ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWFiYWE3Li4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0uYW50LnByb3BlcnRpZXMKLWRpc3QKLWJ1aWxkCi1ib290c3RyYXAKLWRpc3RyaWJ1dGlvbgotcHJqLmVsCi1lbWFjcy1qcHJqLmVsCi1ib290c3RyYXAuYmF0LnBpZgotdmVsb2NpdHkubG9nCi0KZGlmZiAtLWdpdCBhL0tFWVMgYi9LRVlTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTczZWM1Li4wMDAwMDAwCi0tLSBhL0tFWVMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi1UaGlzIGZpbGUgY29udGFpbnMgdGhlIFBHUCBrZXlzIG9mIHZhcmlvdXMgZGV2ZWxvcGVycy4KLVBsZWFzZSBkb24ndCB1c2UgdGhlbSBmb3IgZW1haWwgdW5sZXNzIHlvdSBoYXZlIHRvLiBUaGVpciBtYWluCi1wdXJwb3NlIGlzIGNvZGUgc2lnbmluZy4KLQotVXNlcnM6IHBncCA8IEtFWVMKLURldmVsb3BlcnM6IAotCXBncCAta3hhIDx5b3VyIG5hbWU+IGFuZCBhcHBlbmQgaXQgdG8gdGhpcyBmaWxlLgotCShwZ3BrIC1sbCA8eW91ciBuYW1lPiAmJiBwZ3BrIC14YSA8eW91ciBuYW1lPikgPj4gdGhpcyBmaWxlLgotICAgICAgICAoZ3BnIC0tbGlzdC1zaWdzIDx5b3VyIG5hbWU+Ci0gICAgICAgICAgICAgJiYgZ3BnIC0tYXJtb3IgLS1leHBvcnQgPHlvdXIgbmFtZT4pID4+IHRoaXMgZmlsZS4KLQotVHlwZSBCaXRzL0tleUlEICAgIERhdGUgICAgICAgVXNlciBJRAotcHViICAxMDI0L0ZFRUNBQUVEIDE5OTgvMTEvMTEgU3RlZmFuIEJvZGV3aWcgPGJvZGV3aWdAYm9zdC5kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+Ci0KLS0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotVmVyc2lvbjogMi42LjNpCi0KLW1RQ05BelpKb2lNQUFBRUVBTXpoVXhUT0MyME5wcnA2SzRuTFRpQVJ0K0VYaWkvZG92TldXY2Z6WmNZWGkvbFgKLXIzenBVVFRaeGxLUXBkNFJhSGpGbUdnb09yYVpFNGpDUkZBUlZjRkpnWW1HVUtwY1dKWk83WUtMMzZXVWl6VE0KLStkeUIyeWNPdHpsdHkxVzVWbVJMM0ZHcW82N3BLQTlGL1FIZzNOU3U5aFkxVzl4UFBLN0txM2YrN0tydEFBVVIKLXRDQlRkR1ZtWVc0Z1FtOWtaWGRwWnlBOFltOWtaWGRwWjBCaWIzTjBMbVJsUG9rQWxRSUZFRFpTckdYSGNneUsKLWppVzl6UUVCc2hFRUFNbEc0cVZqS3A0L2FnZEpHNTZNNml6eDlvYUtlY0ZMWEhRSnJGVXkzdzJQdlpIRll0WGMKLW9zWEtvclg2YlByRTh1QjU3TXhiWTJXYXBLZVZSb2RsRzArajM5dkFmNTAxZHVLOHEycmt0Zld0OUNsNEpqSjQKLURiV2hTV2ZWMWNpNjJ1MmdDeHdZUWUyMkY5V2grdmhPUjVOSzlSVGJTS2h1cGRsRnNucmsvaTd4aVFDVkF3VVEKLU5rbWlJNjdLcTNmKzdLcnRBUUdkeFFRQWxjRk96U3Y3RzZNNHVHYmd2dzdJR2dyaHg3cmF3dEl5djloTFhnVkMKLTd1YTl4YVpWOEcwRmw5Z2g4Um5iZGNaNFIvYVQrS0lpQUZhc2xmWjN0NmhsQzRNVGJuQUpxdmRTL05POThaa0oKLVl2bnpaU0tIZmxBYmQ1Z3lFN0lWeEJDOS94UmxGL1dsczVzWU53YjZSam9SQ2FPanhOL3kzV0NMYTNWYTEwMXYKLXpOeTBJMU4wWldaaGJpQkNiMlJsZDJsbklEeGliMlJsZDJsblFHRndZV05vWlM1dmNtYytpUUNWQXdVUU94SW8KLUJLN0txM2YrN0tydEFRR242Z1AvU0JBQ2RIYWtBNEgvL290cHlFU1NyazRQbXlPYVlGMEt5b2s0M0dlZTJtVCsKLW05K2paM2pMY0Mwb2F2NmlIK290TC9saGs5dC9KRE04TGpEMmtBa2RXV29JdnZ1UHlDeDk3Z096b2pJbzBWZTIKLTF3dXhKVEYvVklqd3lPdEU4RnpFN3A0dGtjNkV1YlZwZVprVjlQcTlIRlJCQ1VjeUtKRExuRjR0YnN0U2NMVT0KLT1PQkxlCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLQotCi0KLXB1YiAgMTAyNEQvNTE4OTg1MDQgMjAwMS0wNS0yOSBDb25vciBNYWNOZWlsbCA8Y29ub3JAY29ydGV4ZWJ1c2luZXNzLmNvbS5hdT4KLXVpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25vciBNYWNOZWlsbCA8Y29ub3JAYXBhY2hlLm9yZz4KLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiBHbnVQRyB2MS4wLjYgKE1pbmdXMzIpCi1Db21tZW50OiBGb3IgaW5mbyBzZWUgaHR0cDovL3d3dy5nbnVwZy5vcmcKLQotbVFHaUJEc1RxeWdSQkFDaVpja05kY2xUbFFGb25MYUlLQkZHaE15MEtLQnl3MHg4WEE0aXdkYkNYdUY2eE5JYwotSElGSGFqSjc0QUhjaFE0ZDh4dG9tQnk2Yjh5dkZnV1ZlYVplbnN2bjY5QmxMZXFHZHllSlJ6ZlB0NlRnUm56WgotMmVXaGIwSFhkRzNKd3hMLzJCYWJEaEhmczRZSk9yZ0IvdmhSRlFrdTZvQ01SaUJQdEpqMndlckQ2d0NnMC96cAotamFjWVR3NitDUitzVnZuZUNOeXlTRkVEL1IzajEwYzRSblI4ZGpndjFqS1Q4Q0tQdUhZcmF1cEk5SU5FZStJNgotN3FXanRKMDJHenZNTzZURWxBdFVzZjRheXN1NDVHZ3drd0VCbnVHNm1ZYjNQcTBWMmM1dEpjMkEzVGozRHJkUgotaTNIVU53dXJidXM3Nkkwc1B5eUVOUHUxMlFQZUM2bXZXTEVzeFZKOW8waFJLRmF5R3ZZVW1yd1dLOVVGTGp2cAotcDljWEJBQ0RIZ0xuN01BVkxxVWRZaFJyVWovTStHT1VwdkJpa0Vnb0pKckVVbWI1WDQrKytkZmZNaDVIQklPNAotNUxBMTFxRUt1TTJ4bktxT2lsUDdOTFlYejFGZTBvY3F2MGpzSEI0U3ByRlRUYWk3bWEzMXV3dVJRdkNRWFZ2MQoteUo1Q0xxWWRhNjRoL1VBMmttbVIyZGZvcG12RG9nWUVNei9IVTV2b296eGU3QkVJN2JRaFEyOXViM0lnVFdGagotVG1WcGJHd2dQR052Ym05eVFHRndZV05vWlM1dmNtYytpRmNFRXhFQ0FCY0ZBanNUcXlnRkN3Y0tBd1FERlFNQwotQXhZQ0FRSVhnQUFLQ1JDQkJHUlBVWW1GQkRnSUFLQ1p6dFhxS2hLNmtYT25vR3k3b3BDTm1XVTBsd0Nnc1BEYQotNG0rcnVXM2NoMHJmYnF0Ujc1UzUyUiswTFVOdmJtOXlJRTFoWTA1bGFXeHNJRHhqYjI1dmNrQmpiM0owWlhobAotWW5WemFXNWxjM011WTI5dExtRjFQb2hYQkJNUkFnQVhCUUk3RTZ4TUJRc0hDZ01FQXhVREFnTVdBZ0VDRjRBQQotQ2drUWdRUmtUMUdKaFFUWTBBQ2dtWm1LaGVIempQSnM1aHlicHl2bnZFaVBZcVlBbjIrcnl4ZHR6OFh5T01FeAotR1JtSE5saEc3c3ZzdVFFTkJEc1RxeTBRQkFDZnNDeEo2aUN0Z1g4empsVnRNc01mRHF1NzJ4NXNZYXRXS244YwotdSs0T2o1bWkweDZhelpJaHdDYStLM2loTFZPeUcxbUNSbnp6dEdUSXhXWVJocTNURVNJVk9mZ20rTmdMR3JtQQotWFVURnlDVCsyMVRFeExDcHVWWkttVUhzV1hMeER0ZlExZGlQZVFwaVE4K0Z2Yi80akxHRmpGSXJRMlZqdEZRbgota3Vta1N3QURCZ1A5SDBiRjRoZE11VkVjU0o5aW14U29Kc2hjT09BM1ZkMitZaUNUWmhCeWdXTTQ5d1k1ak5vcwotL0RBcklqTkNFNTNJbE91L1V0SEIyanFrU3FqRjBzb0dZc1VqZUNXb3VpVFA5aEx1TUtQam5xajlyeUpQVERLegotblRDWjRUdUI1Q3R6cktUbFdMbVBDUHBGc0dxZTRLak1lS2cvbXFHcWpQS2w5N3hnU3RLOU45R0lSZ1FZRVFJQQotQmdVQ094T3JMUUFLQ1JDQkJHUlBVWW1GQk1NNkFKc0YzRkZ5WkdFbWJ0OWFHRzFXL3Uwb0k5bWNMZ0NmUXlKKwotYWFsYnNwYXplYTRKOXpnaTU5U1N3T009Ci09SWNtMgotLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyYmUxNC4uMDAwMDAwMAotLS0gYS9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqICAgICAgICAgICAgICAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIAotICogICAgQ29weXJpZ2h0IChDKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhLQotICogdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2YgIHNvdXJjZSBjb2RlIG11c3QgIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIAotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmIGFueSwgbXVzdAotICogICAgaW5jbHVkZSAgdGhlIGZvbGxvd2luZyAgYWNrbm93bGVkZ21lbnQ6ICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzICBzb2Z0d2FyZQotICogICAgZGV2ZWxvcGVkICBieSB0aGUgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgIGFja25vd2xlZGdtZW50IG1heSAgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsICBpZgotICogICAgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqIAotICogNC4gVGhlIG5hbWVzICJBbnQiIGFuZCAgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiAgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSAgb3IgcHJvbW90ZSAgcHJvZHVjdHMgZGVyaXZlZCAgZnJvbSB0aGlzICBzb2Z0d2FyZSB3aXRob3V0ICBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKiAKLSAqIDUuIFByb2R1Y3RzICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90ICBiZSBjYWxsZWQgIkFwYWNoZSIsIG5vciBtYXkKLSAqICAgICJBcGFjaGUiIGFwcGVhciAgaW4gdGhlaXIgbmFtZSwgIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uICBvZiB0aGUKLSAqICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gKiBGSVRORVNTICBGT1IgQSBQQVJUSUNVTEFSICBQVVJQT1NFIEFSRSAgRElTQ0xBSU1FRC4gIElOIE5PICBFVkVOVCBTSEFMTCAgVEhFCi0gKiBBUEFDSEUgU09GVFdBUkUgIEZPVU5EQVRJT04gIE9SIElUUyBDT05UUklCVVRPUlMgIEJFIExJQUJMRSBGT1IgIEFOWSBESVJFQ1QsCi0gKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgREFNQUdFUyAoSU5DTFUtCi0gKiBESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UICBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCi0gKiBPRiBVU0UsIERBVEEsIE9SICBQUk9GSVRTOyBPUiBCVVNJTkVTUyAgSU5URVJSVVBUSU9OKSAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiBBTlkgIFRIRU9SWSBPRiBMSUFCSUxJVFksICBXSEVUSEVSICBJTiBDT05UUkFDVCwgIFNUUklDVCBMSUFCSUxJVFksICBPUiBUT1JUCi0gKiAoSU5DTFVESU5HICBORUdMSUdFTkNFIE9SICBPVEhFUldJU0UpIEFSSVNJTkcgSU4gIEFOWSBXQVkgT1VUIE9GIFRIRSAgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogCi0gKiBUaGlzIHNvZnR3YXJlICBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlICBieSBtYW55IGluZGl2aWR1YWxzCi0gKiBvbiBiZWhhbGYgb2YgdGhlICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlICBpbmZvcm1hdGlvbiAgb24gdGhlIAotICogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDIwZjJkLi4wMDAwMDAwCi0tLSBhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSAgICAgTiAgICAgVAotIAotCi0gIFdoYXQgaXMgaXQ/IAotICAtLS0tLS0tLS0tLQotICAKLSAgQW50IGlzIGEgSmF2YSBiYXNlZCBidWlsZCB0b29sLiBJbiB0aGVvcnkgaXQgaXMga2luZCBvZiBsaWtlICJtYWtlIiAKLSAgd2l0aG91dCBtYWtlcyB3cmlua2xlcyBhbmQgd2l0aCB0aGUgZnVsbCBwb3J0YWJpbGl0eSBvZiBwdXJlIGphdmEgY29kZS4KLQotICAKLSAgV2h5PwotICAtLS0tCi0gIAotICBXaHkgYW5vdGhlciBidWlsZCB0b29sIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBtYWtlLCBnbnVtYWtlLCBubWFrZSwgamFtLCAKLSAgYW5kIG90aGVycz8gQmVjYXVzZSBhbGwgb2YgdGhvc2UgdG9vbHMgaGF2ZSBsaW1pdGF0aW9ucyB0aGF0IGl0cyBvcmlnaW5hbCAKLSAgYXV0aG9yIGNvdWxkbid0IGxpdmUgd2l0aCB3aGVuIGRldmVsb3Bpbmcgc29mdHdhcmUgYWNyb3NzIG11bHRpcGxlIHBsYXRmb3Jtcy4gCi0gIAotICBNYWtlLWxpa2UgdG9vbHMgYXJlIGluaGVyZW50bHkgc2hlbGwgYmFzZWQuIFRoZXkgZXZhbHVhdGUgYSBzZXQgb2YgCi0gIGRlcGVuZGVuY2llcyBhbmQgdGhlbiBleGVjdXRlIGNvbW1hbmRzIG5vdCB1bmxpa2Ugd2hhdCB5b3Ugd291bGQgaXNzdWUgb24gYSAKLSAgc2hlbGwuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGVhc2lseSBleHRlbmQgdGhlc2UgdG9vbHMgYnkgdXNpbmcgb3Igd3JpdGluZyAKLSAgYW55IHByb2dyYW0gZm9yIHRoZSBPUyB0aGF0IHlvdSBhcmUgd29ya2luZyBvbi4gSG93ZXZlciwgdGhpcyBhbHNvIG1lYW5zIHRoYXQgCi0gIHlvdSBsaW1pdCB5b3Vyc2VsZiB0byB0aGUgT1MsIG9yIGF0IGxlYXN0IHRoZSBPUyB0eXBlIHN1Y2ggYXMgVW5peCwgdGhhdCB5b3UgCi0gIGFyZSB3b3JraW5nIG9uLgotICAKLSAgTWFrZWZpbGVzIGFyZSBpbmhlcmVudGx5IGV2aWwgYXMgd2VsbC4gQW55Ym9keSB3aG8gaGFzIHdvcmtlZCBvbiB0aGVtIGZvciBhbnkgCi0gIHRpbWUgaGFzIHJ1biBpbnRvIHRoZSBkcmVhZGVkIHRhYiBwcm9ibGVtLiAiSXMgbXkgY29tbWFuZCBub3QgZXhlY3V0aW5nIAotICBiZWNhdXNlIEkgaGF2ZSBhIHNwYWNlIGluIGZyb250IG9mIG15IHRhYiEhISIgc2FpZCB0aGUgb3JpZ2luYWwgYXV0aG9yIG9mIEFudCAKLSAgd2F5IHRvbyBtYW55IHRpbWVzLiBUb29scyBsaWtlIEphbSB0b29rIGNhcmUgb2YgdGhpcyB0byBhIGdyZWF0IGRlZ3JlZSwgYnV0IAotICBzdGlsbCB1c2UgeWV0IGFub3RoZXIgZm9ybWF0IHRvIHVzZSBhbmQgcmVtZW1iZXIuCi0gIAotICBBbnQgaXMgZGlmZmVyZW50LiBJbnN0ZWFkIGEgbW9kZWwgd2hlcmUgaXQgaXMgZXh0ZW5kZWQgd2l0aCBzaGVsbCBiYXNlZCAKLSAgY29tbWFuZHMsIGl0IGlzIGV4dGVuZGVkIHVzaW5nIEphdmEgY2xhc3Nlcy4gSW5zdGVhZCBvZiB3cml0aW5nIHNoZWxsIAotICBjb21tYW5kcywgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIFhNTCBiYXNlZCBjYWxsaW5nIG91dCBhIHRhcmdldCB0cmVlIAotICB3aGVyZSB2YXJpb3VzIHRhc2tzIGdldCBleGVjdXRlZC4gRWFjaCB0YXNrIGlzIHJ1biBieSBhbiBvYmplY3Qgd2hpY2ggCi0gIGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIFRhc2sgaW50ZXJmYWNlLgotICAKLSAgR3JhbnRlZCwgdGhpcyByZW1vdmVzIHNvbWUgb2YgdGhlIGV4cHJlc3NpdmUgcG93ZXIgdGhhdCBpcyBpbmhlcmVudCBieSBiZWluZyAKLSAgYWJsZSB0byBjb25zdHJ1Y3QgYSBzaGVsbCBjb21tYW5kIHN1Y2ggYXMgYGZpbmQgLiAtbmFtZSBmb28gLWV4ZWMgcm0ge31gIGJ1dCAKLSAgaXQgZ2l2ZXMgeW91IHRoZSBhYmlsaXR5IHRvIGJlIGNyb3NzIHBsYXRmb3JtLiBUbyB3b3JrIGFueXdoZXJlIGFuZCAKLSAgZXZlcnl3aGVyZS4gQW5kIGhleSwgaWYgeW91IHJlYWxseSBuZWVkIHRvIGV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kLCBBbnQgaGFzIAotICBhbiBleGVjIHJ1bGUgdGhhdCBhbGxvd3MgZGlmZmVyZW50IGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIGJhc2VkIG9uIHRoZSBPUyAKLSAgdGhhdCBpdCBpcyBleGVjdXRpbmcgb24uCi0KLSAgVGhlIExhdGVzdCBWZXJzaW9uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIERldGFpbHMgb2YgdGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBvbiB0aGUgQXBhY2hlIEpha2FydGEKLSAgUHJvamVjdCB3ZWIgc2l0ZSA8aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8+LgotCi0KLSAgRG9jdW1lbnRhdGlvbgotICAtLS0tLS0tLS0tLS0tCi0KLSAgRG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgaW4gSFRNTCBmb3JtYXQsIGluIHRoZSBkb2NzLyBkaXJlY3RvcnkuCi0gIEZvciBidWlsZGluZyBzZWUgZG9jcy9pbmRleC5odG1sI2J1aWxkaW5nYW50LgotICBGb3IgaW5zdGFsbGluZyBzZWUgZG9jcy9pbmRleC5odG1sI2luc3RhbGxpbmcuCi0KLQotICBMaWNlbnNpbmcKLSAgLS0tLS0tLS0tCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgeW91IG1heSBmaW5kIGluIHRoZSBmaWxlIAotICBuYW1lZCAiTElDRU5TRSIgaW4gdGhpcyBkaXJlY3RvcnkuCi0gIAotCi0gIFRoYW5rcyBmb3IgdXNpbmcgQW50LgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgQXBhY2hlIEpha2FydGEgUHJvamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8+CmRpZmYgLS1naXQgYS9XSEFUU05FVyBiL1dIQVRTTkVXCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDEyMDBhLi4wMDAwMDAwCi0tLSBhL1dIQVRTTkVXCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLUNoYW5nZXMgZnJvbSBBbnQgMS40IHRvIGN1cnJlbnQgQ1ZTIHZlcnNpb24KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU90aGVyIGNoYW5nZXM6Ci0tLS0tLS0tLS0tLS0tLQotCi1GaXhlZCBidWdzOgotLS0tLS0tLS0tLS0KLQotCi1DaGFuZ2VzIGZyb20gQW50IDEuMyB0byBBbnQgMS40Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBKVW5pdFJlcG9ydCBub3cgdXNlcyB0aGUgeGFsYW4gcmVkaXJlY3QgZXh0ZW5zaW9uIGZvciBtdWx0aS1vdXRwdXQuCi0gIFdpdGggWGFsYW4gMS4yLjIgaXQgZm9yY2VzIHRoZSB1c2Ugb2YgYnNmLmphciBpbiB0aGUgY2xhc3NwYXRoLgotICAoQXZhaWxhYmxlIGluIHRoZSB4YWxhbiBkaXN0cmlidXRpb24pLiBJdCBpcyByZWNvbW1lbmRlZCB0byBzd2l0Y2gKLSAgdG8gWGFsYW4gMi54IHRoYXQgZG8gbm90IG5lZWQgaXQuCi0KLSogWmlwLnNldFdoZW5lbXB0eSgpIGhhcyBjaGFuZ2VkIGl0cyBzaWduYXR1cmUuCi0KLSogPHJtaWM+IGlzIG5vdyBpbXBsZW1lbnRlZCB1c2luZyBhIGZhY3RvcnkuIFRoaXMgbWFrZXMgZXh0ZW5kaW5nCi0gIHJtaWMgdG8gdXNlIGEgbmV3IGNvbXBpbGVyIGEgbG90IGVhc2llciBidXQgbWF5IGJyZWFrIGN1c3RvbQotICB2ZXJzaW9ucyBvZiB0aGlzIHRhc2sgdGhhdCByZWx5IG9uIHRoZSBvbGQgaW1wbGVtZW50YXRpb24uCi0KLSogc2V2ZXJhbCBaaXAgbWV0aG9kcyBoYXZlIGNoYW5nZWQgdGhlaXIgc2lnbmF0dXJlIGFzIHdlIG5vdyB1c2UgYSBaaXAKLSAgcGFja2FnZSBvZiBvdXIgb3duIHRoYXQgaGFuZGxlcyBVbml4IHBlcm1pc3Npb25zIGZvciBkaXJlY3Rvcmllcy4KLSAgRnVydGhlcm1vcmUgPHppcD4gd2lsbCBub3cgdXNlIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyCi0gIGVuY29kaW5nIGZvciBmaWxlbmFtZXMgLSB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29tbWFuZCBsaW5lCi0gIFpJUCB0b29scywgYnV0IGNhdXNlcyBwcm9ibGVtcyBpZiB5b3UgdHJ5IHRvIG9wZW4gdGhlbSBmcm9tIHdpdGhpbgotICBKYXZhIGFuZCB5b3VyIGZpbGVuYW1lcyBjb250YWluIG5vbiBVUy1BU0NJSSBjaGFyYWN0ZXJzLiBVc2UgdGhlIG5ldwotICBlbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlIHRhc2sgYW5kIHNldCBpdCB0byBVVEY4IHRvIGdldCB0aGUgb2xkCi0gIGJlaGF2aW9yLgotCi0qIFRoZSA8cHZjcz4gdGFzayBoYXMgYmVlbiBtb3ZlIHRvIGEgcGFja2FnZSBvZiBpdHMgb3duLgotCi0qIEpVbml0UmVzdWx0Rm9ybWF0ZXIgaGFzIHR3byBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBtdXN0IGJlCi0gIGltcGxlbWVudGVkIGJ5IGN1c3RvbSBmb3JtYXR0ZXJzLgotCi0qIEFudCB3aWxsIG5vIGxvbmdlciB1c2UgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgcGF0aCBpbnRlcm5hbGx5IC0KLSAgdGhpcyBtYXkgeWllbGQgZGlmZmVyZW50IHJlc3VsdHMgb24gZmlsZXN5c3RlbXMgdGhhdCBzdXBwb3J0Ci0gIHN5bWJvbGljIGxpbmtzLgotCi0qIFRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSB4bWwgZm9ybWF0dGVyIGZvciA8anVuaXQ+IGhhcyBjaGFuZ2VkCi0gIGFnYWluLCBpdCBkb2Vzbid0IGZvcm1hdCB0aGUgbnVtZXJpYyB2YWx1ZSBpbiB0aGUgdGltZSBhdHRyaWJ1dGUgYW55bW9yZS4KLQotKiBQYXR0ZXJuIG1hdGNoaW5nIHJ1bGVzIGhhdmUgY2hhbmdlcyBzbGlnaHRseSwgdGhlIHBhdHRlcm4gZm9vKgotICBkb2Vzbid0IG1hdGNoIGZpbGVzIGNvbnRhaW5lZCBpbiBhIGRpcmVjdG9yeSBuYW1lZCBmb28gLSB1c2UgZm9vLyoKLSAgaW5zdGVhZC4KLQotKiA8Zml4Y3JsZj4gd2lsbCBub3QgcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiBsaW5lcyBhbnltb3JlLgotCi0qIFRoZSBDbGFzc2xvYWRlciB1c2FnZSBoYXMgYmVlbiBjaGFuZ2VkIGZvciB0aGUgdGFza2RlZiwgcHJvcGVydHksIGF2YWlsYWJsZSAKLSAgYW5kIHNxbCB0YXNrcyBzbyB0aGF0IGl0IGRlbGVnYXRlcyB0byB0aGUgcGFyZW50IGNsYXNzbG9hZGVyLiBUaGlzIG1heSBjYXVzZSAKLSAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnMgdG8gYmUgdGhyb3duIGlmIGEgc3lzdGVtIGNsYXNzIGF0dGVtcHRzIHRvIGxvYWQgYQotICBjbGFzcyBpbiB0aGUgdGFza2RlZidzIGNsYXNzcGF0aCAodHlwaWNhbGx5IGZhY3Rvcnkgb2JqZWN0cykuCi0KLSogQW50IG5vdyBhbGxvd3MgbXVsdGl0aHJlYWRpbmcgb2YgdGFza3MgYW5kIHRoZSBjb250YWlubWVudCBvZiB0YXNrcyB3aXRoaW4KLSAgb3RoZXIgdGFza3MuIFRoaXMgY2FuIGJyZWFrIGN1c3RvbWVyIGxpc3RlbmVycyB3aGljaCBkbyBub3QgZXhwZWN0IG1lc3NhZ2VzCi0gIGZyb20gYSB0YXNrIGJlZm9yZSB0aGUgcHJldmlvdXMgdGFzayBoYXMgZmluaXNoZWQuIAotICAKLSogQW50IG5vdyBpbnN0YWxscyBpdHMgb3duIG91cHV0IHN0cmVhbSBpbnRvIFN5c3RlbS5vdXQgdG8gcm91dGUgb3V0cHV0IHRvIHRoZQotICB0YXNrIGN1cnJlbnRseSBleGVjdXRpbmcgb24gdGhlIGN1cnJlbnQgdGhyZWFkLiBUaGlzIGFsc28gbWVhbnMgdGhhdCBhbGwgCi0gIG91dHB1dCBpcyBub3cgcm91dGVkIGFzIEFudCBtZXNzYWdlIGV2ZW50cy4gQ3VzdG9tZXIgbGlzdGVuZXJzIGFuZCBsb2dnZXJzIAotICBzaG91bGQgbm90IGNhbGwgU3lzdGVtLm91dCBhdCBhbnkgdGltZS4gVGhpcyBoYXMgYWx3YXlzIGJlZW4gdHJ1ZSBidXQgc3VjaCAKLSAgdXNhZ2Ugbm93IHdpbGwgY2F1c2UgcHJvYmxlbXMgZHVlIHRvIHBvc3NpYmxlIHJlY3Vyc2lvbi4KLQotKiBJbnZhbGlkIG1hbmlmZXN0IGZpbGVzIHdpbGwgbm93IGNhdXNlIGJ1aWxkIGZhaWx1cmVzIGluIHRoZSA8amFyPiB0YXNrLgotCi0qIEFudCBJbnRyb3NwZWN0aW9uIG5vdyBsb29rcyBmb3IgbWV0aG9kcyB3aXRoIG1ldGhvZCBuYW1lcyBzdGFydGluZyB3aXRoCi0gIGFkZENvbmZpZ3VyZWQuIFdoZW4gY2FsbGVkIHRoZXNlIG1ldGhvZHMgYXJlIHBhc3NlZCBhbiBhcmd1bWVudCBhZnRlciBpdCBoYXMgCi0gIGJlZW4gY29uZmlndXJlZCBmcm9tIHRoZSBidWlsZCBmaWxlLiBDdXN0b20gdGFza3Mgc3VwcG9ydGluZyBuZXN0ZWQgZWxlbWVudHMgCi0gIHN0YXJ0aW5nIHdpdGggdGhlIG5hbWUgY29uZmlndXJlZCB3aWxsIG5vIGxvbmdlciBmdW5jdGlvbi4gIAotCi0qIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBQ01EIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAgamF2YSBleGVjdXRhYmxlIHRvIEFudCdzIHdyYXBwZXIgc2NyaXB0cyBtdXN0IG5vdCBjb250YWluIGFkZGl0aW9uYWwKLSAgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYW55IGxvbmdlciAtIHBsZWFzZSB1c2UgdGhlIGVudmlyb25tZW50Ci0gIHZhcmlhYmxlIEFOVF9PUFRTIGZvciBzdWNoIHBhcmFtZXRlcnMgbm93LgotICAKLSogQW50J3Mgd3JhcHBlciBzY3JpcHRzIG5vdyBxdW90ZSB0aGUgQ0xBU1NQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aHVzCi0gIHN1cHBvcnRpbmcgY2xhc3NwYXRocyB3aGljaCByZWZlciB0byBkaXJlY3RvcmllcyBjb250YWluaW5nIHNwYWNlcy4gVGhpcyBtZWFucwotICB0aGF0IHRoZSBDTEFTU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgY2Fubm90IGhhdmUgcXVvdGVzLiBBbnkgcXVvdGVzIHNob3VsZAotICBiZSByZW1vdmVkLiBUaGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBDTEFTU1BBVEggZW52aXJvbm1lbnQKLSAgdmFyaWFibGUgaW4gb3RoZXIgY29udGV4dHMuCi0KLSogQSBkZWxldGUgdGFzayBsaWtlCi0gIDxkZWxldGUgaW5jbHVkZUVtcHR5RmlsZXNldHM9InRydWUiPgotICAgIDxmaWxlc2V0IGRpcj0ic29tZWRpciIgLz4KLSAgPC9kZWxldGU+Ci0gIHdpbGwgbm93IHJlbW92ZSAic29tZWRpciIgYXMgd2VsbCwgdW5sZXNzIHRoZXJlIGFyZSBzdGlsbCBmaWxlcyBsZWZ0Ci0gIGluIGl0IChtYXRjaGVkIGJ5IHRoZSBkZWZhdWx0IGV4Y2x1ZGVzKS4KLQotT3RoZXIgY2hhbmdlczoKLS0tLS0tLS0tLS0tLS0tCi0KLSogTmV3IHRhc2tzOiBlYXIsIHA0Y291bnRlciwgcmVjb3JkLCBjdnNwYXNzLCB2c3NjaGVja2luLCB2c3NjaGVja291dCwKLSAgdHlwZWRlZiwgc2xlZXAsIG1pbWVtYWlsLCBzZXQgb2YgdGFza3MgZm9yIENvbnRpbnV1cy9TeW5lcmd5LCBkZXBlbmRzZXQsCi0gIGNvbmRpdGlvbiwgbWF1ZGl0LCBtbWV0cmljcywganBjb3ZlcmFnZSwganBjb3ZyZXBvcnQsIGpwY292bWVyZ2UKLQotKiBBbnQgbm93IHVzZXMgSkFYUCAxLjEKLQotKiBybWljIG5vdyBzdXBwb3J0cyBLYWZmZSdzIGFuZCBXZWJsb2dpYydzIHZlcnNpb24gb2Ygcm1pYy4KLQotKiBuZXcgbWFnaWMgcHJvcGVydHkgYnVpbGQucm1pYyB0byBjaG9zZSB0aGUgcm1pYyBpbXBsZW1lbnRhdGlvbgotCi0qIDx0YXI+IHdpbGwgbm93IGFkZCBlbXB0eSBkaXJlY3RvcmllcyBhcyB3ZWxsCi0KLSogeW91IGNhbiBub3cgc3BlY2lmeSBhIGRlc2NyaXB0aW9uIGZvciA8cDRjaGFuZ2U+Ci0KLSogPHRvdWNoPiBjYW4gbm93IHdvcmsgb24gPGZpbGVzZXQ+cwotCi0qIDx1cHRvZGF0ZT4gbm93IHN1cHBvcnRzIGEgdmFsdWUgYXR0cmlidXRlCi0KLSogPGZhaWw+IHN1cHBvcnRzIG5lc3RlZCB0ZXh0Ci0KLSogPGZpeGNybGY+IHdvbid0IG92ZXJyaWRlIGZpbGVzIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QKLSAgIGZvcm1hdC4KLQotKiA8c3FsPiBub3cgc3VwcG9ydHMgUkVNIGNvbW1lbnRzIGFzIHdlbGwgYXMgLy8gYW5kIC0tCi0KLSogPGphcj4gbm93IGhhcyBhIG5lc3RlZCA8bWV0YWluZj4gZWxlbWVudCBmb2xsb3dpbmcgdGhlIHNhbWUgaWRlYSBhcwotICA8d2FyPidzIDx3ZWJpbmY+LgotCi0qIDxwdmNzPiBjYW4gbm93IGhhbmRsZSBtdWx0aXBsZSBwcm9qZWN0cy4KLQotKiA8YXZhaWxhYmxlPiBub3cgaGFzIGEgInR5cGUiIGF0dHJpYnV0ZSB5b3UgY2FuIHVzZSBpbiBjb25qdW5jdGlvbgotICB3aXRoIHRoZSAiZmlsZSIgYXR0cmlidXRlIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgImZpbGUiIHlvdSdyZQotICBsb29raW5nIGZvciBpcyBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0KLSogTmV3IDxqdW5pdD4gZm9ybWF0dGVyIG5hbWVkICJicmllZiIKLQotKiA8ZWpiamFyPiBjaGFuZ2VzCi0gICogQWRkIHN1cHBvcnQgZm9yIEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIHRvIHRoZSA8ZWpiamFyPiB0YXNrIHVzaW5nCi0gICAgYSA8Ym9ybGFuZD4gbmVzdGVkIGVsZW1lbnQuCi0gICogQWRkIHN1cHBvcnQgZm9yIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyIHRvIHRoZSA8ZWpiamFyPiB0YXNrLiBBbHNvIAotICAgIGluY2x1ZGVzIHNvbWUgaVBsYW5ldCB1dGlsaXR5IHRhc2tzCi0gICogQWRkIHN1cHBvcnQgZm9yIEpCb3NzIEFwcGxpY2F0aW9uIFNlcnZlciB0byB0aGUgPGVqYmphcj4gdGFzay4gCi0gICogQWRkIGEgbmFtaW5nIGF0dHJpYnV0ZSB0byBjb250cm9sIHRoZSBuYW1pbmcgc2NoZW1lIHRoYXQKLSAgICBlamJqYXIgdXNlcyB0byBuYW1lIHRoZSBnZW5lcmF0ZWQgRUpCIGphcnMuCi0gICogV2VibG9naWMgZWxlbWVudCBub3cgc2V0cyB0aGUgY29tcGlsZXIgY2xhc3MgZm9yIEVKQiAyLjAgYmVhbnMKLSAgKiA8ZHRkPiBlbGVtZW50cyBjYW4gYmUgc3BlY2lmaWVkIGF0IHRoZSA8ZWpiamFyPiBsZXZlbCBmb3IgYnVpbGRpbmcgZ2VuZXJpYwotICAgIGJlYW5zCi0gICogPGR0ZD4gZWxlbWVudHMgY2FuIG5vdyBiZSBVUkxzCi0gICogQWxsb3cgdGhlIG1hbmlmZXN0IHRvIGJlIHNwZWNpZmllZCBmb3IgdGhlIGdlbmVyYXRlZCBqYXJzCi0gICogVGhlIHdlYmxvZ2ljIGVsZW1lbnQgbm93IHN1cHBydHMgYW4gYXR0cmlidGUgbm9FSkJDIHRvIHNraXAgdGhlIHByb2Nlc3NpbmcKLSAgICBvZiB0aGUgamFyIGJ5IGVqYmMuIFRoZSBlamJjIHN0ZXAgd2lsbCB0aGVuIG9jY3VyIGF0IGRlcGxveW1lbnQKLSAgKiB3ZWJsb2dpYyB3aWxsIHRlbGwgZWpiYyB0byB1c2UgSmlrZXMgY29tcGlsZXIgaWYgYnVpbGQuY29tcGlsZXIgaXMgc2V0IHRvIAotICAgIGppa2VzLiBJdCBjYW4gYmUgcmVzdG9yZWQgdG8gdGhlIGRlZmF1bHQsIGphdmFjLCBvcGVyYXRpb24gaWYgZGVzaXJlZC4gIAotICAKLSogQWxsb3cgdGhlIDxzcWw+IERlbGltaXRlciB0byBiZSBzZXQgaW4gdGhlIHNvIHRoYXQgT3JhY2xlIHN0b3JlZCBwcm9jcyBtYXkgYmUKLSAgZW50ZXJlZCAgCi0KLSogPGV4ZWNvbj4gYW5kIDxhcHBseT4gY2FuIG5vdyBvcHRpb25hbGx5IHNraXAgZW1wdHkgZmlsZXNldHMuCi0KLSogPGphdmFkb2M+IGhhcyBhIG5ldyB1c2VleHRlcm5hbGZpbGUgYXR0cmlidXRlIHRoYXQgbWFrZXMgaXQgdXNlIGEKLSAgdGVtcG9yYXJ5IGZpbGUgZm9yIHNvdXJjZWZpbGUgYW5kIHBhY2thZ2UgbmFtZXMgLSBoZWxwcyB0byBkZWZlYXQKLSAgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdGF0aW9ucy4KLQotKiBEYXRhIHR5cGVzIGxpa2UgPHBhdGg+IGNhbiBub3cgYmUgZGVmaW5lZCBpbnNpZGUgb2YgPHRhcmdldD5zCi0KLSogeW91IGNhbiBub3cgc3BlY2lmeSBhIGNsYXNzcGF0aCBmb3IgPHN0eWxlPiAtIHRoZSBYU0xaIHByb2Nlc3NvcgotICB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoaXMgcGF0aAotCi0qIGFkZGVkIGEgZm9yY2UgYXR0cmlidXRlIHRvIDxzdHlsZT4gdG8gc3VwcG9ydCBkZXBlbmRlbmNpZXMgdGhhdCB0aGUKLSAgdGFzayBjYW5ub3QgZGV0ZXJtaW5lIGl0c2VsZiAoZGVwZW5kZW5jeSBvbiBwYXJhbWV0ZXJzLCBub3QgZmlsZQotICBtb2RpZmljYXRpb24gdGltZXMgZm9yIGV4YW1wbGUpCi0KLSogYWRkZWQgdm1sYXVuY2hlciBhdHRyaWJ1dGUgdG8gZXhlYyB0YXNrcy4gVGhpcyBkZWZhdWx0cyB0byB0cnVlLiBJZgotICBpdCBpcyBzZXQgdG8gZmFsc2UsIHRoZSBWTSdzIGFiaWxpdHkgdG8gbGF1bmNoIGNvbW1hbmRzIGluIGJ5cGFzc2VkCi0gIGFuZCB0aGUgT1Mgc2hlbGwsIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSBhdXhpbGxhcnkgYW50UnVuIAotICBzY3JpcHRzIGlzIHVzZWQuIAotCi0qIHJlZ2V4cCBtYXBwZXIgbm93IHN1cHBvcnRzIHRoZSBqYXZhLnV0aWwucmVnZXggcGFja2FnZSBvZiBKREsgMS40LgotCi0qIE5ldyBmaWxlc29ubHkgYXR0cmlidXRlIGZvciA8emlwPiBhbmQgZnJpZW5kcyB0byBzdXBwcmVzcyBkaXJlY3RvcnkKLSAgZW50cmllcy4KLQotKiBOZXcgdXBkYXRlIGF0dHJpYnV0ZSBmb3IgPHppcD4gYW5kIGZyaWVuZHMgLSB1cGRhdGUgYW4gZXhpc3RpbmcKLSAgYXJjaGl2ZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4KLQotKiA8YXBwbHk+IGFuZCA8ZXhlY29uPiBoYXZlIGJlZW4gbWVyZ2VkIGludG8gYSBzaW5nbGUgdGFzay4KLQotKiBhZGRlZCB2c3N2ZXIuc2NjIHRvIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzCi0KLSogPGF2YWlsYWJsZT4gaGFzIGEgbmV3IGZpbGVwYXRoIGF0dHJpYnV0ZS9uZXN0ZWQgZWxlbWVudCB0aGF0IGFsbG93cwotICB5b3UgdG9wIHNlYXJjaCBmb3IgYSBmaWxlIGluIGEgZ2l2ZW4gcGF0aC4KLQotKiA8anVuaXQ+IGNhbiBub3cgb3B0aW9uYWxseSBzZXQgYSBwcm9wZXJ0eSBvbiB0ZXN0IGZhaWx1cmUuCi0KLSogPHRhc2tkZWY+IGNhbiBub3cgZGVmaW5lIHNldmVyYWwgdGFza3MgYXQgb25jZSwgcmVhZGluZyB0aGUgCi0gIG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20gYSBwcm9wZXJ0eSBmaWxlIG9yIHJlc291cmNlLgotCi0qIDx1bnppcC91bmphci91bndhcj4gYW5kIDx1bnRhcj4gbm93IGhhdmUgYW4gb3ZlcndyaXRlIGF0dHJpYnV0ZSB0aGF0Ci0gIGRlZmF1bHRzIHRvIHRydWUuICBJZiBzZXQgdG8gZmFsc2UsIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gdGhlCi0gIGZpbGVzIGluIHRoZSBhcmNoaXZlIHdpbGwgbm90IGJlIHJlcGxhY2VkLgotCi0qIDxwYXR0ZXJuc2V0PiBhbmQgPGZpbGVzZXQ+IG5vdyBzdXBwb3J0IG5lc3RlZCA8aW4vZXhjbHVkZXNmaWxlPgotICBlbGVtZW50cyAtIHVzaW5nIHRoZXNlIHlvdSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGluL2V4Y2x1ZGVzIGZpbGUKLSAgcGVyIDxwYXR0ZXJuc2V0Pi4gCi0KLSogVGhyZWUgbmV3IHN1cHBvcnRlZCBjb21waWxlcnMgZm9yIGphdmFjOiBramMgZm9yIGtvcGksIGdjaiBmb3IgdGhlCi0gIGdjYyBmcm9udGVuZCBhbmQgc2ogZm9yIFN5bWFudGVjJ3MgY29tcGlsZXIuIAotICBJbiBhZGRpdGlvbiBleHRKYXZhYyBvciB0aGUgbmV3IGZvcmsgYXR0cmlidXRlIGNhbiBiZQotICB1c2VkIHRvIHJ1biB0aGUgSkRLJ3MgamF2YWMgaW4gYSBKVk0gc2VwYXJhdGUgZnJvbSBBbnQuCi0KLSogPGZpeHJsZj4gY2FuIG5vdyB3aXRoIENSIG9ubHkgbGluZS1lbmRzIGFuZCBjYW4gdXNlIGFuIGFyYml0cmF0eQotICBiZXR3ZWVuIDIgYW5kIDgwLgotCi0qIFRoZSAuTkVUIHRhc2tzIGhhdmUgYmVlbiBhZGFwdGVkIHRvIHRoZSBiZXRhMiByZWxlYXNlIG9mIHRoZSBmcmFtZXdvcmsuCi0KLSogPG1vdmU+IHdpbGwgbm93IHRyeSB0byByZW5hbWUoKSBmaWxlcyBiZWZvcmUgY29weWluZyB0aGVtIGJ5dGUgYnkKLSAgYnl0ZSAtIG9ubHkgaWYgZmlsdGVyaW5nIGlzIG9mLCBvZiBjb3Vyc2UuCi0gIAotKiA8YW50PiBhbmQgPGFudGNhbGw+IHRhc2tzIG5vdyBzdXBwb3J0IGEgbmV3IGF0dHJpYnV0ZSBpbmhlcml0QWxsLiBXaGVuIHNldCB0bwotICBmYWxzZSwgb25seSB1c2VyIHByb3BlcnRpZXMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSB0YXJnZXQgQW50IGluc3RhbmNlLgotICBUaGlzIGluY2x1ZGVzIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUgYW5kIHByb3BlcnRpZXMgZXhwbGljaXRseQotICBwYXNzZWQKLSAgCi0qIDxqYXZhZG9jPiBub3cgc2tpcHMgb2ZmIGxpbmUgbGlua3MgaWYgdGhlIHBhY2thZ2UgbGlzdCBjYW5ub3QgYmUgZm91bmQuCi0KLSogPHdscnVuPiBub3cgYWxsb3dzIHRoZSBzZWN1cml0eSBwb2xpY3kgZmlsZSB0byBleGlzdCBvdXRzaWRlIHRoZSB3ZWJsb2dpYwotICBkaXJlY3RvcnkuCi0gIAotKiA8amF2YT4gdGFzayB3aWxsIHNldCB0aGUgVGhyZWFkIGNvbnRleHRDbGFzc0xvYWRlciB1bmRlciBKREtzIDEuMisgdG8gdGhlCi0gIGNsYXNzbG9hZGVyIGZvciB0aGUgY2xhc3MgYmVpbmcgZXhlY3V0ZWQuCi0gIAotKiBJbnRyb2R1Y2UgdGhlIGNvbmNlcHQgb2YgYSBUYXNrQ29udGFpbmVyIC0gYSB0YXNrIG9yIGVsZW1lbnQgd2hpY2ggY2FuIGNvbnRhaW4KLSAgQW50IFRhc2tzLiAKLSAgCi0qIEFkZCBuZXcgdGFza3MgaW1wbGVtZW50aW5nIHRoZSBUYXNrQ29udGFpbmVyIGludGVyZmFjZSA8cGFyYWxsZWw+IGFuZAotICA8c2VxdWVudGlhbD4gd2hpY2ggYWxsb3cgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHRhc2tzIHRvIGJlIHNwZWNpZmllZC4KLQotKiA8ZGVwZW5kPiB0YXNrIHdpbGwgbm93IHRha2UgaW50byBhY2NvdW50IGRlcGVuZGVuY2llcyBvbiBqYXIgZmlsZXMgYW5kIGNsYXNzCi0gIGZpbGVzIGZyb20gYSBnaXZlbiBjbGFzc3BhdGguCi0gIAotKiA8amFyPiBtYW5pZmVzdCBlbnRyaWVzIG1heSBub3cgYmUgc3BlY2lmaWVkIGluIHRoZSBidWlsZCBmaWxlIGVpdGhlciAKLSAgY29tcGxldGVseSBvciB0byBiZSBtZXJnZWQgd2l0aCBhIG1hbmlmZXN0IGZpbGUuCi0KLSogPHRzdGFtcD4gdGFzayBjdXN0b20gZm9ybWF0cyBub3cgc3VwcG9ydCBsb2NhbGVzLiAKLQotKiBBZGRlZCBhIGxpc3RuZXIgd2hpY2ggd2lsbCBmb3J3YXJkIGV2ZW50cyB0byBMb2c0Si4gVGhlIGxvZzRqIGNvbmZpZ3VyYXRpb24gCi0gIGZpbGUgc2hvdWxkIGJlIGluIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBBbnQgaXMgcnVuIG9yIHBhc3NlZCBhcyBhIHN5c3RlbQotICBwcm9wZXJ0eSB1c2luZyBhIEpWTSBhcmd1bWVudC4KLQotKiBJbnRyb2R1Y2VkIHRoZSBjb25jZXB0IG9mIDxmaWx0ZXJzZXRzPiB0byBhbGxvdyBmb3IgbW9yZSBjb250cm9sIGluIHdoaWNoIAotICBmaWx0ZXJzIGdldCBhcHBsaWVkIGluIGEgPGNvcHk+IG9yIDxtb3ZlPiBvcGVyYXRpb24uICAgICAgIAotCi0qIEFkZGVkIG5vd2FybiBhdHRyaWJ1dGUgdG8gamF2YWMgYW5kIGRlcHJlY2F0ZWQgdGhlIEppa2VzLW1hZ2ljIHByb3BlcnR5Ci0gIGJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzLgotICAKLSogVGhlIDxkZXBlbmQ+IHRhc2sgY2FjaGUgZm9ybWF0IGhhcyBjaGFuZ2VkIGFuZCBhbGwgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpcwotICBub3cgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUuCi0KLUZpeGVkIGJ1Z3M6Ci0tLS0tLS0tLS0tLQotCi0qIFRlc3RjYXNlcyBoYXZlIGJlZW4gbWFkZSBpbmRlcGVuZGVudCBvZiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCi0qIElucHV0IFpJUC1GaWxlcyB3aWxsIGJlIGNsb3NlZCB3aGVuIHVzaW5nIGEgPHppcGZpbGVzZXQ+LgotCi0qIHA0IHRhc2tzIG5vdyBkb24ndCBmYWlsIGlmIHVzZXIsIHBvcnQgb3IgY2xpZW50IGhhdmUgYmVlbiBvbWl0dGVkCi0gIChhbmQgdGhpcyBpcyBhY2NlcHRhYmxlIGZvciB0aGUgY29udGV4dCBvZiB0aGUgY29tbWFuZCkuCi0KLSogPGphdmFoPidzIG91dHB1dGZpbGUgYXR0cmlidXRlIHdpbGwgYmUgcmVzb2x2ZWQgYXMgcmVsYXRpdmUgdG8gdGhlCi0gIHByb2plY3RzIGJhc2VkaXIuCi0KLSogPGFudHN0cnVjdHVyZT4gc2hvdWxkIGNyZWF0ZSBhIHZhbGlkIERURCBmb3IgcHJvcGVydHlmaWxlLm9wZXJhdGlvbi5lbnRyeSAKLSAgYW5kIG9taXQgdGFza3MgaXQgZmFpbHMgdG8gbG9hZC4KLQotKiB3b24ndCB0cnkgdG8gcGFzcyBhIC1ib290Y2xhc3NwYXRoIGZsYWcgdG8gamF2YWMgMS4xIGFueW1vcmUKLQotKiA8c3R5bGU+J3Mgc3R5bGUgYXR0cmlidXRlIG5vIGhhbmRsZXMgYWJzb2x1dGUgcGF0aHMgY29ycmVjdGx5LgotCi0qIDxkZWxldGUgaW5jbHVkZWVtcHR5ZGlycz0idHJ1ZSI+IG5vdyBkZWxldGVzIG1vcmUgdGhhbiBqdXN0IHRoZSBsZWFmCi0gIGRpcmVjdG9yaWVzLgotCi0qIFlvdSBjYW4gbm93IHNwZWNpZnkgYSA8ZmlsZXNldD4gZm9yIGEgZGlyZWN0b3J5IHRoYXQgZG9lc24ndCBleGlzdCBhdAotICBkZWNsYXJhdGlvbiB0aW1lIGJ1dCB3aWxsIGNyZWF0ZWQgYmVmb3JlIHRoZSBmaWxlc2V0IGdldHMgdXNlZCBmb3IgdGhlCi0gIGZpcnN0IHRpbWUuCi0KLSogSWYgdGhlIHF1aWV0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQsIDxkZWxldGU+IHdpbGwgaGFuZGxlIDxmaWxlc2V0PnMKLSAgd2l0aCBub24tZXhpc3RpbmcgZGlyZWN0b3JpZXMgZ3JhY2VmdWxseS4KLQotKiBPdXRwdXQgd3JpdHRlbiBieSB0ZXN0Y2FzZXMgd2lsbCBub3cgYmUgY2FwdHVyZWQgYnkgdGhlIDxqdW5pdD4gdGFzawotICBhbmQgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXJzLgotICAKLSogUXVvdGUgdGhlIC1ncm91cCBwYXJhbWV0ZXIgdG8gSmF2YWRvYyBhcyBwZXIgdGhlIHNwZWNpZmljYXRpb24KLQotKiBJbml0aWFsaXNlIGNsYXNzZXMgd2hlbiBsb2FkZWQgdGhyb3VnaCB0aGUgQW50Q2xhc3NMb2FkZXIgLSB0aGF0IGlzLCBydW4KLSAgc3RhdGljIGluaXRpYWxpemVycwotICAKLSogSW1wbGVtZW50IGdldFJlc291cmNlKCkgYW5kIGdldFJlc291cmNlcygpIGluIEFudENsYXNzTG9hZGVyCi0KLSogQ3JlYXRlIHRoZSA8ZWpiamFyPiB3ZWJsb2dpYyBjb21tYW5kIGxpbmUgYXMgYSBzZXQgb2YgYXJndW1lbnRzIHJhdGhlciB0aGFuCi0gIGFzIGEgc2luZ2xlIGxpbmUuIEF2b2lkcyBwcm9ibGVtcyB3aXRoIHBhdGhzIHdoaWNoIGNvbnRhaW4gc3BhY2VzLgotICAKLSogPGVqYmphcj4gbm93IGZhaWxzIHdoZW4gdGhlIHdlYmxvZ2ljIGVqYmMgY29tcGlsZXIgcmVwb3J0cyBhbiBlcnJvci4KLSAgCi0qIE1ha2UgdGhlIEFudENsYXNzTG9hZGVyIGxvYWQgcmVzb3VyY2VzIGluIHRoZSBzYW1lIG9yZGVyIGFzIGl0IGN1cnJlbnRseQotICBsb2FkcyBjbGFzc2VzLiAKLSAgCi0qIEhhbmRsZSBjbGFzc3BhdGhzIHdpdGggc3BhY2VzCi0KLSogTWFrZSBzdXJlIFhTTFQgcHJvY2Vzc29ycyBjbG9zZSB0aGVpciBvdXRwdXQgZmlsZXMgaW4gPHN0eWxlPi4gIAotCi0qIHBlcmZvcm0gcHJvcGVyIHVwdG9kYXRlIGNoZWNrIGluIDxybWljPiB3aGVuIGNvbXBpbGluZyBmb3IgSUlPUC4KLQotKiA8amp0cmVlPidzIHVwdG9kYXRlIHRlc3Qgd29ya3MgZXZlbiBpZiBvdXRwdXRkaXJlY3RvcnkgaXMgbm90IHRoZQotICBwYXJlbnQgZGlyIG9mIHRhcmdldAotCi0qIDxjb3B5PiB3aWxsIHJlbW92ZSB0YXJnZXQgZmlsZSAoaWYgaXQgZXhpc3RzKSBiZWZvcmUgd3JpdGluZyB0byBpdCAtCi0gIHRoaXMgYXZvaWRzIHByb2JsZW1zIHdpdGggbGlua3Mgb24gZmlsZXN5c3RlbXMgdGhhdCBzdXBwb3J0IHRoZW0uCi0KLSogPGZ0cD4gbm93IHByb3Blcmx5IHJlY3Vyc2VzIHJlbW90ZSBkaXJlY3Rvcmllcy4KLQotKiA8ZnRwPiBjbG9zZXMgcmVtb3RlIGNvbm5lY3Rpb24gd2hlbiBpdCdzIGRvbmUuCi0KLSogPGp1bml0PiB0cmllcyB0byBpbmNsdWRlIGFsbCBuZWNlc3NhcnkgY2xhc3NlcyBmb3IgdGhlIHRhc2sgaXRzZWxmCi0gIHRvIHRoZSBjbGFzc3BhdGggd2hlbiBydW5uaW5nIGluIGZvcmsgbW9kZSAtIGRvZXNuJ3Qgd29yayBmb3IgSkRLIDEuMQotCi0qIDxhcHBseT4gYW5kIDxleGVjb24+IGRvIG5vdyBleGVjdXRlIHRoZSBjb21tYW5kIG9ubHkgb25jZSwgaWYgeW91Ci0gIHNwZWNpZnkgdGhlIHBhcmFsbGVsIGF0dHJpYnV0ZSAtIGluc3RlYWQgb2Ygb25jZSBwZXIgZmlsZXNldC4KLQotKiBkaXJlY3RvcnkgYmFzZWQgdGFza3MgYW5kIGZpbGVzZXQgY291bGQgbWlzcyBzb21lIGluY2x1ZGVkIGZpbGVzIGluCi0gIGRpcmVjdG9yaWVzIHRoYXQgaGF2ZSBiZWVuIGV4Y2x1ZGVkCi0KLSogPGZpeGNybGY+IGZhaWxlZCBmb3IgbGFyZ2UgZmlsZXMuCi0KLSogPG1vdmU+IHJlbW92ZWQgZmlsZXMgeW91IHRyaWVkIHRvIG1vdmUgdG8gdGhlbXNlbHZlcy4KLQotKiA8c3FsPiB0YXNrIHdpbGwgbm90IHRydHkgdG8gcHJpbnQgdGhlIHJlc3VsdCBzZXQgdW5sZXNzIHRoZSBxdWVyeSBzdWNjZWVkZWQuCi0KLSogQW50IGNsYXNzbG9hZGVyIHdpbGwgbm93IGlnbm9yZSBwYXRocyB3aGljaCBhcmUgaW52YWxpZCByZWxhdGl2ZSB0byB0aGUKLSAgcHJvamVjdCBiYXNlCi0gIAotKiA8ZWpiamFyPiB3ZWJsb2dpYyBlbGVtZW50cyBjaGVjayBmb3IgamFyIGZpbGUgY2hhbmdlcyBoYXMgYmVlbiBmaXhlZC4KLSAgUHJldmlvdXNseSBzb21lIGNoYW5nZXMgd291bGQgbm90IGJlIGluY2x1ZGVkLgotCi0qIHByb3BlcnRpZXMgbG9hZGVkIGZyb20gcHJvcGVydGllcyBmaWxlcyBhcmUgbm93IHJlc29sdmVkIGludGVybmFsbHkuIFRoaXMKLSAgcmVtb3ZlcyB0aGUgc3B1cmlvdXMgd2FybmluZ3MgYWJvdXQgdXNhZ2Ugb2YgcHJvcGVydGllcyB3aGljaCBoYXZlIG5vdCBiZWVuCi0gIHNldC4KLSAgCi0qIDxqYXI+IHRhc2sgYW5kIGZyaWVuZHMgbm93IHByb2Nlc3MgdGhlIEpBUiBtYW5pZmVzdCB0byBlbnN1cmUgaXQgaXMgdmFsaWQuCi0KLSogVGhlIHRhc2sgZmluaXNoZWQgZXZlbnQgbm93IGluY2x1ZGVzIGFueSBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSB0YXNrLgotCi0qIDxqYXZhPiB0YXNrIG5vdyBzdXBwb3J0cyBhIGp2bVZlcnNpb24gYXR0cmlidXRlIHNvIHRoYXQgaWYgYW5vdGhlciBKVk0gaXMKLSAgYmVpbmcgdXNlZCwgQW50IGNhbiBkZXRlcm1pbmUgd2hpY2ggb3B0aW9ucyB0byB1c2UgZm9yIGZlYXR1cmVzIHN1Y2ggYXMgdGhlIAotICBWTSBtZW1vcnkgbGltaXRzIAotCi0gIAotQ2hhbmdlcyBmcm9tIEFudCAxLjIgdG8gQW50IDEuMwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKiBBbnQgZG9lc24ndCBzZWFyY2ggZm9yIHRoZSBidWlsZGZpbGUgYW55bW9yZSwgdW5sZXNzIHlvdSB1c2UgdGhlIG5ldwotICAtZmluZCBhcmd1bWVudC4KLQotKiA8cGVyZm9yY2U+IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGEgbnVtYmVyIG9mIG5ldyB0YXNrcy4KLQotKiA8amF2YWM+IGlzIG5vdyBpbXBsZW1lbnRlZCB1c2luZyBhIGZhY3RvcnkuIFRoaXMgbWFrZXMgZXh0ZW5kaW5nCi0gIGphdmFjIHRvIHVzZSBhIG5ldyBjb21waWxlciBhIGxvdCBlYXNpZXIgYnV0IG1heSBicmVhayBjdXN0b20KLSAgdmVyc2lvbnMgb2YgdGhpcyB0YXNrIHRoYXQgcmVseSBvbiB0aGUgb2xkIGltcGxlbWVudGF0aW9uLgotCi0qIFRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSB4bWwgZm9ybWF0dGVyIGZvciA8anVuaXQ+IGhhcyBjaGFuZ2VkIGEKLSAgbGl0dGxlLCBpdCBkb2Vzbid0IGFwcGVuZCAiIHNlYyIgaW4gdGhlIHRpbWUgYXR0cmlidXRlIGFueW1vcmUuCi0KLU90aGVyIGNoYW5nZXM6Ci0tLS0tLS0tLS0tLS0tLQotCi0qIEEgR1VJIEZyb250ZW5kOiBBbnRpZG90ZS4gVGhpcyBpcyBjdXJyZW50bHkgaW4gZGV2ZWxvcG1lbnQuIEF0IHRoaXMKLSAgdGltZSwgdGhpcyBpcyBub3QgcGFydCBvZiB0aGUgQW50IHJlbGVhc2UsIGFsdGhvdWdoIHRoZSBzb3VyY2UgaXMKLSAgaW5jbHVkZWQgaWYgeW91IGFyZSBpbnRlcmVzdGVkLgotCi0qIE5ldyB0YXNrczogc3R5bGVib29rLCBwcm9wZXJ0eWZpbGUsIGRlcGVuZCwgYW50bHIsIHRlbG5ldCwgY3NjLAotICBpbGFzbSwgYXBwbHksIGphdmFoLCBzZXZlcmFsIGNsZWFyY2FzZSB0YXNrcywganVuaXRyZXBvcnQsIHNvdW5kCi0KLSogQWRkZWQgb3V0cHV0IGF0dHJpYnV0ZSB0byA8amF2YT4uCi0KLSogQWRkZWQgbmVzdGVkIHppcGZpbGVzZXQgZWxlbWVudCB0byA8emlwPgotCi0qIENoYW5nZWQgPHNxbD4gc28gdGhhdCBwcmludGluZyBpcyBhdCB0aGUgdGFzayBsZXZlbCByYXRoZXIgdGhhbiAKLSAgdGhlIHN0YXRlbWVudCBsZXZlbC4KLSAgCi0qIGphdmFkb2MgdGFzayB3aWxsIHBhc3MgLWQgZmxhZyB0byBhbnkgZG9jbGV0IGlmIHRoZSBkZXN0RGlyIGF0dHJpYnV0ZSBpcwotICBnaXZlbi4gSWYgdGhlIGRvY2xldCBkb2VzIG5vdCBhY2NlcHQgdGhlIC1kIGZsYWcgdGhlbiBvbWl0IHRoZSBkZXN0ZGlyCi0gIGF0dHJpYnV0ZS4KLQotKiA8Y2FiPiBjYW4gd29yayBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMgd2l0aCB0aGUgaGVscCBvZiBsaWJjYWJpbmV0LiAKLSAgU2VlIGh0dHA6Ly90cmlsbC5jaXMuZm9yZGhhbS5lZHUvfmJhcmJhY2hhL2NhYmluZXRfbGlicmFyeS8uCi0KLSogPGZ0cD4gbm93IHN1cHBvcnRzIHBhc3NpdmUgbW9kZS4KLQotKiBOZXcgPG1hcHBlcj4gZGF0YSB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGluZmx1ZW5jZSBvbiB0aGUKLSAgdGFyZ2V0IGZpbGVzIGZvciBzb21lIHRhc2tzIGxpa2UgPGNvcHk+IG9yIGVuYWJsZSBuZXcgdHlwZXMgb2YgdGFza3MKLSAgbGlrZSA8YXBwbHk+LgotCi0qIDxleGVjb24+IHByb3ZpZGVzIG1vcmUgY29udHJvbCBvdmVyIHRoZSBjb21tYW5kIGxpbmUgbm93LCB0aGUgbmFtZXMKLSAgb2YgdGhlIHNvdXJjZSBmaWxlcyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGJlIGF0IHRoZSBlbmQgb2YgdGhlCi0gIGNvbW1hbmQuCi0KLSogU3R5bGUgdGFza3Mgd2lsbCBub3cgc3VwcG9ydCBUcmFYIGNvbXBsaWFudCBYU0wgcHJvY2Vzc29ycyBpZiBvbmUgaXMgcHJlc2VudAotICBpbiB5b3VyIGNsYXNzcGF0aC4gIAotCi0qIEFkZGVkIGEgZmFpbG9uZXJyb3IgdG8gdGhlIGphdmFjIHRhc2suIElmIHNldCB0byBmYWxzZSwgdGhlIGJ1aWxkIHdpbGwgCi0gIGNvbnRpbnVlIGV2ZW4gaWYgdGhlcmUgYXJlIGNvbXBpbGF0aW9uIGVycm9ycy4KLSAgCi0qIEFkZGVkIG5lc3RlZCBmb3JtYXQgZWxlbWVudHMgdG8gdGhlIHRzdGFtcCB0YXNrIGFsbG93aW5nIGFkZGl0aW9uYWwgdGltZSAKLSAgZm9ybWF0cyB0byBiZSBkZWZpbmVkIGZvciBhcmJpdHJhcnkgcHJvcGVydGllcy4gICAKLQotKiBBZGRlZCBjbGFzc3BhdGggYXR0cmlidXRlIGFuZCBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQgdG8gPHByb3BlcnR5PgotICB0byBtYWtlIHRoZSByZXNvdXJjZSBhdHRyaWJ1dGUgbW9yZSBwb3dlcmZ1bC4KLQotKiAke30gcHJvcGVydHkgZXhwYW5zaW9uIHdpbGwgbm93IGJlIHBlcmZvcm1lZCBvbiB0aGUgcGF0dGVybnMgcmVhZAotICBmcm9tIGZpbGVzIHNwZWNpZmllZCBhcyBpbmNsdWRlc2ZpbGUgb3IgZXhjbHVkZXNmaWxlIGF0dHJpYnV0ZXMuCi0gIAotKiBUaGUgPHRhcj4gYW5kIDx1bnRhcj4gdGFza3Mgbm93IHN1cHBvcnQgR05VIGZvcm1hdCBmb3IgaGFuZGxpbmcgcGF0aHMKLSAgd2hpY2ggYXJlIGdyZWF0ZXIgdGhhbiAxMDAgY2hhcmFjdGVycyBpbiBsZW5ndGguIEluIGFkZGl0aW9uIHRoZSA8dGFyPgotICB0YXNrIG5vdyBzdXBwb3J0cyBuZXN0ZWQgZmlsZXNldHMgdGhyb3VnaCB3aGljaCB0aGUgZmlsZSBwZXJtaXNzaW9ucwotICBtYXkgYmUgY29udHJvbGxlZC4KLQotKiB3bHJ1biwgd2xzdG9wIGFuZCBlamJqYXIgbm93IHN1cHBvcnQgV2VibG9naWMgNi4wCi0KLSogVGhlIE1QYXNyZSB0YXNrIGhhcyBiZWVuIHVwZGF0ZWQgdG8gd29yayB3aXRoIE1QYXJzZSAyLjAKLQotKiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBzaWduaWZpY2FudGx5IHVwZGF0ZWQuCi0KLQotRml4ZWQgYnVnczoKLS0tLS0tLS0tLS0tCi0KLSogPHNpZ25qYXI+IGRvZXNuJ3QgdXNlIGRlcHJlY3RhdGVkIG1ldGhvZHMgYW55bW9yZS4KLQotKiBqYXZhZG9jJ3MgZmFpbG9uZXJyb3IgYXR0cmlidXRlIHdvcmtzIGFnYWluCi0KLSogamF2YWRvYydzIGFkZGl0aW9uYWxwYXJhbSBhdHRyaWJ1dGUgd2lsbCBub3cgYmUgc3BsaXQgaW50byBzZXBhcmF0ZQotICBwYXJhbWV0ZXJzIChvbiBzcGFjZXMpIHRvIGFsbG93IGZvciBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4KLQotKiBDaGFuZ2VkIDxzcWw+IHRhc2sgc28gdGhhdCBwcmludGluZyByZXN1bHQgc2V0cyB3b3JrcyBvbiBPcmFjbGUKLQotKiBDaGFuZ2VzIHRvIGRkY3JlYXRvciBhbmQgZWpiYyBoZWxwZXIgdG8gcmVzcGVjdCB0aGUgZGVzY3JpcHRvciBoaWVyYXJjaHkKLSAga2VwcGdlbmVyYXRlZCBpbiBlamJjIGNhbiBub3cgYmUgdHVybmVkIG9mZgotICAKLSogZWpiamFyIG5vdyBjb3JyZWN0bHkgaWdub3JlcyA8ZWpiLXJlZj4gZWxlbWVudHMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgQ01QIGZpbGVzIGFyZSBpbmNsdWRlZCBieSBwYXJzaW5nIHRoZSB3ZWJsb2dpYyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmF0aGVyIAotICB0aGFuIHJlbHlpbmcgb24gdGhlIG5hbWluZyBjb252ZW50aW9uIHVzZWQgaW4gYW50IDEuMgotICAKLSogZWpiamFyIGluY2x1ZGVzIHN1cGVyIGNsYXNzZXMgYW5kIHN1cGVyIGludGVyZmFjZXMgaW50byB0aGUgZ2VuZXJhdGVkIGVqYiAKLSAgamFyIGZpbGVzLiBUaGUgPHN1cHBvcnQ+IG5lc3RlZCBlbGVtZW50IGFsbG93cyBzdXBwb3J0IGNsYXNzZXMgdG8gYmUgCi0gIGluY2x1ZGVkIGluIHRoZSBFSkIgamFyLiBUaGUgdG9wbGluayBlbGVtZW50IHNob3VsZCBub3cgY29ycmVjdGx5IGxvY2F0ZQotICB0aGUgdG9wbGluayBkZXNjcmlwdG9yLgotICAKLSogPHZzc2dldD4gbm93IGNvcnJlY3RseSBkZWFscyB3aXRoIHNwYWNlcyBpbiBhcmd1bWVudHMKLQotKiA8amFyPiBmYWlscyBlYXJseSBpZiBhIGdpdmVuIG1hbmlmZXN0IGZpbGUgZG9lc24ndCBleGlzdAotCi0qIDxybWljPiBkb2Vzbid0IHNlYXJjaCBmb3IgdGhlIF9Ta2VsIGZpbGUgYW55bW9yZSB3aGVuIHN0dWJ2ZXJzaW9uIGlzCi0gIHNldCB0byAxLjIuCi0KLSogPHJtaWM+IHVzZXMgdGhlIHRoZSBzYW1lIGNsYXNzcGF0aCB0byB2ZXJpZnkgYSBjbGFzcyBjYW4gYmUgcm1pYydkCi0gIGFzIGl0IHBhc3NlcyB0byB0aGUgY29tcGlsZXIuIAotCi0qIG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZSAoYW5kIHRoZXJlZm9yZSA8bWFpbD4pIGNhbiBub3cKLSAgaGFuZGxlIFNNVFAgc2VydmVycyBzZW5kaW5nIG11bHRpIGxpbmUgcmVzcG9uc2VzLgotCi0qIG5lc3RlZCA8Y2xhc3NwYXRoPiBlbGVtZW50cyBvZiA8dGFza2RlZj4gbm93IHdvcmsgZm9yIDx0YXNrZGVmPnMgbm90Ci0gIG5lc3RlZCBpbnRvIDx0YXJnZXQ+IGFzIHdlbGwuCi0KLSogPHByb3BlcnR5PiBhbmQgPGF2YWlsYWJsZT4gd2lsbCBzZWFyY2ggZm9yIHRoZSByZXNvdXJjZSAiZm9vIiBpbnN0ZWFkCi0gIG9mICIvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZm9vIiB3aGVuIGdpdmVuIGEgcmVsYXRpdmUgcmVzb3VyY2UKLSAgbmFtZSBmb28uCi0gIAotKiBIYW5kbGUgYnVpbGQgZmlsZXMgaW4gZGlyZWN0b3JpZXMgd2hvc2UgbmFtZSBjb250YWluZWQgYSAiIyIgY2hhcmFjdGVyCi0KLSogPGp1bml0PiBjYW4gbm93IGxvZyB0byBmaWxlcyB3aG9zZSBuYW1lIGNvbnRhaW5zIGEgY29tbWEgYXMgd2VsbC4gCi0KLSogVGhlIEFudENsYXNzTG9hZGVyIG5vdyByZWZlcnMgdG8gdGhlIGxvYWRlciB3aGljaCBsb2FkZWQgaXQsIGFueSAKLSAgcmVxdWVzdHMgaXQgZG9lcyBub3QgaGFuZGxlIGl0c2VsZi4gUHJldmlvdXNseSB0aGVzZSB3ZW50IHRvIHRoZSAKLSAgcHJpbW9yZGlhbCBsb2FkZXIuCi0KLUNoYW5nZXMgZnJvbSBBbnQgMS4xIHRvIEFudCAxLjIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogU2VtYW50aWNzIG9mIDxwcm9wZXJ0eT4gaGFzIGNoYW5nZWQgYWdhaW4gaW4gdGhlIGhvcGUgdG8gYmUgbW9yZQotaW50dWl0aXZlLiAke30gZXhwYW5zaW9uIG5vdyBoYXBwZW5zIGF0IHJ1bnRpbWUgYW5kIDxwcm9wZXJ0eT4gdGFncwotbGl2aW5nIGluc2lkZSBvZiB0YXJnZXRzIG9ubHkgdGFrZSBlZmZlY3QgaWYgdGhleSBhcmUgdmlzaXRlZCBhdAotcnVudGltZS4KLQotQXMgYSBzaWRlIGVmZmVjdCBvZiB0aGlzIGNoYW5nZSwgdGFzaydzIGF0dHJpYnV0ZXMgZ2V0IHNldCBhdCBydW50aW1lCi1ub3QgYXQgcGFyc2VyIHRpbWUgYXMgd2VsbCwgd2hpY2ggbWlnaHQgY2hhbmdlIHRoZSByZXN1bHRzIG9mCi08c2NyaXB0PnMgb3Igb3RoZXIgY3VzdG9tIHRhc2tzIHRoYXQgcmVmZXJlbmNlIG90aGVyIHRhc2tzIGJ5IHRoZWlyIGlkCi1hdHRyaWJ1dGUuCi0KLSogY29weWluZyBvZiBzdXBwb3J0IGZpbGVzIGluIDxqYXZhYz4gaGFzIGJlZW4gcmVtb3ZlZCAtIGFzIHdlbGwgYXMKLXRoZSBmaWx0ZXJpbmcgYXR0cmlidXRlLgotCi0qIHRoZSA8ZXhwYW5kPiBhbmQgPGtleXN1YnN0PiB0YXNrcyBoYXZlIGJlZW4gcmVtb3ZlZC4KLQotKiB0aGUgaWdub3JlIGFuZCBpdGVtcyBhdHRyaWJ1dGVzIG9mIGRpcmVjdG9yeSBiYXNlZCB0YXNrcyBoYXZlIGJlZW4gcmVtb3ZlZC4KLQotKiB0aGUgY29tbWFuZCBsaW5lIHN3aXRjaGVzIF9ub3RfIHN0YXJ0aW5nIHdpdGggLSBoYXZlIGJlZW4gcmVtb3ZlZC4KLQotKiBQYXRoIGFuZCBFbnVtZXJhdGVkQXR0cmlidXRlIGhhdmUgYmVlbiBtb3ZlZCBmcm9tCi1vcmcuYXBhY2hlLnRvb2xzLmFudCB0byBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4KLQotKiB0aGUgY2xhc3MgYXR0cmlidXRlcyBvZiA8YXZhaWxhYmxlPiwgPGphdmE+LCA8cm1pYz4gYW5kIDx0YXNrZGVmPgotaGF2ZSBiZWVuIHJlbW92ZWQuCi0KLSogdGhlIHNyYyBhdHRyaWJ1dGUgb2YgPGNobW9kPiBoYXMgYmVlbiByZW1vdmVkLgotCi0qIDxwYXRjaD4gYW5kIDxqYXZhZG9jPiBoYXZlIGxvc3Qgc29tZSBvZiB0aGVpciBhdHRyaWJ1dGVzLgotCi0qIDxqYXZhPiBhbmQgPGN2cz4gaGF2ZSBsb3N0IHNvbWUgdW5kb2N1bWVudGVkIGF0dHJpYnV0ZXMuCi0KLSogdGhlIFVuaXggYW50UnVuIHNjcmlwdCB3b3VsZCBzZWFyY2ggZm9yIGNvbW1hbmQuc2ggaW4gdGhlIGRpcmVjdG9yeQotaXQgY2hhbmdlZCB0byBhbmQgaW52b2tlIHRoaXMgaW5zdGVhZCBvZiBjb21tYW5kIGlmIHByZXNlbnQuIFRoaXMKLWJlaGF2aW9yIGhhcyBiZWVuIGRyb3BwZWQuCi0KLSogPGVqYmphcj4gdGFzayBzeW50YXggaGFzIGJlZW4gY2hhbmdlZCBzaWduaWZpY2FudGx5Ci0KLSogPGV4ZWM+IGlzIG5vIGxvbmdlciBpbXBsZW1lbnRlZCBieSBvcmcuYXBhY2hlLnRvb2wuYW50LnRhc2tkZWZzLkV4ZWMuIAotQ3VzdG9tIHRhc2tzIHRoYXQgcmVseSBvbiBQcm9qZWN0LmNyZWF0ZVRhc2soImV4ZWMiKSB0byByZXR1cm4gYW4KLWluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYXJlIGdvaW5nIHRvIGZhaWwuCi0KLSogbmVzdGVkIDxpbmNsdWRlPiBhbmQgPGV4Y2x1ZGU+IGVsZW1lbnRzIGV4cGVjdCB0aGUgdmFsdWUgb2YgdGhlaXIKLW5hbWUgYXR0cmlidXRlIHRvIGJlIGEgc2luZ2xlIHBhdHRlcm4sIHRoZXkgZG9uJ3QgYWNjZXB0IG11bHRpcGxlCi1wYXR0ZXJucyBhbnltb3JlLiBTcGxpdCB0aGVtIGludG8gbXVsdGlwbGUgZWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZS4KLQotKiA8ZGVsZXRlIGRpcj0ic29tZWRpciIgLz4gd2lsbCBub3cgZGVsZXRlIHRoZSBkaXJlY3RvcnkgaXRzZWxmIGFzCi13ZWxsIGFzIGFsbCBpbmNsdWRlZCBmaWxlcy4gSWYgeW91IGp1c3Qgd2FudCB0byBjbGVhbiBvdXQgdGhlCi1kaXJlY3RvcnkgYW5kIGtlZXAgdGhlIGVtcHR5IG9uZSwgdXNlIGEgbmVzdGVkIGZpbGVzZXQuCi0KLU90aGVyIGNoYW5nZXM6Ci0tLS0tLS0tLS0tLS0tLQotCi0qIE5ldyB0YXNrczogYW50c3RydWN0dXJlLCBjYWIsIGV4ZWNvbiwgZmFpbCwgZnRwLCBnZW5rZXksIGpsaW5rLAotanVuaXQsIHNxbCwgamF2YWNjLCBqanRyZWUsIHN0YXJ0ZWFtLCB3YXIsIHVud2FyLCB1cHRvZGF0ZSwKLW5hdGl2ZTJhc2NpaSwgY29weSwgbW92ZSwgbXBhcnNlLgotCi0qIGNvcHlkaXIsIGNvcHlmaWxlLCBkZWx0cmVlIGFuZCByZW5hbWUgYXJlIG5vdyBkZXByZWNhdGVkLiBUaGV5Ci1zaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IGNvcHksIGRlbGV0ZSBhbmQgbW92ZSB0YXNrcy4KLQotKiA8amF2YT4gdXNlcyBhIENsYXNzTG9hZGVyIG9mIGl0cyBvd24gaW4gbm8tZm9yayBtb2RlIGlmIGEgY2xhc3NwYXRoIGlzCi1zcGVjaWZpZWQuCi0KLSogPHN0eWxlPiB3aWxsIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHRhcmdldCBkaXJlY3RvcmllcyBhbmQgcmVwcm9jZXNzCi1hbGwgZmlsZXMgaWYgdGhlIHN0eWxlc2hlZXQgY2hhbmdlcy4KLQotKiBOZXcgZGF0YSB0eXBlcyBmaWxlc2V0IGFuZCBwYXR0ZXJuc2V0IC0gZXhwZWN0ZWQgdG8gZ2V0IGEgYnJvYWRlciB1c2UuCi1UaGV5LCBhcyB3ZWxsIGFzIFBBVEggbGlrZSBzdHJ1Y3R1cmVzLCBjYW4gbm93IGJlIGRlZmluZWQgb24gYSBnbG9iYWwKLWxldmVsIGFuZCBsYXRlciBiZSByZWZlcmVuY2VkIGJ5IHRoZWlyIGlkIGF0dHJpYnV0ZS4KLQotKiBZb3UgY2FuIHNwZWNpZnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIDxleGVjPi4KLQotKiA8Z2V0PiBjYW4gY2hlY2sgd2hldGhlciBhIHJlbW90ZSBmaWxlIGlzIGFjdHVhbGx5IG5ld2VyIHRoYW4gYSBsb2NhbAotY29weSBiZWZvcmUgaXQgc3RhcnRzIGEgZG93bmxvYWQgKEhUVFAgb25seSkuCi0KLSogQWRkZWQgYSAtbG9nZ2VyIG9wdGlvbiB0byBhbGxvdyB0aGUgY2xhc3Mgd2hpY2ggcGVyZm9ybXMgbG9nZ2luZyB0byBiZSAKLXNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi0qIEFkZGVkIGEgLWVtYWNzIG9wdGlvbiB0byB0ZWxsIHRoZSBsb2dnZXIgdG8gbGVhdmUgb3V0IHRhc2tuYW1lIGFkb3JubWVudHMKLW9uIGxvZyBvdXRwdXQuCi0KLSogPGNobW9kPiB3b3JrcyBvbiBhbGwgZmlsZXMgaW4gcGFyYWxsZWwgYW5kIHN1cHBvcnRzIG11bHRpcGxlIGZpbGVzZXRzLgotCi0qIDxyZXBsYWNlPiBjYW4gbm93IHVzZSB0b2tlbnMgYW5kL29yIHZhbHVlcyB0aGF0IGNyb3NzIGxpbmUgYm91bmRhcmllcy4KLQotKiBidWlsZC5jb21waWxlciBzdXBwb3J0cyBub3cganZjIGFzIHdlbGwuCi0KLSogcHJvamVjdCBzcGVjaWZpYyBoZWxwIGNhbiBub3cgYmUgb2J0YWluZWQgd2l0aCB0aGUgLXByb2plY3RoZWxwIG9wdGlvbi4KLQotKiBBZGRlZCBhIC1kZWJ1ZyBvcHRpb24gdG8gbWFrZSAtdmVyYm9zZSBsZXNzIHZlcmJvc2UgKGFuZCBtb3JlIHVzZWZ1bCkKLQotKiBBbnQgd2lsbCBub3cgc2VhcmNoIGZvciBhIGZpbGUgbmFtZWQgYnVpbGQueG1sIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5Ci1hbmQgYWJvdmUgKHRvd2FyZHMgdGhlIHJvb3Qgb2YgdGhlIGZpbGVzeXN0ZW0pIGlmIHlvdSBkaWRuJ3Qgc3BlY2lmeQotLWJ1aWxkZmlsZSBhbmQgdGhlcmUgaXMgbm8gYnVpbGQueG1sIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLQotKiA8ZWNobz4gY2FuIG5vdyB3cml0ZSB0byBhIGZpbGUgYW5kIGFjY2VwdHMgbmVzdGVkIHRleHQuCi0KLUZpeGVkIGJ1Z3M6Ci0tLS0tLS0tLS0tLQotCi0qIDxjaG1vZD4gZGlkbid0IHdvcmsgd2hlbiB1c2VkIGFzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2suCi0KLSogUGF0aCwgQXZhaWxhYmxlLCBQcm9wZXJ0eSBkaWRuJ3QgcmVzb2x2ZSByZWxhdGl2ZSBmaWxlbmFtZXMgd2l0aAotcmVzcGVjdCB0byB0aGUgUHJvamVjdCdzIGJhc2VkaXIuCi0KLSogUHJvamVjdCBkaWRuJ3QgaW50ZXJwcmV0IHRoZSBiYXNlZGlyIGF0dHJpYnV0ZSBjb3JyZWN0bHkgaW4gYWxsCi1jYXNlcy4KLQotKiBOZXN0ZWQgPHNyYz4gaW4gPGphdmFjPiBjYXVzZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24uCi0KLSogQ29ycnVwdCBaaXAtIGFuZCBKYXItZmlsZXMgYXIgbm93IGRlbGV0ZWQgaWYgdGhlIHRhc2sgZmFpbHMuCi0KLSogbWFueSBtb3JlIGZpeGVzIHdlJ3ZlIGZvcmdvdHRlbiB0byBkb2N1bWVudCBoZXJlIC4uLgotCi0qIFRoZSBwYWNrYWdlbGlzdGxvYyBhdHRyaWJ1dGUgb2YgPGphdmFkb2M+J3MgPGxpbms+IGNoaWxkIHdpbGwgYmUKLSAgcmVzb2x2ZWQgYXMgYSBmaWxlIChpLmUuIGl0IGlzIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byAKLSAgYmFzZWRpcikuCmRpZmYgLS1naXQgYS9hbnQucHJvcGVydGllcy5zYW1wbGUgYi9hbnQucHJvcGVydGllcy5zYW1wbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTY1YjUuLjAwMDAwMDAKLS0tIGEvYW50LnByb3BlcnRpZXMuc2FtcGxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgYSBzYW1wbGUgLmFudC5wcm9wZXJ0aWVzIGZpbGUgdXNlZCBmb3IgYnVpbGRpbmcgYW50LgotIyBNb2RpZnkgaXQgZm9yIHlvdXIgb3duIG5lZWRzIGFuZCBjb3B5IGl0IHRvIC5hbnQucHJvcGVydGllcyAKLSMKLSMgPC0tIHN0YXJ0cyBhIGNvbW1lbnQKLQotIyBJZiB5b3Ugd2FudGVkIHRvIHVzZSB0aGUgYmV0dGVyIHRoYW4gYXZlcmFnZSBqaWtlcyBjb21waWxlciB1bmNvbW1lbnQgbmV4dCBsaW5lCi0jIGJ1aWxkLmNvbXBpbGVyPWppa2VzCi0jIGJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzPXRydWUKLSMgYnVpbGQuY29tcGlsZXIucGVkYW50aWM9dHJ1ZQotIyBidWlsZC5jb21waWxlci5kZXBlbmQ9dHJ1ZQotCi0jIElmIHlvdSB3YW50IHRvIHVzZSBub24tc3RhbmRhcmQgamFycyB0aGVuIGVkaXQgZm9sbG93aW5nIGxpbmVzCi0jIGphci5qdW5pdD0vcGF0aC90by9teS9qdW5pdC5qYXIKLQpkaWZmIC0tZ2l0IGEvYm9vdHN0cmFwLmJhdCBiL2Jvb3RzdHJhcC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4N2FmNjEuLjAwMDAwMDAKLS0tIGEvYm9vdHN0cmFwLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLUBlY2hvIG9mZgotCi1SRU0gWW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IEpBVkFfSE9NRSBpZiBjb21waWxpbmcgd2l0aCAxLjIgb3IgbGF0ZXIuCi0KLXNldCBPTERKQVZBPSVKQVZBJQotc2V0IE9MREpBVkFDPSVKQVZBQyUKLXNldCBPTERDTEFTU1BBVEg9JUNMQVNTUEFUSCUKLXNldCBPTERBTlRIT01FPSVBTlRfSE9NRSUKLQotc2V0IEFOVF9IT01FPS4KLQotaWYgIiIgPT0gIiVKQVZBJSIgIGlmICIiID09ICIlSkFWQV9IT01FJSIgc2V0IEpBVkE9amF2YQotaWYgIiIgPT0gIiVKQVZBJSIgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IEpBVkE9JUpBVkFfSE9NRSVcYmluXGphdmEKLQotaWYgIiIgPT0gIiVKQVZBQyUiIGlmICIiID09ICIlSkFWQV9IT01FJSIgc2V0IEpBVkFDPWphdmFjCi1pZiAiIiA9PSAiJUpBVkFDJSIgICAgICAgICAgICAgICAgICAgICAgICBzZXQgSkFWQUM9JUpBVkFfSE9NRSVcYmluXGphdmFjCi0KLWVjaG8uCi1lY2hvIC4uLiBCb290c3RyYXBwaW5nIEFudCBEaXN0cmlidXRpb24KLQotaWYgICAgICIlT1MlIiA9PSAiV2luZG93c19OVCIgaWYgZXhpc3QgYm9vdHN0cmFwXG51bCBybWRpci9zL3EgYm9vdHN0cmFwCi1pZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBpZiBleGlzdCBib290c3RyYXBcbnVsIGRlbHRyZWUveSBib290c3RyYXAKLWlmICAgICAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGlmIGV4aXN0IGJ1aWxkXGNsYXNzZXNcbnVsIHJtZGlyL3MvcSBidWlsZFxjbGFzc2VzCi1pZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBpZiBleGlzdCBidWlsZFxjbGFzc2VzXG51bCBkZWx0cmVlL3kgYnVpbGRcY2xhc3NlcwotCi1TRVQgTE9DQUxDTEFTU1BBVEg9bGliXGNyaW1zb24uamFyO2xpYlxqYXhwLmphcjtsaWJcb3B0aW9uYWxcanVuaXQuamFyCi0KLWlmIGV4aXN0ICIlSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyIiBjYWxsIHNyY1xzY3JpcHRcbGNwLmJhdCAlSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyCi1pZiBleGlzdCAiJUpBVkFfSE9NRSVcbGliXGNsYXNzZXMuemlwIiBjYWxsIHNyY1xzY3JpcHRcbGNwLmJhdCAlSkFWQV9IT01FJVxsaWJcY2xhc3Nlcy56aXAKLQotc2V0IFRPT0xTPXNyY1xtYWluXG9yZ1xhcGFjaGVcdG9vbHMKLXNldCBDTEFTU0RJUj1jbGFzc2VzCi0KLVNFVCBDTEFTU1BBVEg9JUxPQ0FMQ0xBU1NQQVRIJTslQ0xBU1NESVIlO3NyY1xtYWluOyVDTEFTU1BBVEglCi0KLWVjaG8gSkFWQV9IT01FPSVKQVZBX0hPTUUlCi1lY2hvIEpBVkE9JUpBVkElCi1lY2hvIEpBVkFDPSVKQVZBQyUKLWVjaG8gQ0xBU1NQQVRIPSVDTEFTU1BBVEglCi0KLWlmICAgICAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGlmIGV4aXN0ICVDTEFTU0RJUiVcbnVsIHJtZGlyL3MvcSAlQ0xBU1NESVIlCi1pZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBpZiBleGlzdCAlQ0xBU1NESVIlXG51bCBkZWx0cmVlL3kgJUNMQVNTRElSJQotCi1pZiBub3QgZXhpc3QgJUNMQVNTRElSJVxudWwgbWtkaXIgJUNMQVNTRElSJQotaWYgbm90IGV4aXN0IGJ1aWxkXG51bCBta2RpciBidWlsZAotaWYgbm90IGV4aXN0IGJ1aWxkXGNsYXNzZXNcbnVsIG1rZGlyIGJ1aWxkXGNsYXNzZXMKLQotZWNoby4KLWVjaG8gLi4uIENvbXBpbGluZyBBbnQgQ2xhc3NlcwotCi0iJUpBVkFDJSIgLWQgJUNMQVNTRElSJSAlVE9PTFMlXHRhclwqLmphdmEgJVRPT0xTJVx6aXBcKi5qYXZhICVUT09MUyVcYW50XCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1wqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcKi5qYXZhICVUT09MUyVcYW50XHV0aWxcKi5qYXZhICVUT09MUyVcYW50XHV0aWxccmVnZXhwXFJlZ2V4cE1hdGNoZXIuamF2YSAlVE9PTFMlXGFudFx1dGlsXHJlZ2V4cFxSZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhICVUT09MUyVcYW50XHRhc2tkZWZzXGNvbmRpdGlvblwqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcY29tcGlsZXJzXCouamF2YSAKLQotZWNoby4KLWVjaG8gLi4uIENvcHlpbmcgUmVxdWlyZWQgRmlsZXMKLQotY29weSAlVE9PTFMlXGFudFx0YXNrZGVmc1wqLnByb3BlcnRpZXMgJUNMQVNTRElSJVxvcmdcYXBhY2hlXHRvb2xzXGFudFx0YXNrZGVmcwotY29weSAlVE9PTFMlXGFudFx0eXBlc1wqLnByb3BlcnRpZXMgJUNMQVNTRElSJVxvcmdcYXBhY2hlXHRvb2xzXGFudFx0eXBlcwotCi1lY2hvLgotZWNobyAuLi4gQnVpbGRpbmcgQW50IERpc3RyaWJ1dGlvbgotCi14Y29weSAvcy9xICVDTEFTU0RJUiUgYnVpbGRcY2xhc3NlcwotCi0iJUpBVkElIiAlQU5UX09QVFMlIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4gLWVtYWNzIGJvb3RzdHJhcAotCi1lY2hvLgotZWNobyAuLi4gQ2xlYW5pbmcgVXAgQnVpbGQgRGlyZWN0b3JpZXMKLQotaWYgICAgICIlT1MlIiA9PSAiV2luZG93c19OVCIgaWYgZXhpc3QgJUNMQVNTRElSJVxudWwgcm1kaXIvcy9xICVDTEFTU0RJUiUKLWlmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGlmIGV4aXN0ICVDTEFTU0RJUiVcbnVsIGRlbHRyZWUveSAlQ0xBU1NESVIlCi0KLWVjaG8uCi1lY2hvIC4uLiBEb25lIEJvb3RzdHJhcHBpbmcgQW50IERpc3RyaWJ1dGlvbgotCi1zZXQgSkFWQT0lT0xESkFWQSUKLXNldCBKQVZBQz0lT0xESkFWQUMlCi1zZXQgQ0xBU1NQQVRIPSVPTERDTEFTU1BBVEglCi1zZXQgQU5UX0hPTUU9JU9MREFOVEhPTUUlCi1zZXQgT0xESkFWQT0KLXNldCBPTERKQVZBQz0KLXNldCBPTERDTEFTU1BBVEg9Ci1zZXQgTE9DQUxDTEFTU1BBVEg9Ci1zZXQgT0xEQU5USE9NRT0KLXNldCBUT09MUz0KLQpkaWZmIC0tZ2l0IGEvYm9vdHN0cmFwLnNoIGIvYm9vdHN0cmFwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTBiNjk3Li4wMDAwMDAwCi0tLSBhL2Jvb3RzdHJhcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgY2xhc3NwYXRoICYgamF2YV9ob21lIGFyZSBpbiBVbml4IGZvcm1hdCBiZWZvcmUgd2UgdXNlIHRoZW0KLWlmIFsgIiRPU1RZUEUiID0gImN5Z3dpbjMyIiBdIHx8IFsgIiRPU1RZUEUiID0gImN5Z3dpbiIgXSA7IHRoZW4KLSAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRDTEFTU1BBVEgiYAotICBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKLWZpCi0KLSMgWW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IEpBVkFfSE9NRSBpZiBjb21waWxpbmcgd2l0aCAxLjIgb3IgbGF0ZXIuCi0KLWlmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCi0gIGlmIFsgLWYgIiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphciIgXSA7IHRoZW4KLSAgICBDTEFTU1BBVEg9JENMQVNTUEFUSDokSkFWQV9IT01FL2xpYi90b29scy5qYXIKLSAgZmkKLSAKLSAgaWYgWyAtZiAiJEpBVkFfSE9NRS9saWIvY2xhc3Nlcy56aXAiIF0gOyB0aGVuCi0gICAgQ0xBU1NQQVRIPSRDTEFTU1BBVEg6JEpBVkFfSE9NRS9saWIvY2xhc3Nlcy56aXAKLSAgZmkKLWVsc2UKLSAgZWNobyAiV2FybmluZzogSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQuIgotICBlY2hvICIgIElmIGJ1aWxkIGZhaWxzIGJlY2F1c2Ugc3VuLiogY2xhc3NlcyBjb3VsZCBub3QgYmUgZm91bmQiCi0gIGVjaG8gIiAgeW91IHdpbGwgbmVlZCB0byBzZXQgdGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgZWNobyAiICB0byB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBqYXZhLiIKLWZpCi0KLSMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXM6Ci0jIEpBVkFfSE9NRS9qcmUvc2ggZm9yIGphdmEgYW5kIHJtaWQKLSMgSkFWQV9IT01FL3NoIGZvciBqYXZhYyBhbmQgcm1pYwotaWYgWyAteiAiJEpBVkFDIiBdIDsgdGhlbgotICBpZiBbIC1uICIkSkFWQV9IT01FIiAgXSA7IHRoZW4KLSAgICBpZiBbIC14ICIkSkFWQV9IT01FL3NoL2phdmFjIiBdIDsgdGhlbiAKLSAgICAgIEpBVkFDPSR7SkFWQV9IT01FfS9zaC9qYXZhYzsKLSAgICBlbHNlCi0gICAgICBKQVZBQz0ke0pBVkFfSE9NRX0vYmluL2phdmFjOwotICAgIGZpCi0gIGVsc2UKLSAgICBKQVZBQz1qYXZhYwotICBmaQotZmkKLWlmIFsgLXogIiRKQVZBQ01EIiBdIDsgdGhlbiAKLSAgaWYgWyAtbiAiJEpBVkFfSE9NRSIgIF0gOyB0aGVuCi0gICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4gCi0gICAgICBKQVZBQ01EPSRKQVZBX0hPTUUvanJlL3NoL2phdmEKLSAgICBlbHNlCi0gICAgICBKQVZBQ01EPSRKQVZBX0hPTUUvYmluL2phdmEKLSAgICBmaQotICBlbHNlCi0gICAgSkFWQUNNRD1qYXZhCi0gIGZpCi1maQotIAotaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KLSAgZWNobyAiRXJyb3I6IEpBVkFfSE9NRSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkuIgotICBlY2hvICIgIFdlIGNhbm5vdCBleGVjdXRlICRKQVZBQ01EIgotICBleGl0Ci1maQotCi1BTlRfSE9NRT0uCi1leHBvcnQgQU5UX0hPTUUKLQotZWNobyAuLi4gQm9vdHN0cmFwcGluZyBBbnQgRGlzdHJpYnV0aW9uCi0KLWlmIFsgLWQgImJvb3RzdHJhcCIgXSA7IHRoZW4KLSAgcm0gLXIgYm9vdHN0cmFwCi1maQotCi1pZiBbIC1kICJidWlsZC9jbGFzc2VzIiBdIDsgdGhlbgotICBybSAtciBidWlsZC9jbGFzc2VzCi1maQotCi1DTEFTU1BBVEg9bGliL2NyaW1zb24uamFyOmxpYi9qYXhwLmphcjoke0NMQVNTUEFUSH0KLQotRElSTElCUz1saWIvb3B0aW9uYWwvKi5qYXIKLWZvciBpIGluICR7RElSTElCU30KLWRvCi0gICAgIyBpZiB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LCB0aGVuIGl0IHdpbGwgcmV0dXJuIHRoZSBpbnB1dCBzdHJpbmcKLSAgICAjIHRoaXMgaXMgc3R1cGlkLCBzbyBjYXNlIGZvciBpdAotICAgIGlmIFsgIiRpIiAhPSAiJHtESVJMSUJTfSIgXSA7IHRoZW4KLSAgICAgICAgQ0xBU1NQQVRIPSRDTEFTU1BBVEg6IiRpIgotICAgIGZpCi1kb25lCi0KLVRPT0xTPXNyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMKLUNMQVNTRElSPWNsYXNzZXMKLQotQ0xBU1NQQVRIPSR7Q0xBU1NESVJ9OnNyYy9tYWluOiR7Q0xBU1NQQVRIfQotCi0jIGNvbnZlcnQgdGhlIHVuaXggcGF0aCB0byB3aW5kb3dzCi1pZiBbICIkT1NUWVBFIiA9ICJjeWd3aW4zMiIgXSB8fCBbICIkT1NUWVBFIiA9ICJjeWd3aW4iIF0gOyB0aGVuCi0gICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJENMQVNTUEFUSCJgCi1maQotCi1leHBvcnQgQ0xBU1NQQVRICi0KLW1rZGlyIC1wICR7Q0xBU1NESVJ9Ci1ta2RpciAtcCBidWlsZAotbWtkaXIgLXAgYmluCi0KLWVjaG8gLi4uIENvbXBpbGluZyBBbnQgQ2xhc3NlcwotCi0iJHtKQVZBQ30iIC1kICR7Q0xBU1NESVJ9ICR7VE9PTFN9L3Rhci8qLmphdmEgJHtUT09MU30vemlwLyouamF2YSBcCi0gICAgJHtUT09MU30vYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXIuamF2YSBcCi0gICAgJHtUT09MU30vYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXJGYWN0b3J5LmphdmEgXAotICAgICR7VE9PTFN9L2FudC91dGlsLyouamF2YSAke1RPT0xTfS9hbnQvdHlwZXMvKi5qYXZhIFwKLSAgICAke1RPT0xTfS9hbnQvKi5qYXZhICR7VE9PTFN9L2FudC90YXNrZGVmcy8qLmphdmEgXAotICAgICR7VE9PTFN9L2FudC90YXNrZGVmcy9jb21waWxlcnMvKi5qYXZhIFwKLSAgICAke1RPT0xTfS9hbnQvdGFza2RlZnMvY29uZGl0aW9uLyouamF2YQotCi1lY2hvIC4uLiBDb3B5aW5nIFJlcXVpcmVkIEZpbGVzCi0KLWNwIHNyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMgXAotICAgICR7Q0xBU1NESVJ9L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzCi1jcCBzcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIFwKLSAgICAke0NMQVNTRElSfS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcwotY3Agc3JjL3NjcmlwdC9hbnRSdW4gYmluCi1jaG1vZCAreCBiaW4vYW50UnVuCi0KLWVjaG8gLi4uIEJ1aWxkaW5nIEFudCBEaXN0cmlidXRpb24KLQotY3AgLXIgJHtDTEFTU0RJUn0gYnVpbGQKLQotIiR7SkFWQUNNRH0iIC1jbGFzc3BhdGggIiR7Q0xBU1NQQVRIfSIgLURhbnQuaG9tZT0uIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4gLWVtYWNzIGJvb3RzdHJhcAotCi1lY2hvIC4uLiBDbGVhbmluZyBVcCBCdWlsZCBEaXJlY3RvcmllcwotCi1ybSAtcmYgJHtDTEFTU0RJUn0KLXJtIC1yZiBiaW4KLQotZWNobyAuLi4gRG9uZSBCb290c3RyYXBwaW5nIEFudCBEaXN0cmlidXRpb24KZGlmZiAtLWdpdCBhL2J1aWxkLmJhdCBiL2J1aWxkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzNjMzE1Yy4uMDAwMDAwMAotLS0gYS9idWlsZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLQotc2V0IE9MRENMQVNTUEFUSD0lQ0xBU1NQQVRIJQotc2V0IFJFQUxfQU5UX0hPTUU9JUFOVF9IT01FJQotc2V0IEFOVF9IT01FPWJvb3RzdHJhcAotaWYgZXhpc3QgYm9vdHN0cmFwXGxpYlxhbnQuamFyIGlmIGV4aXN0IGJvb3RzdHJhcFxiaW5cYW50LmJhdCBpZiBleGlzdCBib290c3RyYXBcYmluXGxjcC5iYXQgaWYgZXhpc3QgYm9vdHN0cmFwXGJpblxhbnRSdW4uYmF0IGdvdG8gcnVuQW50Ci1jYWxsIGJvb3RzdHJhcC5iYXQKLWlmIGV4aXN0IGJvb3RzdHJhcFxsaWJcYW50LmphciBpZiBleGlzdCBib290c3RyYXBcYmluXGFudC5iYXQgaWYgZXhpc3QgYm9vdHN0cmFwXGJpblxsY3AuYmF0IGlmIGV4aXN0IGJvb3RzdHJhcFxiaW5cYW50UnVuLmJhdCBnb3RvIHJ1bkFudAotZWNobyBCb290c3RyYXAgRkFJTEVECi1nb3RvIGNsZWFudXAKLQotOnJ1bkFudAotc2V0IExPQ0FMQ0xBU1NQQVRIPWxpYlxjcmltc29uLmphcjtsaWJcamF4cC5qYXI7Ym9vdHN0cmFwXGxpYlxhbnQuamFyCi1mb3IgJSVpIGluIChsaWJcb3B0aW9uYWxcKi5qYXIpIGRvIGNhbGwgYm9vdHN0cmFwXGJpblxsY3AuYmF0ICIlJWkiCi1zZXQgQ0xBU1NQQVRIPSVMT0NBTENMQVNTUEFUSCU7JUNMQVNTUEFUSCUKLXNldCBMT0NBTENMQVNTUEFUSD0KLQotaWYgbm90ICIlUkVBTF9BTlRfSE9NRSUiID09ICIiIGdvdG8gaW5zdGFsbF9hbnQKLWNhbGwgYm9vdHN0cmFwXGJpblxhbnQuYmF0IC1lbWFjcyAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQotZ290byBjbGVhbnVwCi0KLTppbnN0YWxsX2FudAotY2FsbCBib290c3RyYXBcYmluXGFudC5iYXQgLWVtYWNzIC1EYW50Lmluc3RhbGw9IiVSRUFMX0FOVF9IT01FJSIgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKLQotcmVtIGNsZWFuIHVwCi06Y2xlYW51cAotc2V0IEFOVF9IT01FPSVSRUFMX0FOVF9IT01FJQotc2V0IFJFQUxfQU5UX0hPTUU9Ci1zZXQgQ0xBU1NQQVRIPSVPTERDTEFTU1BBVEglCi1zZXQgT0xEQ0xBU1NQQVRIPQpkaWZmIC0tZ2l0IGEvYnVpbGQuc2ggYi9idWlsZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjYyMDg2Ny4uMDAwMDAwMAotLS0gYS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1SRUFMQU5USE9NRT0kQU5UX0hPTUUKLUFOVF9IT01FPWJvb3RzdHJhcAotZXhwb3J0IEFOVF9IT01FCi0KLWlmIHRlc3QgISAtZiBib290c3RyYXAvbGliL2FudC5qYXIgLW8gICEgLXggYm9vdHN0cmFwL2Jpbi9hbnQgLW8gISAteCBib290c3RyYXAvYmluL2FudFJ1biA7IHRoZW4KLSAgL2Jpbi9zaCAuL2Jvb3RzdHJhcC5zaAotZmkgICAgCi0KLWlmIHRlc3QgISAtZiBib290c3RyYXAvbGliL2FudC5qYXIgLW8gICEgLXggYm9vdHN0cmFwL2Jpbi9hbnQgLW8gISAteCBib290c3RyYXAvYmluL2FudFJ1biA7IHRoZW4KLSAgZWNobyBCb290c3RyYXAgRkFJTEVECi0gIGV4aXQKLWZpCi0KLUxPQ0FMQ0xBU1NQQVRIPWxpYi9jcmltc29uLmphcjpsaWIvamF4cC5qYXIKLSMgYWRkIGluIHRoZSBkZXBlbmRlbmN5IC5qYXIgZmlsZXMKLURJUkxJQlM9bGliL29wdGlvbmFsLyouamFyCi1mb3IgaSBpbiAke0RJUkxJQlN9Ci1kbwotICAgIGlmIFsgIiRpIiAhPSAiJHtESVJMSUJTfSIgXSA7IHRoZW4KLSAgICAgICAgTE9DQUxDTEFTU1BBVEg9JExPQ0FMQ0xBU1NQQVRIOiIkaSIKLSAgICBmaQotZG9uZQotCi1DTEFTU1BBVEg9JExPQ0FMQ0xBU1NQQVRIOiRDTEFTU1BBVEgKLWV4cG9ydCBDTEFTU1BBVEgKLQotCi1pZiBbICIkUkVBTEFOVEhPTUUiICE9ICIiIF0gOyB0aGVuCi0gIEFOVF9JTlNUQUxMPSItRGFudC5pbnN0YWxsPSRSRUFMQU5USE9NRSIKLWZpCi0KLWJvb3RzdHJhcC9iaW4vYW50IC1lbWFjcyAkQU5UX0lOU1RBTEwgJCoKLQpkaWZmIC0tZ2l0IGEvYnVpbGQueG1sIGIvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQ3YzczLi4wMDAwMDAwCi0tLSBhL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLSAKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBBbnQgb3duIGJ1aWxkIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0tLT4KLTxwcm9qZWN0IG5hbWU9IkFudCIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLSAgPCEtLSBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgd2l0aG91dCBlZGl0aW5nIHRoaXMgZmlsZSAKLSAgICAgICAoYW5kIHdpdGhvdXQgdHlwaW5nIC1EIGVhY2ggdGltZSBpdCBjb21waWxlcyBpdCkgLS0+Ci0gIDxwcm9wZXJ0eSBmaWxlPSIuYW50LnByb3BlcnRpZXMiIC8+Ci0gIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vLmFudC5wcm9wZXJ0aWVzIiAvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJOYW1lIiB2YWx1ZT0iQW50Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJuYW1lIiB2YWx1ZT0iYW50Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iMS41YWxwaGEiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iZGVidWciIHZhbHVlPSJ0cnVlIiAvPgotICA8cHJvcGVydHkgbmFtZT0iZGVwcmVjYXRpb24iIHZhbHVlPSJmYWxzZSIgLz4KLSAgPHByb3BlcnR5IG5hbWU9Im9wdGltaXplIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmZvcmsiIHZhbHVlPSJmYWxzZSIgLz4KLQotICA8IS0tIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIFNldCB0aGUgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBzb3VyY2UgdHJlZQotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gIC0tPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9InNyYyIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YS5kaXIiIHZhbHVlPSIke3NyYy5kaXJ9L21haW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InNjcmlwdC5kaXIiIHZhbHVlPSIke3NyYy5kaXJ9L3NjcmlwdCIvPgotICA8cHJvcGVydHkgbmFtZT0ibGliLmRpciIgdmFsdWU9ImxpYiIvPgotICA8cHJvcGVydHkgbmFtZT0iZG9jcy5kaXIiIHZhbHVlPSJkb2NzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cy5kaXIiIHZhbHVlPSJzcmMvdGVzdGNhc2VzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cy5ldGMuZGlyIiB2YWx1ZT0ic3JjL2V0Yy90ZXN0Y2FzZXMiLz4KLSAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJhbnQucGFja2FnZSIgdmFsdWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25hbC5wYWNrYWdlIiB2YWx1ZT0iJHthbnQucGFja2FnZX0vdGFza2RlZnMvb3B0aW9uYWwiLz4KLQotICA8cHJvcGVydHkgbmFtZT0ibWFuaWZlc3QiIHZhbHVlPSJzcmMvZXRjL21hbmlmZXN0Ii8+Ci0KLQotICA8IS0tIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIFNldCB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGJ1aWxkIGFyZWEKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJib290c3RyYXAuZGlyIiB2YWx1ZT0iYm9vdHN0cmFwIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYiIgdmFsdWU9IiR7YnVpbGQuZGlyfS9saWIiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmphdmFkb2NzIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2phdmFkb2NzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50ZXN0cyIgdmFsdWU9IiR7YnVpbGQuZGlyfS90ZXN0Y2FzZXMiLz4KLQotICA8cGF0aCBpZD0iY2xhc3NwYXRoIj4KLSAgPC9wYXRoPgotCi0gIDxwYXRoIGlkPSJ0ZXN0cy1jbGFzc3BhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9IiAvPgotICAgIDwhLS0KLSAgICAgICAgaW5jbHVkZSB0aGUgdGVzdCBzb3VyY2UgYW5kIHRlc3QgZGF0YSBkaXJzCi0gICAgICAgIHNvIHRoYXQgd2UgY2FuIHBpY2sgcmVzb3VyY2VzIHZpYSBnZXRSZXNvdXJjZShBc1N0cmVhbSkKLSAgICAgLS0+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3RzLmRpcn0iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdHMuZXRjLmRpcn0iLz4KLSAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoIiAvPgotICA8L3BhdGg+Ci0KLSA8IS0tIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIFNldCB1cCBwcm9wZXJ0aWVzIGZvciB0aGUgZGlzdHJpYnV0aW9uIGFyZWEKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QubmFtZSIgdmFsdWU9Impha2FydGEtJHtuYW1lfS0ke3ZlcnNpb259Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmJhc2UiIHZhbHVlPSJkaXN0cmlidXRpb24iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iZGlzdCIvPgotICA8cHJvcGVydHkgbmFtZT0iZGlzdC5iaW4iIHZhbHVlPSIke2Rpc3QuZGlyfS9iaW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QubGliIiB2YWx1ZT0iJHtkaXN0LmRpcn0vbGliIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRvY3MiIHZhbHVlPSIke2Rpc3QuZGlyfS9kb2NzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmphdmFkb2NzIiB2YWx1ZT0iJHtkaXN0LmRpcn0vZG9jcy9tYW51YWwvYXBpIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXN0LmRpciIgdmFsdWU9ImRpc3Qtc3JjIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlzdC5zcmMiIHZhbHVlPSIke3NyYy5kaXN0LmRpcn0vc3JjIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlzdC5kb2NzIiB2YWx1ZT0iJHtzcmMuZGlzdC5kaXJ9L2RvY3MiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXN0LmxpYiIgdmFsdWU9IiR7c3JjLmRpc3QuZGlyfS9saWIiLz4KLQotICA8IS0tIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIENoZWNrIHRvIHNlZSB3aGF0IG9wdGlvbmFsIGRlcGVuZGVuY2llcyBhcmUgYXZhaWxhYmxlICAgICAgICAgICAgICAKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJjaGVja19mb3Jfb3B0aW9uYWxfcGFja2FnZXMiPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkazEuMisiIGNsYXNzbmFtZT0iamF2YS5sYW5nLlRocmVhZExvY2FsIiAvPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkazEuMysiIGNsYXNzbmFtZT0iamF2YS5sYW5nLlN0cmljdE1hdGgiIC8+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS40KyIgY2xhc3NuYW1lPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIiAvPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImJzZi5wcmVzZW50IiAKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLmlibS5ic2YuQlNGTWFuYWdlciIgCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJuZXRyZXh4LnByZXNlbnQiIAotICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJuZXRyZXh4LmxhbmcuUmV4eCIKLSAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIiAvPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InhzbHAucHJlc2VudCIgCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9ImNvbS5rdmlzY28ueHNsLlhTTFByb2Nlc3NvciIgCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ4YWxhbi5wcmVzZW50IiAKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3JGYWN0b3J5IiAKLSAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIiAvPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InhhbGFuMi5wcmVzZW50IiAKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGwiIAotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIC8+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iZWpiLmVqYmMucHJlc2VudCIgCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9IndlYmxvZ2ljLmVqYmMiIAotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIC8+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iZWpiLkREQ3JlYXRvci5wcmVzZW50IiAKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0id2VibG9naWMuZWpiLnV0aWxzLkREQ3JlYXRvciIgCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJlamIud2xzLnByZXNlbnQiIAotICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJ3ZWJsb2dpYy5TZXJ2ZXIiIAotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIC8+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianVuaXQucHJlc2VudCIgCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9Imp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSIgCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJuZXRjb21wLnByZXNlbnQiIAotICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJjb20ub3JvaW5jLm5ldC5mdHAuRlRQQ2xpZW50IiAKLSAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIiAvPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InN0YXJ0ZWFtLnByZXNlbnQiIAotICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJjb20uc3RhcmJhc2UudXRpbC5QbGF0Zm9ybSIgCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJhbnRsci5wcmVzZW50IiAKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0iYW50bHIuVG9vbCIgCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InZhai5wcmVzZW50IiAKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLmlibS5pdmoudXRpbC5iYXNlLldvcmtzcGFjZSIgIAotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJzdHlsZWJvb2sucHJlc2VudCIgCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc3R5bGVib29rLkVuZ2luZSIgIAotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqYWthcnRhLnJlZ2V4cC5wcmVzZW50IiAKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5yZWdleHAuUkUiICAKLSAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamFrYXJ0YS5vcm8ucHJlc2VudCIgCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGVybDVNYXRjaGVyIiAgCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqbWYucHJlc2VudCIgCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9ImphdmF4LnNvdW5kLnNhbXBsZWQuQ2xpcCIgIAotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJpY29udHJhY3QucHJlc2VudCIKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLnJlbGlhYmxlc3lzdGVtcy5pQ29udHJhY3QuSUNvbnRyYWN0ZWQiCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkZXBlbmQucHJlc2VudCIgCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9ImpkZXBlbmQuZnJhbWV3b3JrLkpEZXBlbmQiICAKLSAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibG9nNGoucHJlc2VudCIKLSAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeSIKLSAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+Ci0gICAgPCEtLSB0aGlzIGlzIGp1c3QgYSB3YXkgdG8gY2hlY2sgZm9yIGEgVHJhWCBpbXBsZW1lbnRhdGlvbiAtLT4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0cmF4LmltcGwucHJlc2VudCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJNRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIKLSAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAKLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXZhbWFpbC5jb21wbGV0ZSI+Ci0gICAgICA8YW5kPgotICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgotICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXgubWFpbC5UcmFuc3BvcnQiCi0gICAgICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KLSAgICAgIDwvYW5kPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8IS0tIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIFByZXBhcmUgdGhlIGJ1aWxkICAgICAgICAgICAgICAKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KLSAgICA8dHN0YW1wPgotICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0ieWVhciIgcGF0dGVybj0ieXl5eSIgLz4KLSAgICA8L3RzdGFtcD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSAKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICBCdWlsZCB0aGUgY29kZSAgICAgICAgICAgCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iYnVpbGQiIAotICAgICAgICAgIGRlcGVuZHM9InByZXBhcmUsIGNoZWNrX2Zvcl9vcHRpb25hbF9wYWNrYWdlcyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IGNvbXBpbGVzIHRoZSBzb3VyY2UgY29kZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgIAotICAgIDxqYXZhYyBzcmNkaXI9IiR7amF2YS5kaXJ9IgotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCi0gICAgICAgICAgIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKLSAgICAgICAgICAgb3B0aW1pemU9IiR7b3B0aW1pemV9IiA+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwTWF0Y2hlci5qYXZhIiAKLSAgICAgICAgICAgICAgIHVubGVzcz0iamFrYXJ0YS5yZWdleHAucHJlc2VudCIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7YW50LnBhY2thZ2V9L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyLmphdmEiIAotICAgICAgICAgICAgICAgdW5sZXNzPSJqYWthcnRhLm9yby5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vdXRpbC9yZWdleHAvSmRrMTRSZWdleHBNYXRjaGVyLmphdmEiIAotICAgICAgICAgICAgICAgdW5sZXNzPSJqZGsxLjQrIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEiCi0gICAgICAgICAgICAgICB1bmxlc3M9ImpkazEuMisiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS9saXN0ZW5lci9Mb2c0akxpc3RlbmVyLmphdmEiCi0gICAgICAgICAgICAgICB1bmxlc3M9ImxvZzRqLnByZXNlbnQiIC8+Ci0KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vSUNvbnRyYWN0LmphdmEiIHVubGVzcz0iaWNvbnRyYWN0LnByZXNlbnQiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1NjcmlwdC5qYXZhIiB1bmxlc3M9ImJzZi5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9TdHlsZUJvb2suamF2YSIgdW5sZXNzPSJzdHlsZWJvb2sucHJlc2VudCIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vTmV0UmV4eEMuamF2YSIgdW5sZXNzPSJuZXRyZXh4LnByZXNlbnQiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1hzbHBMaWFpc29uLmphdmEiIHVubGVzcz0ieHNscC5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9YYWxhbkxpYWlzb24uamF2YSIgdW5sZXNzPSJ4YWxhbi5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9lamIvRWpiYyouamF2YSIgdW5sZXNzPSJlamIuZWpiYy5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9lamIvRERDcmVhdG9yKi5qYXZhIiB1bmxlc3M9ImVqYi5ERENyZWF0b3IucHJlc2VudCIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vZWpiL1dMUnVuLmphdmEiIHVubGVzcz0iZWpiLndscy5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9lamIvV0xTdG9wLmphdmEiIHVubGVzcz0iZWpiLndscy5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9lamIvRWpiSmFyLmphdmEiIHVubGVzcz0iamRrMS4yKyIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vZWpiLypEZXBsb3ltZW50VG9vbC5qYXZhIiB1bmxlc3M9ImpkazEuMisiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2VqYi9JUGxhbmV0Ki5qYXZhIiB1bmxlc3M9ImpkazEuMisiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L0phdmFoLmphdmEiIHVubGVzcz0iamRrMS4yKyIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vanVuaXQvKiIgdW5sZXNzPSJqdW5pdC5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9uZXQvTWltZU1haWwuamF2YSIgdW5sZXNzPSJqYXZhbWFpbC5jb21wbGV0ZSIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vbmV0L0ZUUC5qYXZhIiB1bmxlc3M9Im5ldGNvbXAucHJlc2VudCIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vbmV0L1RlbG5ldFRhc2suamF2YSIgdW5sZXNzPSJuZXRjb21wLnByZXNlbnQiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3NjbS9BbnRTdGFyVGVhbSouamF2YSIgdW5sZXNzPSJzdGFydGVhbS5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9BTlRMUi5qYXZhIiB1bmxlc3M9ImFudGxyLnByZXNlbnQiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2lkZS9WQUoqLmphdmEiIHVubGVzcz0idmFqLnByZXNlbnQiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3BlcmZvcmNlLyouamF2YSIgdW5sZXNzPSJqYWthcnRhLm9yby5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9zb3VuZC8qLmphdmEiIHVubGVzcz0iam1mLnByZXNlbnQiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2p1bml0L1hNTFJlc3VsdEFnZ3JlZ2F0b3IuamF2YSIKLSAgICAgICAgICAgICAgIHVubGVzcz0ieGFsYW4ucHJlc2VudCIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vanVuaXQvQWdncmVnYXRlVHJhbnNmb3JtZXIuamF2YSIKLSAgICAgICAgICAgICAgIHVubGVzcz0ieGFsYW4ucHJlc2VudCIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vamRlcGVuZC8qIiB1bmxlc3M9ImpkZXBlbmQucHJlc2VudCIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc2l0cmFrYS8qKiIgdW5sZXNzPSJqYWthcnRhLm9yby5wcmVzZW50Ii8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L21ldGFtYXRhL01BdWRpdCoiIHVubGVzcz0iamFrYXJ0YS5vcm8ucHJlc2VudCIvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9tZXRhbWF0YS8qKiIgdW5sZXNzPSJqZGsxLjIrIiAvPgotICAgIDwvamF2YWM+Ci0gICAgCi0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIgLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0KLSAgICA8Y29weSAgICB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfSIgCi0gICAgICAgICAgICAgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi92ZXJzaW9uLnR4dCIgLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovZGVmYXVsdE1hbmlmZXN0Lm1mIiAvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbHRlcnNldD4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTiIgdmFsdWU9IiR7dmVyc2lvbn0iIC8+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IkRBVEUiIHZhbHVlPSIke1RPREFZfSIgLz4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iVElNRSIgdmFsdWU9IiR7VFNUQU1QfSIgLz4KLSAgICAgIDwvZmlsdGVyc2V0PgotICAgICAgCi0gICAgPC9jb3B5PgotCi0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30vJHtvcHRpb25hbC5wYWNrYWdlfS9qdW5pdC94c2wiPgotICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfS9ldGMiPgotICAgICAgICAgPGluY2x1ZGUgbmFtZT0ianVuaXQtZnJhbWVzLnhzbCIgLz4KLSAgICAgICAgIDxpbmNsdWRlIG5hbWU9Imp1bml0LW5vZnJhbWVzLnhzbCIgLz4KLSAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotCi0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSAKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAgICAgICAgQ3JlYXRlIHRoZSBhbnQgamFyczogYW50LmphciBhbmQgb3B0aW9uYWwuamFyCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iamFycyIgCi0gICAgICAgICAgZGVwZW5kcz0iYnVpbGQiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY3JlYXRlcyB0aGUgYW50IGphcnMiPgotCi0gICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmxpYn0vJHtuYW1lfS5qYXIiIAotICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIgCi0gICAgICAgICBtYW5pZmVzdD0iJHttYW5pZmVzdH0iPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvKioiIC8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIAotICAgICAgICAgICAgICAgaW5jbHVkZXM9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1RyYVhMaWFpc29uLmNsYXNzIiAvPgotICAgIDwvamFyPgotCi0gICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmxpYn0vb3B0aW9uYWwuamFyIiAKLSAgICAgICAgIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIAotICAgICAgICAgbWFuaWZlc3Q9IiR7bWFuaWZlc3R9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsLyoqIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb24uY2xhc3MiIC8+Ci0gICAgPC9qYXI+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLQotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIENyZWF0ZSB0aGUgZXNzZW50aWFsIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBydW4gYW50Ci0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJkaXN0LWxpdGUiIAotICAgICAgICAgIGRlcGVuZHM9ImphcnMiCi0gICAgICAgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIGEgbWluaW11bSBkaXN0cmlidXRpb24gdG8gcnVuIGFudCI+Ci0KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5iaW59Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtkaXN0LmxpYn0iLz4KLQotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QubGlifSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgIDwvY29weT4KLSAgICAKLSAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmJpbn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NjcmlwdC5kaXJ9LyIgLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5iaW59IiBlb2w9ImNybGYiIGluY2x1ZGVzPSIqLmJhdCIgLz4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5iaW59IiBlb2w9ImxmIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9ImFudCIgLz4KLSAgICAgIDxpbmNsdWRlIG5hbWU9ImFudFJ1biIgLz4KLSAgICA8L2ZpeGNybGY+Ci0gICAgPGZpeGNybGYgc3JjZGlyPSIke2Rpc3QuYmlufSIgaW5jbHVkZXM9InJ1bmFudC5wbCIgLz4KLQotICAgIDxjaG1vZCBwZXJtPSJ1Z28rcngiIGRpcj0iJHtkaXN0LmRpcn0iIHR5cGU9ImRpciIgaW5jbHVkZXM9IioqIiAvPgotICAgIDxjaG1vZCBwZXJtPSJ1Z28rciIgZGlyPSIke2Rpc3QuZGlyfSIgdHlwZT0iZmlsZSIgaW5jbHVkZXM9IioqIiAvPgotICAgIDxjaG1vZCBwZXJtPSJ1Z28reCIgdHlwZT0iZmlsZSI+Ci0gICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QuYmlufSI+Ci0gICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9hbnQiIC8+Ci0gICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9hbnRSdW4iIC8+Ci0gICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9ydW5hbnQucGwiIC8+Ci0gICAgICAgPC9maWxlc2V0PgotICAgIDwvY2htb2Q+Ci0gIDwvdGFyZ2V0PgotCi0gPCEtLQotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIENyZWF0ZSB0aGUgY29tcGxldGUgZGlzdHJpYnV0aW9uCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0iLS0+IGNyZWF0ZXMgYSBjb21wbGV0ZSBkaXN0cmlidXRpb24iPgotICAgIDxhbnRjYWxsIGluaGVyaXRBbGw9ImZhbHNlIiB0YXJnZXQ9ImludGVybmFsX2Rpc3QiPgotICAgICAgPHBhcmFtIG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iJHtkaXN0Lm5hbWV9IiAvPgotICAgIDwvYW50Y2FsbD4KLSAgPC90YXJnZXQ+ICAKLQotICA8dGFyZ2V0IG5hbWU9ImRpc3RfamF2YWRvY3MiIGRlcGVuZHM9ImphdmFkb2NzIj4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuamF2YWRvY3N9Ii8+Ci0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5qYXZhZG9jc30iIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuamF2YWRvY3N9Ii8+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLSAgCi0gIAotICA8dGFyZ2V0IG5hbWU9ImludGVybmFsX2Rpc3QiIGRlcGVuZHM9ImRpc3QtbGl0ZSxkaXN0X2phdmFkb2NzIj4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZG9jc30iLz4KLQotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QubGlifSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi56aXAiIC8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotCi0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5saWJ9IiBmaWxlPSIke2xpYi5kaXJ9L29wdGlvbmFsL1JFQURNRSIvPgotICAgIAotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZG9jc30iCi0gICAgICAgICAgZmlsdGVyaW5nPSJvbiI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZG9jcy5kaXJ9Ii8+Ci0gICAgPC9jb3B5PgotCi0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iLiI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IlJFQURNRSIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IlRPRE8iLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iV0hBVFNORVciLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iS0VZUyIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLQotICAgIDxjaG1vZCBwZXJtPSJ1Z28rcngiIGRpcj0iJHtkaXN0LmRpcn0iIHR5cGU9ImRpciIgaW5jbHVkZXM9IioqIiAvPgotICAgIDxjaG1vZCBwZXJtPSJ1Z28rciIgZGlyPSIke2Rpc3QuZGlyfSIgdHlwZT0iZmlsZSIgaW5jbHVkZXM9IioqIiAvPgotICAgIDxjaG1vZCBwZXJtPSJ1Z28reCIgdHlwZT0iZmlsZSI+Ci0gICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QuYmlufSI+Ci0gICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9hbnQiIC8+Ci0gICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9hbnRSdW4iIC8+Ci0gICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9ydW5hbnQucGwiIC8+Ci0gICAgICAgPC9maWxlc2V0PgotICAgIDwvY2htb2Q+Ci0KLSAgPC90YXJnZXQ+Ci0KLQotICA8IS0tCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgVGFyZ2V0IHRvIGNyZWF0ZSBib290c3RyYXAgYnVpbGQKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC0tPgotICA8dGFyZ2V0IG5hbWU9ImJvb3RzdHJhcCIgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIGEgYm9vdHN0cmFwIGJ1aWxkIj4KLSAgICA8YW50Y2FsbCBpbmhlcml0QWxsPSJmYWxzZSIgdGFyZ2V0PSJkaXN0LWxpdGUiPgotICAgICAgPHBhcmFtIG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iJHtib290c3RyYXAuZGlyfSIgLz4KLSAgICA8L2FudGNhbGw+Ci0gIDwvdGFyZ2V0PgotCi0KLSAgPCEtLQotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIENyZWF0ZSB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbgotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3JjLWRpc3QiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY3JlYXRlcyBhIHNvdXJjZSBkaXN0cmlidXRpb24iPgotCi0gICAgPG1rZGlyIGRpcj0iJHtzcmMuZGlzdC5kaXJ9IiAvPgotIAotICAgIDxjb3B5IHRvZGlyPSIke3NyYy5kaXN0LmxpYn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IiouemlwIiAvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcHRpb25hbC9SRUFETUUiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0KLSAgICA8Y29weSB0b2Rpcj0iJHtzcmMuZGlzdC5zcmN9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIvPgotICAgIDwvY29weT4KLQotICAgIDxjb3B5IHRvZGlyPSIke3NyYy5kaXN0LmRvY3N9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2NzLmRpcn0iPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJtYW51YWwvYXBpLyoqIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotCi0gICAgPGNvcHkgdG9kaXI9IiR7c3JjLmRpc3QuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9Ii4iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJSRUFETUUiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRSIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJUT0RPIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IldIQVRTTkVXIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IktFWVMiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iYnVpbGQuYmF0Ii8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImJ1aWxkLnNoIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImJvb3RzdHJhcC5iYXQiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iYm9vdHN0cmFwLnNoIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLQotICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtzcmMuZGlzdC5kaXJ9IiBlb2w9ImNybGYiIGluY2x1ZGVzPSIqLmJhdCIgLz4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7c3JjLmRpc3QuZGlyfSIgZW9sPSJsZiI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnNoIiAvPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovYW50IiAvPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovYW50UnVuIiAvPgotICAgIDwvZml4Y3JsZj4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7c3JjLmRpc3QuZGlyfSI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi9ydW5hbnQucGwiIC8+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+Ci0gICAgPC9maXhjcmxmPgotCi0gICAgPGNobW9kIHBlcm09InVnbyt4IiBkaXI9IiR7c3JjLmRpc3QuZGlyfSIgdHlwZT0iZGlyIi8+Ci0gICAgPGNobW9kIHBlcm09InVnbytyIiBkaXI9IiR7c3JjLmRpc3QuZGlyfSIgLz4KLSAgICA8Y2htb2QgcGVybT0idWdvK3giPgotICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlzdC5kaXJ9Ij4KLSAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLy5zaCIgLz4KLSAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2FudCIgLz4KLSAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2FudFJ1biIgLz4KLSAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL3J1bmFudC5wbCIgLz4KLSAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jaG1vZD4KLQotICA8L3RhcmdldD4KLQotICA8IS0tCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgQ3JlYXRlIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJkaXN0cmlidXRpb24iIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY3JlYXRlcyBhIGJpbmFyeSBkaXN0cmlidXRpb24iPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5iYXNlfSIvPgotCi0gICAgPGFudGNhbGwgaW5oZXJpdEFsbD0iZmFsc2UiIHRhcmdldD0iaW50ZXJuYWxfZGlzdCI+Ci0gICAgICA8cGFyYW0gbmFtZT0iZGlzdC5kaXIiIHZhbHVlPSIke2Rpc3QubmFtZX0iIC8+Ci0gICAgPC9hbnRjYWxsPgotICAgIDx6aXAgemlwZmlsZT0iJHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1iaW4uemlwIiAKLSAgICAgICAgIGJhc2VkaXI9IiR7ZGlzdC5uYW1lfS8uLiIgCi0gICAgICAgICBpbmNsdWRlcz0iJHtkaXN0Lm5hbWV9LyoqIgotICAgICAgICAgZXhjbHVkZXM9IiR7ZGlzdC5uYW1lfS9saWIvb3B0aW9uYWwuamFyIi8+Ci0gICAgPHRhciBsb25nZmlsZT0iZ251IgotICAgICAgICAgdGFyZmlsZT0iJHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1iaW4udGFyIj4KLSAgICAgIDx0YXJmaWxlc2V0IGRpcj0iJHtkaXN0Lm5hbWV9Ly4uIiBtb2RlPSI3NTUiIHVzZXJuYW1lPSJhbnQiIGdyb3VwPSJhbnQiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluL2FudCIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluL2FudFJ1biIvPgotICAgICAgPC90YXJmaWxlc2V0PiAKLSAgICAgIDx0YXJmaWxlc2V0IGRpcj0iJHtkaXN0Lm5hbWV9Ly4uIiB1c2VybmFtZT0iYW50IiBncm91cD0iYW50Ij4gCi0gICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlzdC5uYW1lfS8qKiIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluL2FudCIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluL2FudFJ1biIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vbGliL29wdGlvbmFsLmphciIvPgotICAgICAgPC90YXJmaWxlc2V0PiAKLSAgICA8L3Rhcj4KLSAgICA8Z3ppcCB6aXBmaWxlPSIke2Rpc3QuYmFzZX0vJHtkaXN0Lm5hbWV9LWJpbi50YXIuZ3oiIAotICAgICAgICAgIHNyYz0iJHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1iaW4udGFyIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke2Rpc3QuYmFzZX0vJHtkaXN0Lm5hbWV9LWJpbi50YXIiLz4KLSAgICA8Y29weSBmaWxlPSIke2Rpc3QubmFtZX0vbGliL29wdGlvbmFsLmphciIgdG9maWxlPSIke2Rpc3QuYmFzZX0vJHtkaXN0Lm5hbWV9LW9wdGlvbmFsLmphciIvPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3QubmFtZX0iIC8+Ci0KLQotICAgIDxhbnRjYWxsIGluaGVyaXRBbGw9ImZhbHNlIiB0YXJnZXQ9InNyYy1kaXN0Ij4KLSAgICAgIDxwYXJhbSBuYW1lPSJzcmMuZGlzdC5kaXIiIHZhbHVlPSIke2Rpc3QubmFtZX0iIC8+Ci0gICAgPC9hbnRjYWxsPgotICAgIDx6aXAgemlwZmlsZT0iJHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1zcmMuemlwIiAKLSAgICAgICAgIGJhc2VkaXI9IiR7ZGlzdC5uYW1lfS8uLiIgCi0gICAgICAgICBpbmNsdWRlcz0iJHtkaXN0Lm5hbWV9LyoqIi8+Ci0gICAgPHRhciBsb25nZmlsZT0iZ251IgotICAgICAgICAgdGFyZmlsZT0iJHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyIiA+Ci0gICAgICA8dGFyZmlsZXNldCBkaXI9IiR7ZGlzdC5uYW1lfS8uLiIgbW9kZT0iNzU1IiB1c2VybmFtZT0iYW50IiBncm91cD0iYW50Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jvb3RzdHJhcC5zaCIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYnVpbGQuc2giLz4KLSAgICAgIDwvdGFyZmlsZXNldD4gCi0gICAgICA8dGFyZmlsZXNldCBkaXI9IiR7ZGlzdC5uYW1lfS8uLiIgdXNlcm5hbWU9ImFudCIgZ3JvdXA9ImFudCI+IAotICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vKioiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jvb3RzdHJhcC5zaCIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYnVpbGQuc2giLz4KLSAgICAgIDwvdGFyZmlsZXNldD4KLSAgICA8L3Rhcj4gCi0gICAgPGd6aXAgemlwZmlsZT0iJHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyLmd6IiAKLSAgICAgICAgICBzcmM9IiR7ZGlzdC5iYXNlfS8ke2Rpc3QubmFtZX0tc3JjLnRhciIvPgotICAgIDxkZWxldGUgZmlsZT0iJHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdC5uYW1lfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLQotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIENsZWFucyB1cCBidWlsZCBhbmQgZGlzdHJpYnV0aW9uIGRpcmVjdG9yaWVzCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IGNsZWFucyB1cCBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmJhc2V9IiAvPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3QuZGlyfSIgLz4KLSAgICA8ZGVsZXRlPiAKLSAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IioqLyp+IiBkZWZhdWx0ZXhjbHVkZXM9Im5vIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PiAKLQotICA8IS0tCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgQ2xlYW5zIGV2ZXJ5dGhpbmcKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC0tPgotICA8dGFyZ2V0IG5hbWU9ImFsbGNsZWFuIiAKLSAgICAgICAgICBkZXBlbmRzPSJjbGVhbiIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IGNsZWFucyB1cCBldmVyeXRoaW5nIj4KLSAgICA8ZGVsZXRlIGZpbGU9IiR7Ym9vdHN0cmFwLmRpcn0vYmluL2FudFJ1biIgLz4KLSAgICA8ZGVsZXRlIGZpbGU9IiR7Ym9vdHN0cmFwLmRpcn0vYmluL2FudFJ1bi5iYXQiIC8+Ci0gIDwvdGFyZ2V0PiAKLQotICA8IS0tCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgSW5zdGFsbHMgYW50Ci0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBpZj0iYW50Lmluc3RhbGwiPgotICAgIDxhbnRjYWxsIGluaGVyaXRBbGw9ImZhbHNlIiB0YXJnZXQ9ImludGVybmFsX2Rpc3QiPgotICAgICAgPHBhcmFtIG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iJHthbnQuaW5zdGFsbH0iIC8+Ci0gICAgPC9hbnRjYWxsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtbGl0ZSIgaWY9ImFudC5pbnN0YWxsIj4KLSAgICA8YW50Y2FsbCBpbmhlcml0QWxsPSJmYWxzZSIgdGFyZ2V0PSJkaXN0LWxpdGUiPgotICAgICAgPHBhcmFtIG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iJHthbnQuaW5zdGFsbH0iIC8+Ci0gICAgPC9hbnRjYWxsPgotICA8L3RhcmdldD4KLQotICA8IS0tIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgIENyZWF0ZXMgdGhlIEFQSSBkb2N1bWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAtLT4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iamF2YWRvY19jaGVjayI+Ci0gICAgPHVwdG9kYXRlIHByb3BlcnR5PSJqYXZhZG9jLm5vdHJlcXVpcmVkIiAKLSAgICAgICAgICAgICAgdGFyZ2V0ZmlsZT0iJHtidWlsZC5qYXZhZG9jc30vcGFja2FnZXMuaHRtbCIgPgotICAgICAgICA8c3JjZmlsZXMgZGlyPSAiJHtqYXZhLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmphdmEiLz4KLSAgICA8L3VwdG9kYXRlPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2NzIiBkZXBlbmRzPSJwcmVwYXJlLCBqYXZhZG9jX2NoZWNrIiAKLSAgICAgICAgICB1bmxlc3M9ImphdmFkb2Mubm90cmVxdWlyZWQiCi0gICAgICAgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiI+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5qYXZhZG9jc30iLz4KLSAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuKiIKLSAgICAgICAgICAgICB1c2VleHRlcm5hbGZpbGU9InllcyIKLSAgICAgICAgICAgICBzb3VyY2VwYXRoPSIke2phdmEuZGlyfSIKLSAgICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmphdmFkb2NzfSIKLSAgICAgICAgICAgICBhdXRob3I9InRydWUiCi0gICAgICAgICAgICAgdmVyc2lvbj0idHJ1ZSIKLSAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iJHtOYW1lfSBBUEkiCi0gICAgICAgICAgICAgZG9jdGl0bGU9IiR7TmFtZX0iPgotICAgICAgPGdyb3VwIHRpdGxlPSJBbnQgQ29yZSIgcGFja2FnZXM9Im9yZy5hcGFjaGUudG9vbHMuYW50KiIgLz4KLSAgICAgIDxncm91cCB0aXRsZT0iQ29yZSBUYXNrcyIgcGFja2FnZXM9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzKiIgLz4KLSAgICAgIDxncm91cCB0aXRsZT0iT3B0aW9uYWwgVGFza3MiIHBhY2thZ2VzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbCoiIC8+Ci0KLSAgICAgIDxib3R0b20+Q29weXJpZ2h0ICYjMTY5OyAxOTk5LSR7eWVhcn0gQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9ib3R0b20+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgICAgICAgIENvbXBpbGUgdGVzdGNhc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iYnVpbGQiIGlmPSJqdW5pdC5wcmVzZW50Ij4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRlc3RzfSIvPgotCi0gICAgPGphdmFjIHNyY2Rpcj0iJHt0ZXN0cy5kaXJ9IgotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnRlc3RzfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgotICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtkZXByZWNhdGlvbn0iID4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RzLWNsYXNzcGF0aCIgLz4KLQotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQU5UTFJUZXN0LmphdmEiIAotICAgICAgICAgICAgICAgdW5sZXNzPSJhbnRsci5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cE1hdGNoZXJUZXN0LmphdmEiIAotICAgICAgICAgICAgICAgdW5sZXNzPSJqYWthcnRhLnJlZ2V4cC5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb01hdGNoZXJUZXN0LmphdmEiIAotICAgICAgICAgICAgICAgdW5sZXNzPSJqYWthcnRhLm9yby5wcmVzZW50IiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBNYXRjaGVyVGVzdC5qYXZhIiAKLSAgICAgICAgICAgICAgIHVubGVzcz0iamRrMS40KyIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvKi5qYXZhIgotICAgICAgCQkJCSB1bmxlc3M9Impha2FydGEub3JvLnByZXNlbnQiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Yc2xwTGlhaXNvblRlc3QuamF2YSIgCi0gICAgICAgICAgICAgICB1bmxlc3M9InhzbHAucHJlc2VudCIvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWGFsYW5MaWFpc29uVGVzdC5qYXZhIiAKLSAgICAgICAgICAgICAgIHVubGVzcz0ieGFsYW4ucHJlc2VudCIvPgotICAgIDwvamF2YWM+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZHVtcC1pbmZvIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJqYXZhLnZtLmluZm89JHtqYXZhLnZtLmluZm99IiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImphdmEudm0ubmFtZT0ke2phdmEudm0ubmFtZX0iIC8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iamF2YS52bS52ZW5kb3I9JHtqYXZhLnZtLnZlbmRvcn0iIC8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iamF2YS52bS52ZXJzaW9uPSR7amF2YS52bS52ZXJzaW9ufSIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJvcy5hcmNoPSR7b3MuYXJjaH0iIC8+Ci0gICAgPGVjaG8gbWVzc2FnZT0ib3MubmFtZT0ke29zLm5hbWV9IiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9Im9zLnZlcnNpb249JHtvcy52ZXJzaW9ufSIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJmaWxlLmVuY29kaW5nPSR7ZmlsZS5lbmNvZGluZ30iIC8+Ci0gICAgPGVjaG8gbWVzc2FnZT0idXNlci5sYW5ndWFnZT0ke3VzZXIubGFuZ3VhZ2V9IiAvPgotICA8L3RhcmdldD4KLQotICA8IS0tIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgICAgICBSdW4gdGVzdGNhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gIC0tPgotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9InJ1bi10ZXN0cyIgZGVzY3JpcHRpb249Ii0tPiBydW4gSlVuaXQgdGVzdHMiLz4KLQotICA8dGFyZ2V0IG5hbWU9InJ1bi10ZXN0cyIgZGVwZW5kcz0iZHVtcC1pbmZvLGNvbXBpbGUtdGVzdHMiIGlmPSJqdW5pdC5wcmVzZW50Ij4KLQotCi0gICAgPGp1bml0IHByaW50c3VtbWFyeT0ibm8iIGhhbHRvbmZhaWx1cmU9InllcyIgZm9yaz0iJHtqdW5pdC5mb3JrfSI+Ci08IS0tICAgICAgPGp2bWFyZyB2YWx1ZT0iLWNsYXNzaWMiLz4gLS0+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0cy1jbGFzc3BhdGgiLz4KLQotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdHMiIHZhbHVlPSIke2J1aWxkLnRlc3RzfSIvPgotCi0gICAgICA8Zm9ybWF0dGVyIHR5cGU9ImJyaWVmIiB1c2VmaWxlPSJmYWxzZSIgLz4KLQotICAgICAgPGJhdGNodGVzdD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3RzLmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypUZXN0KiIgLz4KLSAgICAgICAgICA8IS0tIGFic3RyYWN0IGNsYXNzLCBub3QgYSB0ZXN0Y2FzZSAtLT4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmc1Rlc3QuamF2YSIgLz4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyVGVzdC5qYXZhIiAvPgotCi0gICAgICAgICAgPCEtLSBoZWxwZXIgY2xhc3Nlcywgbm90IHRlc3RjYXNlcyAtLT4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmVGVzdCpUYXNrLmphdmEiIC8+Ci0KLSAgICAgICAgICA8IS0tIHRoZXNlIHRlc3RzIG5lZWQgdG8gYmUgbG9jYWxpc2VkIGJlZm9yZSBiZWluZyByYW4/Pz8/IC0tPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1B2Y3NUZXN0LmphdmEiIC8+Ci0KLSAgICAgICAgICA8IS0tIHRoZXNlIGRlcGVuZCBvbiBvcmRlciAtLT4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXBUZXN0LmphdmEiIC8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR3ppcFRlc3QuamF2YSIgLz4KLQotICAgICAgICAgIDwhLS0gb25seSBydW4gdGhlc2UgdGVzdHMgaWYgdGhlaXIgcmVxdWlyZWQgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgLS0+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQU5UTFJUZXN0LmphdmEiIAotICAgICAgICAgICAgICAgICAgIHVubGVzcz0iYW50bHIucHJlc2VudCIgLz4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwTWF0Y2hlclRlc3QuamF2YSIgCi0gICAgICAgICAgICAgICAgICAgdW5sZXNzPSJqYWthcnRhLnJlZ2V4cC5wcmVzZW50IiAvPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyVGVzdC5qYXZhIiAKLSAgICAgICAgICAgICAgICAgICB1bmxlc3M9Impha2FydGEub3JvLnByZXNlbnQiIC8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBNYXRjaGVyVGVzdC5qYXZhIiAKLSAgICAgICAgICAgICAgICAgICB1bmxlc3M9ImpkazEuNCsiIC8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9pZGUvVkFKRXhwb3J0VGVzdC5qYXZhIiB1bmxlc3M9InZhai5wcmVzZW50IiAvPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc2l0cmFrYS8qLmphdmEiIHVubGVzcz0iamFrYXJ0YS5vcm8ucHJlc2VudCIgLz4KLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgPCEtLSBydW4gd2hlbiB5b3UgaGF2ZSB0aGUgZW52aXJvbm1lbnQgc2V0dXAgdG8gc3VwcG9ydCB0aGVtIC0tPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GdHBUZXN0LmphdmEiIC8+Ci0KLSAgICAgICAgICA8IS0tIGl0J3MgYW4gYWJzdHJhY3QgY2xhc3MsIG5vdCBhIHRlc3QgLS0+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QuamF2YSIgLz4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Yc2xwTGlhaXNvblRlc3QuamF2YSIgdW5sZXNzPSJ4c2xwLnByZXNlbnQiLz4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YYWxhbkxpYWlzb25UZXN0LmphdmEiIHVubGVzcz0ieGFsYW4ucHJlc2VudCIvPgotICAgICAgICAgIAotICAgICAgICAgIDwhLS0gZWhtLCB0aGlzIGlzIG5vdCByZWFsbHkgYSBUcmFYIHRlc3QgYnV0IHJhdGhlciBhIHhhbGFuMiB0ZXN0Li4tLT4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvblRlc3QuamF2YSIgdW5sZXNzPSJ4YWxhbjIucHJlc2VudCIvPgotCi0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotCi0gICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5HemlwVGVzdCIgLz4KLSAgICAgIDx0ZXN0IG5hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdVbnppcFRlc3QiIC8+Ci0gICAgPC9qdW5pdD4KLQotICAgIDwhLS0gY2xlYW4gdXAgYWdhaW4gLS0+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7dGVzdHMuZXRjLmRpcn0vdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIudG1wIiAvPgotICAgIDxkZWxldGUgZGlyPSIke3Rlc3RzLmV0Yy5kaXJ9L3Rhc2tkZWZzL3Rhc2tkZWZzLnRtcCIgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0cy5ldGMuZGlyfS90YXNrZGVmcy50bXAiIC8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke3Rlc3RzLmV0Yy5kaXJ9L3Rhc2tkZWZzL3RtcC5qYXIiIC8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7dGVzdHMuZXRjLmRpcn0vdHlwZXMvY29weXRlc3QiIC8+Ci0gICAgPCEtLSBnZW5lcmF0ZWQgYnkgdGVzdGNhc2VzIGluIGp2bSBkaXIgLS0+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke3VzZXIuZGlyfS94YWxhbjEtcmVkaXJlY3Qtb3V0LnRtcCIgLz4KLSAgICA8ZGVsZXRlIGZpbGU9IiR7dXNlci5kaXJ9L3hhbGFuMi1yZWRpcmVjdC1vdXQudG1wIiAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InJ1bi1zaW5nbGUtdGVzdCIgaWY9InRlc3RjYXNlIiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KLQotICAgIDxqdW5pdCBwcmludHN1bW1hcnk9Im5vIiBoYWx0b25mYWlsdXJlPSJ5ZXMiIGZvcms9IiR7anVuaXQuZm9ya30iPgotPCEtLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1jbGFzc2ljIi8+IC0tPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdHMiIHZhbHVlPSIke2J1aWxkLnRlc3RzfSIvPgotICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9L2xpYi9jbGFzc2VzLnppcCIgLz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RzLWNsYXNzcGF0aCIvPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiIC8+Ci0gICAgICA8dGVzdCBuYW1lPSIke3Rlc3RjYXNlfSIgLz4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLQotICA8IS0tIAotICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgICAgICBNYWluIHRhcmdldCAtIHJ1bnMgZGlzdC1saXRlIGJ5IGRlZmF1bHQKLSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJtYWluIiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IGNyZWF0ZXMgYSBtaW5pbXVtIGRpc3RyaWJ1dGlvbiBpbiAuL2Rpc3QiPgotICAgIDxhbnRjYWxsIGluaGVyaXRBbGw9ImZhbHNlIiB0YXJnZXQ9ImRpc3QtbGl0ZSIvPgotICA8L3RhcmdldD4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9kb2NzLnhtbCBiL2RvY3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NThjYjljLi4wMDAwMDAwCi0tLSBhL2RvY3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iYnVpbGQtc2l0ZSIgZGVmYXVsdD0iZG9jcyIgYmFzZWRpcj0iLiI+Ci0KLSAgICA8IS0tIEluaXRpYWxpemF0aW9uIHByb3BlcnRpZXMgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9InByb2plY3QubmFtZSIgdmFsdWU9ImFudCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLnNyYyIgICAgIGxvY2F0aW9uPSJ4ZG9jcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLmRlc3QiICAgIGxvY2F0aW9uPSJkb2NzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InByb2plY3QuZmlsZSIgdmFsdWU9InN0eWxlc2hlZXRzL3Byb2plY3QueG1sIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzaXRlLmRpciIgICAgIGxvY2F0aW9uPSIuLi9qYWthcnRhLXNpdGUyIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZW1wbC5wYXRoIiAgIGxvY2F0aW9uPSJ4ZG9jcy9zdHlsZXNoZWV0cyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmVsb2NpdHkucHJvcHMiICAgbG9jYXRpb249IiR7ZG9jcy5zcmN9L3ZlbG9jaXR5LnByb3BlcnRpZXMiIC8+Ci0KLSAgICA8cGF0aCBpZD0iYW5ha2lhLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzaXRlLmRpcn0vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InByZXBhcmUiPiAgICAKLSAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudmVsb2NpdHkuYW5ha2lhLkFuYWtpYVRhc2siIAotICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJBbmFraWFUYXNrLnByZXNlbnQiPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYW5ha2lhLmNsYXNzcGF0aCIvPgotICAgICAgICA8L2F2YWlsYWJsZT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgZGVwZW5kcz0icHJlcGFyZSIgbmFtZT0icHJlcGFyZS1lcnJvciIgdW5sZXNzPSJBbmFraWFUYXNrLnByZXNlbnQiPgotICAgICAgICA8ZWNobz4KLSAgICAgICAgICAgIEFuYWtpYVRhc2sgaXMgbm90IHByZXNlbnQhIFBsZWFzZSBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCAKLSAgICAgICAgICAgIHZlbG9jaXR5LmphciBpcyBpbiB5b3VyIGNsYXNzcGF0aC4KLSAgICAgICAgPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJkb2NzIiBkZXBlbmRzPSJwcmVwYXJlLWVycm9yIiBpZj0iQW5ha2lhVGFzay5wcmVzZW50Ij4KLSAgICAgICAgPHRhc2tkZWYgbmFtZT0iYW5ha2lhIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudmVsb2NpdHkuYW5ha2lhLkFuYWtpYVRhc2siIHJldmVyc2Vsb2FkZXI9InRydWUiPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYW5ha2lhLmNsYXNzcGF0aCIvPgotICAgICAgICA8L3Rhc2tkZWY+Ci0gICAgICAgIAotICAgICAgICA8YW5ha2lhIGJhc2VkaXI9IiR7ZG9jcy5zcmN9IiBkZXN0ZGlyPSIke2RvY3MuZGVzdH0vIgotICAgICAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiIHN0eWxlPSIuL3NpdGUudnNsIgotICAgICAgICAgICAgIHByb2plY3RGaWxlPSIke3Byb2plY3QuZmlsZX0iCi0gICAgICAgICAgICAgZXhjbHVkZXM9IioqL3N0eWxlc2hlZXRzLyoqIGZhcS54bWwiCi0gICAgICAgICAgICAgaW5jbHVkZXM9IioqLyoueG1sIgotICAgICAgICAgICAgIGxhc3RNb2RpZmllZENoZWNrPSJ0cnVlIgotICAgICAgICAgICAgIHRlbXBsYXRlUGF0aD0iJHt0ZW1wbC5wYXRofSIKLSAgICAgICAgICAgICB2ZWxvY2l0eVByb3BlcnRpZXNGaWxlPSIke3ZlbG9jaXR5LnByb3BzfSI+Ci0gICAgICAgIDwvYW5ha2lhPgotCi0gICAgICAgIDxhbmFraWEgYmFzZWRpcj0iJHtkb2NzLnNyY30iIGRlc3RkaXI9IiR7ZG9jcy5kZXN0fS8iCi0gICAgICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIgc3R5bGU9Ii4vZmFxLnZzbCIKLSAgICAgICAgICAgICBwcm9qZWN0RmlsZT0iJHtwcm9qZWN0LmZpbGV9IgotICAgICAgICAgICAgIGluY2x1ZGVzPSJmYXEueG1sIgotICAgICAgICAgICAgIGxhc3RNb2RpZmllZENoZWNrPSJ0cnVlIgotICAgICAgICAgICAgIHRlbXBsYXRlUGF0aD0iJHt0ZW1wbC5wYXRofSIKLSAgICAgICAgICAgICB2ZWxvY2l0eVByb3BlcnRpZXNGaWxlPSIke3ZlbG9jaXR5LnByb3BzfSI+Ci0gICAgICAgIDwvYW5ha2lhPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iamF2YWRvY3MiPgotICAgICAgPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIHRhcmdldD0iZGlzdF9qYXZhZG9jcyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmphdmFkb2NzIiB2YWx1ZT0iJHtkb2NzLmRlc3R9L21hbnVhbC9hcGkiIC8+Ci0gICAgICA8L2FudD4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iZG9jcywgamF2YWRvY3MiLz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jcmltc29uLmphciBiL2xpYi9jcmltc29uLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzNmFlMS4uMDAwMDAwMAotLS0gYS9saWIvY3JpbXNvbi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF4cC5qYXIgYi9saWIvamF4cC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODE3ODMuLjAwMDAwMDAKLS0tIGEvbGliL2pheHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL29wdGlvbmFsLy5jdnNpZ25vcmUgYi9saWIvb3B0aW9uYWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2YTcxMi4uMDAwMDAwMAotLS0gYS9saWIvb3B0aW9uYWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWpkZXBlbmQqLmphcgpkaWZmIC0tZ2l0IGEvbGliL29wdGlvbmFsL1JFQURNRSBiL2xpYi9vcHRpb25hbC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTY2YWMuLjAwMDAwMDAKLS0tIGEvbGliL29wdGlvbmFsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotUGxlYXNlIHJlZmVyIHRvIHRoZSBBbnQgbWFudWFsIHVuZGVyIEluc3RhbGxpbmcgQW50IC8gTGlicmFyeSBEZXBlbmRlbmNpZXMgZm9yIGEgbGlzdAotb2YgdGhlIGphciByZXF1aXJlbWVudHMgZm9yIHZhcmlvdXMgb3B0aW9uYWwgdGFza3MgYW5kIGZlYXR1cmVzLgpkaWZmIC0tZ2l0IGEvbGliL29wdGlvbmFsL2p1bml0LmphciBiL2xpYi9vcHRpb25hbC9qdW5pdC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNGE1Y2YuLjAwMDAwMDAKLS0tIGEvbGliL29wdGlvbmFsL2p1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGVhdGVyL1JFQURNRSBiL3Byb3Bvc2FsL2FudGVhdGVyL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjMTczNy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1SRUFETUUgZm9yIEFudChFYXRlcikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FeGVjdXRpb246Ci0KLSAgICBhbnQgW2FyZ3NdIHRhcmdldAotICAgIAotQXJnczoKLQotICAgIC1oZWxwCi0gICAgLXF1aWV0Ci0gICAgLXZlcmJvc2UKLSAgICAtdGFza3BhdGggW3BhdGhdCi0gICAgLWFudGZpbGUgW2ZpbGVdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZWF0ZXIvYm9vdHN0cmFwL0Jvb3RzdHJhcC5qYXZhIGIvcHJvcG9zYWwvYW50ZWF0ZXIvYm9vdHN0cmFwL0Jvb3RzdHJhcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhmY2UxLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGVhdGVyL2Jvb3RzdHJhcC9Cb290c3RyYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpMjAwMCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotLyoqCi0gKiBRdWljayBhbmQgZGlydHkgc2luZ2xlIGNsYXNzIGJvb3RzdHJhcCB1dGlsaXR5IGZvciBnZXR0aW5nIEFudCBvZmYKLSAqIHRoZSBncm91bmQgd2hlbiBpbiBuZWVkLiBUbyB1c2UsIGNvbXBpbGUgdGhpcyBmaWxlIGluIHRoZSBkaXJlY3RvcnkKLSAqIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBpcyBpbiB0aGUgcmVwb3NpdG9yeSwgdGhlbiBleGVjdXRlIGl0LiBUaGF0J3MKLSAqIGl0LjxwPgotICoKLSAqIE5vIHByZXRlbnNlIGlzIG1hZGUgdGhhdCB0aGlzIGlzIGFuIGVsZWdhbnQgcGVpY2Ugb2YgY29kZS4gVGhpcyBjb2RlCi0gKiBvbmx5IGV4aXN0cyB0byBkbyBhIGdyb3VuZCB6ZXJvIGJ1aWxkIG9mIEFudC4gQW55IG90aGVyIGJ1aWxkaW5nIG9mCi0gKiBBbnQgc2hvdWxkIGJlIGRvbmUgd2l0aCBpdHNlbGYgd2hlbmV2ZXIgcG9zc2libGUuCi0gKgotICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gKGR1bmNhbkBhcGFjaGUub3JnKQotICogQGF1dGhvciBDb25vciBNYWNOZWlsbCAoY29ub3JAbTY0LmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEJvb3RzdHJhcCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tbWFuZCBsaW5lIGVudHJ5IHBvaW50LiBUaGlzIGlzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBib290c3RyYXAKLSAgICAgKiB3aGVyZSB3ZSBnbyBhbmQgc2V0IHVwIHRoZSBlbnZpcm9ubWVudCBhbmQgZ2VuZXJhbGx5IGRvIHdoYXQgaXMKLSAgICAgKiBuZWNlc3NhcnkgdG8gc2V0IHVwIGZvciBCb290c3RyYXBwaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgCi0gICAgICAgIFN0cmluZ1tdIGNvbW1hbmQ7Ci0gICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBudWxsOwotICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgY29tcGlsZXIgb24gdGhlIGNsYXNzcGF0aC4gUmlnaHQgbm93Ci0gICAgICAgIC8vIHdlJ3JlIGp1c3QgY2hlY2tpbmcgZm9yIHRoZSBvbGQgY29tcGlsZXIsIGJ1dCB3aWxsIHdhbnQgdG8gY2hlY2sKLSAgICAgICAgLy8gZm9yIHRoZSBuZXcgY29tcGlsZXIgYW5kIHVzZSBpdCBpZiBpdCBleGlzdHMuIExhdGVyLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJzdW4udG9vbHMuamF2YWMuTWFpbiIpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsgCi0gICAgICAgICAgICBTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOwotICAgICAgICAgICAgaWYgKGphdmFIb21lLmVuZHNXaXRoKCJqcmUiKSkgewotICAgICAgICAgICAgICAgIGphdmFIb21lID0gamF2YUhvbWUuc3Vic3RyaW5nKDAsIGphdmFIb21lLmxlbmd0aCgpIC0gNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBYWFggc2hvdWxkIGNoZWNrIGlmIHRoaXMgZXhpc3RzIGFuZCBiYWlsIG91dCBpZiBpdCBkb2Vzbid0Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBqYXZhSG9tZSArICIvbGliL3Rvb2xzLmphciIgKyBGaWxlLnBhdGhTZXBhcmF0b3IgKyAiLiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFhYWCByZWFsbHkgc2hvdWxkIGNoZWNrIHRvIHNlZSBpZiBjb21waWxpbmcgdGhlIGJvb3RzdHJhcCBpcyBuZWNlc3NhcnkuIDopCi0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGluZyBCb290c3RyYXAyIik7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBTdHJpbmdbXSB7ImphdmFjIiwgIi4vQm9vdHN0cmFwMi5qYXZhIn07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21tYW5kID0gbmV3IFN0cmluZ1tdIHsiamF2YWMiLCAiLWNsYXNzcGF0aCIsIGNsYXNzcGF0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9Cb290c3RyYXAyLmphdmEifTsKLSAgICAgICAgfQotICAgICAgICBydW5Db21tYW5kKGNvbW1hbmQpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIEJvb3RzdHJhcDIiKTsKLSAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21tYW5kID0gbmV3IFN0cmluZ1tdIHsiamF2YSIsICJCb290c3RyYXAyIn07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21tYW5kID0gbmV3IFN0cmluZ1tdIHsiamF2YSIsICItY3AiLCBjbGFzc3BhdGgsICJCb290c3RyYXAyIn07Ci0gICAgICAgIH0KLSAgICAgICAgcnVuQ29tbWFuZChjb21tYW5kLCBhcmdzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciBleGVjaW5nIHByb2Nlc3NlcwotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHJ1bkNvbW1hbmQoU3RyaW5nW10gY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAKLSAgICAgICAgUnVudGltZSBydW50aW1lID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0gICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IHJ1bnRpbWUuZXhlYyhjb21tYW5kKTsKLSAgICAgICAgICAgIAotICAgICAgICAvLyBlY2hvIG91dHB1dCBmcm9tIHByb2Nlc3MKLSAgICAgICAgICAgIAotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgwXTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7Ci0gICAgICAgIHdoaWxlIChjb3VudCAhPSAtMSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZShidWYsIDAsIGNvdW50KTsKLSAgICAgICAgICAgIGNvdW50ID0gaW4ucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgaW4gPSBwcm9jZXNzLmdldEVycm9yU3RyZWFtKCk7Ci0gICAgICAgIGNvdW50ID0gaW4ucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOyAgICAgICAgICAKLSAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIFN0cmVhbSBPdXRwdXQ6Iik7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoY291bnQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LndyaXRlKGJ1ZiwgMCwgY291bnQpOwotICAgICAgICAgICAgICAgIGNvdW50ID0gaW4ucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciBydW5uaW5nIHByb2Nlc3NlcyB0aGF0IGxldCBzb21lIGFkZGl0aW9uYWwgYXJncwotICAgICAqIGJlIHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBydW5Db21tYW5kKFN0cmluZ1tdIGNvbW1hbmQsIFN0cmluZ1tdIGFkZHRsQXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gbmV3Q29tbWFuZCA9IG5ldyBTdHJpbmdbY29tbWFuZC5sZW5ndGggKyBhZGR0bEFyZ3MubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBuZXdDb21tYW5kW2ldID0gY29tbWFuZFtpXTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZHRsQXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbmV3Q29tbWFuZFtjb21tYW5kLmxlbmd0aCArIGldID0gYWRkdGxBcmdzW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJ1bkNvbW1hbmQobmV3Q29tbWFuZCk7Ci0gICAgfQotfSAKLSAKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGVhdGVyL2Jvb3RzdHJhcC9Cb290c3RyYXAyLmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9ib290c3RyYXAvQm9vdHN0cmFwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzU1ZGM5Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGVhdGVyL2Jvb3RzdHJhcC9Cb290c3RyYXAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKTIwMDAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi0vKioKLSAqIFNlY29uZCBzdGFnZSBib290c3RyYXAuIFRoaXMgaXMgd2hlcmUgdGhlIG1ham9yaXR5IG9mIHRoZSB3b3JrIGhhcHBlbnMuCi0gKgotICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gKGR1bmNhbkBhcGFjaGUub3JnKTsKLSAqLwotcHVibGljIGNsYXNzIEJvb3RzdHJhcDIgewotICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2UgPSAiLi4vIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JpbXNvblNvdXJjZXMgPSAiLi4vLi4vLi4veG1sLWNyaW1zb24vc3JjIjsgLy8gcmVsYXRpdmUgdG8gYmFzZQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG1vZHVsZXMgPSBuZXcgU3RyaW5nW117ImNvcHkiLCAiZWNobyIsICJqYXIiLCAiamF2YWMiLCAiYnVpbGR0YXJnZXQifTsKLQotICAgIC8qKgotICAgICAqIENvbW1hbmQgbGluZSBlbnRyeSBwb2ludC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAKLSAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBCb290c3RyYXAyLi4uLiIpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBmaXJzdCBjcmVhdGUgZGlycyB0aGF0IHdlIG5lZWQgZm9yIHN0cmFwcGluZwotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBta2RpcihiYXNlICsgImJvb3RzdHJhcC90ZW1wIik7Ci0gICAgICAgIG1rZGlyKGJhc2UgKyAiYm9vdHN0cmFwL3RlbXAvY3JpbXNvbiIpOwotICAgICAgICBta2RpcihiYXNlICsgImJvb3RzdHJhcC90ZW1wL21haW4iKTsKLSAgICAgICAgbWtkaXIoYmFzZSArICJib290c3RyYXAvdGVtcC90YXNrcyIpOwotICAgICAgICBta2RpcihiYXNlICsgImJvb3RzdHJhcC90ZW1wL3Rhc2tqYXJzIik7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1rZGlyKGJhc2UgKyAiYm9vdHN0cmFwL3RlbXAvdGFza3MvIiArIG1vZHVsZXNbaV0pOwotICAgICAgICB9Ci0gICAgICAKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGJ1aWxkIGNyaW1zb24sIGJ1dCBvbmx5IGlmIGl0IGhhc24ndCBiZWVuIGJ1aWx0IHlldCBzaW5jZQotICAgICAgICAvLyAxMjcgY2xhc3MgZmlsZXMgdGFrZXMgbW9yZSBzZWNvbmRzIHRoYW4gSSBsaWtlIHRvIHdhaXQuCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGlmICghKG5ldyBGaWxlKGJhc2UgKyAiYm9vdHN0cmFwL3RlbXAvY3JpbXNvbi9qYXZheCIpLmV4aXN0cygpKSkgewotICAgICAgICAgICAgVmVjdG9yIHYxID0gZ2V0U291cmNlcyhiYXNlICsgY3JpbXNvblNvdXJjZXMpOwotICAgICAgICAgICAgZG9Db21waWxlKGJhc2UgKyAiYm9vdHN0cmFwL3RlbXAvY3JpbXNvbiIsIHYxKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBtYWluIHRoaW5nCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWZWN0b3IgdjIgPSBnZXRTb3VyY2VzKGJhc2UgKyAic291cmNlL21haW4iKTsKLSAgICAgICAgZG9Db21waWxlKGJhc2UgKyAiYm9vdHN0cmFwL3RlbXAvbWFpbiIsIHYyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBub3cgYnVpbGQgZWFjaCBvZiB0aGUgbmVlZGVkIHBlaWNlcyBpbnRvIHRoZWlyCi0gICAgICAgIC8vIGFyZWFzIHdpdGhpbiB0aGUgc3RyYXBwaW5nIGFyZWEKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBidWlsZE1vZHVsZShtb2R1bGVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBub3csIHNldCBjbGFzc3BhdGhzIGFuZCBsYXVuY2ggYW4gQW50IGJ1aWxkIHRvCi0gICAgICAgIC8vIGhhdmUgQW50IGJ1aWxkIGl0c2VsZiBuaWNlbHkKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNUQVJUSU5HIFJFQUwgQlVJTEQiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOyAgICAgCi0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBjbWRhcnJheSA9IG5ldyBTdHJpbmdbMTBdOwotICAgICAgICBjbWRhcnJheVswXSA9ICJqYXZhIjsKLSAgICAgICAgY21kYXJyYXlbMV0gPSAiLWNwIjsKLSAgICAgICAgY21kYXJyYXlbMl0gPSBiYXNlICsgImJvb3RzdHJhcC90ZW1wL21haW4iICsgRmlsZS5wYXRoU2VwYXJhdG9yICsKLSAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgImJvb3RzdHJhcC90ZW1wL2NyaW1zb24iOwotICAgICAgICBjbWRhcnJheVszXSA9ICJvcmcuYXBhY2hlLmFudC5jbGkuTWFpbiI7Ci0gICAgICAgIGNtZGFycmF5WzRdID0gIi10YXNrcGF0aCI7Ci0gICAgICAgIGNtZGFycmF5WzVdID0gYmFzZSArICJib290c3RyYXAvdGVtcC90YXNramFycyI7Ci0gICAgICAgIGNtZGFycmF5WzZdID0gIi1idWlsZGZpbGUiOwotICAgICAgICBjbWRhcnJheVs3XSA9IGJhc2UgKyAic291cmNlL21haW4uYW50IjsKLSAgICAgICAgY21kYXJyYXlbOF0gPSAiLXRhcmdldCI7IAotICAgICAgICBjbWRhcnJheVs5XSA9ICJkZWZhdWx0IjsKLSAgICAgICAgCi0gICAgICAgIEJvb3RzdHJhcC5ydW5Db21tYW5kKGNtZGFycmF5LCBhcmdzKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGSU5JU0hFRCBXSVRIIFJFQUwgQlVJTEQiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIFJlbW92ZSBUZW1wb3JhcnkgY2xhc3NlcwotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBkZWxldGUodGVtcERpck5hbWUpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBQcmludCBDbG9zZXIKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGxvbmcgZWxhcHNkID0gZW5kVGltZSAtIHN0YXJ0VGltZTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCb290c3RyYXAgVGltZTogIiArIChlbGFwc2QvMTAwMCkgKyAiLiIgKyAoZWxhcHNkJTEwMDApICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNlY29uZHMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1rZGlyKFN0cmluZyBhcmcpIHsKLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShhcmcpOwotICAgICAgICBpZiAoZGlyLmV4aXN0cygpICYmICFkaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPaCwgaG9ycm9ycyEgRGlyICIgKyBhcmcgKyAiICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2Vzbid0IHNlZW0gdG8gYmUgYSBkaXIuLi4gU3RvcCEiKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1ha2luZyBkaXI6ICIgKyBhcmcpOwotICAgICAgICAgICAgZGlyLm1rZGlyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkTW9kdWxlKFN0cmluZyBhcmcpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZGluZyAiICsgYXJnKTsKLSAgICAgCi0gICAgICAgIC8vIGdldCBhbGwgc291cmNlcyBhbmQgaGFuZCB0aGVtIG9mZiB0byB0aGUgY29tcGlsZXIgdG8KLSAgICAgICAgLy8gYnVpbGQgb3ZlciBpbnRvIGRlc3RpbmF0aW9uCi0KLSAgICAgICAgVmVjdG9yIHYgPSBnZXRTb3VyY2VzKGJhc2UgKyAic291cmNlL2NvcmV0YXNrcy8iICsgYXJnKTsKLSAgICAgICAgaWYgKHYuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZG9Db21waWxlKGJhc2UgKyAiYm9vdHN0cmFwL3RlbXAvdGFza3MvIiArIGFyZywgdik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgLy8gbW92ZSB0YXNrZGVmLnByb3BlcnRpZXMgZm9yIHRoZSBtb2R1bGUKLQotICAgICAgICBjb3B5ZmlsZShiYXNlICsgInNvdXJjZS9jb3JldGFza3MvIiArIGFyZyArICIvdGFza2RlZi5wcm9wZXJ0aWVzIiwKLSAgICAgICAgICAgICAgICAgYmFzZSArICJib290c3RyYXAvdGVtcC90YXNrcy8iICsgYXJnICsgIi90YXNrZGVmLnByb3BlcnRpZXMiKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIGphciB1cCB0YXNrcwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamFyRGlyKG5ldyBGaWxlKGJhc2UgKyAiYm9vdHN0cmFwL3RlbXAvdGFza3MvIiArIGFyZyksIAotICAgICAgICAgICAgICAgIG5ldyBGaWxlKGJhc2UgKyAiYm9vdHN0cmFwL3RlbXAvdGFza2phcnMvIiArIGFyZyArICIuamFyIikpOwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwcm9ibGVtIGphcidpbmc6ICIgKyBhcmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGdldFNvdXJjZXMoU3RyaW5nIGFyZykgewotCi0gICAgICAgIEZpbGUgc291cmNlRGlyID0gbmV3IEZpbGUoYXJnKTsKLSAgICAgICAgCi0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBzY2FuRGlyKHNvdXJjZURpciwgdiwgIi5qYXZhIik7Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgamFyRGlyKEZpbGUgZGlyLCBGaWxlIGphcmZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZGlyLmxpc3QoKTsKLSAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSmFyaW5nOiAiICsgamFyZmlsZSk7ICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShqYXJmaWxlKTsKLSAgICAgICAgICAgIEphck91dHB1dFN0cmVhbSBqb3MgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKGZvcywgbmV3IE1hbmlmZXN0KCkpOwotICAgICAgICAgICAgamFyRGlyKGRpciwgIiIsIGpvcyk7Ci0gICAgICAgICAgICBqb3MuY2xvc2UoKTsgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGphckRpcihGaWxlIGRpciwgU3RyaW5nIHByZWZpeCwgSmFyT3V0cHV0U3RyZWFtIGpvcykgdGhyb3dzIAotICAgICAgICBJT0V4Y2VwdGlvbiAKLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZGlyLmxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHppcEVudHJ5TmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoIXByZWZpeC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHppcEVudHJ5TmFtZSA9IHByZWZpeCArICIvIiArIGZpbGVzW2ldOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHppcEVudHJ5TmFtZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeSh6aXBFbnRyeU5hbWUpOwotICAgICAgICAgICAgICAgIGpvcy5wdXROZXh0RW50cnkoemUpOwotICAgICAgICAgICAgICAgIGphckRpcihmLCB6aXBFbnRyeU5hbWUsIGpvcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyB6aXBFbnRyeU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcmVmaXguZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB6aXBFbnRyeU5hbWUgPSBwcmVmaXggKyAiLyIgKyBmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB6aXBFbnRyeU5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoemlwRW50cnlOYW1lKTsKLSAgICAgICAgICAgICAgICBqb3MucHV0TmV4dEVudHJ5KHplKTsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4ICogMTAyNF07Ci0gICAgICAgICAgICAgICAgY291bnQgPSBmaXMucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBqb3Mud3JpdGUoYnVmLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gZmlzLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNjYW5EaXIoRmlsZSBkaXIsIFZlY3RvciB2LCBTdHJpbmcgZW5kc1dpdGgpIHsKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkaXIubGlzdCgpOwotICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOwotICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHNjYW5EaXIoZiwgdiwgZW5kc1dpdGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZXNbaV0uZW5kc1dpdGgoZW5kc1dpdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudChmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvQ29tcGlsZShTdHJpbmcgZGVzdCwgVmVjdG9yIHNvdXJjZXMpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBDb21waWxpbmcgIiArIHNvdXJjZXMuc2l6ZSgpICsgIiBmaWxlcyB0byAiICsgZGVzdCk7Ci0gICAgICAgIAotICAgICAgICAvLyBYWFggVGhpcyBzaG91bGQgYmUgbW9yZSBmb3JnaXZpbmcgYWJvdXQgY29tcGlsaW5nIHdoZXJldmVyCi0gICAgICAgIC8vIHVuZGVyIHdoYXRldmVyIGNvbXBpbGVyLCBidXQgdGhpcyB3b3JrcyBzby4uLgotICAgICAgICAKLSAgICAgICAgc3VuLnRvb2xzLmphdmFjLk1haW4gY29tcGlsZXIgPSBuZXcgc3VuLnRvb2xzLmphdmFjLk1haW4oU3lzdGVtLm91dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhYyIpOyAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW3NvdXJjZXMuc2l6ZSgpICsgNF07Ci0gICAgICAgIGFyZ3NbMF0gPSAiLWNsYXNzcGF0aCI7Ci0gICAgICAgIGFyZ3NbMV0gPSBiYXNlICsgImJvb3RzdHJhcC90ZW1wL21haW4iICsgRmlsZS5wYXRoU2VwYXJhdG9yICsgIAotICAgICAgICAgICAgICAgICAgYmFzZSArICJib290c3RyYXAvdGVtcC9jcmltc29uIjsKLSAgICAgICAgYXJnc1syXSA9ICItZCI7Ci0gICAgICAgIGFyZ3NbM10gPSBkZXN0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGFyZ3NbNCtpXSA9ICgoRmlsZSlzb3VyY2VzLmVsZW1lbnRBdChpKSkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludCgiamF2YWMgIik7Ci0gICAgICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAvLyAgICAgU3lzdGVtLm91dC5wcmludChhcmdzW2ldICsgIiAiKTsKLSAgICAgICAgLy8gfQotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBpbGVyLmNvbXBpbGUoYXJncyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5ZmlsZShTdHJpbmcgZnJvbSwgU3RyaW5nIGRlc3QpIHsKLSAgICAgICAgRmlsZSBmcm9tRiA9IG5ldyBGaWxlKGZyb20pOwotICAgICAgICBGaWxlIGRlc3RGID0gbmV3IEZpbGUoZGVzdCk7Ci0gICAgICAgIGlmIChmcm9tRi5leGlzdHMoKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBDb3B5aW5nICIgKyBmcm9tKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmcm9tRik7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0Rik7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjQgKiAxNl07Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBjb3VudCA9IGluLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgY291bnQpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGluLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT1VDSDogIiArIGZyb20pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGVhdGVyL2Jvb3RzdHJhcC9SRUFETUUgYi9wcm9wb3NhbC9hbnRlYXRlci9ib290c3RyYXAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY2ZmQ2Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGVhdGVyL2Jvb3RzdHJhcC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1CT09UU1RSQVAgRk9MREVSIFJFQURNRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSB1dGlsaXRpZXMgcHJvdmlkZWQgaGVyZSBhcmUgdXNlZCBieSB0aGUgZGV2ZWxvcGVycyBvZiBBbnQgdG8gCi1ib290c3RyYXAgYnVpbGRzIG9mIEFudCBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBuaWdodGx5IGJ1aWxkIHByb2Nlc3MKLXRvIGJ1aWxkIEFudCBmcm9tIGEgemVybyBzdGF0ZS4KLQotVGhhdCBzYWlkLCB0aGVyZSBpcyBubyByZWFzb24gZm9yIG1vc3QgZm9sa3MgLS0gZXZlbiBoYXJkIGNvcmUgQW50Ci1kZXZlbG9wZXJzIC0tIHRvIHVzZSB0aGUgZmlsZXMgaGVyZSBvbiBhIHJlZ3VsYXIgYmFzaXMuIFlvdSBzaG91bGQKLXJlYWxseSBoYXZlIHRoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24gb2YgQW50IGluc3RhbGxlZCBzb21ld2hlcmUgc28KLXRoYXQgeW91IGNhbiBlYXNpbHkgYnVpbGQgQW50IHVzaW5nIGl0c2VsZi4gQ2hlY2sgb3V0IHRoZSAKLWluc3RhbGxhdGlvbiBndWlkZWxpbmVzIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBzdWdnZXN0aW9ucyBvbiBob3cKLUFudCBjYW4gYmUgaW5zdGFsbGVkIGFzIGEgZnVsbCB0aW1lIHByb2dyYW0gb2YgeW91ciBzeXN0ZW0uIAotCi1IT1cgVE8gVVNFCi0KLVNvLCB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSBib290c3RyYXAgZmFjaWxpdGllcyBpbnN0ZWFkIG9mIGp1c3QKLWRvd25sb2FkaW5nIGEgYnVpbGQgZnJvbSBzb21ld2hlcmU/IE9rLiBIZXJlJ3MgaG93IGl0IHdvcmtzOgotCi0gICogTWFrZSBzdXJlIHRoYXQgc3VuLnRvb2xzLmphdmFjLk1haW4gaXMgb24geW91ciBjbGFzc3BhdGguIAotICAgIFNvbWV0aW1lcyBpdCBpcywgc29tZXRpbWVzIGl0IGlzbid0IC0tIGl0IGRlcGVuZHMgb24gdGhlIEpESwotICAgIGluc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUuIFlvdSBjYW4gZG8gYSBxdWljayBjaGVjayB1c2luZwotICAgIHRoZSAnamF2YXAgc3VuLnRvb2xzLmphdmFjLk1haW4nIGNvbW1hbmQgdG8gc2VlIGlmIGl0IGlzLgotCi0gICogTWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgeG1sLWNyaW1zb24gY2hlY2tlZCBvdXQgbmV4dCB0bwotICAgIHRoZSBqYWthcnRhLWFudCB3b3Jrc3BhY2Ugc28gdGhhdCB0aGUgQm9vdHN0cmFwIGNhbiBmaW5kCi0gICAgdGhpcyBuZWNlc3NhcnkgY29kZS4KLQotICAqIENvbXBpbGUgQm9vdHN0cmFwLmphdmEuIFlvdSBzaG91bGQgZW5kIHVwIHdpdGggQm9vdHN0cmFwLmNsYXNzCi0gICAgYW5kIG1heWJlIGEgZmV3IG90aGVyIGNsYXNzZXMgKGRlcGVuZGluZykuCi0gICAgCi0gICogRXhlY3V0ZSB0aGUgQm9vdHN0cmFwIGNsYXNzLgotICAKLUhvdyB0aGlzIHdpbGwgd29yayBpbiBwcmFjdGljZSBpczoKLQotICAlIGphdmFjIEJvb3RzdHJhcC5qYXZhCi0gICUgamF2YSBCb290c3RyYXAKLQotVGhlIEJvb3RzdHJhcCBjbGFzcyB3aWxsIGdyaW5kIG91dCBhIHByZWxpbWluYXJ5IGJ1aWxkIGluIHRoZSBkaXJlY3RvcnkKLSd0ZW1wLycgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW4gdGhpcyBkaXJlY3RvcnksIHRoZW4gdXNlIHRoYXQgYnVpbGQgdG8KLWJ1aWxkIGEgcmVhbCBjb3B5IG9mIEFudCBpbnRvICcuLi9CdWlsZCcgdXNpbmcgQW50J3Mgb3duIG1ha2VmaWxlLiBBZnRlcgotZG9pbmcgdGhpcywgdGhlIEJvb3N0cmFwIGNsYXNzIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgYnVpbGQgaW4KLXRoZSAndGVtcC8nIGRpcmVjdG9yeS4KLQotSElTVE9SSUNBTCBOT1RFCi0KLVRoZSBCb290c3RyYXAgY2xhc3MgaXMgc29tZXdoYXQgdGhlIHNhbWUgcm91Z2ggaGFjayBhcyB0aGUgZmlyc3Qgc2tldGNoCi1vZiBBbnQgaXRzZWxmIC0tIGEgcHJvb2Ygb2YgY29uY2VwdCB0aGF0IGEgSmF2YSBiYXNlZCBidWlsZCBzeXN0ZW0KLWNvdWxkIHdvcmsgb3V0IGhhbGZ3YXkgZGVjZW50bHkuIE9mIGNvdXJzZSwgQW50IGhhcyBleHBhbmRlZCBtdWNoIHBhc3QKLXRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcywgYnV0IHRoaXMgbGl0dGxlIHN0YXJ0IHNlcnZlcyBhcyBhIHVzZWZ1bAotdG9vbCB0byBib290c3RyYXAgYnVpbGRzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGVhdGVyL3NvdXJjZS9jb3JldGFza3MvYnVpbGR0YXJnZXQvb3JnL2FwYWNoZS9hbnQvYnVpbGR0YXJnZXQvQnVpbGRUYXJnZXRUYXNrLmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvY29yZXRhc2tzL2J1aWxkdGFyZ2V0L29yZy9hcGFjaGUvYW50L2J1aWxkdGFyZ2V0L0J1aWxkVGFyZ2V0VGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFkNTlmLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGVhdGVyL3NvdXJjZS9jb3JldGFza3MvYnVpbGR0YXJnZXQvb3JnL2FwYWNoZS9hbnQvYnVpbGR0YXJnZXQvQnVpbGRUYXJnZXRUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmJ1aWxkdGFyZ2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuKjsKLQotLyoqCi0gKiBBIHNpbXBsZSB0YXNrIHRoYXQgYnVpbGRzIGEgdGFyZ2V0IGlmIGEgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUKLSAqCi0gKiBAYXV0aG9yIEphbWVzIER1bmNhbiBEYXZpZHNvbiAoZHVuY2FuQGFwYWNoZS5vcmcpCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZFRhcmdldFRhc2sgZXh0ZW5kcyBBYnN0cmFjdFRhc2sgewotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFJJVkFURSBEQVRBIE1FTUJFUlMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqIERhdGEgdG8gZWNobwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGlmUHJvcGVydHk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGFyZ2V0IHRvIGV4ZWN1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lOwotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFVCTElDIE1FVEhPRFMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGlzIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBBbnRFeGNlcHRpb24gewotICAgICAgICAvLyBYWFggc2hvdWxkIHJlYWxseSBjaGVjayBpbnRlcm5hbCBzdGF0ZSBiZWZvcmUgcHJvY2VlZGluZyEgVGFyZ2V0Ci0gICAgICAgIC8vIGhhcyB0byBiZSBzZXQuLi4KLSAgICAgICAgCi0gICAgICAgIC8vIFhYWCBvaCwgYW5kIHdlIHNob3VsZCByZWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSB0YXJnZXQgZXhpc3RzCi0gICAgICAgIC8vIGFuZCBmYWlsIG91dCBpZiBpdCBkb2Vzbid0LiA6KQotICAgICAgICAKLSAgICAgICAgaWYgKGlmUHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGlmUHJvcGVydHlWYWx1ZSA9IHByb2plY3QuZ2V0UHJvcGVydHkoaWZQcm9wZXJ0eSk7Ci0gICAgICAgICAgICBpZiAoaWZQcm9wZXJ0eVZhbHVlLmVxdWFscygidHJ1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5zdGFydEJ1aWxkKHRhcmdldE5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb2plY3Quc3RhcnRCdWlsZCh0YXJnZXROYW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfSAKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgZXhhbWluZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZihTdHJpbmcgaWZQcm9wZXJ0eSkgewotICAgICAgICB0aGlzLmlmUHJvcGVydHkgPSBpZlByb3BlcnR5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0YXJnZXQgdG8gYmUgZXhlY3V0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldE5hbWUpIHsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL2NvcmV0YXNrcy9idWlsZHRhcmdldC90YXNrZGVmLnByb3BlcnRpZXMgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvY29yZXRhc2tzL2J1aWxkdGFyZ2V0L3Rhc2tkZWYucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjNDUwNi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvY29yZXRhc2tzL2J1aWxkdGFyZ2V0L3Rhc2tkZWYucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyB0YXNrZGVmLnByb3BlcnRpZXMgZm9yIEVjaG8gdGFzawotCi10YXNrcz1idWlsZHRhcmdldAotdGFzay5idWlsZHRhcmdldC5jbGFzcz1vcmcuYXBhY2hlLmFudC5idWlsZHRhcmdldC5CdWlsZFRhcmdldFRhc2sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvY29yZXRhc2tzL2VjaG8vb3JnL2FwYWNoZS9hbnQvZWNoby9FY2hvVGFzay5qYXZhIGIvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL2NvcmV0YXNrcy9lY2hvL29yZy9hcGFjaGUvYW50L2VjaG8vRWNob1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjZTQwZC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvY29yZXRhc2tzL2VjaG8vb3JnL2FwYWNoZS9hbnQvZWNoby9FY2hvVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5lY2hvOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuKjsKLQotLyoqCi0gKiBBIHZlcnkgc2ltcGxlIHRhc2sgdGhhdCB0YWtlcyBhIGJpdCBvZiB0ZXh0IGFuZCBlY2hvcyBpdCBiYWNrIG91dAotICogd2hlbiBpdCBpcyBleGVjdXRlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZyBwcm9wZXJ0aWVzCi0gKiBpbiBidWlsZGZpbGVzLCBsZXR0aW5nIHRoZSB1c2VyIGtub3cgdGhhdCBzb21ldGhpbmcgaXMgZ29pbmcgdG8gaGFwcGVuCi0gKiBhbmQgYXMgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIHRoYXQgY2FuIGJlIGNvcGllZCB0byBjcmVhdGUgb3RoZXIgdGFza3MuCi0gKgotICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gKGR1bmNhbkBhcGFjaGUub3JnKQotICovCi1wdWJsaWMgY2xhc3MgRWNob1Rhc2sgZXh0ZW5kcyBBYnN0cmFjdFRhc2sgewotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFJJVkFURSBEQVRBIE1FTUJFUlMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqIERhdGEgdG8gZWNobwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQVUJMSUMgTUVUSE9EUwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoaXMgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2plY3QuZ2V0RnJvbnRFbmQoKS53cml0ZU1lc3NhZ2UodGV4dCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gCi0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGV4dCB0aGF0IHRoaXMgdGFzayB3aWxsIGVjaG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvY29yZXRhc2tzL2VjaG8vdGFza2RlZi5wcm9wZXJ0aWVzIGIvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL2NvcmV0YXNrcy9lY2hvL3Rhc2tkZWYucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk0OTA3MC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvY29yZXRhc2tzL2VjaG8vdGFza2RlZi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIHRhc2tkZWYucHJvcGVydGllcyBmb3IgRWNobyB0YXNrCi0KLXRhc2tzPWVjaG8KLXRhc2suZWNoby5jbGFzcz1vcmcuYXBhY2hlLmFudC5lY2hvLkVjaG9UYXNrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4uYW50IGIvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4uYW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZlZTYzLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGVhdGVyL3NvdXJjZS9tYWluLmFudAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tIENvbW1lbnQgb3V0c2lkZSBvZiBwcm9qZWN0IC0tPgotCi08cHJvamVjdCBuYW1lPSJBbnQiIGRlZmF1bHQ9ImRlZmF1bHQiPgotCi0gIDwhLS0gQ29tbWVudCBpbnNpZGUgb2YgcHJvamVjdCAtLT4KLQotICA8ZGVzY3JpcHRpb24+UHJpbWFyeSBidWlsZGZpbGUgZm9yIGJ1aWxkaW5nIEFudCBpdHNlbGY8L2Rlc2NyaXB0aW9uPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJmb28iIHZhbHVlPSJ0cnVlIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiBkZXBlbmRzPSJtYWluIj4KLSAgICA8ZWNobyB0ZXh0PSJEZWZhdWx0IFRhcmdldCBpcyBFeGVjdXRpbmciLz4KLSAgICA8YnVpbGR0YXJnZXQgdGFyZ2V0PSJtYWluIiBpZj0iZm9vIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibWFpbiI+Ci0gICAgPGVjaG8gdGV4dD0iTWFpbiBUYXJnZXQgaXMgRXhlY3V0aW5nIi8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvQWJzdHJhY3RUYXNrLmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9BYnN0cmFjdFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZmMyZS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9BYnN0cmFjdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLmJlYW5zLio7Ci0KLS8qKgotICogU3VwZXJjbGFzcyBvZiBhbGwgVGFza3MuIEFsbCB0YXNrcyBleHRlbmQgZnJvbSB0aGlzLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIChkdW5jYW5AYXBhY2hlLm9yZykKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFzayB7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQUk9URUNURUQgREFUQSBNRU1CRVJTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBQcm9qZWN0IHByb2plY3Q7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBBQlNUUkFDVCBQVUJMSUMgTUVUSE9EUwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQW50RXhjZXB0aW9uOwotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFVCTElDIE1FVEhPRFMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCi0gICAgCi0gICAgLyoqCi0gICAgICogVXNlZCBieSB0aGUgc3lzdGVtIHRvIHNldCB0aGUgYXR0cmlidXRlcyB3aGljaCB0aGVuIGdldCByZWZsZWN0ZWQKLSAgICAgKiBpbnRvIHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhIYXNodGFibGUgYXR0cmlidXRlcykgewotICAgICAgICBDbGFzcyBjbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLSAgICAgICAgQmVhbkluZm8gYmk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiaSA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhjbGF6eik7Ci0gICAgICAgIH0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgcmVmbGVjdCBvbjogIiArIGNsYXp6KTsKLSAgICAgICAgICAgIC8vIFhYWCBleGNlcHRpb24gb3V0Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcGRhID0gYmkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkYS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gcGRhW2ldOwotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gcGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgT2JqZWN0IG8gPSBhdHRyaWJ1dGVzLmdldChwcm9wZXJ0eSk7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZylvOwotICAgICAgICAgICAgICAgIE1ldGhvZCBzZXRNZXRob2QgPSBwZC5nZXRXcml0ZU1ldGhvZCgpOwotICAgICAgICAgICAgICAgIGlmIChzZXRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIG1hID0gc2V0TWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYS5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYyA9IG1hWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuZ2V0TmFtZSgpLmVxdWFscygiamF2YS5sYW5nLlN0cmluZyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWV0aG9kLmludm9rZSh0aGlzLCBuZXcgU3RyaW5nW10ge3ZhbHVlfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGJhZCBiYWQgYmFkIC0tIG5hcnJvdyB0byBleGFjdCBleGNlcHRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT1VDSDogIiArIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggZXhjZXB0aW9uIG91dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXNlZCBieSBzeXN0ZW0gdG8gc2V0IHRoZSBwcm9qZWN0LgotICAgICAqLyAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGVhdGVyL3NvdXJjZS9tYWluL29yZy9hcGFjaGUvYW50L0FudEV4Y2VwdGlvbi5qYXZhIGIvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvQW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDdhNjkuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvQW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKTIwMDAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudDsKLQotLyoqCi0gKiBTaWduYWxzIGEgcHJvYmxlbSB3aGlsZSBzZXR0aW5nIHVwIG9yIGV4ZWN1dGluZyBhIGJ1aWxkLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIChkdW5jYW5AYXBhY2hlLm9yZykKLSAqLwotcHVibGljIGNsYXNzIEFudEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFBSSVZBVEUgTUVNQkVSUwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRocm93YWJsZSBjYXVzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQcm9qZWN0IHdpdGhpbiB3aGljaCB0aGlzIGV4Y2VwdGlvbiBvY2N1cmVkLCBpZiBhcHBsaWNhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotICAgIAotICAgIC8qKgotICAgICAqIFRhcmdldCB3aXRoaW4gd2hpY2ggdGhpcyBleGNlcHRpb24gb2NjdXJyZWQsIGlmIGFwcGxpY2FibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYXJnZXQgdGFyZ2V0OwotICAgIAotICAgIC8qKgotICAgICAqIFRhc2sgd2l0aGluIHdoaWNoIHRoaXMgZXhjZXB0aW9uIG9jY3VycmVkLCBpZiBhcHBsaWNhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgVGFzayB0YXNrOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDT05TVFJVQ1RPUlMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEFudEV4Y2VwdGlvbiB3aXRoIG5vIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIEFudEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBBbnRFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW50RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBBbnRFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIEFudEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEFudEV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBjYXVzZSBhbmQgYSAKLSAgICAgKiBkZXRhaWxlZCBtZXNzYWdlIG9mIChjYXVzZT09bnVsbCA/IG51bGwgOiBjYXVzZS50b1N0cmluZygpKQotICAgICAqLwotICAgIHB1YmxpYyBBbnRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlPT1udWxsID8gbnVsbCA6IGNhdXNlLnRvU3RyaW5nKCkpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFVCTElDIE1FVEhPRFMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKi8gCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdXNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBQcm9qZWN0IHdpdGhpbiB0aGUgc2NvcGUgb2Ygd2hpY2ggdGhpcyBleGNlcHRpb24gb2NjdXJyZWQsCi0gICAgICogaWYgYXBwbGljYWJsZS4gT3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFRhcmdldCB3aXRoaW4gdGhlIHNjb3BlIG9mIHdoaWNoIHRoaXMgZXhjZXB0aW9uIG9jY3VycmVkLAotICAgICAqIGlmIGFwcGxpY2FibGUuIE90aGVyd2lzZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBUYXJnZXQgZ2V0VGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLSAgICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVGFzayB3aWh0aW4gdGhlIHNjb3BlIG9mIHdoaWNoIHRoaXMgZXhjZXB0aW9uIG9jY3VycmVkLAotICAgICAqIGlmIGFwcGxpY2FibGUuIE90aGVyd2lzZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBUYXNrIGdldFRhc2soKSB7Ci0gICAgICAgIHJldHVybiB0YXNrOwotICAgIH0KLSAgICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQQUNLQUdFIE1FVEhPRFMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm9qZWN0IHdpdGhpbiB0aGUgc2NvcGUgb2Ygd2hpY2ggdGhpcyBleGNlcHRpb24gb2NjdXJyZWQuCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBpbnRlcm5hbCBlcnJvciBoYW5kbGluZyBtZWNoYW5pc20gb2YKLSAgICAgKiBBbnQgYmVmb3JlIGl0IGlzIHByb3BvZ2F0ZWQgb3V0LgotICAgICAqLwotICAgIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGFyZ2V0IHdpdGhpbiB0aGUgc2NvcGUgb2Ygd2hpY2ggdGhpcyBleGNlcHRpb24gb2NjdXJyZWQuCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBpbnRlcm5hbCBlcnJvciBoYW5kbGluZyBtZWNoYW5zaW0gb2YKLSAgICAgKiBBbnQgYmVmb3JlIGl0IGlzIHByb3BvZ2F0ZWQgb3V0LgotICAgICAqLwotICAgIHZvaWQgc2V0VGFyZ2V0KFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRhc2sgd2l0aGluIHRoZSBzY29wZSBvZiB3aGljaCB0aGlzIGV4Y2VwdGlvbiBvY2N1cnJlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGludGVybmFsIGVycm9yIGhhbmRsaW5nIG1lY2hhbmlzbSBvZgotICAgICAqIEFudCBiZWZvcmUgaXQgaXMgcHJvcG9nYXRlZCBvdXQuCi0gICAgICovCi0gICAgdm9pZCBzZXRUYXNrKFRhc2sgdGFzaykgewotICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9BbnRGcm9udEVuZC5qYXZhIGIvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvQW50RnJvbnRFbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzMDgxNC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9BbnRGcm9udEVuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykyMDAwIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQ7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdGhhdCBsZXRzIEFudCB0YWxrIHRvIGEgZnJvbnQgZW5kIHN1Y2ggYXMgYSBDTEkgZnJvbnQgZW5kLAotICogR1VJIGZyb250IGVuZCwgU2VydmxldCBmcm9udCBlbmQsIG9yIHNvbWUgb3RoZXIgZnJvbnQgZW5kLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIChkdW5jYW5AYXBhY2hlLm9yZykKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFudEZyb250RW5kIHsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ09OU1RBTlRTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoYXQgYW4gYXNzb2NpYXRlZCBtZXNzYWdlIGhhcyBhIGxvdyBpbXBvcnRhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19MRVZFTF9MT1cgPSAxOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IGFuIGFzc29jaWF0ZWQgbWVzc2FnZSBoYXMgYSBtZWRpdW0gaW1wb3J0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfTEVWRUxfTUVEID0gMjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhbiBhc3NvY2lhdGVkIG1lc3NhZ2UgaGFzIGEgaGlnaCBpbXBvcnRhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19MRVZFTF9ISUdIID0gMzsKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFBVQkxJQyBNRVRIT0RTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0KLSAgICAvKioKLSAgICAgKiBTZW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgRnJvbnRFbmQgdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIGludG8KLSAgICAgKiB0aGUgc2NvcGUgb2YgYSBwYXJ0aWN1bGFyIHByb2plY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgICogZG9lcyBub3RoaW5nLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQcm9qZWN0U3RhcnQoUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCBub3RpZmljYXRpb24gdG8gdGhlIEZyb250RW5kIHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCBvdXQKLSAgICAgKiBvZiB0aGUgc2NvcGUgb2YgYSBwYXJ0aWN1bGFyIFByb2plY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgICogZG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVByb2plY3RFbmQoUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlbmQgbm90aWZpY2F0aW9uIHRvIHRoZSBGcm9udEVuZCB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgaW50bwotICAgICAqIHRoZSBzY29wZSBvZiBhIHBhcnRpY3VsYXIgdGFyZ2V0LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzCi0gICAgICogbm90aGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlUYXJnZXRTdGFydChUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlbmQgbm90aWZpY2F0aW9uIHRvIHRoZSBGcm9udEVuZCB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgb3V0IG9mCi0gICAgICogdGhlIHNjb3BlIG9mIGEgcGFydGljdWxhciB0YXJnZXQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMKLSAgICAgKiBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVRhcmdldEVuZChUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlbmQgbm90aWZpY2F0aW9uIHRvIHRoZSBGcm9udEVuZCB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgaW50byB0aGUKLSAgICAgKiBzY29wZSBvZiBhIHBhcnRpY3VsYXIgdGFzay4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVRhc2tTdGFydChUYXNrIHRhc2spIHsKLSAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VuZCBub3RpZmljYXRpb24gdG8gdGhlIEZyb250RW5kIHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCBvdXQgb2YKLSAgICAgKiB0aGUgc2NvcGUgb2YgYSBwYXJ0aWN1bGFyIHRhc2suIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMKLSAgICAgKiBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVRhc2tFbmQoVGFzayB0YXNrKSB7Ci0gICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgbWVzc2FnZSB0byB0aGUgZnJvbnQgZW5kIHdpdGggYSBtZWRpdW0gaW1wb3J0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgd3JpdGVNZXNzYWdlKG1lc3NhZ2UsIE1TR19MRVZFTF9NRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIG1lc3NhZ2UgdG8gdGhlIGZyb250IGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsZXZlbCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9Qcm9qZWN0LmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9Qcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZTJkNGQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gKGMpMjAwMCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEluIG1lbW9yeSBjb250YWluZXIgZm9yIGFuIEFudCBwcm9qZWN0LgotICoKLSAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIChkdW5jYW5AYXBhY2hlLm9yZykKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3QgewotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQUklWQVRFIERBVEEgTUVNQkVSUwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIC8vcHJpdmF0ZSBBbnQgYW50OwotICAgIAotICAgIC8qKgotICAgICAqIEJhc2UgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC4gVXN1YWxseSB0aGlzIHZhbHVlIGlzIHRoZSBkaXJlY3RvcnkKLSAgICAgKiB3aGVyZSB0aGUgcHJvamVjdCBmaWxlIHdhcyBmb3VuZCwgYnV0IGNhbiBiZSBkaWZmZXJlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGJhc2VEaXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VGFyZ2V0TmFtZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEZyb250IGVuZCB0aGF0IHRoaXMgcHJvamVjdCBjb21tdW5pY2F0ZXMgdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBBbnRGcm9udEVuZCBmcm9udEVuZDsKLQotICAgIC8qKgotICAgICAqIFByb3BlcnRpZXMgb2YgdGhpcyBwcm9qZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFBhcmVudCBwcm9qZWN0IHRvIHRoaXMgcHJvamVjdCwgaWYgb25lIGV4aXN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFByb2plY3QgcGFyZW50UHJvamVjdCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBIYXNodGFibGUgY29udGFpbmluZyBhbGwgb2YgdGhlIHRhcmdldHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzCi0gICAgICogcHJvamVjdC4gVGFyZ2V0cyBhcmUgc3RvcmVkIGluIHRoaXMgaGFzaHRhYmxlIHVzaW5nIHRoZSBuYW1lCi0gICAgICogb2YgdGhlIHRhcmdldCBhcyB0aGUga2V5IGFuZCB0aGUgVGFyZ2V0IG9iamVjdCBmb3IgdGhlIHRhcmdldAotICAgICAqIGFzIHRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSB0YXJnZXRzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFRhc2tNYW5hZ2VyIGZvciB0aGlzIHByb2plY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYXNrTWFuYWdlciB0YXNrTWFuYWdlcjsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ09OU1RSVUNUT1JTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUHJvamVjdCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gRnJvbnRFbmQgYW5kIFRhc2tNYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3QoQW50RnJvbnRFbmQgZnJvbnRFbmQsIFRhc2tNYW5hZ2VyIHRhc2tNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMuZnJvbnRFbmQgPSBmcm9udEVuZDsKLSAgICAgICAgdGhpcy50YXNrTWFuYWdlciA9IHRhc2tNYW5hZ2VyOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFVCTElDICBNRVRIT0RTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSB0YXJnZXQgdG8gdGhpcyBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRhcmdldChUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIC8vIFhYWCBjaGVjayBvdXQgZm9yIG5hbWUsIGlmIG51bGwsIHJlamVjdCEKLSAgICAgICAgdGFyZ2V0cy5wdXQodGFyZ2V0LmdldE5hbWUoKSwgdGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0QmFzZURpcigpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VEaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB0YXJnZXQgZm9yIHRoaXMgcHJvamVjdCwgaWYgdGhlcmUgaXMgb25lLiBPdGhlcndpc2UKLSAgICAgKiBpdCByZXR1cm5zIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRUYXJnZXROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb2plY3QsIGlmIGFueS4gSWYgbm90LCByZXR1cm5zIAotICAgICAqIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZyb250IGVuZCB0aGF0IGlzIHJ1bm5pbmcgdGhpcyBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBBbnRGcm9udEVuZCBnZXRGcm9udEVuZCgpIHsKLSAgICAgICAgcmV0dXJuIGZyb250RW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBQcm9qZWN0IG9iamVjdCB0byB0aGlzIFByb2plY3QgaWYgYSBwYXJlbnQKLSAgICAgKiBwcm9qZWN0IGV4aXN0cy4gSWYgdGhlcmUgaXMgbm90IGEgcGFyZW50IFByb2plY3Qgb2JqZWN0LCBudWxsCi0gICAgICogaXMgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3QgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50UHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgaWRlbnRpZmllZCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiBubyB0YXJnZXQKLSAgICAgKiBpcyBrbm93biBieSB0aGUgZ2l2ZW4gbmFtZSwgdGhlbiBudWxsIGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBUYXJnZXQgZ2V0VGFyZ2V0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoVGFyZ2V0KXRhcmdldHMuZ2V0KG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGV4dW1lcmF0aW9uIG9mIGFsbCB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VGFyZ2V0cygpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldHMuZWxlbWVudHMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGlzIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eS4gUmV0dXJucyBudWxsIGlmIHRoZSBwcm9wZXJ0eSBkb2VzCi0gICAgICogbm90IGV4aXN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIC8vcHVibGljIHZvaWQgc2V0QW50KEFudCBhbnQpIHsKLSAgICAvLyAgICB0aGlzLmFudCA9IGFudDsKLSAgICAvL30KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBiYXNlIGRpciBmb3IgdGhpcyBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VEaXIoRmlsZSBkaXIpIHsKLSAgICAgICAgLy8gWFhYIHNob3VsZCBjaGVjayB0aGlzIHRvIG1ha2Ugc3VyZSBpdCdzIGEgZGlyIQotICAgICAgICBiYXNlRGlyID0gZGlyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHRhcmdldCBmb3IgdGhpcyBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXJnZXROYW1lKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0gICAgICAgIGRlZmF1bHRUYXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmcm9udCBlbmQgZm9yIHRoaXMgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9udEVuZChBbnRGcm9udEVuZCBmcm9udEVuZCkgewotICAgICAgICB0aGlzLmZyb250RW5kID0gZnJvbnRFbmQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgcHJvcGVydHkgb24gdGhpcyBwcm9qZWN0LiBJZiB0aGUgcHJvcGVydHkgaXMgYWxyZWFkeQotICAgICAqIHNldCwgdGhpcyBtZXRob2Qgd2lsbCBvdmVycmlkZSBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICBwcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTdGFydHMgYSBidWlsZCBvZiB0aGlzIHByb2plY3QgdXNpbmcgdGhlIGRlZmF1bHQgdGFyZ2V0IGlmIG9uZQotICAgICAqIGlzIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEJ1aWxkKCkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFhYWCBuZWVkIHRvIGRvIHNvbWV0aGluZyBpZiB0aGUgZGVmYXVsdCB0YXJnZXQgaXNuJ3Qgc2V0Li4KLSAgICAgICAgLy8gbWF5YmUgbG9vayBmb3IgdGFyZ2V0IG5hbWUgJ2RlZmF1bHQnLCB0aGVuIGJhaWw/Ci0gICAgICAgIHN0YXJ0QnVpbGQoZGVmYXVsdFRhcmdldE5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTdGFydHMgYSBidWlsZCBvZiB0aGlzIHByb2plY3Qgd2l0aCB0aGUgZW50cnkgcG9pbnQgYXQgdGhlIGdpdmVuCi0gICAgICogdGFyZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0QnVpbGQoU3RyaW5nIHRhcmdldE5hbWUpIHRocm93cyBBbnRFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgLy8gbm90aWZ5IEFudEZyb250RW5kIHRoYXQgd2UgYXJlIHN0YXJ0aW5nIGEgYnVpbGQgb24gYSBwcm9qZWN0Ci0gICAgICAgIAotICAgICAgICBmcm9udEVuZC5ub3RpZnlQcm9qZWN0U3RhcnQodGhpcyk7Ci0gICAgICAgIAotICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gZ2V0VGFyZ2V0KHRhcmdldE5hbWUpOwotICAgICAgICAKLSAgICAgICAgZnJvbnRFbmQubm90aWZ5VGFyZ2V0U3RhcnQodGFyZ2V0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFhYWCBkb24ndCBmb3JnZXQgdG8gZXhlY3V0ZSBkZXBlbmRhbmNpZXMgZmlyc3QhCi0gICAgICAgIAotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gdGFyZ2V0LmdldFRhc2tzKCkuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFRhc2sgdGFzayA9IChUYXNrKWVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGZyb250RW5kLm5vdGlmeVRhc2tTdGFydCh0YXNrKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQWJzdHJhY3RUYXNrIGFUYXNrID0gdGFza01hbmFnZXIuZ2V0VGFza0luc3RhbmNlKHRhc2suZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBhVGFzay5zZXRQcm9qZWN0KHRoaXMpOwotICAgICAgICAgICAgICAgIGFUYXNrLnNldEF0dHJpYnV0ZXModGFzay5nZXRBdHRyaWJ1dGVzKCkpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IGFUYXNrLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWIpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUYXNrICIgKyB0YXNrLmdldFR5cGUoKSArICIgZmFpbGVkIjsKLSAgICAgICAgICAgICAgICAgICAgQW50RXhjZXB0aW9uIGFlID0gbmV3IEFudEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBhZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFudEV4Y2VwdGlvbiBhZTsKLSAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQW50RXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBhZSA9IG5ldyBBbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWUgPSAoQW50RXhjZXB0aW9uKWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFlLnNldFByb2plY3QodGhpcyk7Ci0gICAgICAgICAgICAgICAgYWUuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgYWUuc2V0VGFzayh0YXNrKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBhZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyb250RW5kLm5vdGlmeVRhc2tFbmQodGFzayk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG5vdGlmeSBmcm9udEVuZCB0aGF0IHdlIGFyZSBkb25lCi0gICAgICAgIGZyb250RW5kLm5vdGlmeVRhcmdldEVuZCh0YXJnZXQpOwotICAgICAgICBmcm9udEVuZC5ub3RpZnlQcm9qZWN0RW5kKHRoaXMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHaXZlbnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUHJvamVjdCBuYW1lPSIgKyBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGVhdGVyL3NvdXJjZS9tYWluL29yZy9hcGFjaGUvYW50L1Byb2plY3RCdWlsZGVyLmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9Qcm9qZWN0QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTJlYjEzLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGVhdGVyL3NvdXJjZS9tYWluL29yZy9hcGFjaGUvYW50L1Byb2plY3RCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKTIwMDAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGJ1aWxkIFByb2plY3Qgb2JqZWN0IHRyZWVzLgotICoKLSAqIFhYWCByaWdodCBub3cgdGhpcyBjbGFzcyBvbmx5IGRlYWxzIHdpdGggdGhlIHByaW1hcnkgbGV2ZWxzIChwcm9qZWN0L3RhcmdldC90YXNrKQotICogYW5kIG5vdGhpbmcgZWxzZS4gQWxzbywgaXQgb25seSBzdXBwb3J0cyBhdHRyaWJ1dGVzLi4uLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIChkdW5jYW5AYXBhY2hlLm9yZykKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RCdWlsZGVyIHsKLSAgICAgICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQUklWQVRFIE1FTUJFUlMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBBbnRGcm9udEVuZCBmcm9udEVuZDsKLSAgICAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYXNrTWFuYWdlciB0YXNrTWFuYWdlcjsKLSAgICAgICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDT05TVFJVQ1RPUlMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgCi0gICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2plY3QgYnVpbGRlciB0aGF0IHdpbGwgYnVpbGQgcHJvamVjdHMgZm9yIHRoZSBnaXZlbgotICAgICAqIEFudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdEJ1aWxkZXIoQW50RnJvbnRFbmQgZnJvbnRFbmQpIHsKLSAgICAgICAgdGhpcy5mcm9udEVuZCA9IGZyb250RW5kOwotICAgICAgICB0YXNrTWFuYWdlciA9IG5ldyBUYXNrTWFuYWdlcihmcm9udEVuZCk7Ci0gICAgICAgIHBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIHBhcnNlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7ICAKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQVUJMSUMgTUVUSE9EUwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgcHJvamVjdCBmcm9tIHRoZSBnaXZlbiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0IGJ1aWxkRnJvbUZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgQW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgICAgQnVpbGRlckhhbmRsZXJCYXNlIGJoYiA9IG5ldyBCdWlsZGVySGFuZGxlckJhc2UoKTsKLSAgICAgICAgICAgIGJoYi5zZXRQcm9qZWN0RmlsZUxvY2F0aW9uKGZpbGUpOwotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGZpbGUsIGJoYik7Ci0gICAgICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBiaGIuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgcHJvamVjdC5zZXRGcm9udEVuZChmcm9udEVuZCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24ocGNlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICBFeGNlcHRpb24gZSA9IHNlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgQW50RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLy8gaXQncyBvbmUgb2Ygb3VyIG93biB0aHJvd24gZnJvbSBpbnNpZGUgdGhlIHBhcnNlciB0byBzdG9wIGl0Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEFudEV4Y2VwdGlvbillOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEFudEV4Y2VwdGlvbihzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFudEV4Y2VwdGlvbihpb2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFRhc2tNYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByb2plY3RCdWlsZGVyIGFuZAotICAgICAqIHRoZSBwcm9qZWN0cyB0aGF0IGl0IGJ1aWxkcwotICAgICAqLwotICAgIHB1YmxpYyBUYXNrTWFuYWdlciBnZXRUYXNrTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tNYW5hZ2VyOwotICAgIH0KLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIElOTkVSIENMQVNTRVMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIG5lZWRlZCBTQVggbWV0aG9kcyB0byBnZXQgYWxsIHRoZQotICAgICAqIGRhdGEgbmVlZGVkIG91dCBvZiBhIGJ1aWxkIGZpbGUuCi0gICAgICovCi0gICAgY2xhc3MgQnVpbGRlckhhbmRsZXJCYXNlIGV4dGVuZHMgSGFuZGxlckJhc2UgewotICAgIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU1RBUlQgPSAwOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPSkVDVCA9IDE7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9UQVJHRVQgPSAyOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVEFTSyA9IDM7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ERVNDUklQVElPTiA9IDQ7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUk9QRVJUWSA9IDU7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9GSU5JU0hFRCA9IDk5OwotICAgIAotICAgICAgICBwcml2YXRlIGludCBzdGF0ZSA9IFNUQVRFX1NUQVJUOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3IgdGFnQ2hhckRhdGFTdGFjayA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgVGFyZ2V0IGN1cnJlbnRUYXJnZXQ7Ci0gICAgICAgIHByaXZhdGUgVGFzayBjdXJyZW50VGFzazsKLSAgICAKLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gbmV3IFByb2plY3QoZnJvbnRFbmQsIHRhc2tNYW5hZ2VyKTsKLSAgICAKLSAgICAgICAgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgc2V0UHJvamVjdEZpbGVMb2NhdGlvbihGaWxlIGZpbGUpIHsKLSAgICAgICAgICAgIHByb2plY3Quc2V0QmFzZURpcihmaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHRhZ0NoYXJEYXRhID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgdGFnQ2hhckRhdGFTdGFjay5pbnNlcnRFbGVtZW50QXQodGFnQ2hhckRhdGEsIDApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgY2FzZSBTVEFURV9TVEFSVDoKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInByb2plY3QiKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BST0pFQ1Q7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGF0dHMuZ2V0VmFsdWUoIm5hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3ROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2plY3QgZWxlbWVudCBkb2Vzbid0IGNvbnRhaW4gYSBuYW1lIGF0dHJpYnV0ZSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbnRFeGNlcHRpb24gYWUgPSBuZXcgQW50RXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGFlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFRhcmdldCA9IGF0dHMuZ2V0VmFsdWUoImRlZmF1bHQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZWZhdWx0VGFyZ2V0TmFtZShkZWZhdWx0VGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpck5hbWUgPSBhdHRzLmdldFZhbHVlKCJiYXNlZGlyIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlRGlyTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggbmVlZCB0byBjaGVjayB0byBzZWUgaWYgYmFzZSBkaXIgZXhpc3RzCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VEaXIobmV3IEZpbGUoYmFzZURpck5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvamVjdCBmaWxlIGRvZXNuJ3QgY29udGFpbiBhIHByb2plY3QgZWxlbWVudCBhcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdHMgcm9vdCBub2RlIjsKLSAgICAgICAgICAgICAgICAgICAgQW50RXhjZXB0aW9uIGFlID0gbmV3IEFudEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGFlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJPSkVDVDoKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdmFsaWQgdGFncyBpbiBhIHByb2plY3Qgb2JqZWN0IGFyZTogZGVzY3JpcHRpb24sIHByb3BlcnR5LCBhbmQgdGFyZ2V0Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiZGVzY3JpcHRpb24iKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RFU0NSSVBUSU9OOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInByb3BlcnR5IikpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QUk9QRVJUWTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGF0dHMuZ2V0VmFsdWUoIm5hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBhdHRzLmdldFZhbHVlKCJ2YWx1ZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiTmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBwcmVzZW50IG9uIHByb3BlcnR5IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFudEV4Y2VwdGlvbiBhZSA9IG5ldyBBbnRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oYWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJWYWx1ZSBhdHRyaWJ1dGUgbXVzdCBiZSBwcmVzZW50IG9uIHByb3BlcnR5IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFudEV4Y2VwdGlvbiBhZSA9IG5ldyBBbnRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oYWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidGFyZ2V0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9UQVJHRVQ7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gYXR0cy5nZXRWYWx1ZSgibmFtZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gbmV3IFRhcmdldCh0YXJnZXROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuYWRkVGFyZ2V0KGN1cnJlbnRUYXJnZXQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGZpZ3VyZSBvdXQgd2hpY2ggdGFyZ2V0IHdlJ3JlIHRhbGtpbmcgYWJvdXQhIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGlrZSBhIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlRhcmdldCBlbGVtZW50IGRvZXNuJ3QgY29udGFpbiBhIG5hbWUgYXR0cmlidXRlIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFudEV4Y2VwdGlvbiBhZSA9IG5ldyBBbnRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oYWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXBlbmRzID0gYXR0cy5nZXRWYWx1ZSgiZGVwZW5kcyIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihkZXBlbmRzLCAiLCIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFkZERlcGVuZGFuY3kodG9rLm5leHRUb2tlbigpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFhYWCBhZGQgZGVwZW5kZW5jeSBjaGVja3MKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGluZyB0YXJnZXQsIGdvdDogIiArIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAvLyBYWFggZXhjZXB0aW9uIG91dAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgY2FzZSBTVEFURV9UQVJHRVQ6Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFZhbGlkIHRhZ3MgaW5zaWRlIHRhcmdldDogdGFzawotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1RBU0s7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkdldHRpbmcgdGFzazogIiArIG5hbWUgKyAiIGZvciB0YXJnZXQgIiArIAotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQpOwotICAgICAgICAgICAgICAgIC8vIFhYWCBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGFzayB0eXBlIChuYW1lKSBleGlzdHMgaW4gc3lzdGVtCi0gICAgICAgICAgICAgICAgLy8gZWxzZSBleGNlcHRpb24gb3V0LgotICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrID0gbmV3IFRhc2sobmFtZSk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldC5hZGRUYXNrKGN1cnJlbnRUYXNrKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXROYW1lID0gYXR0cy5nZXROYW1lKGkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXRWYWx1ZSA9IGF0dHMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrLmFkZEF0dHJpYnV0ZShhdE5hbWUsIGF0VmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgY2FzZSBTVEFURV9UQVNLOgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBkYXRhIGluIGhlcmUgbmVlZHMgdG8gYmUgcmVmbGVjdGVkIGludG8gdGFza3MKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vdCB5ZXQgc3VwcG9ydGluZyB0YWdzIGluc2lkZSBvZiB0YXNrcyEiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBwcm9qZWN0IGJ1aWxkIHdpbGwgcHJvYmFibHkgYnVzdCByaWdodCBoZXJlIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJJ20gbm90IHN1cmUsIGJ1dCB3ZSdyZSBvZmYgYmFzZSBoZXJlOiAiICsgbmFtZSk7Ci0gICAgICAgICAgICAgICAgLy8gWFhYIGV4Y2VwdGlvbiBvdXQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gKFN0cmluZ0J1ZmZlcil0YWdDaGFyRGF0YVN0YWNrLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVsZW1lbnREYXRhID0gKFN0cmluZ0J1ZmZlcil0YWdDaGFyRGF0YVN0YWNrLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgICAgIHRhZ0NoYXJEYXRhU3RhY2sucmVtb3ZlRWxlbWVudEF0KDApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgY2FzZSBTVEFURV9UQVNLOgotICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfVEFSR0VUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGNhc2UgU1RBVEVfVEFSR0VUOgotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygidGFyZ2V0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QUk9KRUNUOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0aW5nIHRvIGdldCBhbiBlbmQgb2YgdGFyZ2V0LCBnb3Q6ICIgKyBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGV4Y2VwdGlvbiBvdXQuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGNhc2UgU1RBVEVfREVTQ1JJUFRJT046Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJkZXNjcmlwdGlvbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUFJPSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihlbGVtZW50RGF0YS50b1N0cmluZygpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RpbmcgdG8gZ2V0IGFuIGVuZCBvZiBkZXNjcmlwdGlvbiwgZ290OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAvLyBYWFggZXhjZXB0aW9uIG91dC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgY2FzZSBTVEFURV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInByb3BlcnR5IikpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QUk9KRUNUOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0aW5nIHRvIGdldCBlbmQgb2YgcHJvcGVydHksIGdvdDogIiArIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAvLyBYWFggZXhjZXB0aW9uIG91dAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BST0pFQ1Q6Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJwcm9qZWN0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGluZyB0byBnZXQgZW5kIG9mIHByb2plY3QsIGdvdDogIiArIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAvLyBYWFggZXhjZXB0aW9uIG91dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkknbSBub3Qgc3VyZSB3aGF0IHdlIGFyZSBlbmRpbmcgaGVyZTogIiArIG5hbWUpOwotICAgICAgICAgICAgICAgIC8vIFhYWCBleGNlcHRpb24gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvVGFyZ2V0LmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9UYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1Yzk4YS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9UYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gKGMpMjAwMCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogSW4gbWVtb3J5IGNvbnRhaW5lciBmb3IgYW4gQW50IHRhcmdldC4KLSAqLwotcHVibGljIGNsYXNzIFRhcmdldCB7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFBSSVZBVEUgREFUQSBNRU1CRVJTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuIFRoaXMgbmFtZSBtdXN0IGJlCi0gICAgICogdW5pcXVlIHdpdGhpbmcgYSBwcm9qZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBWZWN0b3IgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIHRhcmdldHMgdGhhdCB0aGlzIHRhcmdldAotICAgICAqIGRlcGVuZHMgb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgZGVwZW5kc0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBWZWN0b3IgY29udGFpbmluZyB0aGUgdGFza3MgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHRhcmdldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciB0YXNrcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ09OU1RSVUNUT1JTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBUYXJnZXQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFBVQkxJQyBBQ0NFU1NPUiBNRVRIT0RTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZGVwZW5kYW5jeSB0byB0aGlzIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGVwZW5kYW5jeShTdHJpbmcgdGFyZ2V0TmFtZSkgewotICAgICAgICBkZXBlbmRzTGlzdC5hZGRFbGVtZW50KHRhcmdldE5hbWUpOwotICAgIH0KLSAgICAgICAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayB0YXNrKSB7Ci0gICAgICAgIHRhc2tzLmFkZEVsZW1lbnQodGFzayk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGlzIFRhcmdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVEFSR0VUOiAiICsgbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIG9mIFRhc2tzIGNvbnRhaW5lZCBpbiB0aGlzIFRhcmdldC4gCi0gICAgICogPHA+Ci0gICAgICogUGxlYXNlIHVzZSBjYXV0aW9uIHdoZW4gdXNpbmcgdGhpcyBtZXRob2QuIEkgYW0gbm90IGhhcHB5Ci0gICAgICogYWJvdXQgZXhwb3NpbmcgdGhpcyBkYXRhIGFzIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgCi0gICAgICogQ29sbGVjdGlvbiwgYnV0IGRvbid0IHdhbnQgdG8gdXNlIDEuMSBjb2xsZWN0aW9ucy4gU28sIAotICAgICAqIHRoaXMgbWV0aG9kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4gWW91IGhhdmUgYmVlbiB3YXJuZWQuCi0gICAgICovCi0gICAgcHVibGljIFZlY3RvciBnZXRUYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9UYXNrLmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2M2M4MDEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAoYykyMDAwIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBJbiBtZW1vcnkgY29udGFpbmVyIGZvciBhbiBBbnQgdGFyZ2V0LgotICoKLSAqIFhYWCBuZWVkIGEgd2F5IHRvIHF1ZXJ5IHdoaWNoIGF0dHJpYnV0ZXMgYXJlIHZhbGlkIGZvciB0aGlzIHBhcnRpY3VsYXIKLSAqIHRhc2sgdHlwZS4uLiBMaWtlIGludG8gQW50IG9iamVjdCB0byBkbyB0aGlzPwotICovCi1wdWJsaWMgY2xhc3MgVGFzayB7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFBSSVZBVEUgREFUQSBNRU1CRVJTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHR5cGUgb2YgdGhlIHRhc2suCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ09OU1RSVUNUT1JTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBUYXNrKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQVUJMSUMgQUNDRVNTT1IgTUVUSE9EUwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKWF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgewotICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5rZXlzKCk7Ci0gICAgfQotICAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhpcyBUYXJnZXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlRBU0s6ICIgKyB0eXBlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGVhdGVyL3NvdXJjZS9tYWluL29yZy9hcGFjaGUvYW50L1Rhc2tNYW5hZ2VyLmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9UYXNrTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmZjN2U5Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGVhdGVyL3NvdXJjZS9tYWluL29yZy9hcGFjaGUvYW50L1Rhc2tNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKTIwMDAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotLyoqCi0gKiBNYW5hZ2VyIG9mIHRhc2tzIGFuZCBhbGwgdGhpbmdzIHJlbGF0ZWQgdG8gdGFza3MuIFRhc2tzIGNhbiBiZSBmb3VuZCBpbiBhCi0gKiB3aWRlIG51bWJlciBvZiBsb2NhdGlvbnMgLS0gYW5kIG1vc3Qgb2YgdGhlc2UgbG9jYXRpb25zIHJlcXVpcmUgY2xhc3MgbG9hZGluZwotICogaGVscC4gQXMgd2VsbCwgbmV3IG5vZGVzIG9uIHRoZSB0YXNrIHNlYXJjaCBwYXRoIG1heSBiZSBhZGRlZCBhdCBhbnkgdGltZS4KLSAqIFdoZW4gdGhlc2UgYXJlIGFkZGVkLCBuZXcgdGFza3Mgc2hvdWxkIGJlIHNjYW5uZWQgZm9yLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIChkdW5jYW5AYXBhY2hlLm9yZykKLSAqLwotcHVibGljIGNsYXNzIFRhc2tNYW5hZ2VyIHsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFJJVkFURSBEQVRBIE1FTUJFUlMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqIEZyb250RW5kIHRoYXQgdGhpcyBUYXNrTWFuYWdlciBjYW4gY29tbXVuaWNhdGUgdGhyb3VnaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFudEZyb250RW5kIGZyb250RW5kOwotICAgIAotICAgIC8qKgotICAgICAqIERhdGEgc3RydWN0dXJlIHdoZXJlIGFsbCB0aGUgQ2xhc3MgZGVmaW5pdGlvbiBmb3IgYWxsIGtub3duIHRhc2tzIGFyZQotICAgICAqIGhlbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFza0NsYXNzZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgdGhlIG5vZGVzIHdoZXJlIHRhc2tzIGFyZSBwaWNrZWQgdXAgZnJvbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciB0YXNrUGF0aE5vZGVzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDT05TVFJVQ1RPUlMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgVGFza01hbmFnZXIuCi0gICAgICovCi0gICAgVGFza01hbmFnZXIoQW50RnJvbnRFbmQgZnJvbnRFbmQpIHsKLSAgICAgICAgdGhpcy5mcm9udEVuZCA9IGZyb250RW5kOwotICAgIH0KLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFBVQkxJQyBNRVRIT0RTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbm9kZSB0byB0aGUgdGFzayBwYXRoIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRhc2tQYXRoTm9kZShGaWxlIGZpbGUpIHRocm93cyBBbnRFeGNlcHRpb24gewotICAgICAgICB0YXNrUGF0aE5vZGVzLmFkZEVsZW1lbnQoZmlsZSk7Ci0gICAgICAgIHByb2Nlc3NUYXNrUGF0aE5vZGUoZmlsZSk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBQQUNLQUdFIE1FVEhPRFMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgQWJzdHJhY3RUYXNrIGdldFRhc2tJbnN0YW5jZShTdHJpbmcgdGFza05hbWUpIHRocm93cyBBbnRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcyl0YXNrQ2xhc3Nlcy5nZXQodGFza05hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChBYnN0cmFjdFRhc2spY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNhbid0IGluc3RhbnRpYXRlIHRhc2s6ICIgKyB0YXNrTmFtZTsKLSAgICAgICAgICAgIEFudEV4Y2VwdGlvbiBhZSA9IG5ldyBBbnRFeGNlcHRpb24obXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IGFlOwotICAgICAgICB9Ci0gICAgfQotIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFJJVkFURSBNRVRIT0RTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZW51bSBvZiB0aGUgdGFzayBuYW1lcyB0aGF0IGFyZSBkZWZpbmVkIGluIGEgZ2l2ZW4gCi0gICAgICogcHJvcGVydGllcyBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgRW51bWVyYXRpb24gZ2V0VGFza05hbWVzKFByb3BlcnRpZXMgcHJvcHMpIHsKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFN0cmluZyBzID0gcHJvcHMuZ2V0UHJvcGVydHkoInRhc2tzIik7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICIsIiwgZmFsc2UpOwotICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHRhc2tOYW1lID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICAgIHYuYWRkRWxlbWVudCh0YXNrTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHYuZWxlbWVudHMoKTsKLSAgICB9Ci0gICAKLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBkaXJlY3RvcnkgdG8gZ2V0IGNsYXNzIGRlZmludGlvbnMgZnJvbSBpdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRGlyKEZpbGUgZGlyKSB7Ci0gICAgICAgIGZyb250RW5kLndyaXRlTWVzc2FnZSgiU2Nhbm5pbmcgIiArIGRpciArICIgZm9yIHRhc2tzIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRGcm9udEVuZC5NU0dfTEVWRUxfTE9XKTsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCAidGFza2RlZi5wcm9wZXJ0aWVzIik7Ci0gICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBnZXRUYXNrTmFtZXMocHJvcHMpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXNrTmFtZSA9IChTdHJpbmcpZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFza0NsYXNzID0gcHJvcHMuZ2V0UHJvcGVydHkoInRhc2suIiArIHRhc2tOYW1lICsgIi5jbGFzcyIpOwotICAgICAgICAgICAgICAgICAgICBVUkxDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHtkaXIudG9VUkwoKX0pOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBsb2FkZXIubG9hZENsYXNzKHRhc2tDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcm9udEVuZC53cml0ZU1lc3NhZ2UoIkdvdCBUYXNrOiAiICsgdGFza05hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LCBBbnRGcm9udEVuZC5NU0dfTEVWRUxfTE9XKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tDbGFzc2VzLnB1dCh0YXNrTmFtZSwgY2xhenopOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGRuJ3QgbG9hZCB0YXNrOiAiICsgdGFza05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNuZmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGVycm9yIG91dCBhbmQgc3RvcC4uLi4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IHdvcmsgd2l0aCBkaXI6ICIgKyBkaXIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpb2UpOwotICAgICAgICAgICAgICAgIC8vIFhYWCBlcnJvciBvdXQgYW5kIHN0b3AgdGhlIGJ1aWxkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAKLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBqYXIgZmlsZSB0byBnZXQgY2xhc3MgZGVmaW5pdGlvbnMgZnJvbSBpdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSmFyKEZpbGUgZmlsZSkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZyb250RW5kLndyaXRlTWVzc2FnZSgiU2Nhbm5pbmcgIiArIGZpbGUgKyAiIGZvciB0YXNrcyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50RnJvbnRFbmQuTVNHX0xFVkVMX0xPVyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKLSAgICAgICAgICAgIFppcEVudHJ5IHppcEVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeSgidGFza2RlZi5wcm9wZXJ0aWVzIik7Ci0gICAgICAgICAgICBpZiAoemlwRW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbSh6aXBFbnRyeSk7Ci0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgcHJvcHMubG9hZChpbik7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBnZXRUYXNrTmFtZXMocHJvcHMpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhc2tOYW1lID0gKFN0cmluZyllbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXNrQ2xhc3MgPSBwcm9wcy5nZXRQcm9wZXJ0eSgidGFzay4iICsgdGFza05hbWUgKyAiLmNsYXNzIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJObyBjbGFzcyBkZWZpbml0aW9uIGZvciB0YXNrICIgKyB0YXNrTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIGphciBmaWxlICIgKyBmaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFudEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFVSTENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10ge2ZpbGUudG9VUkwoKX0pOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBsb2FkZXIubG9hZENsYXNzKHRhc2tDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAlmcm9udEVuZC53cml0ZU1lc3NhZ2UoIkdvdCBUYXNrOiAiICsgdGFza05hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LCBBbnRGcm9udEVuZC5NU0dfTEVWRUxfTE9XKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tDbGFzc2VzLnB1dCh0YXNrTmFtZSwgY2xhenopOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGRuJ3QgbG9hZCB0YXNrOiAiICsgdGFza05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNuZmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGVycm9yIG91dCBhbmQgc3RvcC4uLi4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBub3QgbGVhdmUgcmVzb3VyY2VzIGhhbmdpbmcKLSAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkbid0IHdvcmsgd2l0aCBmaWxlOiAiICsgZmlsZSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW9lKTsKLSAgICAgICAgICAgIC8vIFhYWCBuZWVkIHRvIGV4Y2VwdGlvbiBvdXQgb2YgaGVyZSBwcm9wZXJseSB0byBzdG9wIHRoaW5ncyAKLSAgICAgICAgfQotICAgIH0KLSAgIAotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIG5vZGUgb2YgdGhlIHRhc2sgcGF0aCBzZWFyY2hpbmcgZm9yIHRhc2sgZGVmaW5pdGlvbnMgdGhlcmUKLSAgICAgKiBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlIGxpc3Qgb2Yga25vd24gdGFza3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Rhc2tQYXRoTm9kZShGaWxlIGZpbGUpIHRocm93cyBBbnRFeGNlcHRpb24gewotICAgIAotICAgICAgICAvLyB0YXNrIHBhdGggbm9kZXMgY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAvLyAgICAgKiBqYXIgZmlsZQotICAgICAgICAvLyAgICAgKiBkaXJlY3Rvcnkgb2YgamFyIGZpbGVzCi0gICAgICAgIC8vICAgICAqIGRpcmVjdG9yeSBob2xkaW5nIGNsYXNzIGZpbGVzCi0gICAgICAgIAotICAgICAgICBpZihmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGxvb2sgZm9yIGFsbCBqYXIgZmlsZXMgaGVyZQotICAgICAgICAgICAgLy8gc2Vjb25kIGxvb2sgZm9yIGEgdGFza2RlZnMucHJvcGVydGllcyBoZXJlIHRvIHNlZSBpZiB3ZSBzaG91bGQKLSAgICAgICAgICAgIC8vIHRyZWF0IHRoZSBkaXJlY3RvcnkgYXMgYSBjbGFzc3BhdGgKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZXNbaV0uZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSmFyKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlc1tpXS5lcXVhbHMoInRhc2tkZWYucHJvcGVydGllcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEaXIoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKLSAgICAgICAgICAgIHByb2Nlc3NKYXIoZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB1cCB0aGUgdGFza3BhdGggYmFzZWQgb24gdGhlIGN1cnJlbnRseSBydW5uaW5nIG9wZXJhdGluZwotICAgICAqIHN5c3RlbS4gSW4gZ2VuZXJhbCwgdGhlIG9yZGVyaW5nIG9mIHRoZSB0YXNrcGF0aCBpczogdXNlciBkaXJlY3RvcnksCi0gICAgICogc3lzdGVtIGRpcmVjdG9yeSwgYW5kIHRoZW4gaW5zdGFsbGF0aW9uLiBUaGlzIGFsbG93cyB1c2VycyBvcgotICAgICAqIHN5c3RlbSBhZG1pbnMgdG8gb3ZlcnJpZGUgb3IgYWRkIHRhc2tzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRVcFRhc2tQYXRoKCkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyAxc3QsIGFkZCB1c2VyJ3MgaG9tZSBkaXIuCi0gICAgICAgIAotICAgICAgICBGaWxlIGY7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdXNlckhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOwotICAgICAgICAKLSAgICAgICAgLy8gZ2VuZXJpYyB1bml4Ci0gICAgICAgIGYgPSBuZXcgRmlsZSh1c2VySG9tZSArICIuYW50IiwgInRhc2tzIik7Ci0gICAgICAgIGlmIChmLmV4aXN0cygpICYmIGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgYWRkVGFza1BhdGhOb2RlKGYpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBtYWNvcyB4Ci0gICAgICAgIGYgPSBuZXcgRmlsZSh1c2VySG9tZSArICIvTGlicmFyeS9BbnQiLCAiVGFza3MiKTsKLSAgICAgICAgaWYgKGYuZXhpc3RzKCkgJiYgZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBhZGRUYXNrUGF0aE5vZGUoZik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHdpbmRvd3MgLS0gdG9kbwotICAgICAgICAKLSAgICAgICAgLy8gMm5kLCBhZGQgc3lzdGVtIGxvY2FsIGRpci4KLSAgICAgICAgCi0gICAgICAgIC8vIGdlbmVyaWMgdW5peAotICAgICAgICBmID0gbmV3IEZpbGUoIi91c3IvbG9jYWwvYW50L3Rhc2tzIik7Ci0gICAgICAgIGlmIChmLmV4aXN0cygpICYmIGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgYWRkVGFza1BhdGhOb2RlKGYpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBtYWNvcyB4Ci0gICAgICAgIGYgPSBuZXcgRmlsZSgiL0xpYnJhcnkvQW50L1Rhc2tzIik7Ci0gICAgICAgIGlmIChmLmV4aXN0cygpICYmIGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgYWRkVGFza1BhdGhOb2RlKGYpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyB3aW5kb3dzIC0tIHRvZG8KLSAgICAgICAgCi0gICAgICAgIC8vIDNyZCwgYWRkIGluc3RhbGxhdGlvbiBsb2NhbCBkaXIuCi0gICAgICAgIAotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQkFTRTogIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiLyIpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFhYWCAtLS0tIG5vdCByZWFsbHkgc3VyZSBob3cgdGhlIGJlc3Qgd2F5IG9mIGdldHRpbmcgdGhpcyBpbmZvIGlzLi4uCi0gICAgICAgIC8vIGhhZnRhIHRoaW5rIGFib3V0IGl0LgotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvY2xpL0NMSUZyb250RW5kLmphdmEgYi9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9jbGkvQ0xJRnJvbnRFbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjYjhmMy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9jbGkvQ0xJRnJvbnRFbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpMjAwMCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNsaTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC4qOwotCi0vKioKLSAqIEZyb250IGVuZCBmb3IgdGhlIENvbW1hbmQgTGluZSBJbnRlcmZhY2UgdGhhdCBnZXRzIHBhc3NlZCB0byBBbnQgc28gdGhhdAotICogaXQgY2FuIGNvbW11bmljYXRlIGluZm9ybWF0aW9uIHRvIHRoZSBDTEkuCi0gKgotICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gKGR1bmNhbkBhcGFjaGUub3JnKQotICovCi1wdWJsaWMgY2xhc3MgQ0xJRnJvbnRFbmQgZXh0ZW5kcyBBbnRGcm9udEVuZCB7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFBSSVZBVEUgTUVNQkVSUwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gYXJnczsKLQotICAgIC8qKgotICAgICAqIFByb2plY3RCdWlsZGVyIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJvbnRFbmQuIAotICAgICAqLwotICAgIHByaXZhdGUgUHJvamVjdEJ1aWxkZXIgcHJvamVjdEJ1aWxkZXI7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1zZ0xldmVsRmlsdGVyID0gTVNHX0xFVkVMX01FRDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUYXNrTWFuYWdlciBpbnN0YW5jZSB0aGF0IHdlIGNhbiBzZXQgdGFza3BhdGhzIGFuZCBzdWNoIG9uLgotICAgICAqLwotICAgIHByaXZhdGUgVGFza01hbmFnZXIgdGFza01hbmFnZXI7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDT05TVFJVQ1RPUlMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQ0xJRnJvbnRFbmQgdGhhdCBjYW4gZHJpdmUgYW4gQW50IGJ1aWxkIGZyb20gdGhlIENvbW1hbmQKLSAgICAgKiBMaW5lLgotICAgICAqLwotICAgIHB1YmxpYyBDTElGcm9udEVuZCgpIHsKLSAgICAgICAgcHJvamVjdEJ1aWxkZXIgPSBuZXcgUHJvamVjdEJ1aWxkZXIodGhpcyk7Ci0gICAgICAgIHRhc2tNYW5hZ2VyID0gcHJvamVjdEJ1aWxkZXIuZ2V0VGFza01hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFBVQkxJQyBNRVRIT0RTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0KLSAgICAvKioKLSAgICAgKiBTZW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgRnJvbnRFbmQgdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIGludG8KLSAgICAgKiB0aGUgc2NvcGUgb2YgYSBwYXJ0aWN1bGFyIHByb2plY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgICogZG9lcyBub3RoaW5nLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQcm9qZWN0U3RhcnQoUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHdyaXRlTWVzc2FnZSgiUHJvamVjdCBTdGFydDogIiArIHByb2plY3QuZ2V0TmFtZSgpLCBNU0dfTEVWRUxfTE9XKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgRnJvbnRFbmQgdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIG91dAotICAgICAqIG9mIHRoZSBzY29wZSBvZiBhIHBhcnRpY3VsYXIgUHJvamVjdC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgKiBkb2VzIG5vdGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UHJvamVjdEVuZChQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgd3JpdGVNZXNzYWdlKCJQcm9qZWN0IEVuZDogIiArIHByb2plY3QuZ2V0TmFtZSgpLCBNU0dfTEVWRUxfTE9XKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VuZCBub3RpZmljYXRpb24gdG8gdGhlIEZyb250RW5kIHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCBpbnRvCi0gICAgICogdGhlIHNjb3BlIG9mIGEgcGFydGljdWxhciB0YXJnZXQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMKLSAgICAgKiBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVRhcmdldFN0YXJ0KFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgd3JpdGVNZXNzYWdlKCJUYXJnZXQgU3RhcnQ6ICIgKyB0YXJnZXQuZ2V0TmFtZSgpLCBNU0dfTEVWRUxfTE9XKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VuZCBub3RpZmljYXRpb24gdG8gdGhlIEZyb250RW5kIHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCBvdXQgb2YKLSAgICAgKiB0aGUgc2NvcGUgb2YgYSBwYXJ0aWN1bGFyIHRhcmdldC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcwotICAgICAqIG5vdGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5VGFyZ2V0RW5kKFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgd3JpdGVNZXNzYWdlKCJUYXJnZXQgRW5kOiAiICsgdGFyZ2V0LmdldE5hbWUoKSwgTVNHX0xFVkVMX0xPVyk7IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgRnJvbnRFbmQgdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIGludG8gdGhlCi0gICAgICogc2NvcGUgb2YgYSBwYXJ0aWN1bGFyIHRhc2suIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlUYXNrU3RhcnQoVGFzayB0YXNrKSB7Ci0gICAgICAgIHdyaXRlTWVzc2FnZSgiVGFzayBTdGFydDogIiArIHRhc2suZ2V0VHlwZSgpLCBNU0dfTEVWRUxfTE9XKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VuZCBub3RpZmljYXRpb24gdG8gdGhlIEZyb250RW5kIHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCBvdXQgb2YKLSAgICAgKiB0aGUgc2NvcGUgb2YgYSBwYXJ0aWN1bGFyIHRhc2suIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMKLSAgICAgKiBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVRhc2tFbmQoVGFzayB0YXNrKSB7Ci0gICAgICAgIHdyaXRlTWVzc2FnZSgiVGFzayBFbmQ6ICIgKyB0YXNrLmdldFR5cGUoKSwgTVNHX0xFVkVMX0xPVyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwotICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gIiI7Ci0gICAgICAgIEZpbGUgYnVpbGRGaWxlID0gbnVsbDsKLSAgICAgICAgd3JpdGVNZXNzYWdlKCJBbnQoRWF0ZXIpIC0tIFByb3Bvc2VkIEFudCAyLjAiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHByb2Nlc3MgdGhyb3VnaCB0aGUgYXJncyBzZXQKLSAgICAgICAgCi0gICAgICAgIGlmIChpc0FyZygiaGVscCIpKSB7Ci0gICAgICAgICAgICBwcmludEhlbHAoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGlzQXJnKCJxdWlldCIpKSB7Ci0gICAgICAgICAgICBtc2dMZXZlbEZpbHRlciA9IE1TR19MRVZFTF9ISUdIOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaXNBcmcoInZlcmJvc2UiKSkgewotICAgICAgICAgICAgbXNnTGV2ZWxGaWx0ZXIgPSBNU0dfTEVWRUxfTE9XOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYXJnVGFza3BhdGggPSBnZXRBcmdWYWx1ZSgidGFza3BhdGgiKTsKLSAgICAgICAgaWYgKGFyZ1Rhc2twYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhcmdUYXNrcGF0aC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVNZXNzYWdlKCJNdXN0IGdpdmUgYSB2YWx1ZSBmb3IgLXRhc2twYXRoIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBYWFggbmVlZCB0byBzZXBhcmF0ZSBvbiBwYXRoIHNlcHMgc28gdGhhdCByZWFsIHBhdGhzIGNhbiBiZSB0YWtlbgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhc2tNYW5hZ2VyLmFkZFRhc2tQYXRoTm9kZShuZXcgRmlsZShhcmdUYXNrcGF0aCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFudEV4Y2VwdGlvbiBhZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYWUpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYXJnQnVpbGRmaWxlID0gZ2V0QXJnVmFsdWUoImJ1aWxkZmlsZSIpOwotICAgICAgICBpZiAoYXJnQnVpbGRmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhcmdCdWlsZGZpbGUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHdyaXRlTWVzc2FnZSgiTXVzdCBnaXZlIGEgdmFsdWUgZm9yIC1idWlsZGZpbGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vdHJ5IHsKLSAgICAgICAgICAgICAgICBidWlsZEZpbGUgPSBuZXcgRmlsZShhcmdCdWlsZGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAvL2FudC5zZXRCdWlsZGZpbGUobmV3IEZpbGUoYXJnQnVpbGRmaWxlKSk7Ci0gICAgICAgICAgICAgICAgLy99IGNhdGNoIChBbnRFeGNlcHRpb24gYWUpIHsKLSAgICAgICAgICAgICAgICAvLyAgICB3cml0ZU1lc3NhZ2UoIkNhbid0IHNldCBidWlsZGZpbGUiKTsKLSAgICAgICAgICAgICAgICAvLyAgICB3cml0ZU1lc3NhZ2UoYWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgLy8gICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0YXJnZXQgPSBnZXRUYXJnZXRBcmcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gWFhYIGRvIHNvbWV0aGluZyBpZiB3ZSBkb250JyBoYXZlIGEgYnVpbGRmaWxlIHNldCEKLSAgICAgICAgCi0gICAgICAgIC8vIFhYWCByZWFsbHkgc2hvdWxkIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YXJnZXQgaXMgc2V0IHRvIHNvbWV0aGluZwotICAgICAgICAvLyBsaWtlIGdldCB0aGUgZGVmYXVsdC4uLgotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCA9IHByb2plY3RCdWlsZGVyLmJ1aWxkRnJvbUZpbGUoYnVpbGRGaWxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvamVjdC5zZXRGcm9udEVuZCh0aGlzKTsKLSAgICAgICAgICAgIHByb2plY3Quc3RhcnRCdWlsZCh0YXJnZXQpOwotICAgICAgICB9IGNhdGNoIChBbnRFeGNlcHRpb24gYWUpIHsgIAotICAgICAgICAKLSAgICAgICAgICAgIC8vWFhYIHRoaXMgd2hvbGUgd3JpdGUgYSBzdHJpbmcgYXQgYSB0aW1lIG1lc3NhZ2UgaGFuZGxpbmcKLSAgICAgICAgICAgIC8vIHN1Y2tzIGFuZCBuZWVkcyB0byBiZSBpbXByb3ZlZC4uLgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHdyaXRlTWVzc2FnZSgiQnVpbGQgU3RvcHBlZCIpOwotICAgICAgICAgICAgd3JpdGVNZXNzYWdlKCIgICAgUHJvamVjdDogIiArIGFlLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVNZXNzYWdlKCIgICAgIFRhcmdldDogIiArIGFlLmdldFRhcmdldCgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB3cml0ZU1lc3NhZ2UoIiAgVGFzayBUeXBlOiAiICsgYWUuZ2V0VGFzaygpLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICB3cml0ZU1lc3NhZ2UoIkRldGFpbHMgRm9sbG93Iik7Ci0gICAgICAgICAgICB3cml0ZU1lc3NhZ2UoIiIpOwotICAgICAgICAgICAgd3JpdGVNZXNzYWdlKGFlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGFlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVNZXNzYWdlKCIiKTsKLSAgICAgICAgICAgICAgICB3cml0ZU1lc3NhZ2UoIkNhdXNlIEV4Y2VwdGlvbjogIiArIHQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVNZXNzYWdlKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgbWVzc2FnZSB0byB0aGUgZnJvbnQgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxldmVsKSB7Ci0gICAgICAgIGlmIChsZXZlbCA+PSBtc2dMZXZlbEZpbHRlcikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUFJJVkFURSBNRVRIT0RTCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gYXJndW1lbnQgbmFtZSwgbnVsbCBpZiB0aGUgYXJndW1lbnQKLSAgICAgKiBuYW1lIGlzbid0IGluIHRoZSBhcmd1bWVudCBzZXQsIG9yICIiIGlmIHRoZSBhcmd1bWVudCBkb2Vzbid0IGhhdmUKLSAgICAgKiBhIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldEFyZ1ZhbHVlKFN0cmluZyBhcmdOYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItIiArIGFyZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgIT0gYXJncy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdzW2kgKyAxXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgdGhhdCB3YXMgcmVxdWVzdGVkIHRvIGJlIGJ1aWx0LCBpZiBhbnkuIElmIG5vCi0gICAgICogdGFyZ2V0IGlzIGRldGVybWluZWQsIHJldHVybnMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEFyZygpIHsKLSAgICAgICAgU3RyaW5nIHBvc3NpYmxlVGFyZ2V0ID0gZ2V0QXJnVmFsdWUoInRhcmdldCIpOwotICAgICAgICBpZiAocG9zc2libGVUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHBvc3NpYmxlVGFyZ2V0LmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICB3cml0ZU1lc3NhZ2UoIk11c3QgZ2l2ZSBhIHZhbHVlIGZvciAtdGFyZ2V0Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBwb3NzaWJsZVRhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIHBvc3NpYmxlVGFyZ2V0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdOwotICAgICAgICBpZiAocG9zc2libGVUYXJnZXQuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXJnc1thcmdzLmxlbmd0aCAtIDJdLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgLy8gb3VyIHBvc3NpYmxlIHRhcmdldCBtaWdodCBiZSBhbiBhcmcgdmFsdWUgaW5zdGVhZCBvZiBhIHRhcmdldAotICAgICAgICAgICAgLy8gWFhYIHVnaCAtLSB0aGVyZSBoYXMgdG8gYmUgYSBiZXR0ZXIgd2F5IGhlcmUuIFdlIG5lZWQgdG8gaG9sZAotICAgICAgICAgICAgLy8gYSBsaXN0IG9mIGFsbCBhcmdzIHRoYXQgZG9uJ3QgaGF2ZSB2YWx1ZXMgc29tZXdoZXJlLgotICAgICAgICAgICAgaWYgKGFyZ3NbYXJncy5sZW5ndGggLSAyXS5lcXVhbHMoIi1oZWxwIikgfHwKLSAgICAgICAgICAgICAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMl0uZXF1YWxzKCItdmVyYm9zZSIpIHx8Ci0gICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDJdLmVxdWFscygiLXF1aWV0IikpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSdyZSBvaywgdGhlIGFyZyBiZWZvcmUgdGhlIHBvc3NpYmxlIHRhcmdldCBkb2Vzbid0IGhhdmUgYSB2YWx1ZQotICAgICAgICAgICAgICAgIHJldHVybiBwb3NzaWJsZVRhcmdldDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcG9zc2libGVUYXJnZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gYXJndW1lbnQgbmFtZSBleGlzdHMgaW4gdGhlIGFyZ3VtZW50Ci0gICAgICogc2V0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FyZyhTdHJpbmcgYXJnTmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLSIgKyBhcmdOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGhlbHAgdG8gU3lzdGVtLm91dAotICAgICAqLyAgCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50SGVscCgpIHsKLSAgICAKLSAgICAgICAgLy8gWFhYIHJlc291cmNlIGJ1bmRsZSB0aGlzLgotICAgIAotICAgICAgICBTdHJpbmcgbHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIFN0cmluZyBtc2cgPSAiVXNhZ2U6IGFudCBbYXJnc10gW3RhcmdldF0iICsgbHMgKwotICAgICAgICAgICAgICAgICAgICAgIiAgICBBcmd1bWVudHMgY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOiIgKyBscyArCi0gICAgICAgICAgICAgICAgICAgICAiICAgICAgICAtaGVscCIgKyBscyArCi0gICAgICAgICAgICAgICAgICAgICAiICAgICAgICAtdGFza3BhdGggW3BhdGhdIiArIGxzICsKLSAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIC1idWlsZGZpbGUgW2ZpbGVdIiArbHMgKwotICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgLXZlcmJvc2UiICsgbHMgKwotICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgLXF1aWV0IiAgICsgbHMgKyBscyArCi0gICAgICAgICAgICAgICAgICAgICAiICAgIE5vdGUgdGhhdCBpZiBubyBidWlsZGZpbGUgYXJndW1lbnQgaXMgZ2l2ZW4sIEFudCB3aWxsIitscysKLSAgICAgICAgICAgICAgICAgICAgICIgICAgdHJ5IHRvIGZpbmQgb25lIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gSWYgdGhlcmUgYXJlIitscysKLSAgICAgICAgICAgICAgICAgICAgICIgICAgdHdvIG9yIG1vcmUgYnVpbGRmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGl0IiArbHMrCi0gICAgICAgICAgICAgICAgICAgICAiICAgIHdpbGwgYmFpbC4iOwotICAgICAgICB3cml0ZU1lc3NhZ2UobXNnKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9jbGkvTWFpbi5qYXZhIGIvcHJvcG9zYWwvYW50ZWF0ZXIvc291cmNlL21haW4vb3JnL2FwYWNoZS9hbnQvY2xpL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4MWI4OS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRlYXRlci9zb3VyY2UvbWFpbi9vcmcvYXBhY2hlL2FudC9jbGkvTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9hbnQuYW50IGIvcHJvcG9zYWwvYW50ZmFybS9hbnQuYW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFhMjQyLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vYW50LmFudAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0gdGhpcyBpcyBhIHRlc3QgLS0+Ci08cHJvamVjdCBuYW1lPSJhbnQiIAotCXhtbG5zOmRvYz0iaHR0cDovYXBhY2hlLm9yZy9hbnQtMi4wLjAvZG9jIiAKLQlkb2M6Y29weXJpZ2h0PSJDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIj4KLQotCTxpbXBvcnQgbmFtZT0iamF2YTJzZGsiLz4KLQk8aW1wb3J0IG5hbWU9ImpheHAiLz4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iamF2YTJzZGs6aW5pdCIvPgotCi0JPHRhcmdldCBuYW1lPSJjb3JlIiBhYmM6YWFhYT0iZm9vIj4KLQkJPGphdmFjIGRlc3Q9InRlbXAvY29yZSIgY2xhc3NwYXRoPSIiPgotCQkJPGZpbGVzZXQgc3JjPSJjb3JlIi8+Ci0JCTwvamF2YWM+Ci0JCTxqYXIgamFyZmlsZT0iZGlzdC9hbnQuamFyIiBiYXNlZGlyPSJ0ZW1wL2NvcmUiIG1hbmlmZXN0PSJjb3JlL01FVEEtSU5GL21hbmlmZXN0Lm1mIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InhtbCIgZGVwZW5kcz0iY29yZSBqYXhwOmluaXQiPgotCQk8amF2YWMgZGVzdD0idGVtcC94bWwiIGNsYXNzcGF0aD0iZGlzdC9hbnQuamFyOntqYXhwOmFudC5iYXNlLmRpcn0vamF4cC5qYXI6e2pheHA6YW50LmJhc2UuZGlyfS9jcmltc29uLmphciI+Ci0JCQk8ZmlsZXNldCBzcmM9InhtbCIvPgotCQk8L2phdmFjPgotCQk8amFyIGphcmZpbGU9ImRpc3QveG1sL2FudC14bWwuamFyIiBiYXNlZGlyPSJ0ZW1wL3htbCIvPgotCQk8Y29weSBzcmM9ImJvb3QveG1sL2pheHAuamFyIiBkZXN0PSJkaXN0L3htbC9qYXhwLmphciIvPgotCQk8Y29weSBzcmM9ImJvb3QveG1sL2NyaW1zb24uamFyIiBkZXN0PSJkaXN0L3htbC9jcmltc29uLmphciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ0YXNrcyIgZGVwZW5kcz0iY29yZSI+Ci0JCTxqYXZhYyBkZXN0PSJ0ZW1wL3Rhc2tzIiBjbGFzc3BhdGg9ImRpc3QvYW50LmphciI+Ci0JCQk8ZmlsZXNldCBzcmM9InRhc2tzIi8+Ci0JCTwvamF2YWM+Ci0JCTxqYXIgamFyZmlsZT0iZGlzdC90YXNrcy9zdGFuZGFyZC5qYXIiIGJhc2VkaXI9InRlbXAvdGFza3MiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJpbml0IGNvcmUgeG1sIHRhc2tzIi8+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9ib290c3RyYXAuYmF0IGIvcHJvcG9zYWwvYW50ZmFybS9ib290c3RyYXAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDZlODE1Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vYm9vdHN0cmFwLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUBpZiBub3QgZXhpc3QgYm9vdCBta2RpciBib290Ci1AaWYgbm90IGV4aXN0IGJvb3RcdGFza3MgbWtkaXIgYm9vdFx0YXNrcwotQGlmIG5vdCBleGlzdCBib290XHhtbCBta2RpciBib290XHhtbAotQGlmIG5vdCBleGlzdCB0ZW1wIG1rZGlyIHRlbXAKLUBpZiBub3QgZXhpc3QgdGVtcFxjb3JlIG1rZGlyIHRlbXBcY29yZQotQGlmIG5vdCBleGlzdCB0ZW1wXHhtbCBta2RpciB0ZW1wXHhtbAotQGlmIG5vdCBleGlzdCB0ZW1wXHRhc2tzIG1rZGlyIHRlbXBcdGFza3MKLQotamF2YWMgLWNsYXNzcGF0aCAiIiAtZCB0ZW1wXGNvcmUgY29yZVxvcmdcYXBhY2hlXHRvb2xzXGFudFwqLmphdmEgY29yZVxvcmdcYXBhY2hlXHRvb2xzXGFudFxjbWRsaW5lXCouamF2YSBjb3JlXCouamF2YSAKLUBpZiBlcnJvcmxldmVsIDEgZ290byBlbmQKLQotamFyIC1jZm0gYm9vdFxhbnQuamFyIGNvcmVcTUVUQS1JTkZcbWFuaWZlc3QubWYgLUMgdGVtcFxjb3JlIC4KLUBpZiBlcnJvcmxldmVsIDEgZ290byBlbmQKLQotamF2YWMgLWNsYXNzcGF0aCAiYm9vdFxhbnQuamFyO2pheHBcamF4cC5qYXI7amF4cFxjcmltc29uLmphciIgLWQgdGVtcFx4bWwgeG1sXG9yZ1xhcGFjaGVcdG9vbHNcYW50XHhtbFwqLmphdmEKLUBpZiBlcnJvcmxldmVsIDEgZ290byBlbmQKLQotamFyIC1jZiBib290XHhtbFxhbnQteG1sLmphciAtQyB0ZW1wXHhtbCAuCi1AaWYgZXJyb3JsZXZlbCAxIGdvdG8gZW5kCi0KLWphdmFjIC1jbGFzc3BhdGggImJvb3RcYW50LmphciIgLWQgdGVtcFx0YXNrcyB0YXNrc1xvcmdcYXBhY2hlXHRvb2xzXGFudFx0YXNrc1wqLmphdmEKLUBpZiBlcnJvcmxldmVsIDEgZ290byBlbmQKLQotY29weSB0YXNrc1xqYXZhMnNkay5hbnQgdGVtcFx0YXNrc1xqYXZhMnNkay5hbnQKLQotamFyIC1jZiBib290XHRhc2tzXGphdmEyc2RrLmphciAtQyB0ZW1wXHRhc2tzIC4KLUBpZiBlcnJvcmxldmVsIDEgZ290byBlbmQKLQotY29weSBqYXhwXGpheHAuamFyIGJvb3RceG1sXGpheHAuamFyCi1jb3B5IGpheHBcY3JpbXNvbi5qYXIgYm9vdFx4bWxcY3JpbXNvbi5qYXIKLQotQHJtZGlyIC9zIC9xIHRlbXAKLQotCi06ZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9ib290c3RyYXAuc2ggYi9wcm9wb3NhbC9hbnRmYXJtL2Jvb3RzdHJhcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlMzcwNC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2Jvb3RzdHJhcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1pZiAhIHRlc3QgLWQgYm9vdCA7IHRoZW4KLSAgICBta2RpciAtcCBib290L3Rhc2tzCi0gICAgbWtkaXIgLXAgYm9vdC94bWwKLWZpCi0KLWlmICEgdGVzdCAtZCAgdGVtcCA7IHRoZW4KLSAgICBta2RpciAtcCB0ZW1wL2NvcmUKLSAgICBta2RpciAtcCB0ZW1wL3htbAotICAgIG1rZGlyIC1wIHRlbXAvdGFza3MKLWZpCi0KLWlmICB0ZXN0IC16ICIkSkFWQUMiIDsgdGhlbgotICAgIEpBVkFDPWphdmFjOwotZmkKLQotVE9PTFM9Y29yZS9vcmcvYXBhY2hlL3Rvb2xzCi0KLSR7SkFWQUN9IC1kIHRlbXAvY29yZSAke1RPT0xTfS9hbnQvKi5qYXZhIFwKLSAgICAgICAgICAgICAgICAgICAgICAke1RPT0xTfS9hbnQvY21kbGluZS8qLmphdmEgXAotICAgICAgICAgICAgICAgICAgICAgIGNvcmUvKi5qYXZhCi0KLWphciAtY2ZtIGJvb3QvYW50LmphciBjb3JlL01FVEEtSU5GL21hbmlmZXN0Lm1mIC1DIHRlbXAvY29yZSAuCi0KLSR7SkFWQUN9IC1jbGFzc3BhdGggYm9vdC9hbnQuamFyOmpheHAvamF4cC5qYXI6amF4cC9jcmltc29uLmphciAtZCB0ZW1wL3htbCB4bWwvb3JnL2FwYWNoZS90b29scy9hbnQveG1sLyouamF2YQotCi1qYXIgLWNmIGJvb3QveG1sL2FudC14bWwuamFyIC1DIHRlbXAveG1sIC4KLQotJHtKQVZBQ30gLWNsYXNzcGF0aCBib290L2FudC5qYXIgLWQgdGVtcC90YXNrcyB0YXNrcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrcy8qLmphdmEKLQotY3AgdGFza3MvamF2YTJzZGsuYW50IHRlbXAvdGFza3MvamF2YTJzZGsuYW50Ci0KLWphciAtY2YgYm9vdC90YXNrcy9qYXZhMnNkay5qYXIgLUMgdGVtcC90YXNrcyAuCi0KLWNwIGpheHAvamF4cC5qYXIgYm9vdC94bWwvamF4cC5qYXIKLWNwIGpheHAvY3JpbXNvbi5qYXIgYm9vdC94bWwvY3JpbXNvbi5qYXIKLQotI3JtIC1yZiB0ZW1wCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL2J1aWxkLmJhdCBiL3Byb3Bvc2FsL2FudGZhcm0vYnVpbGQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjU4YjgzLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamF2YSAtY2xhc3NwYXRoIGJvb3RcYW50LmphciAtRGFudC5wcm9qZWN0LnBhdGg9LjtqYXhwIGFudCBhbnQ6YWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9idWlsZC5zaCBiL3Byb3Bvc2FsL2FudGZhcm0vYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjllYjYuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyEvYmluL3NoCi0KLWphdmEgLWNsYXNzcGF0aCBib290L2FudC5qYXIgLURhbnQucHJvamVjdC5wYXRoPS46amF4cCBhbnQgYW50OmFsbApkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jbGVhbi5iYXQgYi9wcm9wb3NhbC9hbnRmYXJtL2NsZWFuLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQ4NWFkNy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2NsZWFuLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotaWYgZXhpc3QgYm9vdCBybWRpciAvcyAvcSBib290Ci1pZiBleGlzdCB0ZW1wIHJtZGlyIC9zIC9xIHRlbXAKLWlmIGV4aXN0IGRpc3Qgcm1kaXIgL3MgL3EgZGlzdApkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jbGVhbi5zaCBiL3Byb3Bvc2FsL2FudGZhcm0vY2xlYW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMGI3OTIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS9jbGVhbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMhL2Jpbi9zaAotCi1pZiB0ZXN0IC1kIGJvb3QgOyB0aGVuCi0gICAgcm0gLXJmIGJvb3QKLWZpCi0KLWlmIHRlc3QgLWQgdGVtcCA7IHRoZW4KLSAgICBybSAtcmYgdGVtcAotZmkKLQotaWYgdGVzdCAtZCBkaXN0IDsgdGhlbgotICAgIHJtIC1yZiBkaXN0Ci1maQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL01FVEEtSU5GL21hbmlmZXN0Lm1mIGIvcHJvcG9zYWwvYW50ZmFybS9jb3JlL01FVEEtSU5GL21hbmlmZXN0Lm1mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUzYjQxLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9NRVRBLUlORi9tYW5pZmVzdC5tZgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFpbi1DbGFzczogb3JnLmFwYWNoZS50b29scy5hbnQuY21kbGluZS5NYWluCi0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9hbnQuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9hbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NjY3Yi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmNtZGxpbmUuTWFpbjsKLQotcHVibGljIGNsYXNzIGFudCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1haW4ubWFpbihhcmdzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudEV4Y2VwdGlvbi5qYXZhIGIvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNiYjAwLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGVycm9yIHdpdGhpbiBBbnQuIFRoZSBlbmQKLSAqICB1c2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byB0cmlnZ2VyIHRoaXMgZXhjZXB0aW9uIHVuZGVyCi0gKiAgbm9ybWFsIGNpcmN1bXN0YW5jZXMuIFRoZSBCdWlsZEV4Y2VwdGlvbiBjbGFzcyBzaG91bGQKLSAqICBiZSB1c2VkIGluc3RlYWQgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbXBpbGUgb3Igc29tZSBvdGhlciB0YXNrCi0gKiAgaGFzIGZhaWxlZC4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bXBmb2VtbWVAdGhvdWdodHdvcmtzLmNvbSI+TWF0dGhldyBGb2VtbWVsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQW50RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBUaHJvd2FibGUgY2F1c2U7Ci0KLSAgICBwdWJsaWMgQW50RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW50RXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtc2cpOwotCi0gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gY2F1c2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotICAgICAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIG91dCkgewotICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKLQotICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKG91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgb3V0KSB7Ci0gICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOwotCi0gICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2Uob3V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzcyMzUuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudFNlY3VyaXR5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi0vKioKLSAqICBUaGlzIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW5zdGFsbGVkIGJ5IHRoZSBXb3Jrc3BhY2UgY2xhc3MKLSAqICB3aGlsZSB0YXNrcyBhcmUgYmVpbmcgaW52b2tlZCBzbyB0aGF0IFN5c3RlbS5leGl0IGNhbGxzIGNhbgotICogIGJlIGludGVyY2VwdGVkLiBBbnkgdGFza3MgdGhhdCB0cmllcyB0byBjYWxsIFN5c3RlbS5leGl0Ci0gKiAgd2lsbCBjYXVzZSBhbiBFeGl0RXhjZXB0aW9uIHRvIGJlIHRocm93biBpbnN0ZWFkIG9mIHRlcm1pbmF0aW5nCi0gKiAgdGhlIFZNLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptcGZvZW1tZUB0aG91Z2h0d29ya3MuY29tIj5NYXR0aGV3IEZvZW1tZWw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBbnRTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewotICAgIC8qKgotICAgICAqICBUaHJvd3MgYW4gRXhpdEV4Y2VwdGlvbiB3aGljaCBzaG91bGQgYmUgY2F1Z2h0IGF0IHRoZSB0YXNrIGxldmVsIGFuZCBoYW5kbGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoZWNrRXhpdChpbnQgc3RhdHVzKSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGl0RXhjZXB0aW9uKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFsbG93cyBhbnl0aGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHApIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXZlbnQuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODE4NTcuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLS8qKgotICogIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGluZm9ybWF0aW9uIGFib3V0IGV2ZW50cyB0aGF0IG9jY3VyIGR1cmluZwotICogIGEgYnVpbGQuCi0gKgotICogIEBzZWUgQnVpbGRMaXN0ZW5lcgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptcGZvZW1tZUB0aG91Z2h0d29ya3MuY29tIj5NYXR0aGV3IEZvZW1tZWw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZEV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQlVHID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7Ci0KLSAgICBwcml2YXRlIFdvcmtzcGFjZSB3b3Jrc3BhY2U7Ci0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBUYXJnZXQgdGFyZ2V0OwotICAgIHByaXZhdGUgVGFzayB0YXNrOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBpbnQgcHJpb3JpdHk7Ci0gICAgcHJpdmF0ZSBCdWlsZEV4Y2VwdGlvbiBleGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBCdWlsZEV2ZW50IGZvciBhIHdvcmtzcGFjZSBsZXZlbCBldmVudAotICAgICAqCi0gICAgICogQHBhcmFtIHdvcmtzcGFjZSB0aGUgd29ya3NwYWNlIHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXZlbnQoV29ya3NwYWNlIHdvcmtzcGFjZSkgewotICAgICAgICBzdXBlcih3b3Jrc3BhY2UpOwotICAgICAgICB0aGlzLndvcmtzcGFjZSA9IHdvcmtzcGFjZTsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy50YXJnZXQgPSBudWxsOwotICAgICAgICB0aGlzLnRhc2sgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIEJ1aWxkRXZlbnQgZm9yIGEgcHJvamVjdCBsZXZlbCBldmVudAotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBlbWl0dGVkIHRoZSBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRFdmVudChQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgc3VwZXIocHJvamVjdCk7Ci0gICAgICAgIHRoaXMud29ya3NwYWNlID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgdGhpcy50YXJnZXQgPSBudWxsOwotICAgICAgICB0aGlzLnRhc2sgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIEJ1aWxkRXZlbnQgZm9yIGEgdGFyZ2V0IGxldmVsIGV2ZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgdGhhdCBlbWl0dGVkIHRoZSBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRFdmVudChUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHN1cGVyKHRhcmdldCk7Ci0gICAgICAgIHRoaXMud29ya3NwYWNlID0gdGFyZ2V0LmdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gdGFyZ2V0LmdldFByb2plY3QoKTsKLSAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIHRoaXMudGFzayA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgQnVpbGRFdmVudCBmb3IgYSB0YXNrIGxldmVsIGV2ZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFzayB0aGUgdGFzayB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEV2ZW50KFRhc2sgdGFzaykgewotICAgICAgICBzdXBlcih0YXNrKTsKLSAgICAgICAgdGhpcy53b3Jrc3BhY2UgPSB0YXNrLmdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gdGFzay5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFzay5nZXRUYXJnZXQoKTsKLSAgICAgICAgdGhpcy50YXNrID0gdGFzazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgcHJpb3JpdHkpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbihCdWlsZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgdGhpcy5leGNlcHRpb24gPSBleGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHByb2plY3QgdGhhdCBmaXJlZCB0aGlzIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB0YXJnZXQgdGhhdCBmaXJlZCB0aGlzIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBUYXJnZXQgZ2V0VGFyZ2V0KCkgewotCi0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHRhc2sgdGhhdCBmaXJlZCB0aGlzIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBUYXNrIGdldFRhc2soKSB7Ci0gICAgICAgIHJldHVybiB0YXNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBsb2dnaW5nIG1lc3NhZ2UuIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIHNldAotICAgICAqICBmb3IgIm1lc3NhZ2VMb2dnZWQiIGV2ZW50cy4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHByaW9yaXR5IG9mIHRoZSBsb2dnaW5nIG1lc3NhZ2UuIFRoaXMgZmllbGQgd2lsbCBvbmx5Ci0gICAgICogIGJlIHNldCBmb3IgIm1lc3NhZ2VMb2dnZWQiIGV2ZW50cy4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKXsKLSAgICAgICAgcmV0dXJuIHByaW9yaXR5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duLCBpZiBhbnkuIFRoaXMgZmllbGQgd2lsbCBvbmx5Ci0gICAgICogIGJlIHNldCBmb3IgInRhc2tGaW5pc2hlZCIsICJ0YXJnZXRGaW5pc2hlZCIsIGFuZCAiYnVpbGRGaW5pc2hlZCIgZXZlbnRzLgotICAgICAqCi0gICAgICogIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQoQnVpbGRFdmVudCkKLSAgICAgKiAgQHNlZSBCdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQpCi0gICAgICogIEBzZWUgQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyOWU4Yi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotLyoqCi0gKiAgSW5kaWNhdGVzIHRoYXQgYW4gZXJyb3IgZHVyaW5nIHRoZSBidWlsZCwgc3VjaCBhcyBhIGNvbXBpbGVyIGVycm9yLAotICogIGEgdHlwbyBpbiBhIGJ1aWxkIGZpbGUsIGV0Yy4gRXJyb3JzIHJlc3VsdGluZyBmcm9tIGNvZGluZwotICogIGVycm9ycyB3aXRoaW4gYW50IG9yIGEgbWlzY29uZmlndXJlZCBzZXR1cCBzaG91bGQgdXNlCi0gKiAgQW50RXhjZXB0aW9uLgotICoKLSAqICBAc2VlIEFudEV4Y2VwdGlvbgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptcGZvZW1tZUB0aG91Z2h0d29ya3MuY29tIj5NYXR0aGV3IEZvZW1tZWw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0KLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBsb2NhdGlvbiBpbiB0aGUgYnVpbGQgZmlsZSB3aGVyZSB0aGlzIGVycm9yLgotICAgICAqICBvY2N1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgbG9jYXRpb24gaW4gdGhlIGJ1aWxkIGZpbGUgd2hlcmUgdGhpcyBlcnJvciBvY2N1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIChsb2NhdGlvbiA9PSBudWxsKSA/IGdldE1lc3NhZ2UoKSA6IChsb2NhdGlvbiArICI6ICIgKyBnZXRNZXNzYWdlKCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRMaXN0ZW5lci5qYXZhIGIvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmMTZkYi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogIE9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIG5vdGlmaWVkIHdoZW4KLSAqICB0aGluZ3MgaGFwcGVuZWQgZHVyaW5nIGEgYnVpbGQuCi0gKgotICogIEBzZWUgQnVpbGRFdmVudAotICogIEBzZWUgUHJvamVjdCNhZGRCdWlsZExpc3RlbmVyKEJ1aWxkTGlzdGVuZXIpCi0gKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1wZm9lbW1lQHRob3VnaHR3b3Jrcy5jb20iPk1hdHRoZXcgRm9lbW1lbDwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBCdWlsZExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZWQgYmVmb3JlIGFueSB0YXJnZXRzIGFyZSBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KTsKLQotICAgIC8qKgotICAgICAqICBGaXJlZCBhZnRlciB0aGUgbGFzdCB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50Ci0gICAgICogIHdpbGwgc3RpbGwgYmUgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpOwotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIGJlZm9yZSBhIHByb2plY3QgZmlsZSBpcyBwYXJzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW1wb3J0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KTsKLQotICAgIC8qKgotICAgICAqICBGaXJlZCBhZnRlciBhIHByb2plY3QgZmlsZSBpcyBwYXJzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW1wb3J0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZWQgd2hlbiBhIHRhcmdldCBpcyBzdGFydGVkLgotICAgICAqCi0gICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRUYXJnZXQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZWQgd2hlbiBhIHRhcmdldCBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQgd2lsbAotICAgICAqICBzdGlsbCBiZSB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGhlIGJ1aWxkLgotICAgICAqCi0gICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRFeGNlcHRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpOwotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIHdoZW4gYSB0YXNrIGlzIHN0YXJ0ZWQuCi0gICAgICoKLSAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldFRhc2soKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpOwotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIHdoZW4gYSB0YXNrIGhhcyBmaW5pc2hlZC4gVGhpcyBldmVudCB3aWxsIHN0aWxsCi0gICAgICogIGJlIHRocm93IGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZWQgd2hlbmV2ZXIgYSBtZXNzYWdlIGlzIGxvZ2dlZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0TWVzc2FnZSgpCi0gICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRQcmlvcml0eSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGl0RXhjZXB0aW9uLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvRXhpdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTRkMGIzLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGl0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLS8qKgotICogIFRocm93biBieSB0aGUgQW50U2VjdXJpdHlNYW5hZ2VyIHdoZW5ldmVyIGEgdGFzayB0cmllcwotICogIHRvIGNhbGwgU3lzdGVtLmV4aXQoKS4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bXBmb2VtbWVAdGhvdWdodHdvcmtzLmNvbSI+TWF0dGhldyBGb2VtbWVsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRXhpdEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIHByaXZhdGUgaW50IHN0YXR1czsKLQotICAgIHB1YmxpYyBFeGl0RXhjZXB0aW9uKGludCBzdGF0dXMpIHsKLSAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbXBvcnQuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhNGY0Ni4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLS8qKgotICogIFJlcHJlc2VudHMgYW4gaW1wb3J0IHN0YXRlbWVudCBmcm9tIGEgcHJvamVjdC4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bXBmb2VtbWVAdGhvdWdodHdvcmtzLmNvbSI+TWF0dGhldyBGb2VtbWVsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0IHsKLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotCi0gICAgcHVibGljIEltcG9ydChQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvSW1wb3J0ZXIuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYxYTQ3Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogIFVzZWQgYnkgYSB3b3Jrc3BhY2UgdG8gcmVhZCBwcm9qZWN0IGZpbGVzLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptcGZvZW1tZUB0aG91Z2h0d29ya3MuY29tIj5NYXR0aGV3IEZvZW1tZWw8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1wb3J0ZXIgewotICAgIHB1YmxpYyB2b2lkIGltcG9ydFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0xvYWQuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2FkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjVkZGMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L0xvYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLS8qKgotICogIFRoZSBvbmx5IHRhc2sgdGhhdCBnZXRzIGxvYWRlZCBieSBkZWZhdWx0LiBJdCBjYW4gYmUgdXNlZAotICogIHRvIGR5bmFtaWNhbGx5IGxvYWQgYW55IG90aGVyIHJlcXVpcmVkIHRhc2tzLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptcGZvZW1tZUB0aG91Z2h0d29ya3MuY29tIj5NYXR0aGV3IEZvZW1tZWw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkIGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFdvcmtzcGFjZSgpLmRlYnVnKCJMb2FkaW5nICIgKyBuYW1lKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgVVJMW10geyBnZXRQcm9qZWN0KCkuZ2V0QmFzZSgpIH0sCi0gICAgICAgICAgICAgICAgZ2V0V29ya3NwYWNlKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICAgICAgZ2V0V29ya3NwYWNlKCkucmVnaXN0ZXJUYXNrKG5hbWUsIGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NuYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2xhc3MgXCIiICsgY2xhc3NuYW1lICsgIlwiIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc25hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpIHsKLSAgICAgICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0LmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjJiYWZjLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogIFN0b3JlcyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIHByb2plY3QgZmlsZS4gRWFjaCBwcm9qZWN0Ci0gKiAgaGFzIGl0cyBvd24gbmFtZXNwYWNlIGZvciB2YXJpYWJsZSBuYW1lcyBhbmQgdGFyZ2V0IG5hbWVzLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptcGZvZW1tZUB0aG91Z2h0d29ya3MuY29tIj5NYXR0aGV3IEZvZW1tZWw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0IHsKLSAgICBwcml2YXRlIFdvcmtzcGFjZSB3b3Jrc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFVSTCBiYXNlOwotICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICAgIHByaXZhdGUgTGlzdCBpbXBvcnRzOwotICAgIHByaXZhdGUgTWFwIHRhcmdldHM7Ci0gICAgcHJpdmF0ZSBNYXAgdmFyaWFibGVzOwotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSBuZXcgcHJvamVjdC4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBXb3Jrc3BhY2UgY2xhc3MuCi0gICAgICovCi0gICAgUHJvamVjdChXb3Jrc3BhY2Ugd29ya3NwYWNlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLndvcmtzcGFjZSA9IHdvcmtzcGFjZTsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIHRoaXMuaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy50YXJnZXRzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgdGhpcy52YXJpYWJsZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgdGhhdCB0aGlzIHByb2plY3QgYmVsb25ncyB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHdvcmtzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGRpcmVjdG9yeSBvciBqYXIgZmlsZSB3aGVyZSB0aGlzIHByb2plY3QgZmlsZSB3YXMgbG9jYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldEJhc2UoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoaXMgcHJvamVjdCBmaWxlIHdhcyBsb2NhdGVkLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgQW50RXhjZXB0aW9uIGlmIHRoaXMgcHJvamVjdCB3YXMgbG9hZGVkIGZyb20gYSBqYXIgYW5kIG5vdCBhIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRCYXNlRGlyKCkgewotICAgICAgICBpZiAoYmFzZS5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoYmFzZS5nZXRGaWxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFudEV4Y2VwdGlvbihiYXNlLnRvU3RyaW5nKCkgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZShVUkwgYmFzZSkgewotICAgICAgICB0aGlzLmJhc2UgPSBiYXNlOwotCi0gICAgICAgIGlmIChiYXNlLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgIHZhcmlhYmxlcy5wdXQoImFudC5iYXNlLmRpciIsIGJhc2UuZ2V0RmlsZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGFuIGVtcHR5IHRhcmdldCB3aXRoIHRoZSBzcGVjaWVkIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFRhcmdldCBjcmVhdGVUYXJnZXQoU3RyaW5nIG5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRoaXMsIG5hbWUpOwotICAgICAgICBUYXJnZXQgcHJldlRhcmdldCA9IChUYXJnZXQpIHRhcmdldHMucHV0KG5hbWUsIHRhcmdldCk7Ci0KLSAgICAgICAgaWYgKHByZXZUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUYXJnZXQgd2l0aCBuYW1lIFwiIiArIG5hbWUgKyAiXCIgYWxyZWFkeSBleGlzdHMiOwotICAgICAgICAgICAgaWYgKHByZXZUYXJnZXQuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXNnID0gbXNnICsgIiBhdCAiICsgcHJldlRhcmdldC5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB0YXJnZXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBBbnRFeGNlcHRpb24gaWYgdGhlIHRhcmdldCBkb2Vzbid0IGV4aXN0LgotICAgICAqLwotICAgIHB1YmxpYyBUYXJnZXQgZ2V0VGFyZ2V0KFN0cmluZyBuYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldCkgdGFyZ2V0cy5nZXQobmFtZSk7Ci0gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUYXJnZXQgXCIiICsgbmFtZSArICJcIiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFRhcmdldHMoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXRzLnZhbHVlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbmRpY2F0ZXMgdGhlIHRoaXMgcHJvamVjdCByZWxpZXMgb24gdmFyaWFibGVzIG9yIHRhcmdldHMgaW4gYW5vdGhlciBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBJbXBvcnQgY3JlYXRlSW1wb3J0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIEltcG9ydCBpbXAgPSBuZXcgSW1wb3J0KHRoaXMsIG5hbWUpOwotICAgICAgICBpbXBvcnRzLmFkZChpbXApOwotICAgICAgICByZXR1cm4gaW1wOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBsaXN0IG9mIHByb2plY3RzIHRoYXQgdGhpcyBwcm9qZWN0IGltcG9ydHMuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0SW1wb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIGltcG9ydHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4gVmFyaWFibGVzIGZyb20gb3RoZXIKLSAgICAgKiAgcHJvamVjdHMgbWF5IGJlIHJlZmVyZW5jZWQgYnkgdXNpbmcgdGhlICc6JyBvcGVyYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlKFN0cmluZyBuYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpbnQgcG9zID0gbmFtZS5pbmRleE9mKFdvcmtzcGFjZS5TQ09QRV9TRVBBUkFUT1IpOwotICAgICAgICBpZiAocG9zID09IC0xKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSB2YXJpYWJsZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlZhcmlhYmxlIFwiIiArIG5hbWUgKyAiXCIgbm90IGRlZmluZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFyaWFibGVOYW1lID0gbmFtZS5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgICAgICAgICBQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4gVmFyaWFibGVzIGZyb20gb3RoZXIKLSAgICAgKiAgcHJvamVjdHMgbWF5IGJlIHJlZmVyZW5jZWQgYnkgdXNpbmcgdGhlICc6JyBvcGVyYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpbnQgcG9zID0gbmFtZS5pbmRleE9mKFdvcmtzcGFjZS5TQ09QRV9TRVBBUkFUT1IpOwotICAgICAgICBpZiAocG9zID09IC0xKSB7Ci0gICAgICAgICAgICB2YXJpYWJsZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFyaWFibGVOYW1lID0gbmFtZS5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgICAgICAgICBQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXIgZ2V0UGF0aFNlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuICc6JzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvVGFyZ2V0LmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjRhOTQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L1RhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogIFJlcHJlc2VudHMgYSBzZXQgb2YgYWN0aW9ucyB0byBiZSBleGVjdXRlZCwgd2hpY2ggbWF5IG9yIG1heQotICogIG5vdCBkZXBlbmQgb24gb3RoZXIgc2V0cyBvZiBhY3Rpb25zLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptcGZvZW1tZUB0aG91Z2h0d29ya3MuY29tIj5NYXR0aGV3IEZvZW1tZWw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXQgewotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0gICAgcHJpdmF0ZSBMaXN0IHRhc2tzOwotICAgIHByaXZhdGUgTGlzdCBkZXBlbmRzOwotCi0gICAgLyoqCi0gICAgICogIENhbGxlZCBieSB0aGUgUHJvamVjdCBjbGFzcyB0byBjcmVhdGUgbmV3IHRhcmdldHMuCi0gICAgICovCi0gICAgVGFyZ2V0KFByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIHRoaXMudGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMuZGVwZW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFRhc2tzKCkgewotICAgICAgICByZXR1cm4gdGFza3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRGVwZW5kKFN0cmluZyBkZXBlbmQpIHsKLSAgICAgICAgLy8gSWYgbm8gcHJvamVjdCB3YXMgc3BlY2lmaWVkLCB1c2UgdGhpcyB0YXJnZXQncyBwcm9qZWN0Ci0gICAgICAgIGlmIChkZXBlbmQuaW5kZXhPZihXb3Jrc3BhY2UuU0NPUEVfU0VQQVJBVE9SKSA9PSAtMSkgewotICAgICAgICAgICAgZGVwZW5kID0gZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArIFdvcmtzcGFjZS5TQ09QRV9TRVBBUkFUT1IgKyBkZXBlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZGVwZW5kcy5hZGQoZGVwZW5kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXREZXBlbmRzKCkgewotICAgICAgICByZXR1cm4gZGVwZW5kczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIHRhc2sgcHJveHkgZm9yIHRoaXMgdGFyZ2V0LiBUaGUgcHJveHkgd2lsbAotICAgICAqICBiZSBjb252ZXJ0ZWQgaW50byBhbiBhY3R1YWwgdGFzayBvYmplY3QgYXQgYnVpbGQgdGltZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza1Byb3h5IGNyZWF0ZVRhc2tQcm94eShTdHJpbmcgbmFtZSkgewotICAgICAgICBUYXNrUHJveHkgcHJveHkgPSBuZXcgVGFza1Byb3h5KHRoaXMsIG5hbWUpOwotICAgICAgICB0YXNrcy5hZGQocHJveHkpOwotICAgICAgICByZXR1cm4gcHJveHk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWNhZThiLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLS8qKgotICogIEFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGFsbCB0YXNrIG9iamVjdHMuIEFueSBjbGFzcyB0aGF0Ci0gKiAgZXh0ZW5kcyB0aGlzIGNsYXNzIGNhbiBiZSBwbHVnZ2VkIGludG8gYSB3b3Jrc3BhY2UgYnkgdXNpbmcgdGhlICJsb2FkIgotICogIHRhc2suCi0gKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1wZm9lbW1lQHRob3VnaHR3b3Jrcy5jb20iPk1hdHRoZXcgRm9lbW1lbDwvYT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRhc2sgewotICAgIHByaXZhdGUgV29ya3NwYWNlIHdvcmtzcGFjZTsKLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFRhcmdldCB0YXJnZXQ7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOwotCi0gICAgcHVibGljIFdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB3b3Jrc3BhY2U7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRXb3Jrc3BhY2UoV29ya3NwYWNlIHdvcmtzcGFjZSkgewotICAgICAgICB0aGlzLndvcmtzcGFjZSA9IHdvcmtzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFRhcmdldCBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRUYXJnZXQoVGFyZ2V0IHRhcmdldCkgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tEYXRhLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0OWJjNC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBzdG9yZXMgaW5mbyBhYm91dCBhIGJlYW4ncyBwcm9wZXJ0aWVzIHNvIHRoYXQKLSAqICB0aGUgYWN0dWFsIGJlYW4gY2FuIGJlIGluc3RhbnRpYXRlZCBhdCBhIGxhdGVyIHRpbWUuIFRoaXMgZGF0YQotICogIGlzIHVzZWQgdG8gc3RvcmUgaW5mbyBhYm91dCBhIHRhc2ssIHNpbmNlIHRoZSBhY3R1YWwKLSAqICB0YXNrIGNsYXNzIG1pZ2h0IG5vdCBiZSBsb2FkZWQgdW50aWwgYWZ0ZXIgcGFyc2luZyBpcyBjb21wbGV0ZWQuCi0gKgotICogIEBzZWUgVGFza1Byb3h5Ci0gKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1wZm9lbW1lQHRob3VnaHR3b3Jrcy5jb20iPk1hdHRoZXcgRm9lbW1lbDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tEYXRhIHsKLSAgICBwcml2YXRlIFRhc2tQcm94eSBwcm94eTsKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyB0ZXh0OwotICAgIHByaXZhdGUgTWFwIHByb3BlcnRpZXM7Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIG5ldyBUYXNrRGF0YSB1bmRlciB0aGUgc3BlY2lmaWVkIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIFRhc2tEYXRhKFRhc2tQcm94eSBwcm94eSkgewotICAgICAgICB0aGlzLnByb3h5ID0gcHJveHk7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSBudWxsOwotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB0YXNrIHByb3h5IHRoYXQgdGhpcyBkYXRhIGlzIGFzc29jaWF0ZWQgd2l0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza1Byb3h5IGdldFRhc2tQcm94eSgpIHsKLSAgICAgICAgcmV0dXJuIHByb3h5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBsb2NhdGlvbiBpbiB0aGUgYnVpbGQgZmlvbGUgd2hlcmUgdGhpcyBkYXRhIHdhcyBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbG9jYXRpb24gaW4gdGhlIGJ1aWxkIGZpb2xlIHdoZXJlIHRoaXMgZGF0YSB3YXMgZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSB0ZXh0IGZvciB0aGlzIGJlYW4gZGF0YSwgZm9yIGNhc2VzIHdoZXJlIHRoZSBiZWFuIGlzIGEgc2ltcGxlCi0gICAgICogIHR5cGUgbGlrZSBTdHJpbmcgb3IgaW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9uIHRoZSBiZWFuLiBNdWx0aXBsZSBwcm9wZXJ0aWVzIGNhbiBiZQotICAgICAqICBhZGRlZCB3aXRoIHRoZSBzYW1lIG5hbWUgb25seSBpZiB0aGUgcHJvcGVydHkgb24gdGhlIGJlYW4gaXMgYW4gYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIFRhc2tEYXRhIGFkZFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFRhc2tEYXRhIGRhdGEgPSBuZXcgVGFza0RhdGEocHJveHkpOwotICAgICAgICBnZXRQcm9wZXJ0aWVzKG5hbWUpLmFkZChkYXRhKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxpc3Qgb2YgcHJvcGVydHkgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGdldFByb3BlcnRpZXMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSAoTGlzdCkgcHJvcGVydGllcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgbmV3IGJlYW4gaW5zdGFuY2UgYW5kIGluaXRpYWxpemVzIGl0cyBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQmVhbihDbGFzcyB0eXBlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgYmVhbiA9IG51bGw7Ci0KLSAgICAgICAgLy8gU2VlIGlmIGFuIGVkaXRvciBleGlzdHMgZm9yIHRoaXMgdHlwZQotICAgICAgICBQcm9wZXJ0eUVkaXRvciBlZGl0b3IgPSBQcm9wZXJ0eUVkaXRvck1hbmFnZXIuZmluZEVkaXRvcih0eXBlKTsKLQotICAgICAgICBpZiAoZWRpdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0ZXh0IGZvciB0eXBlcyB3aXRob3V0IGVkaXRvcnMKLSAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGV4dCBcIiIgKyB0ZXh0ICsgIlwiIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJlYW4gPSB0eXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSAiICsgdHlwZS5nZXROYW1lKCksIGV4Yyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24oIlVuYWJsZSB0byBhY2Nlc3MgY29uc3RydWN0b3IgZm9yICIgKyB0eXBlLmdldE5hbWUoKSwgZXhjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBlZGl0b3IgcGFyc2UgdGhlIHRleHQKLSAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0QXNUZXh0KHBhcnNlVmFyaWFibGVzKHRleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlwiIiArIHRleHQgKyAiXCIgaXMgbm90IGEgdmFsaWQgbnVtYmVyIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiZWFuID0gZWRpdG9yLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGZpZWxkcyBvbiB0aGUgYmVhbgotICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGJlYW4pOwotCi0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIGFsbCBvZiB0aGUgcHJvcGVydHkgdmFsdWVzIG9uIHRoZSBiZWFuLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm9wZXJ0aWVzKE9iamVjdCBiZWFuKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIENhbGwgc2V0UHJvcGVydHkgZm9yIGVhY2ggcHJvcGVydHkgdGhhdCdzIGJlZW4gZGVmaW5lZAotICAgICAgICBJdGVyYXRvciBpdHIgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHNldFByb3BlcnR5KGJlYW4sIG5hbWUsIHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmluZHMgdGhlIFByb3BlcnR5RGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmVkIHByb3BlcnR5IGFuZCBzZXRzIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIG5hbWUsIExpc3QgdmFsdWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhiZWFuLmdldENsYXNzKCkpOwotCi0gICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIHByb3BlcnR5IHdpdGggdGhlIG1hdGNoaW5nIG5hbWUKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShiZWFuLCBkZXNjcmlwdG9yc1tpXSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5leHBlY3RlZCBhdHRyaWJ1dGUgXCIiICsgbmFtZSArICJcIiIsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyBhIHNpbmdsZSBwcm9wZXJ0eSBvbiBhIGJlYW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3Qgb2JqLCBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciwgTGlzdCB2YWx1ZXMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgQ2xhc3MgdHlwZSA9IGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCk7Ci0KLSAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGNyZWF0ZUJlYW5zKHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCB2YWx1ZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHZhbHVlcy5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgVGFza0RhdGEgZGF0YSA9IChUYXNrRGF0YSkgdmFsdWVzLmdldCgwKTsKLSAgICAgICAgICAgIHZhbHVlID0gZGF0YS5jcmVhdGVCZWFuKHR5cGUpOwotCi0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVzY3JpcHRvci5nZXRXcml0ZU1ldGhvZCgpLmludm9rZShvYmosIG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKCJVbmFibGUgdG8gYWNjZXNzIHdyaXRlIG1ldGhvZCBmb3IgXCIiICsgZGVzY3JpcHRvci5nZXROYW1lKCkgKyAiXCIiLCBleGMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKCJVbmFibGUgdG8gc2V0IHByb3BlcnR5IFwiIiArIGRlc2NyaXB0b3IuZ2V0TmFtZSgpICsgIlwiIiwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgbnVtYmVyIG9mIGJlYW5zIHdpdGggdGhlIHNhbWUgdHlwZSB1c2luZyB0aGUgbGlzdCBvZiBUYXNrRGF0YSdzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gY3JlYXRlQmVhbnMoQ2xhc3MgdHlwZSwgTGlzdCB2YWx1ZXMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIGJlYW5zID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZSh0eXBlLCB2YWx1ZXMuc2l6ZSgpKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBJdGVyYXRvciBpdHIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFRhc2tEYXRhIGRhdGEgPSAoVGFza0RhdGEpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBiZWFuc1tpKytdID0gZGF0YS5jcmVhdGVCZWFuKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVXNlcyB0aGUgSW50cm9zcGVjdG9yIGNsYXNzIHRvIGxvb2t1cCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKENsYXNzIHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8odHlwZSwgT2JqZWN0LmNsYXNzKS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24oIlVuYWJsZSB0byBnZXQgYmVhbiBpbmZvIGZvciAiICsgdHlwZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlcGxhY2VzIGFueSB2YXJpYWJsZXMgaW4gdGhlIGlucHV0IHN0cmluZyB3aXRoIHRoZWlyIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwYXJzZVZhcmlhYmxlcyhTdHJpbmcgaW5wdXQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGVuZCA9IDA7Ci0gICAgICAgIHdoaWxlICgoc3RhcnQgPSBpbnB1dC5pbmRleE9mKCd7JywgZW5kKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoaW5wdXQuc3Vic3RyaW5nKGVuZCxzdGFydCkpOwotICAgICAgICAgICAgZW5kID0gaW5wdXQuaW5kZXhPZignfScsIHN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChlbmQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGlucHV0LnN1YnN0cmluZygrK3N0YXJ0LCBlbmQrKyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJveHkuZ2V0VGFyZ2V0KCkuZ2V0UHJvamVjdCgpLmdldFZhcmlhYmxlKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHZhcmlhYmxlIFwiIiArIG5hbWUgKyAiXCIgaGFzIG5vdCBiZWVuIGRlZmluZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRwdXQuYXBwZW5kKGlucHV0LnN1YnN0cmluZyhlbmQpKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrUHJveHkuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlN2YwZS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvVGFza1Byb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLS8qKgotICogIFRoaXMgY2xhc3Mgc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8KLSAqICBpbnN0YW50aWF0ZSBhIHRhc2sgb2JqZWN0LiBJdCBiYXNpY2FsbHkgY29uc2lzdHMgb2YKLSAqICB0aGUgdGFzayBuYW1lIGFuZCBhIFRhc2tEYXRhIG9iamVjdCwgd2hpY2ggc3RvcmVzIHRoZQotICogIHZhbHVlcyBvZiB0aGUgZmllbGRzLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptcGZvZW1tZUB0aG91Z2h0d29ya3MuY29tIj5NYXR0aGV3IEZvZW1tZWw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrUHJveHkgewotICAgIHByaXZhdGUgVGFyZ2V0IHRhcmdldDsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgVGFza0RhdGEgZGF0YTsKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQotICAgIHB1YmxpYyBUYXNrUHJveHkoVGFyZ2V0IHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBUYXNrRGF0YSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFyZ2V0IGdldFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBUYXNrRGF0YSBnZXREYXRhKCkgewotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmluZHMgdGhlIGNsYXNzIGZvciB0aGlzIHRhc2sgbmFtZSwgYW5kIGNyZWF0ZXMgYW4KLSAgICAgKiAgaW5zdGFuY2Ugb2YgaXQgdXNpbmcgVGFza0RhdGEuY3JlYXRlQmVhbigpLgotICAgICAqLwotICAgIHB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyB0eXBlID0gdGFyZ2V0LmdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKS5nZXRUYXNrQ2xhc3MobmFtZSk7Ci0gICAgICAgIHJldHVybiAoVGFzaykgZGF0YS5jcmVhdGVCZWFuKHR5cGUpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvV29ya3NwYWNlLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvV29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzk5YzAuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L1dvcmtzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqICBUaGUgbWFpbiBjbGFzcyBpbiB0aGUgQW50IGNsYXNzIGhpZXJhcmNoeS4gQSB3b3Jrc3BhY2UgY29udGFpbnMKLSAqICBtdWx0aXBsZSBwcm9qZWN0cywgd2hpY2ggaW4gdHVybiBjb250YWluIG11bHRpcGxlIHRhcmdldHMsIHdoaWNoCi0gKiAgaW4gdHVybiBjb250YWluIG11bHRpcGxlIHRhc2sgcHJveGllcy4gVGhlIHdvcmtzcGFjZSBhbHNvIGhhbmRsZXMKLSAqICB0aGUgc29ydGluZyBhbmQgZXhlY3V0aW9uIG9mIHRhcmdldHMgZHVyaW5nIGEgYnVpbGQuCi0gKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1wZm9lbW1lQHRob3VnaHR3b3Jrcy5jb20iPk1hdHRoZXcgRm9lbW1lbDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNDT1BFX1NFUEFSQVRPUiA9ICc6JzsKLQotICAgIHByaXZhdGUgSW1wb3J0ZXIgaW1wb3J0ZXI7Ci0gICAgcHJpdmF0ZSBNYXAgcHJvamVjdHM7Ci0gICAgcHJpdmF0ZSBNYXAgdGFza3M7Ci0gICAgcHJpdmF0ZSBMaXN0IGxpc3RlbmVyczsKLQotICAgIHByaXZhdGUgVGFzayBjdXJyZW50VGFzayA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBuZXcgQW50IHdvcmtzcGFjZSB3aXRoIG5vIHByb2plY3RzLiBUaGUgb25seQotICAgICAqICB0YXNrIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkIGlzIHRoZSAibG9hZCIgdGFzay4KLSAgICAgKgotICAgICAqICBUaGUgaW1wb3J0ZXIgaXMgdXNlZCB0byBoYW5kbGUgdGhlIGFjdHVhbCByZWFkaW5nIG9mIGJ1aWxkIGZpbGVzLgotICAgICAqICBJbiB0aGVvcnksIGRpZmZlcmVudCBpbXBvcnRlcnMgY291bGQgYmUgdXNlZCB0byByZWFkIHByb2plY3QgaW5mbyBmcm9tCi0gICAgICogIERPTSB0cmVlcywgc2VyaWFsaXplZCBvYmplY3RzLCBkYXRhYmFzZXMsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgV29ya3NwYWNlKEltcG9ydGVyIGltcG9ydGVyKSB7Ci0gICAgICAgIHRoaXMuaW1wb3J0ZXIgPSBpbXBvcnRlcjsKLSAgICAgICAgdGhpcy5wcm9qZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMudGFza3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICByZWdpc3RlclRhc2soImxvYWQiLCBMb2FkLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQXNzaWducyBhIHRhc2sgY2xhc3MgdG8gYSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVGFzayhTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSkgewotICAgICAgICB0YXNrcy5wdXQobmFtZSwgdHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGNsYXNzIGZvciBhIHRhc2sgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldFRhc2tDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgdHlwZSA9IChDbGFzcykgdGFza3MuZ2V0KG5hbWUpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHRhc2sgbmFtZWQgXCIiICsgbmFtZSArICJcIiBoYXMgYmVlbiBsb2FkZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIHByb2plY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBwcm9qZWN0IGluaXRpYWxseQotICAgICAqICBjb250YWlucyBubyB0YXJnZXRzLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gbmV3IFByb2plY3QodGhpcywgbmFtZSk7Ci0gICAgICAgIHByb2plY3RzLnB1dChuYW1lLCBwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHByb2plY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG9yIHRocm93cwotICAgICAqICBhbiBleGNlcHRpb24gaWYgbm8gcHJvamVjdCBleGlzdHMgd2l0aCB0aGF0IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgbmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gKFByb2plY3QpIHByb2plY3RzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9qZWN0IFwiIiArIG5hbWUgKyAiXCIgbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEJ1aWxkcyBhbGwgb2YgdGhlIHRhcmdldHMgaW4gdGhlIGxpc3QuIFRhcmdldCBuYW1lcyBtdXN0Ci0gICAgICogIGJlIG9mIHRoZSBmb3JtIHByb2plY3RuYW1lOnRhcmdldG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYnVpbGQoTGlzdCBmdWxsTmFtZXMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSB0YXNrcyBpbnRlcmNlcHQgU3lzdGVtLmV4aXQoKSBjYWxscwotICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IEFudFNlY3VyaXR5TWFuYWdlcigpKTsKLQotICAgICAgICBmaXJlQnVpbGRTdGFydGVkKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBwcm9qZWN0IGZpbGVzLi4uCi0gICAgICAgICAgICBpbXBvcnRUYXJnZXRzKGZ1bGxOYW1lcyk7Ci0KLSAgICAgICAgICAgIC8vIC4uLmZpZ3VyZSBvdXQgdGhlIGJ1aWxkIG9yZGVyLi4uCi0gICAgICAgICAgICBMaXN0IHRvRG9MaXN0ID0gc29ydFRhcmdldHMoZnVsbE5hbWVzKTsKLQotICAgICAgICAgICAgLy8gLi4uYW5kIGJ1aWxkIHRoZSB0YXJnZXRzCi0gICAgICAgICAgICBJdGVyYXRvciBpdHIgPSB0b0RvTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldCkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBidWlsZFRhcmdldCh0YXJnZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlyZUJ1aWxkRmluaXNoZWQobnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIGZpcmVCdWlsZEZpbmlzaGVkKGV4Yyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKHNtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIHdvcmtzcGFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRCdWlsZExpc3RlbmVyKEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlbW92ZXMgYSBsaXN0ZW5lciB0byB0aGUgd29ya3NwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJ1aWxkTGlzdGVuZXIoQnVpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZXMgYSBtZXNzYWdlTG9nZ2VkIGV2ZW50IHdpdGggREVCVUcgcHJpb3JpdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBmaXJlTWVzc2FnZUxvZ2dlZChtZXNzYWdlLCBCdWlsZEV2ZW50LkRFQlVHKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZXMgYSBtZXNzYWdlTG9nZ2VkIGV2ZW50IHdpdGggSU5GTyBwcmlvcml0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluZm8oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZmlyZU1lc3NhZ2VMb2dnZWQobWVzc2FnZSwgQnVpbGRFdmVudC5JTkZPKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZXMgYSBtZXNzYWdlTG9nZ2VkIGV2ZW50IHdpdGggV0FSTiBwcmlvcml0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZmlyZU1lc3NhZ2VMb2dnZWQobWVzc2FnZSwgQnVpbGRFdmVudC5XQVJOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZXMgYSBtZXNzYWdlTG9nZ2VkIGV2ZW50IHdpdGggRVJST1IgcHJpb3JpdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBmaXJlTWVzc2FnZUxvZ2dlZChtZXNzYWdlLCBCdWlsZEV2ZW50LkVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wb3J0cyBpbnRvIHRoZSB3b3Jrc3BhY2UgYWxsIG9mIHRoZSBwcm9qZWN0cyByZXF1aXJlZCB0bwotICAgICAqICBidWlsZCBhIHNldCBvZiB0YXJnZXRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbXBvcnRUYXJnZXRzKExpc3QgZnVsbE5hbWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvciBpdHIgPSBmdWxsTmFtZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IChTdHJpbmcpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRQcm9qZWN0TmFtZShmdWxsTmFtZSk7Ci0gICAgICAgICAgICBpbXBvcnRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBvcnRzIHRoZSBwcm9qZWN0IGludG8gdGhlIHdvcmtzcGFjZSwgYXMgd2VsbCBhcyBhbnkgb3RoZXJzCi0gICAgICogIHRoYXQgdGhlIHByb2plY3QgZGVwZW5kcyBvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdCBpbXBvcnRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gKFByb2plY3QpIHByb2plY3RzLmdldChwcm9qZWN0TmFtZSk7Ci0KLSAgICAgICAgLy8gRG9uJ3QgcGFyc2UgYSBwcm9qZWN0IGZpbGUgbW9yZSB0aGFuIG9uY2UKLSAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgcHJvamVjdCBmaWxlCi0gICAgICAgICAgICBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0KLSAgICAgICAgICAgIGZpcmVJbXBvcnRTdGFydGVkKHByb2plY3QpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbXBvcnRlci5pbXBvcnRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICAgICAgICAgIGZpcmVJbXBvcnRGaW5pc2hlZChwcm9qZWN0LCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIGZpcmVJbXBvcnRGaW5pc2hlZChwcm9qZWN0LCBleGMpOwotICAgICAgICAgICAgICAgIHRocm93IGV4YzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUGFyc2UgYW55IGltcG9ydGVkIHByb2plY3RzIGFzIHdlbGwKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHByb2plY3QuZ2V0SW1wb3J0cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEltcG9ydCBpbXAgPSAoSW1wb3J0KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIGltcG9ydFByb2plY3QoaW1wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogIEJ1aWxkcyBhIHNwZWNpZmljIHRhcmdldC4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRhcmdldHMgaXQgZGVwZW5kcwotICAgICAqICBvbiBoYXZlIGFscmVhZHkgYmVlbiBidWlsdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRUYXJnZXQoVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZmlyZVRhcmdldFN0YXJ0ZWQodGFyZ2V0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdCB0YXNrcyA9IHRhcmdldC5nZXRUYXNrcygpOwotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gdGFza3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgVGFza1Byb3h5IHByb3h5ID0gKFRhc2tQcm94eSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBleGVjdXRlVGFzayh0YXJnZXQsIHByb3h5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlyZVRhcmdldEZpbmlzaGVkKHRhcmdldCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goQnVpbGRFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICBmaXJlVGFyZ2V0RmluaXNoZWQodGFyZ2V0LCBudWxsKTsKLSAgICAgICAgICAgIHRocm93IGV4YzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnN0YW50aWF0ZXMgdGhlIHRhc2sgZnJvbSB0aGUgcHJveHkgYW5kIGV4ZWN1dGVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVGFzayhUYXJnZXQgdGFyZ2V0LCBUYXNrUHJveHkgcHJveHkpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRhc2sgdGFzayA9IHByb3h5LmNyZWF0ZVRhc2soKTsKLSAgICAgICAgdGFzay5zZXRXb3Jrc3BhY2UodGhpcyk7Ci0gICAgICAgIHRhc2suc2V0UHJvamVjdCh0YXJnZXQuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgdGFzay5zZXRUYXJnZXQodGFyZ2V0KTsKLQotICAgICAgICBmaXJlVGFza1N0YXJ0ZWQodGFzayk7Ci0gICAgICAgIGN1cnJlbnRUYXNrID0gdGFzazsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhc2suZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICBmaXJlVGFza0ZpbmlzaGVkKHRhc2ssIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgZXhjLnNldExvY2F0aW9uKHByb3h5LmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgZmlyZVRhc2tGaW5pc2hlZCh0YXNrLCBleGMpOwotICAgICAgICAgICAgdGhyb3cgZXhjOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgY3VycmVudFRhc2sgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIERvZXMgYSB0b3BvbG9naWNhbCBzb3J0IG9uIGEgbGlzdCBvZiB0YXJnZXQgbmFtZXMuIFJldHVybnMKLSAgICAgKiAgYSBsaXN0IG9mIFRhcmdldCBvYmplY3RzIGluIHRoZSBvcmRlciB0byBiZSBleGVjdXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Qgc29ydFRhcmdldHMoTGlzdCBmdWxsTmFtZXMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgc29ydFRhcmdldHMocmVzdWx0cywgbmV3IFN0YWNrKCksIGZ1bGxOYW1lcyk7Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzb3J0VGFyZ2V0cyhMaXN0IHJlc3VsdHMsIFN0YWNrIHZpc2l0ZWQsIExpc3QgZnVsbE5hbWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvciBpdHIgPSBmdWxsTmFtZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IChTdHJpbmcpIGl0ci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBjeWNsZXMKLSAgICAgICAgICAgIGlmICh2aXNpdGVkLmNvbnRhaW5zKGZ1bGxOYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93Q3ljbGljRGVwZW5kZW5jeSh2aXNpdGVkLCBmdWxsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFscmVhZHkgYWRkZWQgdGhpcyB0YXJnZXQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgIFRhcmdldCB0YXJnZXQgPSBnZXRUYXJnZXQoZnVsbE5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdHMuY29udGFpbnModGFyZ2V0KSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2aXNpdGVkLnB1c2goZnVsbE5hbWUpOwotICAgICAgICAgICAgc29ydFRhcmdldHMocmVzdWx0cywgdmlzaXRlZCwgdGFyZ2V0LmdldERlcGVuZHMoKSk7Ci0gICAgICAgICAgICByZXN1bHRzLmFkZCh0YXJnZXQpOwotICAgICAgICAgICAgdmlzaXRlZC5wb3AoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluZGljYXRpbmcgYSBjeWNsaWMgZGVwZW5kZW5jeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dDeWNsaWNEZXBlbmRlbmN5KFN0YWNrIHZpc2l0ZWQsIFN0cmluZyBmdWxsTmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoIkN5Y2xpYyBkZXBlbmRlbmN5OiAiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpdGVkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtc2cuYXBwZW5kKChTdHJpbmcpdmlzaXRlZC5nZXQoaSkpOwotICAgICAgICAgICAgbXNnLmFwcGVuZCgiIC0+ICIpOwotICAgICAgICB9Ci0gICAgICAgIG1zZy5hcHBlbmQoZnVsbE5hbWUpOwotICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBQYXJzZXMgdGhlIGZ1bGwgdGFyZ2V0IG5hbWUgaW50byBpcyBwcm9qZWN0IGFuZCB0YXJnZXQgY29tcG9uZW50cywKLSAgICAgKiAgdGhlbiBsb2NhdGVzIHRoZSBUYXJnZXQgb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgVGFyZ2V0IGdldFRhcmdldChTdHJpbmcgZnVsbE5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFByb2plY3ROYW1lKGZ1bGxOYW1lKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSBnZXRUYXJnZXROYW1lKGZ1bGxOYW1lKTsKLQotICAgICAgICBQcm9qZWN0IHByb2plY3QgPSAoUHJvamVjdCkgcHJvamVjdHMuZ2V0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9qZWN0IFwiIiArIHByb2plY3ROYW1lICsgIlwiIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGFyZ2V0IHRhcmdldCA9IHByb2plY3QuZ2V0VGFyZ2V0KHRhcmdldE5hbWUpOwotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGFyZ2V0IFwiIiArIGZ1bGxOYW1lICsgIlwiIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcHJvamVjdCBwb3J0aW9uIG9mIGEgZnVsbCB0YXJnZXQgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZShTdHJpbmcgZnVsbE5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBwb3MgPSBmdWxsTmFtZS5pbmRleE9mKFNDT1BFX1NFUEFSQVRPUik7Ci0gICAgICAgIGlmIChwb3MgPT0gLTEgfHwgcG9zID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiXCIiICsgZnVsbE5hbWUgKyAiXCIgaXMgbm90IGEgdmFsaWQgdGFyZ2V0IG5hbWUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmdWxsTmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgdGFyZ2V0IHBvcnRpb24gb2YgYSBmdWxsIHRhcmdldCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWUoU3RyaW5nIGZ1bGxOYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpbnQgcG9zID0gZnVsbE5hbWUuaW5kZXhPZihTQ09QRV9TRVBBUkFUT1IpOwotICAgICAgICBpZiAocG9zID09IC0xIHx8IHBvcyA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlwiIiArIGZ1bGxOYW1lICsgIlwiIGlzIG5vdCBhIHZhbGlkIHRhcmdldCBuYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZnVsbE5hbWUuc3Vic3RyaW5nKHBvcyArIDEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXJlTWVzc2FnZUxvZ2dlZChTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KSB7Ci0gICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQ7Ci0gICAgICAgIGlmIChjdXJyZW50VGFzayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZXZlbnQgPSBuZXcgQnVpbGRFdmVudChjdXJyZW50VGFzayk7Ci0gICAgICAgIH0KLSAgICAgICAgZXZlbnQuc2V0TWVzc2FnZShtZXNzYWdlLCBwcmlvcml0eSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0gKEJ1aWxkTGlzdGVuZXIpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0ZW5lci5tZXNzYWdlTG9nZ2VkKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXJlQnVpbGRTdGFydGVkKCkgewotICAgICAgICBJdGVyYXRvciBpdHIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0aGlzKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLmJ1aWxkU3RhcnRlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlyZUJ1aWxkRmluaXNoZWQoQnVpbGRFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0aGlzKTsKLSAgICAgICAgZXZlbnQuc2V0RXhjZXB0aW9uKGV4Yyk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0gKEJ1aWxkTGlzdGVuZXIpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0ZW5lci5idWlsZEZpbmlzaGVkKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXJlSW1wb3J0U3RhcnRlZChQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHByb2plY3QpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IChCdWlsZExpc3RlbmVyKSBpdHIubmV4dCgpOwotICAgICAgICAgICAgbGlzdGVuZXIuaW1wb3J0U3RhcnRlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlyZUltcG9ydEZpbmlzaGVkKFByb2plY3QgcHJvamVjdCwgQnVpbGRFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudChwcm9qZWN0KTsKLSAgICAgICAgZXZlbnQuc2V0RXhjZXB0aW9uKGV4Yyk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0gKEJ1aWxkTGlzdGVuZXIpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0ZW5lci5pbXBvcnRGaW5pc2hlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlyZVRhcmdldFN0YXJ0ZWQoVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBCdWlsZEV2ZW50IGV2ZW50ID0gbmV3IEJ1aWxkRXZlbnQodGFyZ2V0KTsKLQotICAgICAgICBJdGVyYXRvciBpdHIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLnRhcmdldFN0YXJ0ZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVUYXJnZXRGaW5pc2hlZChUYXJnZXQgdGFyZ2V0LCBCdWlsZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRhcmdldCk7Ci0gICAgICAgIGV2ZW50LnNldEV4Y2VwdGlvbihleGMpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IChCdWlsZExpc3RlbmVyKSBpdHIubmV4dCgpOwotICAgICAgICAgICAgbGlzdGVuZXIudGFyZ2V0RmluaXNoZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVUYXNrU3RhcnRlZChUYXNrIHRhc2spIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRhc2spOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IChCdWlsZExpc3RlbmVyKSBpdHIubmV4dCgpOwotICAgICAgICAgICAgbGlzdGVuZXIudGFza1N0YXJ0ZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVUYXNrRmluaXNoZWQoVGFzayB0YXNrLCBCdWlsZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRhc2spOwotICAgICAgICBldmVudC5zZXRFeGNlcHRpb24oZXhjKTsKLQotICAgICAgICBJdGVyYXRvciBpdHIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLnRhc2tGaW5pc2hlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L2NtZGxpbmUvRGVmYXVsdExvZ2dlci5qYXZhIGIvcHJvcG9zYWwvYW50ZmFybS9jb3JlL29yZy9hcGFjaGUvdG9vbHMvYW50L2NtZGxpbmUvRGVmYXVsdExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTMzNTFmLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9jbWRsaW5lL0RlZmF1bHRMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5jbWRsaW5lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1wZm9lbW1lQHRob3VnaHR3b3Jrcy5jb20iPk1hdHRoZXcgRm9lbW1lbDwvYT4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRMb2dnZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKLSAgICBwcml2YXRlIFByaW50U3RyZWFtIG91dDsKLQotICAgIHB1YmxpYyBEZWZhdWx0TG9nZ2VyKFByaW50U3RyZWFtIG91dCkgewotICAgICAgICB0aGlzLm91dCA9IG91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBCdWlsZEV4Y2VwdGlvbiBleGMgPSBldmVudC5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgaWYgKGV4YyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiQlVJTEQgU1VDQ0VTU0ZVTCIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgb3V0LnByaW50bG4oIkJVSUxEIEZBSUxFRCIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGV4Yyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbXBvcnRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIkltcG9ydGluZzogIiArIGV2ZW50LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGltcG9ydEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIlxuWyIgKyBldmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIjoiICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpICsgIl0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG91dC5wcmludGxuKCIgICAgIiArIGV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9jbWRsaW5lL01haW4uamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vY29yZS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9jbWRsaW5lL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyNmU2Yi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL2NvcmUvb3JnL2FwYWNoZS90b29scy9hbnQvY21kbGluZS9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmNtZGxpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi0vKioKLSAqICBSdW5zIHRoZSBjb21tYW5kIGxpbmUgdmVyc2lvbiBvZiBhbnQuIFRha2VzIGEgbGlzdCBvZgotICogIGZ1bGx5IHF1YWxpZmllZCB0YXJnZXRzIGFuZCBidWlsZHMgdGhlbS4KLSAqICBBbnkgamFycyBpbiB0aGUgInRhc2tzIiBkaXJlY3Rvcnkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkCi0gKiAgdG8gdGhlIHByb2plY3QgcGF0aC4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bXBmb2VtbWVAdGhvdWdodHdvcmtzLmNvbSI+TWF0dGhldyBGb2VtbWVsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTWFpbiB7Ci0KLSAgICAvKioKLSAgICAgKiAgQnVpbGRzIHRoZSBzcGVjaWZpZWQgdGFyZ2V0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIEZpbGUgaW5zdGFsbERpciA9IGZpbmRJbnN0YWxsRGlyKCk7Ci0gICAgICAgIHNldHVwUHJvamVjdFBhdGgoaW5zdGFsbERpcik7Ci0gICAgICAgIEltcG9ydGVyIGltcG9ydGVyID0gbG9hZEltcG9ydGVyKGluc3RhbGxEaXIpOwotCi0gICAgICAgIFdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBuZXcgV29ya3NwYWNlKGltcG9ydGVyKTsKLSAgICAgICAgd29ya3NwYWNlLmFkZEJ1aWxkTGlzdGVuZXIobmV3IERlZmF1bHRMb2dnZXIoU3lzdGVtLm91dCkpOwotCi0gICAgICAgIExpc3QgdGFyZ2V0cyA9IEFycmF5cy5hc0xpc3QoYXJncyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3b3Jrc3BhY2UuYnVpbGQodGFyZ2V0cykpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpbmRzIHRoZSBhbnQuamFyIGZpbGUgaW4gdGhlIGNsYXNzcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGZpbmRJbnN0YWxsRGlyKCkgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgaXRyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIiksCi0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIikpOwotCi0gICAgICAgIHdoaWxlIChpdHIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpdHIubmV4dFRva2VuKCkpOwotICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscygiYW50LmphciIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm91bmQgaXQKLSAgICAgICAgICAgICAgICBGaWxlIGRpciA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkaXIgPSBuZXcgRmlsZSgiLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGlyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gbG9jYXRlIGFudC5qYXIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb2NhdGVzIHRoZSAidGFza3MiIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgYW50LmphciBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBQcm9qZWN0UGF0aChGaWxlIGluc3RhbGxEaXIpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LnByb2plY3QucGF0aCIsICIuIikpOwotCi0gICAgICAgIEZpbGUgdGFza0RpciA9IG5ldyBGaWxlKGluc3RhbGxEaXIsICJ0YXNrcyIpOwotICAgICAgICBpZiAodGFza0Rpci5leGlzdHMoKSkgewotICAgICAgICAgICAgRmlsZVtdIHRhc2tqYXJzID0gdGFza0Rpci5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFza2phcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIikpOwotICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKHRhc2tqYXJzW2ldLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImFudC5wcm9qZWN0LnBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGF0aC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIGNsYXNzIGxvYWRlciB1c2luZyB0aGUgamFycyBmcm9tIHRoZSAieG1sIiBkaXJlY3RvcnksIGFuZAotICAgICAqICBsb2FkcyB0aGUgWG1sSW1wb3J0ZXIgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wb3J0ZXIgbG9hZEltcG9ydGVyKEZpbGUgaW5zdGFsbERpcikgewotICAgICAgICBGaWxlIHhtbERpciA9IG5ldyBGaWxlKGluc3RhbGxEaXIsICJ4bWwiKTsKLSAgICAgICAgaWYgKHhtbERpci5leGlzdHMoKSkgewotICAgICAgICAgICAgRmlsZVtdIHhtbEphcnMgPSB4bWxEaXIubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFt4bWxKYXJzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhtbEphcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0geG1sSmFyc1tpXS50b1VSTCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVVJMQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMpOwotICAgICAgICAgICAgICAgIHJldHVybiAoSW1wb3J0ZXIpIGxvYWRlci5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUudG9vbHMuYW50LnhtbC5YbWxJbXBvcnRlciIpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICAgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gZmluZCB4bWwgZGlyZWN0b3J5Iik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL3JlYWRtZS50eHQgYi9wcm9wb3NhbC9hbnRmYXJtL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Nzg5YmIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotKioqIEluc3RhbGxpbmcgKioqCi0KLVRvIGdldCB0aGluZ3Mgc3RhcnRlZCB5b3UnbGwgbmVlZCB0byBydW4gdGhlIGJvb3RzdHJhcC5iYXQgZmlsZSwgd2hpY2ggd2lsbCBtYW51YWxseSBjb21waWxlIGEgdmVyc2lvbiBvZiBhbnQgaW50byB0aGUgImJvb3QiIGRpcmVjdG9yeS4gRnJvbSB0aGVuIG9uIHlvdSBjYW4gdXNlIEFudCB0byBidWlsZCBBbnQgYnkgcnVubmluZyB0aGUgYnVpbGQuYmF0IGZpbGUuIChUaGVyZSBhcmVuJ3QgYW55IHVuaXggc2NyaXB0cyB5ZXQsIHVuZm9ydHVuYXRlbHkuIEFueSBoZWxwIGhlcmUgd291bGQgYmUgYXBwcmVjaWF0ZWQhKQotCi1UbyAiaW5zdGFsbCIgYW50LCB5b3UganVzdCBuZWVkIHRvIGhhdmUgdGhlIGFudC5qYXIgZmlsZSBpbiB5b3VyIGNsYXNzcGF0aC4gQW50IHdpbGwgZmlndXJlIG91dCB0aGUgcmVzdC4gVG8gcnVuIGl0LCB0eXBlOgotCi1qYXZhIGFudCBwcm9qZWN0OnRhcmdldAotCi1XaGVuIGFudCBpcyBydW4sIHRoZSBNYWluIGNsYXNzIHNjYW5zIHRoZSBjbGFzc3BhdGggdG8gZmluZCB0aGUgYW50LmphciBmaWxlLCBhbmQgY2FuIGZpZ3VyZSBvdXQgZnJvbSB0aGVyZSB3aGVyZSB0aGUgcmVzdCBvZiB0aGUgZmlsZXMgYXJlLiBJbiBwYXJ0aWN1bGFyLCB0aGUgamFycyBpbiB0aGUgInRhc2tzIiBkaXJlY3RvcnkgZ2V0IGFkZGVkIHRvIHRoZSBwcm9qZWN0IHBhdGggYXV0b21hdGljYWxseS4gQW5kIHRoZSBqYXJzIGluIHRoZSAieG1sIiBkaXJlY3RvcnkgZ2V0IGxvYWRlZCB1c2luZyBhIHNlcGFyYXRlIGNsYXNzIGxvYWRlciwgc28gdGhhdCB0aGV5IGRvbid0IGNvbmZsaWN0IHdpdGggdGhlIHhtbCBwYXJzZXJzIHRoYXQgdmFyaW91cyB0YXNrcyBtaWdodCBiZSB1c2luZy4KLQotCi0qKiogUnVubmluZyAqKioKLQotRm9yIG5vdywgdGhlIHRhcmdldHMgc3BlY2lmaWVkIGNvbiB0aGUgY29tbWFuZCBsaW5lIG11c3QgYmUgaW4gdGhlIGZvcm0gcHJvamVjdDp0YXJnZXQuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB0YXJnZXQgImFsbCIgaW4gZmlsZSAiZm9vLmFudCIsIHRoZSB0YXJnZXQgbmFtZSB3b3VsZCBiZSAiZm9vOmFsbCIuIEluIHRoZSBmdXR1cmUgdGhlcmUgd2lsbCBiZSBhIHdheSB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IHByb2plY3QsIHNvIHRoYXQgb25seSB0aGUgdGFyZ2V0IG5hbWUgd291bGQgbmVlZCB0byBiZSBzcGVjaWZpZWQuIAotCi1BbnQgc2VhcmNoZXMgYWxvbmcgdGhlICJwcm9qZWN0IHBhdGgiIHRvIGZpbmQgcHJvamVjdHMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gImltcG9ydCIgc3RhdGVtZW50cy4gVGhlIHByb2plY3QgcGF0aCBkZWZhdWx0cyB0byAiLiIsIGllIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmcgdGhlICJhbnQucHJvamVjdC5wYXRoIiBzeXN0ZW0gcHJvcGVydHkuIFZhcmlhYmxlcyBhbmQgdGFyZ2V0cyBmcm9tIG90aGVyIHByb2plY3RzIGNhbiBiZSBhY2Nlc3NlZCBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIHRoZSBwcm9qZWN0IG5hbWUgYW5kIGEgY29sb24uCi0KLQotKioqIENvbmNlcHRzICoqKgotCi1UaGUgbWFpbiB0aGluZyBJJ2QgbGlrZSBwZW9wbGUgdG8gY2hlY2sgb3V0IGlzIHRoZSB3aG9sZSB3b3Jrc3BhY2UgY29uY2VwdCwgaWUgdGhlIGFiaWxpdHkgdG8gcHVsbCBtdWx0aXBsZSBhbnQgZmlsZXMgaW50byBhIHNpbmdsZSBidWlsZC4gSSBwZXJzb25hbGx5IHRoaW5rIHRoaXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byByZXVzZSBhbnQgZmlsZXMgZnJvbSBvdGhlciBwcm9qZWN0cywgYW5kIGF2b2lkIHJlY3Vyc2l2ZSBtYWtlIHN5bmRyb21lIGF0IHRoZSBzYW1lIHRpbWUuIFBsdXMsIEkgdGhpbmsgdGhpcyBtb2RlbCBsZW5kcyBpdHNlbGYgdG8gQ0pBTiBpbXBsZW1lbnRhdGlvbiBxdWl0ZSBuaWNlbHkuCi0KLUkndmUgYWxzbyB0cmllZCB0byBtYWtlIHRoZSB0YXNrcyBtb3JlIGNvbXBsaWFudCB3aXRoIHRoZSBqYXZhYmVhbiBzcGVjLiBBcyBhIHJlc3VsdCBvZiB0aGlzLCB0aGUgd29yZCAicHJvcGVydHkiIGJlY2FtZSBzbyBvdmVybG9hZGVkIHRoYXQgSSBkZWNpZGVkIHRvIHVzZSB0aGUgdGVybSAidmFyaWFibGUiIGZvciB2YWx1ZXMgZGVmaW5lZCBpbiBhbnQgcHJvamVjdHMuIElmIGFueW9uZSBmZWVscyBzdHJvbmdseSBhYm91dCBpdCBJJ2xsIGNoYW5nZSBpdCBiYWNrLgotCi1UaGUgZGVwZW5kcyBhdHRyaWJ1dGUgb24gdGFyZ2V0cyB1c2VzIGEgd2hpdGVzcGFjZSBkZWxpbWl0ZWQgbGlzdCBvZiB0YXJnZXQgbmFtZXMsIGluc3RlYWQgb2YgY29tbWEgc2VwYXJhdGVkLiBUaGlzIGlzIG1vcmUgY29uc2lzdGVudCB3aXRoIHRoZSAibGlzdCIgZGF0YXR5cGUgaW4gdGhlIHhtbCBzY2hlbWEgc3BlYy4KLQotVGhlIHBhcnNlciBpcyBuYW1lc3BhY2UgYXdhcmUsIGFuZCBhdHRyaWJ1dGVzIGZvciBhbnkgbmFtZXNwYWNlIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGFyZSBpZ25vcmVkLgotCi1UaGUgY29kZSByZWxpZXMgaGVhdmlseSBvbiBKREsgMS4yIGZlYXR1cmVzLiBNYWtpbmcgaXQgSkRLIDEuMSBjb21wYXRpYmxlIHdvdWxkIGJlIGEgbG90IG9mIHdvcmssIGJ1dCBpcyBkZWZpbml0ZWx5IGRvYWJsZS4KLQotVGhlcmUncyBvYnZpb3VzbHkgYSBsb3Qgb2Ygc3R1ZmYgbWlzc2luZyBmcm9tIHRoaXMgcHJvdG90eXBlLCBzdWNoIGFzIGRhdGF0eXBlcywgcmVhbCB0YXNrcywgYSB3YXkgdG8gYWNjZXNzIHN5c3RlbSBwcm9wZXJ0aWVzLCBkZWZhdWx0IHRhcmdldHMsIGV0Yy4gSWYgZW5vdWdoIHBlb3BsZSBsaWtlIHRoZSBiYXNpYyBkZXNpZ24gSSdsbCBzdGFydCB0YWNrbGluZyB0aG9zZSBuZXh0Li4uCi0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vdGFza3MvamF2YTJzZGsuYW50IGIvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9qYXZhMnNkay5hbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNmI0NTEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9qYXZhMnNkay5hbnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJqYXZhMnNkayI+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPGxvYWQgbmFtZT0iZWNobyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrcy5FY2hvIi8+Ci0JCTxsb2FkIG5hbWU9ImphdmFjbG9hZGVyIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tzLkphdmFjTG9hZGVyIi8+Ci0JCTxqYXZhY2xvYWRlci8+Ci0JCTxsb2FkIG5hbWU9ImphciIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrcy5KYXIiLz4KLQkJPGxvYWQgbmFtZT0ic2V0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tzLlNldFZhcmlhYmxlIi8+Ci0JCTxsb2FkIG5hbWU9ImNvcHkiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza3MuQ29weSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvQ29weS5qYXZhIGIvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrcy9Db3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODkxNzIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrcy9Db3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza3M7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotcHVibGljIGNsYXNzIENvcHkgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcml2YXRlIFN0cmluZyBzcmM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzdDsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOwotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotICAgICAgICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoKGxlbiA9IGluLnJlYWQoYnVmKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBsZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24oIkVycm9yIGNvcHlpbmcgZmlsZXMiLCBleGMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTcmMoKSB7Ci0gICAgICAgIHJldHVybiBzcmM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKLSAgICAgICAgdGhpcy5zcmMgPSBzcmM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXN0KCkgewotICAgICAgICByZXR1cm4gZGVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0KFN0cmluZyBkZXN0KSB7Ci0gICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvRWNoby5qYXZhIGIvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrcy9FY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2ViZmMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrcy9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi1wdWJsaWMgY2xhc3MgRWNobyBleHRlbmRzIFRhc2sgewotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL3Rhc2tzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tzL0ZpbGVzZXQuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvRmlsZXNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRhM2IyLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvRmlsZXNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlc2V0IHsKLSAgICBwcml2YXRlIFN0cmluZyBzcmM7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNyYygpIHsKLSAgICAgICAgcmV0dXJuIHNyYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIHNyYykgewotICAgICAgICB0aGlzLnNyYyA9IHNyYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRGaWxlcyhMaXN0IHJlc3VsdHMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nIHByb3BlcnR5IFwic3JjXCIiLCBudWxsKTsgLy9MT0NBVElPTgotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShzcmMpOwotICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHNyYyArICIgZG9lcyBub3QgZXhpc3QiLCBudWxsKTsgLy8gTE9DQVRJT04hISEKLSAgICAgICAgfQotICAgICAgICBnZXRGaWxlcyhkaXIsIHJlc3VsdHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRGaWxlcyhGaWxlIGZpbGUsIExpc3QgcmVzdWx0cykgewotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGdldEZpbGVzKGZpbGVzW2ldLCByZXN1bHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmaWxlLmdldFBhdGgoKS5lbmRzV2l0aCgiLmphdmEiKSkgewotICAgICAgICAgICAgcmVzdWx0cy5hZGQoZmlsZS5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvSmFyLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL3Rhc2tzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tzL0phci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTVlOTFjLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvSmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza3M7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi1wdWJsaWMgY2xhc3MgSmFyIGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgamFyZmlsZTsKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlZGlyOwotICAgIHByaXZhdGUgU3RyaW5nIG1hbmlmZXN0OwotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXJmaWxlKCkgewotICAgICAgICByZXR1cm4gamFyZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXJmaWxlKFN0cmluZyBqYXJmaWxlKSB7Ci0gICAgICAgIHRoaXMuamFyZmlsZSA9IGphcmZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlZGlyKCkgewotICAgICAgICByZXR1cm4gYmFzZWRpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKFN0cmluZyBiYXNlZGlyKSB7Ci0gICAgICAgIHRoaXMuYmFzZWRpciA9IGJhc2VkaXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1hbmlmZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KFN0cmluZyBtYW5pZmVzdCkgewotICAgICAgICB0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoamFyZmlsZSkuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpci5ta2RpcnMoKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGFyZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhcmdMaXN0LmFkZCgiLWNmIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcmdMaXN0LmFkZCgiLWNtZiIpOwotICAgICAgICAgICAgYXJnTGlzdC5hZGQobWFuaWZlc3QpOwotICAgICAgICB9Ci0gICAgICAgIGFyZ0xpc3QuYWRkKGphcmZpbGUpOwotICAgICAgICBhcmdMaXN0LmFkZCgiLUMiKTsKLSAgICAgICAgYXJnTGlzdC5hZGQoYmFzZWRpcik7Ci0gICAgICAgIGFyZ0xpc3QuYWRkKCIuIik7Ci0KLSAgICAgICAgU3RyaW5nW10gYXJncyA9IChTdHJpbmdbXSkgYXJnTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbYXJnTGlzdC5zaXplKCldKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoInN1bi50b29scy5qYXIuTWFpbiIpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJtYWluIiwgbmV3IENsYXNzW10geyBhcmdzLmdldENsYXNzKCkgfSk7Ci0KLSAgICAgICAgICAgIGdldFdvcmtzcGFjZSgpLmluZm8oIlJ1bm5pbmcgamFyLi4uIik7Ci0KLSAgICAgICAgICAgIG1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgYXJncyB9KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXhpdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGlmICgoKEV4aXRFeGNlcHRpb24pY2F1c2UpLmdldFN0YXR1cygpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCdWlsZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKCJFcnJvciBydW5uaW5nIGphciIsIGV4Yyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24oIkphciBjbGFzcyBub3QgZm91bmQuIE1ha2VzIHN1cmUgdG9vbHMuamFyIGlzIGluIHlvdXIgY2xhc3NwYXRoIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFudEV4Y2VwdGlvbigiRXJyb3IgcnVubmluZyBqYXIiLCBleGMpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvSmF2YWMuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvSmF2YWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlZDQ5Ni4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL3Rhc2tzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tzL0phdmFjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi1wdWJsaWMgY2xhc3MgSmF2YWMgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcml2YXRlIEZpbGVzZXRbXSBmaWxlc2V0OwotICAgIHByaXZhdGUgU3RyaW5nIGRlc3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NwYXRoOwotICAgIHByaXZhdGUgU3RyaW5nIGNvbXBpbGVyY2xhc3MgPSBudWxsOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb21waWxlcmNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBpbGVyY2xhc3MgPSAiY29tLnN1bi50b29scy5qYXZhYy5NYWluIjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgYXJnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJnTGlzdC5hZGQoIi1kIik7Ci0gICAgICAgIGFyZ0xpc3QuYWRkKGRlc3QpOwotCi0gICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgYXJnTGlzdC5hZGQoIi1jbGFzc3BhdGgiKTsKLQotICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgcHJvamVjdCdzIHBhdGggc2VwYXJhdG9yIHdpdGggdGhlIHN5c3RlbSdzIHBhdGggc2VwYXJhdG9yCi0gICAgICAgICAgICBhcmdMaXN0LmFkZChjbGFzc3BhdGgucmVwbGFjZShnZXRQcm9qZWN0KCkuZ2V0UGF0aFNlcGFyYXRvcigpLCBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzZXQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbGVzZXRbaV0uZ2V0RmlsZXMoYXJnTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBhcmdzID0gKFN0cmluZ1tdKSBhcmdMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1thcmdMaXN0LnNpemUoKV0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgRmlsZShkZXN0KS5ta2RpcnMoKTsKLQotICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY29tcGlsZXJjbGFzcyk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoIm1haW4iLCBuZXcgQ2xhc3NbXSB7IGFyZ3MuZ2V0Q2xhc3MoKSB9KTsKLQotICAgICAgICAgICAgZ2V0V29ya3NwYWNlKCkuaW5mbygiUnVubmluZyBqYXZhYy4uLiIpOwotCi0gICAgICAgICAgICBtZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IGFyZ3MgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEV4aXRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoKChFeGl0RXhjZXB0aW9uKWNhdXNlKS5nZXRTdGF0dXMoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ29tcGlsZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKCJFcnJvciBydW5uaW5nIGNvbXBpbGVyIiwgZXhjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb21waWxlciBjbGFzcyBub3QgZm91bmQuIE1ha2VzIHN1cmUgdG9vbHMuamFyIGlzIGluIHlvdXIgY2xhc3NwYXRoIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24oIlVuYWJsZSB0byBhY2Nlc3MgY29tcGlsZXIgY2xhc3MiLCBleGMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIG1haW4gbWV0aG9kIG9uIGNvbXBpbGVyIGNsYXNzIiwgZXhjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzdCgpIHsKLSAgICAgICAgcmV0dXJuIGRlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdChTdHJpbmcgZGVzdCkgewotICAgICAgICB0aGlzLmRlc3QgPSBkZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoKCkgewotICAgICAgICByZXR1cm4gY2xhc3NwYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgY2xhc3NwYXRoKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlc2V0W10gZ2V0RmlsZXNldCgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVzZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZXNldChGaWxlc2V0W10gZmlsZXNldCkgewotICAgICAgICB0aGlzLmZpbGVzZXQgPSBmaWxlc2V0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL3Rhc2tzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tzL0phdmFjTG9hZGVyLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL3Rhc2tzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tzL0phdmFjTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2QwZmMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrcy9KYXZhY0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotcHVibGljIGNsYXNzIEphdmFjTG9hZGVyIGV4dGVuZHMgVGFzayB7Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgdG9vbHNKYXIgPSBmaW5kVG9vbHNKYXIoKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgVVJMW10geyBnZXRQcm9qZWN0KCkuZ2V0QmFzZSgpLCB0b29sc0phciB9LAotICAgICAgICAgICAgICAgIGdldFdvcmtzcGFjZSgpLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgICAgIGdldFdvcmtzcGFjZSgpLnJlZ2lzdGVyVGFzaygiamF2YWMiLCBsb2FkZXIubG9hZENsYXNzKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrcy5KYXZhYyIpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKCJCYWQgVVJMIiwgZXhjKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDbGFzcyBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVVJMIGZpbmRUb29sc0phcigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICAvLyBJIGFzc3VtZSB0aGlzIHdvbid0IHdvcmsgZXZlcnl3aGVyZS4uLgotICAgICAgICByZXR1cm4gbmV3IEZpbGUobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSksICIuLi9saWIvdG9vbHMuamFyIikudG9VUkwoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrcy9TZXRWYXJpYWJsZS5qYXZhIGIvcHJvcG9zYWwvYW50ZmFybS90YXNrcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrcy9TZXRWYXJpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY2YThmLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0vdGFza3Mvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza3MvU2V0VmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLXB1YmxpYyBjbGFzcyBTZXRWYXJpYWJsZSBleHRlbmRzIFRhc2sgewotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0UHJvamVjdCgpLnNldFZhcmlhYmxlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvYW50ZmFybS94bWwvb3JnL2FwYWNoZS90b29scy9hbnQveG1sL1Byb2plY3RIYW5kbGVyLmphdmEgYi9wcm9wb3NhbC9hbnRmYXJtL3htbC9vcmcvYXBhY2hlL3Rvb2xzL2FudC94bWwvUHJvamVjdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NjFkNy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9hbnRmYXJtL3htbC9vcmcvYXBhY2hlL3Rvb2xzL2FudC94bWwvUHJvamVjdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQueG1sOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuKjsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBwb3B1bGF0ZXMgYSBQcm9qZWN0IG9iamVjdCB2aWEgU0FYIGV2ZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgLyogaW1wbGVtZW50cyBMZXhpY2FsSGFuZGxlciAqLyB7Ci0gICAgcHJpdmF0ZSBXb3Jrc3BhY2Ugd29ya3NwYWNlOwotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgTG9jYXRvciBsb2NhdG9yOwotCi0gICAgLyoqCi0gICAgICogIFRoZSB0b3Agb2YgdGhpcyBzdGFjayByZXByZXNlbnRzIHRoZSAiY3VycmVudCIgZXZlbnQgaGFuZGxlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0YWNrIGhhbmRsZXJzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFNBWCBoYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RIYW5kbGVyKFByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLndvcmtzcGFjZSA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKG5ldyBSb290SGFuZGxlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0gICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0b3IuZ2V0UHVibGljSWQoKSArICI6IiArIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIERlbGVnYXRlIHRvIHRoZSBjdXJyZW50IGhhbmRsZXIKLSAgICAgICAgKChDb250ZW50SGFuZGxlciloYW5kbGVycy5wZWVrKCkpLnN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRGVsZWdhdGUgdG8gdGhlIGN1cnJlbnQgaGFuZGxlcgotICAgICAgICAoKENvbnRlbnRIYW5kbGVyKWhhbmRsZXJzLnBlZWsoKSkuZW5kRWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgLy9YWFggbmVlZCB0byBpbXBsZW1lbnQgdGV4dCBjb250ZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQCIgKyB0YXJnZXQgKyAiQCIgKyBkYXRhICsgIkAiKTsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHspCi0gICAgcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB7fQotICAgIHB1YmxpYyB2b2lkIGVuZERURCgpIHt9Ci0gICAgcHVibGljIHZvaWQgZW5kRW50aXR5KGphdmEubGFuZy5TdHJpbmcgbmFtZSkge30KLSAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkge30KLSAgICBwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHt9Ci0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoamF2YS5sYW5nLlN0cmluZyBuYW1lKSAge30KLSAgICAqLwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBoYW5kbGVzIGFueSB0b3AgbGV2ZWwgU0FYIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFJvb3RIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGlzQW50TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSkgJiYgbG9jYWxOYW1lLmVxdWFscygicHJvamVjdCIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChuZXcgUHJvamVjdEVsZW1IYW5kbGVyKHFOYW1lLCBhdHRzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZWxlbWVudCBcIiIgKyBxTmFtZSArICJcIiIsIGxvY2F0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgaGFuZGxlcnMucG9wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhpcyBjbGFzcyBoYW5kbGVzIGV2ZW50cyB0aGF0IG9jY3VyIHdpdGggYSAicHJvamVjdCIgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFByb2plY3RFbGVtSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLSAgICAgICAgcHVibGljIFByb2plY3RFbGVtSGFuZGxlcihTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghaXNBbnROYW1lc3BhY2UoYXR0cy5nZXRVUkkoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cy5nZXRRTmFtZShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygibmFtZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3ROYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYXR0cmlidXRlIFwiIiArIG5hbWUgKyAiXCIiLCBsb2NhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJNaXNzaW5nIGF0dHJpYnV0ZSBcIm5hbWVcIiIsIGxvY2F0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXByb2plY3ROYW1lLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIkEgcHJvamVjdCBuYW1lZCBcIiIgKyBwcm9qZWN0TmFtZSArICJcIiBtdXN0IGJlIGxvY2F0ZWQgaW4gYSBmaWxlIGNhbGxlZCBcIiIgKyBwcm9qZWN0TmFtZSArICIuYW50XCIiLCBsb2NhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNBbnROYW1lc3BhY2UobmFtZXNwYWNlVVJJKSAmJiBsb2NhbE5hbWUuZXF1YWxzKCJ0YXJnZXQiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2gobmV3IFRhcmdldEVsZW1IYW5kbGVyKHByb2plY3QsIHFOYW1lLCBhdHRzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpc0FudE5hbWVzcGFjZShuYW1lc3BhY2VVUkkpICYmIGxvY2FsTmFtZS5lcXVhbHMoImltcG9ydCIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChuZXcgSW1wb3J0RWxlbUhhbmRsZXIocHJvamVjdCwgcU5hbWUsIGF0dHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBlbGVtZW50IFwiIiArIHFOYW1lICsgIlwiIiwgbG9jYXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBoYW5kbGVycy5wb3AoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaGlzIGNsYXNzIGhhbmRsZXMgZXZlbnRzIHRoYXQgb2NjdXIgd2l0aCBhICJ0YXJnZXQiIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBUYXJnZXRFbGVtSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBUYXJnZXQgdGFyZ2V0OwotCi0gICAgICAgIHB1YmxpYyBUYXJnZXRFbGVtSGFuZGxlcihQcm9qZWN0IHByb2plY3QsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBkZXBlbmRlbmNpZXMgPSAiIjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzQW50TmFtZXNwYWNlKGF0dHMuZ2V0VVJJKGkpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHMuZ2V0UU5hbWUoaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIm5hbWUiKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJkZXBlbmRzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYXR0cmlidXRlIFwiIiArIG5hbWUgKyAiXCIiLCBsb2NhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIk1pc3NpbmcgYXR0cmlidXRlIFwibmFtZVwiIiwgbG9jYXRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcHJvamVjdC5jcmVhdGVUYXJnZXQodGFyZ2V0TmFtZSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldExvY2F0aW9uKGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIHBhcnNlRGVwZW5kcyhkZXBlbmRlbmNpZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goQnVpbGRFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihleGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBQYXJzZXMgdGhlIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHByb2plY3QgbmFtZXMuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VEZXBlbmRzKFN0cmluZyBkZXBlbmRzKSB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkZXBlbmRzKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LmFkZERlcGVuZCh0YXJnZXROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoIWlzQW50TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYXR0cmlidXRlIFwiIiArIHFOYW1lICsgIlwiIiwgbG9jYXRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRhc2tQcm94eSBwcm94eSA9IHRhcmdldC5jcmVhdGVUYXNrUHJveHkocU5hbWUpOwotICAgICAgICAgICAgcHJveHkuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBoYW5kbGVycy5wdXNoKG5ldyBUYXNrRWxlbUhhbmRsZXIocHJveHkuZ2V0RGF0YSgpLCBxTmFtZSwgYXR0cykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgaGFuZGxlcnMucG9wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhpcyBjbGFzcyBoYW5kbGVzIGV2ZW50cyB0aGF0IG9jY3VyIHdpdGggYSAiaW1wb3J0IiBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSW1wb3J0RWxlbUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBJbXBvcnRFbGVtSGFuZGxlcihQcm9qZWN0IHByb2plY3QsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBpbXBvcnROYW1lID0gbnVsbDsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzQW50TmFtZXNwYWNlKGF0dHMuZ2V0VVJJKGkpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHMuZ2V0UU5hbWUoaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIm5hbWUiKSkgewotICAgICAgICAgICAgICAgICAgICBpbXBvcnROYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYXR0cmlidXRlIFwiIiArIG5hbWUgKyAiXCIiLCBsb2NhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbXBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIk1pc3NpbmcgYXR0cmlidXRlIFwibmFtZVwiIiwgIGxvY2F0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJbXBvcnQgaW1wID0gcHJvamVjdC5jcmVhdGVJbXBvcnQoaW1wb3J0TmFtZSk7Ci0gICAgICAgICAgICBpbXAuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGVsZW1lbnQgXCIiICsgcU5hbWUgKyAiXCIiLCBsb2NhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGhhbmRsZXJzLnBvcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoaXMgY2xhc3MgaGFuZGxlcyBldmVudHMgdGhhdCBvY2N1ciB3aXRoIGEgdGFzayBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVGFza0VsZW1IYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIFRhc2tEYXRhIGRhdGE7Ci0KLSAgICAgICAgcHVibGljIFRhc2tFbGVtSGFuZGxlcihUYXNrRGF0YSBkYXRhLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghaXNBbnROYW1lc3BhY2UoYXR0cy5nZXRVUkkoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cy5nZXRRTmFtZShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgICAgIFRhc2tEYXRhIGNoaWxkID0gZGF0YS5hZGRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5zZXRMb2NhdGlvbihnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5zZXRUZXh0KHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoIWlzQW50TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZWxlbWVudCBcIiIgKyBxTmFtZSArICJcIiIsIGxvY2F0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUYXNrRGF0YSBjaGlsZCA9IGRhdGEuYWRkUHJvcGVydHkocU5hbWUpOwotICAgICAgICAgICAgY2hpbGQuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBoYW5kbGVycy5wdXNoKG5ldyBUYXNrRWxlbUhhbmRsZXIoY2hpbGQsIHFOYW1lLCBhdHRzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBoYW5kbGVycy5wb3AoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbnROYW1lc3BhY2UoU3RyaW5nIHVyaSkgewotICAgICAgICByZXR1cm4gdXJpID09IG51bGwgPyBmYWxzZSA6IHVyaS5lcXVhbHMoIiIpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9hbnRmYXJtL3htbC9vcmcvYXBhY2hlL3Rvb2xzL2FudC94bWwvWG1sRXhwb3J0ZXIuamF2YSBiL3Byb3Bvc2FsL2FudGZhcm0veG1sL29yZy9hcGFjaGUvdG9vbHMvYW50L3htbC9YbWxFeHBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRmMTJkLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2FudGZhcm0veG1sL29yZy9hcGFjaGUvdG9vbHMvYW50L3htbC9YbWxFeHBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotcHVibGljIGNsYXNzIFhtbEV4cG9ydGVyIHsKLSAgICBwdWJsaWMgdm9pZCBleHBvcnRQcm9qZWN0KFByb2plY3QgcHJvamVjdCwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKCI8cHJvamVjdCBuYW1lPVwiIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIlwiPlxuIik7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRyID0gcHJvamVjdC5nZXRUYXJnZXRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFRhcmdldCB0YXJnZXQgPSAoVGFyZ2V0KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgd3JpdGVUYXJnZXQodGFyZ2V0LCBvdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LndyaXRlKCI8L3Byb2plY3Q+XG4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVUYXJnZXQoVGFyZ2V0IHRhcmdldCwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKCJcdDx0YXJnZXQgbmFtZT1cIiIgKyB0YXJnZXQuZ2V0TmFtZSgpICsgIlwiIGRlcGVuZHM9XCIiICsgY29uY2F0KHRhcmdldC5nZXREZXBlbmRzKCkpICsgIj5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIlx0PC90YXJnZXQ+XG4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbmNhdChMaXN0IGRlcGVuZHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IGRlcGVuZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBkZXBlbmQgPSAoU3RyaW5nKSBpdHIubmV4dCgpOwotICAgICAgICAgICAgYnVmLmFwcGVuZChkZXBlbmQpOwotICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBXb3Jrc3BhY2Ugd29ya3NwYWNlID0gbmV3IFdvcmtzcGFjZShuZXcgWG1sSW1wb3J0ZXIoKSk7Ci0gICAgICAgIFByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5pbXBvcnRQcm9qZWN0KCJhbnQiKTsKLSAgICAgICAgV3JpdGVyIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCk7Ci0gICAgICAgIG5ldyBYbWxFeHBvcnRlcigpLmV4cG9ydFByb2plY3QocHJvamVjdCwgb3V0KTsKLSAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2FudGZhcm0veG1sL29yZy9hcGFjaGUvdG9vbHMvYW50L3htbC9YbWxJbXBvcnRlci5qYXZhIGIvcHJvcG9zYWwvYW50ZmFybS94bWwvb3JnL2FwYWNoZS90b29scy9hbnQveG1sL1htbEltcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjBjY2YuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvYW50ZmFybS94bWwvb3JnL2FwYWNoZS90b29scy9hbnQveG1sL1htbEltcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnhtbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0vKioKLSAqICBUaGlzIGNsYXNzIGtub3dzIGhvdyB0byBsb2NhdGUgeG1sIHByb2plY3QgZmlsZXMKLSAqICBhbmQgaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya3NwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgWG1sSW1wb3J0ZXIgaW1wbGVtZW50cyBJbXBvcnRlciB7Ci0gICAgcHJpdmF0ZSBVUkxbXSBwYXRoOwotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYW4gaW1wb3J0ZXIgZm9yIGEgd29ya3NwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxJbXBvcnRlcigpIHsKLSAgICAgICAgdGhpcy5wYXRoID0gZ2V0UHJvamVjdFBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wb3J0cyB0aGUgcHJvamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbXBvcnRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTG9jYXRlIHRoZSBwcm9qZWN0IGZpbGUKLSAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gZmluZFByb2plY3RGaWxlKHByb2plY3QpOwotCi0gICAgICAgIC8vIFBhcnNlIHRoZSB4bWwKLSAgICAgICAgcGFyc2VQcm9qZWN0RmlsZShwcm9qZWN0LCBjb25uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmluZCB0aGUgLmFudCBmaWxlIGZvciB0aGlzIHByb2plY3QuIFNlYXJjaGVzIGVhY2ggZGlyZWN0b3J5IGFuZAotICAgICAqICBqYXIgaW4gdGhlIHByb2plY3QgcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFVSTENvbm5lY3Rpb24gZmluZFByb2plY3RGaWxlKFByb2plY3QgcHJvamVjdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gcHJvamVjdC5nZXROYW1lKCkgKyAiLmFudCI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChwYXRoW2ldLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29ubi5jb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5zZXRCYXNlKHBhdGhbaV0pOwotICAgICAgICAgICAgICAgIHByb2plY3Quc2V0TG9jYXRpb24odXJsLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBjb25uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucyd0IGluIHRoaXMgZGlyZWN0b3J5L2phciwga2VlcCBsb29raW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUuLi4KLSAgICAgICAgICAgICAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2plY3QgXCIiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXCIgbm90IGZvdW5kIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFBhcnNlIHRoZSB4bWwgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VQcm9qZWN0RmlsZShQcm9qZWN0IHByb2plY3QsIFVSTENvbm5lY3Rpb24gY29ubikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBQcm9qZWN0SGFuZGxlcihwcm9qZWN0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKGNvbm4uZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBzb3VyY2Uuc2V0UHVibGljSWQoY29ubi5nZXRVUkwoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgICAgLyogcGFyc2VyLmdldFhNTFJlYWRlcigpLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBoYW5kbGVyKTsgICovCi0gICAgICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlLCBoYW5kbGVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChTQVhQYXJzZUV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIGlmIChleGMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgZXhjLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSwgZXhjLmdldFB1YmxpY0lkKCkgKyAiOiIgKyBleGMuZ2V0TGluZU51bWJlcigpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChTQVhFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICBpZiAoZXhjLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIGV4Yy5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbnRFeGNlcHRpb24oIlBhcnNlIGVycm9yIiwgZXhjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFudEV4Y2VwdGlvbigiUGFyc2VyIGNvbmZpZ3VyYXRpb24gZXJyb3IiLCBleGMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgc2luY2UgY29ubi5jb25uZWN0KCkKLSAgICAgICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseQotICAgICAgICAgICAgdGhyb3cgbmV3IEFudEV4Y2VwdGlvbigiUHJvamVjdCBmaWxlIG5vdCBmb3VuZCIsIGV4Yyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIHByb2plY3QgZmlsZSIsIGV4Yyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFBhcnNlcyB0aGUgcHJvamVjdCBwYXRoIChzcGVjaWZpZWQgdXNpbmcgdGhlICJhbnQucHJvamVjdC5wYXRoIgotICAgICAqICBzeXN0ZW0gcHJvcGVydHlpbnRvIFVSTCBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFVSTFtdIGdldFByb2plY3RQYXRoKCkgewotICAgICAgICBTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LnByb2plY3QucGF0aCIsICIuIik7Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBVUkxbXSBwYXRoID0gbmV3IFVSTFt0b2tlbnMuY291bnRUb2tlbnMoKV07Ci0gICAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuLmVuZHNXaXRoKCIuamFyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aFtpXSA9IG5ldyBVUkwoImphcjpmaWxlOiIgKyB0b2tlbiArICIhLyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhbaV0gPSBuZXcgVVJMKCJmaWxlOiIgKyB0b2tlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRoW2ldID0gbmV3IFVSTCgiZmlsZToiICsgdG9rZW4gKyAiLyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSkFYUCBzdHVmZi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBwYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBwYXJzZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICBwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2ZyYW50aWMvYnVpbGQuYmF0IGIvcHJvcG9zYWwvZnJhbnRpYy9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhOTZhZTQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvZnJhbnRpYy9idWlsZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1AZWNobyBvZmYKLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVtIGJ1aWxkLmJhdCAtIEJ1aWxkIFNjcmlwdCBmb3IgRnJhbnRpYyAobGlmdGVkIGZyb20gVG9tY2F0Li4udGh4IGd1eXMpCi1yZW0KLXJlbSBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVyZXF1aXNpdGVzOgotcmVtCi1yZW0gICBKQVZBX0hPTUUgICAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBbUkVRVUlSRURdCi1yZW0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1yZW0gLS0tLS0gU2F2ZSBFbnZpcm9ubWVudCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXNldCBfQ0xBU1NQQVRIPSVDTEFTU1BBVEglCi1zZXQgX0NMQVNTRVM9JUNMQVNTRVMlCi0KLXJlbSAtLS0tLSBWZXJpZnkgYW5kIFNldCBSZXF1aXJlZCBFbnZpcm9ubWVudCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBnb3RKYXZhSG9tZQotZWNobyBZb3UgbXVzdCBzZXQgSkFWQV9IT01FIHRvIHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uCi1nb3RvIGNsZWFudXAKLTpnb3RKYXZhSG9tZQotCi1yZW0gLS0tLS0gU2V0IFVwIFRoZSBSdW50aW1lIENsYXNzcGF0aCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlmIG5vdCAiJUNMQVNTUEFUSCUiID09ICIiIHNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7Ci1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy4vc3JjCi0KLXJlbSAtLS0tLSBFeGVjdXRlIFRoZSBSZXF1ZXN0ZWQgQnVpbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaWYgbm90IGV4aXN0IGRpc3QgbWtkaXIgZGlzdAotaWYgbm90IGV4aXN0IGRpc3RcbGliIG1rZGlyIGRpc3RcbGliCi1pZiBub3QgZXhpc3QgZGlzdFxsaWJcY2xhc3NlcyBta2RpciBkaXN0XGxpYlxjbGFzc2VzCi1pZiBub3QgZXhpc3QgZGlzdFxkb2MgbWtkaXIgZGlzdFxkb2MKLWlmIG5vdCBleGlzdCBkaXN0XGRvY1xhcGkgbWtkaXIgZGlzdFxkb2NcYXBpCi0KLXNldCBDTEFTU0VTPWRpc3RcbGliXGNsYXNzZXMKLQotJUpBVkFfSE9NRSVcYmluXGphdmFjIC1kICVDTEFTU0VTJSBzcmMvb3JnL2FwYWNoZS9hbnQvdGVzdC8qLmphdmEKLSVKQVZBX0hPTUUlXGJpblxqYXIgY3ZmIGRpc3RcbGliXGZyYW50aWMuamFyIC1DIGRpc3RcbGliXGNsYXNzZXMgLgotCi14Y29weSB3ZWJzaXRlXCouaHRtbCBkaXN0XGRvYyAvcyAveQoteGNvcHkgd2Vic2l0ZVwqLmdpZiBkaXN0XGRvYyAvcyAveQotCi0lSkFWQV9IT01FJVxiaW5camF2YWRvYyAtcHJvdGVjdGVkIC1zb3VyY2VwYXRoIHNyYyAtZCBkaXN0XGRvY1xhcGkgLWF1dGhvciBvcmcuYXBhY2hlLmFudCBvcmcuYXBhY2hlLmFudC5lbmdpbmUgb3JnLmFwYWNoZS5hbnQudGFza3Mgb3JnLmFwYWNoZS5hbnQudGFza3MuYnVpbGQgb3JnLmFwYWNoZS5hbnQudGFza3MudXRpbAotCi1yZW0gLS0tLS0gUmVzdG9yZSBFbnZpcm9ubWVudCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi06Y2xlYW51cAotc2V0IENMQVNTUEFUSD0lX0NMQVNTUEFUSCUKLXNldCBDTEFTU0VTPSVfQ0xBU1NFUyUKLXNldCBfQ0xBU1NQQVRIPQotc2V0IF9DTEFTU0VTPQotCi06ZmluaXNoCi0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L0FudEV4Y2VwdGlvbi5qYXZhIGIvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvQW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzYzYjEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvQW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudDsKLQotcHVibGljIGNsYXNzIEFudEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgcHVibGljIEFudEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC9lbmdpbmUvQW50RW5naW5lTGlzdGVuZXIuamF2YSBiL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L2VuZ2luZS9BbnRFbmdpbmVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODM5ZDY0Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L2VuZ2luZS9BbnRFbmdpbmVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIlRvbWNhdCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuZW5naW5lOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5BbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQudGFza3MuVGFzazsKLQotcHVibGljIGludGVyZmFjZSBBbnRFbmdpbmVMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotICAgIAotICAgIHZvaWQgZW5naW5lU3RhcnQoQW50RXZlbnQgZSk7Ci0gICAgdm9pZCBlbmdpbmVGaW5pc2goQW50RXZlbnQgZSk7Ci0gICAgCi0gICAgdm9pZCB0YXNrU3RhcnQoQW50RXZlbnQgZSk7Ci0gICAgdm9pZCB0YXNrRXhlY3V0ZShBbnRFdmVudCBlKTsKLSAgICB2b2lkIHRhc2tGaW5pc2goQW50RXZlbnQgZSk7Ci0gICAgdm9pZCB0YXNrTWVzc2FnZShBbnRFdmVudCBlLCBTdHJpbmcgbWVzc2FnZSk7Ci0gICAgdm9pZCB0YXNrRXhjZXB0aW9uKEFudEV2ZW50IGUsIEFudEV4Y2VwdGlvbiBleGNlcHRpb24pOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvZW5naW5lL0FudEV2ZW50LmphdmEgYi9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC9lbmdpbmUvQW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0ZDFmNy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC9lbmdpbmUvQW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmVuZ2luZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LnRhc2tzLlRhc2s7Ci0KLXB1YmxpYyBjbGFzcyBBbnRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLSAgICAKLSAgICBUYXNrIHRhc2s7Ci0gICAgCi0gICAgcHVibGljIEFudEV2ZW50KE9iamVjdCBzb3VyY2UpIHsKLSAgICAgICAgdGhpcyhzb3VyY2UsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQW50RXZlbnQoT2JqZWN0IHNvdXJjZSwgVGFzayB0YXNrKSB7Ci0gICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgICAgIHRoaXMudGFzayA9IHRhc2s7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUYXNrIGdldFRhc2soKSB7Ci0gICAgICAgIHJldHVybiB0YXNrOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgdGFzaykgewotICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L2VuZ2luZS9EZWZhdWx0RW5naW5lTGlzdGVuZXIuamF2YSBiL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L2VuZ2luZS9EZWZhdWx0RW5naW5lTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjZGE0My4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC9lbmdpbmUvRGVmYXVsdEVuZ2luZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIlRvbWNhdCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuZW5naW5lOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuQW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LnRhc2tzLlRhc2s7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RW5naW5lTGlzdGVuZXIgaW1wbGVtZW50cyBBbnRFbmdpbmVMaXN0ZW5lciB7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFByaW50U3RyZWFtICAgICAgIG91dHB1dFN0cmVhbTsKLSAgICBwcm90ZWN0ZWQgbG9uZyAgICAgICAgICAgICAgc3RhcnRUaW1lOwotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgICAgICBzYiAgICAgICAgICAgICAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgICAgIGluZGVudFNwYWNlcyAgICA9IDQ7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gICAgICAgICAgIGluZGVudCAgICAgICAgICA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgICAgIGN1ckluZGVudCAgICAgICA9IDA7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFNpbXBsZURhdGVGb3JtYXQgIHRpbWVzdGFtcCAgICAgICA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJISDptbTpzczpTU1MiKTsKLSAgICAKLSAgICBwdWJsaWMgRGVmYXVsdEVuZ2luZUxpc3RlbmVyKCkgewotICAgICAgICB0aGlzKFN5c3RlbS5vdXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRGVmYXVsdEVuZ2luZUxpc3RlbmVyKFByaW50U3RyZWFtIG91dHB1dFN0cmVhbSkgewotICAgICAgICB0aGlzLm91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SW5kZW50U3BhY2VzKGludCBzcGFjZXMpIHsKLSAgICAgICAgdGhpcy5pbmRlbnRTcGFjZXMgPSBzcGFjZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZW50U3BhY2VzKCkgewotICAgICAgICByZXR1cm4gaW5kZW50U3BhY2VzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRlbnQoYm9vbGVhbiBvbikgewotICAgICAgICB0aGlzLmluZGVudCA9IG9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luZGVudCgpIHsKLSAgICAgICAgcmV0dXJuIGluZGVudDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwYWRMZWZ0KFN0cmluZyBzLCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIHNiLnNldExlbmd0aCgwKTsKLSAgICAgICAgc2IuYXBwZW5kKHMpOwotICAgICAgICB3aGlsZSAoc2IubGVuZ3RoKCkgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHNiLmluc2VydCgwLCAnICcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBvdXRwdXQoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKCFpbmRlbnQpIHsKLSAgICAgICAgICAgIG91dHB1dFN0cmVhbS5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgbGV0J3MgYmUgb24gdGhlIHNhZmUgc2lkZQotICAgICAgICBpZiAoY3VySW5kZW50IDwgMCkgewotICAgICAgICAgICAgY3VySW5kZW50ID0gMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3V0cHV0U3RyZWFtLnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZExlZnQobWVzc2FnZSwgbWVzc2FnZS5sZW5ndGgoKSArIChpbmRlbnRTcGFjZXMgKiBjdXJJbmRlbnQpKSk7Ci0gICAgfQotICAgIAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIEFudEVuZ2luZUxpc3RlbmVyIEltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuZ2luZVN0YXJ0KEFudEV2ZW50IGUpIHsKLSAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOwotICAgICAgICBvdXRwdXQoIkVuZ2luZSBTdGFydGVkOiAiICsgdGltZXN0YW1wLmZvcm1hdChub3cpKTsKLSAgICAgICAgc3RhcnRUaW1lID0gbm93LmdldFRpbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5naW5lRmluaXNoKEFudEV2ZW50IGUpIHsKLSAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOwotICAgICAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKLSAgICAgICAgCi0gICAgICAgIG91dHB1dCgiRW5naW5lIEZpbmlzaGVkOiAiICsgdGltZXN0YW1wLmZvcm1hdChub3cpKTsKLSAgICAgICAgb3V0cHV0KCJFbGFwc2VkIFRpbWU6ICIgKyAoZWxhcHNlZCAvIDEwMDBGKSArICIgc2Vjb25kcyIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnQoQW50RXZlbnQgZSkgewotICAgICAgICBvdXRwdXQoIlRhc2sgU3RhcnRlZDogIiArIGUuZ2V0VGFzaygpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgY3VySW5kZW50Kys7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRhc2tFeGVjdXRlKEFudEV2ZW50IGUpewotICAgICAgICBvdXRwdXQoIlRhc2sgRXhlY3V0aW9uOiAiICsgZS5nZXRUYXNrKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoKEFudEV2ZW50IGUpewotICAgICAgICBjdXJJbmRlbnQtLTsKLSAgICAgICAgb3V0cHV0KCJUYXNrIEZpbmlzaGVkOiAiICsgZS5nZXRUYXNrKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0YXNrTWVzc2FnZShBbnRFdmVudCBlLCBTdHJpbmcgbWVzc2FnZSl7Ci0gICAgICAgIGN1ckluZGVudCsrOwotICAgICAgICBvdXRwdXQoIlRhc2sgTWVzc2FnZTogIiArIGUuZ2V0VGFzaygpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpICsgIjogIiArCi0gICAgICAgICAgICAgICBtZXNzYWdlKTsKLSAgICAgICAgY3VySW5kZW50LS07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRhc2tFeGNlcHRpb24oQW50RXZlbnQgZSwgQW50RXhjZXB0aW9uIGV4Y2VwdGlvbil7Ci0gICAgICAgIG91dHB1dCgiVGFzayBFeGNlcHRpb246ICIgKyBlLmdldFRhc2soKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSArICI6ICIgKwotICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvZW5naW5lL0hpZXJhcmNoaWNhbEhhc2h0YWJsZS5qYXZhIGIvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvZW5naW5lL0hpZXJhcmNoaWNhbEhhc2h0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODc2YWYzLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L2VuZ2luZS9IaWVyYXJjaGljYWxIYXNodGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBIaWVyYXJjaGljYWxIYXNodGFibGUgZXh0ZW5kcyBIYXNodGFibGUgewotICAgIAotICAgIHByaXZhdGUgSGllcmFyY2hpY2FsSGFzaHRhYmxlIHBhcmVudDsKLSAgICAKLSAgICBwdWJsaWMgSGllcmFyY2hpY2FsSGFzaHRhYmxlKCkgewotICAgICAgICB0aGlzKG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSGllcmFyY2hpY2FsSGFzaHRhYmxlKEhpZXJhcmNoaWNhbEhhc2h0YWJsZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBIaWVyYXJjaGljYWxIYXNodGFibGUgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSGllcmFyY2hpY2FsSGFzaHRhYmxlIHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3QgZ2V0UHJvcGVydHlOYW1lcygpIHsKLSAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBFbnVtZXJhdGlvbiBlID0ga2V5cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgbGlzdC5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFBhcmVudCgpLmdldFByb3BlcnR5TmFtZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0KG5hbWUpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBnZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBwdXQobmFtZSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eVZhbHVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChuYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0UGFyZW50KCkucmVtb3ZlUHJvcGVydHlWYWx1ZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVtb3ZlKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvZW5naW5lL1Rhc2tFbmdpbmUuamF2YSBiL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L2VuZ2luZS9UYXNrRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzVmY2UuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvZW5naW5lL1Rhc2tFbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5lbmdpbmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LkFudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC50YXNrcy5UYXNrOwotCi0vKioKLSAqIFRoZSBUYXNrRW5naW5lIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRoYXQgYSBUYXNrRW5naW5lIGFyZSByZXF1aXJlZAotICogdG8gaW1wbGVtZW50LiBUaGlzIGludGVyZmFjZSBpcyBhbHNvIHBhc3NlZCB0byBlYWNoIFRhc2sgaW4gb3JkZXIgZm9yIHRoZW0gdG8KLSAqIGdldCBhY2Nlc3MgdG8gc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBsaWtlIGluc2VydGluZyBhIG5ldyBUYXNrIGR1cmluZyBhIHJ1biwKLSAqIG9yIGZvcmNpbmcgdGhlIGV4ZWN1dGlvbiBwYXRoIG9mIFRhc2tzIHRvIGJlIG1vZGlmaWVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tFbmdpbmUgewotICAgIAotICAgIHZvaWQgYWRkQW50RW5naW5lTGlzdGVuZXIoQW50RW5naW5lTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIAotICAgIHZvaWQgcmVtb3ZlQW50RW5naW5lTGlzdGVuZXIoQW50RW5naW5lTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIAotICAgIHZvaWQgZXhlY3V0ZShUYXNrIHRhc2spIHRocm93cyBBbnRFeGNlcHRpb247Ci0gICAgCi0gICAgdm9pZCBleGVjdXRlKFRhc2sgcm9vdCwgVGFzayB0YXNrKSB0aHJvd3MgQW50RXhjZXB0aW9uOwotICAgIAotICAgIHZvaWQgbWVzc2FnZShUYXNrIHRhc2ssIFN0cmluZyBtZXNzYWdlKTsKLSAgICAKLSAgICBUYXNrIGdldE5leHRFeGVjdXRlVGFzaygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBwcm9wZXJ0eSBuYW1lcyB0aGF0IHRoZSBjdXJyZW50IHRhc2sgc3RhY2sgaXMgYXdhcmUKLSAgICAgKiBvZi4gVGhpcyBpcyBhIHJlY3Vyc2l2ZSBsaXN0IG9mIGFsbCBwcm9wZXJ0eSBuYW1lcy4KLSAgICAgKi8KLSAgICBMaXN0IGdldFByb3BlcnR5TmFtZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNYXkgYmUgY2FsbGVkIHRvIG9idGFpbiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZC4gUHJvcGVydHkKLSAgICAgKiB2YWx1ZXMgYXJlIG1haW50YWluZWQgaW4gYSBoaWVyYXJjaGljYWwgbWFubmVyIGFzIGVhY2ggdGFzayBpcyBleGVjdXRlZC4KLSAgICAgKiBXaGVuIGEgcHJvcGVydHkgaXMgcmVxdWVzdGVkLCBpZiB0aGUgY3VycmVudCBleGVjdXRpb24gbGV2ZWwgZG9lcyBub3QKLSAgICAgKiBjb250YWluIHRoZSBwcm9wZXJ0eSwgdGhlIGV4ZWN1dGlvbiBwYXJlbnQgaXMgdGhlbiBxdWVyaWVkLiBUaGlzCi0gICAgICogY29udGludWVzIHVudGlsIHRoZXJlIGlzIG5vIHdoZXJlIGVsc2UgdG8gZ28hCi0gICAgICogPHA+PC9wPgotICAgICAqIE1heWJlIHRoaXMgc2hvdWxkIGJlIGEgSGFzaHRhYmxlIGltcGxlbWVudGF0aW9uIGFuZCBiZSBhYmxlIHRvIHJldHVybgotICAgICAqIE9iamVjdD8gSXMgdGhhdCBhIGxpdHRsZSBvdmVya2lsbCBjb25zaWRlcmluZyB0aGVzZSB2YWx1ZXMgd2lsbCB1c3VhbGx5Ci0gICAgICogYmUgU3RyaW5ncz8gUGVyaGFwcyBzb21lb25lIHdpbGwgaGF2ZSBhIGZhcmZldGNoZWQgaWRlYSBvZiBzdG9yaW5nIGEKLSAgICAgKiBUYXNrIGluIGEgcHJvcGVydHk/Ci0gICAgICovCi0gICAgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoU3RyaW5nIG5hbWUpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIG5hbWUtdmFsdWUgcGFpciB0byB0aGlzIGV4ZWN1dGlvbiBzdGFjayBwcm9wZXJ0eSBsaXN0LiBJZiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpcyBkZWNsYXJlZCBpbiBwYXJlbnQgdGFza3MsIEkgZG9uJ3QgcmVhbGx5IHNlZSBhIHJlYXNvbiBmb3Igbm90Ci0gICAgICogYWRkaW5nIGl0IGFnYWluIHRvIHRoaXMgZXhlY3V0aW9uIGxpc3QuIFRoaXMgd291bGQgYWNoaWV2ZSBhIG5pY2Ugc2NvcGVkCi0gICAgICogcGFyYW1ldGVyIGxpc3QgdGhhdCBpcyBkaWN0YXRlZCBieSBuZXN0aW5nIGxldmVscy4KLSAgICAgKiA8cD48L3A+Ci0gICAgICogVGhpcyBpcyBhZ2FpbnN0IHRoZSBjdXJyZW50IEFudCAoMS4yKSBzcGVjaWZpY2F0aW9uLCBidXQgSSdtIG5vdCBzdXJlIHdoeQotICAgICAqIHRoYXQgcmVzdHJpY3Rpb24gd2FzIHRoZXJlLiBJdCB3b3VsZCBiZSBzaW1wbGUgdG8gaW1wbGVtZW50IGhlcmUgaWYgaXQKLSAgICAgKiBhZ2FpbiByZXF1aXJlZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFByb3BlcnR5VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZnJvbSB0aGUgcHJvcGVydHkgbGlzdC4gSSBoYXZlbid0IHRob3VnaHQgdG9vCi0gICAgICogbXVjaCBhYm91dCB0aGUgcnVsZXMgYmVoaW5kIHRoaXMgbWV0aG9kLiBNeSBjdXJyZW50IHRoaW5raW5nIGlzIHRoYXQgdGhlCi0gICAgICogcHJvcGVydHkgaXMgcmVtb3ZlZCBubyBtYXR0ZXIgd2hhdCBsZXZlbCBvZiB0aGUgZXhlY3V0aW9uIHN0YWNrIHRoZQotICAgICAqIHByb3BlcnR5IHdhcyBkZWZpbmVkIGluLiBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGdvb2QgaW4gbW9zdCBjYXNlcy4gSWYgaXQKLSAgICAgKiBldmVyIHN1cmZhY2VzIHRoYXQgdGhlIHByb3BlcnR5IHNob3VsZCBqdXN0IGJlIHVuYXZhaWxhYmxlIGZvciB0aGlzIHN0YWNrCi0gICAgICogbGV2ZWwgKGFuZCBvdGhlcidzIGJlbG93IGl0KSwgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gY2FuIGJlIG1vZGlmaWVkIHRvCi0gICAgICoga2VlcCBhIGxpc3Qgb2YgdGhlc2UgInVuYXZhaWxhYmxlIiBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlUHJvcGVydHlWYWx1ZShTdHJpbmcgbmFtZSk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC9lbmdpbmUvVGFza0VuZ2luZUltcGwuamF2YSBiL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L2VuZ2luZS9UYXNrRW5naW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY1NzQ5Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L2VuZ2luZS9UYXNrRW5naW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmVuZ2luZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuQW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LnRhc2tzLlRhc2s7Ci0KLS8qKgotICogVGhlIGVuZ2luZSB0aGF0IGFjdHVhbGx5IGludm9rZXMgZWFjaCBUYXNrLiBJbiBhZGRpdGlvbiB0byBzcGVjaWZ5aW5nIGEgVGFzawotICogdG8gZXhlY3V0ZSwgaXQgbWF5IGJlIGRlc2lyYWJsZSB0byBzcGVjaWZ5IHRoZSByb290IFRhc2sgdGhhdCB3aWxsIGRlZmluZQotICogYW4gZXhlY3V0aW9uIGN5Y2xlLgotICovCi1wdWJsaWMgY2xhc3MgVGFza0VuZ2luZUltcGwgaW1wbGVtZW50cyBUYXNrRW5naW5lIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBbmFsYWdvdXMgdG8gYSBjYWxsIHN0YWNrLCBidXQgd2l0aCBUYXNrcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RhY2sgdGFza1N0YWNrICAgICAgID0gbmV3IFN0YWNrKCk7OwotICAgIAotICAgIC8qKgotICAgICAqIEFzIHRoZSB0YXNrIHN0YWNrIGlzIGJ1aWx0LCBhIG1pcnJvciByZXByZXNlbnRhdGlvbiB3aWxsIGFsc28gYmUKLSAgICAgKiBjb250cnVjdGVkIHRoYXQgd2lsbCBob2xkIHByb3BlcnR5IHZhbHVlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RhY2sgcHJvcGVydHlTdGFjayAgID0gbmV3IFN0YWNrKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogS2VlcHMgdHJhY2sgb2YgQW50RW5naW5lTGlzdGVuZXJzLiBXZSBkb24ndCBoYXZlIHRvIHVzZSBWZWN0b3IgYmVjYXVzZSB3ZQotICAgICAqIHRha2UgY2FyZSBvZiBzeW5jaHJvbml6YXRpb24gb24gdGhlIGFkZCwgcmVtb3ZlLCBhbmQgaXRlcmF0aW9uIG9wZXJhdGlvbnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZW5naW5lTGV2ZWwgPSAwOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGlzIHByaXZhdGUgc28gaXQgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gVXNlcnMgb2YgdGhpcyBjbGFzcwotICAgICAqIHdpbGwgZ2V0IGFuIGluc3RhbmNlIGJ5IHVzaW5nIHRoZSBnZXRUYXNrRW5naW5lKCkgbWV0aG9kLiBUaGlzIHdpbGwgYWxsb3cKLSAgICAgKiB1cyB0byBoYXZlIGEgc2ltcGxlIEZhY3RvcnkgaW1wbGVtZW50YXRpb24uIFdlIG1heSB1c2UgYSBTaW5nbGV0b24KLSAgICAgKiBpbXBsZW1lbnRhdGlvbiwgb3IgYSBjb2xsZWN0aW9uIHBvb2wuIFRoZSBjaG9pY2UgaXMgdXAgdG8gdXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYXNrRW5naW5lSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgdXNhYmxlIGluc3RhbmNlIG9mIGEgVGFza0VuZ2luZSB0byB0aGUgcmVxdWVzdG9yLiBOb3RoaW5nCi0gICAgICogc29waGlzdGljYXRlZCB5ZXQsIHNpbXBsZSBkb2xlcyBvdXQgYSBuZXcgaW5zdGFuY2UgZWFjaCB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGFza0VuZ2luZSBnZXRUYXNrRW5naW5lKCkgewotICAgICAgICByZXR1cm4gbmV3IFRhc2tFbmdpbmVJbXBsKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFdhbGsgdGhlIGxpc3Qgb2YgVGFza3MgYmFja3dhcmRzIHVudGlsIHRoZSByb290IGlzIHJlYWNoZWQuIEtlZXAgdHJhY2sgb2YKLSAgICAgKiB0aGUgVGFza3MgYWxvbmcgdGhlIHdheSBpbiBhIFN0YWNrLiBSZXR1cm4gbnVsbCBpZiB0aGUgcm9vdCBUYXNrIGlzIG5vdCBhCi0gICAgICogcGFyZW50IG9mIHRoZSBwcm92aWRlZCBUYXNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdGFjayBnZXRUYXNrU3RhY2soVGFzayByb290LCBUYXNrIHRhc2spIHsKLSAgICAgICAgU3RhY2sgc3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgd2hpbGUgKHRhc2sgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhY2sucHVzaCh0YXNrKTsKLSAgICAgICAgICAgIGlmICh0YXNrID09IHJvb3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXNrID0gdGFzay5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBUYXNrIHRvIGJlIGV4ZWN1dGVkIGZyb20gdGhlIHRhc2tTdGFjay4gVGhlIHRhc2sgaXMgbm90Ci0gICAgICogcmVtb3ZlZCBmcm9tIHRoZSBTdGFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFzayBnZXROZXh0RXhlY3V0ZVRhc2soKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRhc2spdGFza1N0YWNrLnBlZWsoKTsKLSAgICAgICAgfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBlc3gpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIElmIG5vIHJvb3QgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIGV4ZWN1dGUKLSAgICAgKiB0aGUgVGFzayB3aXRoIG5vIHJvb3QuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSBUYXNrIHBhcmFtZXRlcgotICAgICAqIGFzIGl0cyBvd24gcm9vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFRhc2sgdGFzaykgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGUodGFzaywgdGFzayk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIHdvcmtob3JzZSwgaG93ZXZlciBpdCBoYXMgYmVlbiBtYWRlIHRvIGJlIHZlcnkgc2ltcGxlLiBHaXZlbgotICAgICAqIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgYSBwYXRoIGJldHdlZW4gcm9vdCBhbmQgdGhlIHRhcmdldCBUYXNrLCB3ZSBidWlsZAotICAgICAqIGEgdHJhaWwgb2YgVGFza3MgdG8gY29ubmVjdCB0aGUgdHdvLiBOZXh0IHdlIGV4ZWN1dGUgZWFjaCBUYXNrIG9uIHRoZSB3YXkKLSAgICAgKiBiZXR3ZWVuIHRoZSB0d28gVGFza3MuIE9uY2Ugd2UgYXJyaXZlIGF0IHRoZSBUYXNrIHRvIGV4ZWN1dGUsIHdlIGV4ZWN1dGUKLSAgICAgKiBhbGwgb2YgaXRzIGNobGlkcmVuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVGFzayByb290LCBUYXNrIHRhc2spIHRocm93cyBBbnRFeGNlcHRpb24gewotICAgICAgICBmaXJlRW5naW5lU3RhcnQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhc2tTdGFjayA9IGdldFRhc2tTdGFjayhyb290LCB0YXNrKTs7Ci0gICAgICAgICAgICBpZiAodGFza1N0YWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBleGVjdXRpb24gcm9vdCBUYXNrIGlzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgZXhlY3V0aW9uIFRhc2suIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFBvcCB0aHJ1IHRoZSBzdGFjayBhbmQgZXhlY3V0ZSBlYWNoIFRhc2sgd2UgY29tZSBhY3Jvc3MuCi0gICAgICAgICAgICB3aGlsZSAoIXRhc2tTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBleGVjdXRlVGFzayh0YXNrU3RhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZmlyZUVuZ2luZUZpbmlzaCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEEgcmVjdXJzaXZlIHJvdXRpbmUgdGhhdCBhbGxvd3MgYWxsIFRhc2tzIGluIHRoZSBzdGFjayB0byBiZSBleGVjdXRlZC4gQXQKLSAgICAgKiB0aGUgc2FtZSB0aW1lLCB0aGUgc3RhY2sgbWF5IGdyb3cgdG8gaW5jbHVkZSBuZXcgVGFza3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVRhc2soU3RhY2sgdGFza1N0YWNrKSB0aHJvd3MgQW50RXhjZXB0aW9uIHsKLSAgICAgICAgVGFzayB0YXNrID0gKFRhc2spdGFza1N0YWNrLnBvcCgpOwotICAgICAgICAKLSAgICAgICAgZmlyZVRhc2tTdGFydCh0YXNrKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEFkZCBhIG5ldyBwcm9wZXJ0eSBob2xkZXIgZm9yIHRoaXMgdGFzayB0byB0aGUgcHJvcGVydHkgc3RhY2suIE5vdGUKLSAgICAgICAgICAgIC8vIHRoYXQgdGhlIHBhcmVudCBvZiB0aGUgbmV3IGhvbGRlciBpcyB0aGUgY3VycmVudCBzdGFjayBoZWFkLgotICAgICAgICAgICAgaWYgKHRhc2suaXNQcm9wZXJ0eUNvbnRhaW5lcigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RhY2sucHVzaChuZXcgSGllcmFyY2hpY2FsSGFzaHRhYmxlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RhY2sucHVzaChuZXcgSGllcmFyY2hpY2FsSGFzaHRhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGllcmFyY2hpY2FsSGFzaHRhYmxlKXByb3BlcnR5U3RhY2sucGVlaygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBbGxvdyBUYXNrIHRvIGRvIHdoYXRldmVyIGl0IG1heSBuZWVkIHRvIGRvIGJlZm9yZSB0b3VjaGluZyBpdHMKLSAgICAgICAgICAgIC8vIGNoaWxkcmVuLgotICAgICAgICAgICAgdGFzay5pbml0KHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBUYXNrJ3MgY2hpbGRyZW4gYW5kIGV4ZWN1dGUgYW55IHByaW9yaXR5IFRhc2tzLgotICAgICAgICAgICAgVGFza1tdIHRhc2tzID0gdGFzay5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGMgPSB0YXNrcy5sZW5ndGg7IGkgPCBjOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAodGFza3NbaV0uZ2V0RXhlY3V0aW9uTW9kZSgpID09IFRhc2suRVhFQ1VUSU9OX01PREVfUFJJT1JJVFkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFza1N0YWNrLnB1c2godGFza3NbaV0pOwotICAgICAgICAgICAgICAgICAgICBleGVjdXRlVGFzayh0YXNrU3RhY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWxsb3cgdGhlIFRhc2sgdG8gdmFsaWRhdGUuCi0gICAgICAgICAgICB0YXNrLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZpbmFsbHksIGV4ZWN1dGUgdGhlIFRhc2suCi0gICAgICAgICAgICBmaXJlVGFza0V4ZWN1dGUodGFzayk7Ci0gICAgICAgICAgICB0YXNrLmV4ZWN1dGUodGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIGNhbiBkaXNjYXJkIHRoZSBubyBsb25kZXIgbmVlZGVkIHByb3BlcnR5IGhvbGRlci4KLSAgICAgICAgICAgIGlmICh0YXNrLmlzUHJvcGVydHlDb250YWluZXIoKSkgewotICAgICAgICAgICAgICAgIHByb3BlcnR5U3RhY2sucG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoQW50RXhjZXB0aW9uIGF4KSB7Ci0gICAgICAgICAgICBmaXJlVGFza0V4Y2VwdGlvbih0YXNrLCBheCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBmaXJlVGFza0ZpbmlzaCh0YXNrKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYXVzZXMgYW4gQW50RXZlbnQgdG8gYmUgZ2VuZXJhdGVkIGFuZCBmaXJlZCB0byBhbGwgbGlzdGVuZXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoVGFzayB0YXNrLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBmaXJlVGFza01lc3NhZ2UodGFzaywgbWVzc2FnZSk7Ci0gICAgfQotICAgIAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW5lciBTdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBbnRFbmdpbmVMaXN0ZW5lcihBbnRFbmdpbmVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAoIWxpc3RlbmVyTGlzdC5jb250YWlucyhsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBbnRFbmdpbmVMaXN0ZW5lcihBbnRFbmdpbmVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAobGlzdGVuZXJMaXN0LmNvbnRhaW5zKGxpc3RlbmVyKSkgewotICAgICAgICAgICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGZpcmVFbmdpbmVTdGFydCgpIHsKLSAgICAgICAgaWYgKGVuZ2luZUxldmVsKysgPiAwKSByZXR1cm47Ci0gICAgICAgIEFudEV2ZW50IGUgPSBuZXcgQW50RXZlbnQodGhpcyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKEFudEVuZ2luZUxpc3RlbmVyKWxpc3RlbmVyTGlzdC5nZXQoaSkpLmVuZ2luZVN0YXJ0KGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZmlyZUVuZ2luZUZpbmlzaCgpIHsKLSAgICAgICAgaWYgKC0tZW5naW5lTGV2ZWwgPiAwKSByZXR1cm47Ci0gICAgICAgIEFudEV2ZW50IGUgPSBuZXcgQW50RXZlbnQodGhpcyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKEFudEVuZ2luZUxpc3RlbmVyKWxpc3RlbmVyTGlzdC5nZXQoaSkpLmVuZ2luZUZpbmlzaChlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGZpcmVUYXNrU3RhcnQoVGFzayB0YXNrKSB7Ci0gICAgICAgIEFudEV2ZW50IGUgPSBuZXcgQW50RXZlbnQodGhpcywgdGFzayk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKEFudEVuZ2luZUxpc3RlbmVyKWxpc3RlbmVyTGlzdC5nZXQoaSkpLnRhc2tTdGFydChlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGZpcmVUYXNrRXhlY3V0ZShUYXNrIHRhc2spIHsKLSAgICAgICAgQW50RXZlbnQgZSA9IG5ldyBBbnRFdmVudCh0aGlzLCB0YXNrKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICgoQW50RW5naW5lTGlzdGVuZXIpbGlzdGVuZXJMaXN0LmdldChpKSkudGFza0V4ZWN1dGUoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBmaXJlVGFza0ZpbmlzaChUYXNrIHRhc2spIHsKLSAgICAgICAgQW50RXZlbnQgZSA9IG5ldyBBbnRFdmVudCh0aGlzLCB0YXNrKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICgoQW50RW5naW5lTGlzdGVuZXIpbGlzdGVuZXJMaXN0LmdldChpKSkudGFza0ZpbmlzaChlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGZpcmVUYXNrTWVzc2FnZShUYXNrIHRhc2ssIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEFudEV2ZW50IGUgPSBuZXcgQW50RXZlbnQodGhpcywgdGFzayk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKEFudEVuZ2luZUxpc3RlbmVyKWxpc3RlbmVyTGlzdC5nZXQoaSkpLnRhc2tNZXNzYWdlKGUsIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZmlyZVRhc2tFeGNlcHRpb24oVGFzayB0YXNrLCBBbnRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgIEFudEV2ZW50IGUgPSBuZXcgQW50RXZlbnQodGhpcywgdGFzayk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKEFudEVuZ2luZUxpc3RlbmVyKWxpc3RlbmVyTGlzdC5nZXQoaSkpLnRhc2tFeGNlcHRpb24oZSwgZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgU3VwcG9ydCBNZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB0aGUgcm91dGluZSB0aGF0IHdpbGwgcGVyZm9ybSBrZXkgc3Vic3RpdHV0aW9uLiBQaHJhc2Ugd2lsbCBjb21lCi0gICAgICogaW4gYXMgInNyYy8ke3NvbWVwYXJhbX0iIGFuZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlICJub3JtYWxpemVkIgotICAgICAqIHN0cmluZy4gSSBzdXBwb3NlIHdoaWxlIEknbSBkb2luZyB0aGlzIHdlIHNob3VsZCBzdXBwb3J0IHBocmFzZXMgd2l0aAotICAgICAqIG5lc3RlZCBrZXlzLCBzdWNoIGFzICJzcmMvJHtidWlsZCR7dG9rZW59fSIuIEFsc28sIHdlIHNob3VsZCBwcm9wZXJseQotICAgICAqIGhhbmRsZSBjYXNlcyB3aGVyZSAke3NvbWVwYXJhbX0gd2lsbCBldmFsdWF0ZSB0byAke2Fub3RoZXJwYXJhbX0uCi0gICAgICogPHA+PC9wPgotICAgICAqIE9uZSB0aGluZyB0aGF0IHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIEFudCAxLjIgbWVjaGFuaXNtb2NjdXJzIHdoZW4gYQotICAgICAqIHBhcmFtZXRlciB2YWx1ZSBpcyBub3QgZm91bmQuIFRoZSBzdWJzdGl0dXRpb24gcm91dGluZSBpbnNlcnRzIGl0IGJhY2sgaW4KLSAgICAgKiB0aGUgcGhyYXNlIHVuY2hhbmdlZC4gSSBoYXZlIG9wdGVkIHRvIGluc2VydCBhIHplcm8tbGVuZ3RoIHN0cmluZwotICAgICAqIGluc3RlYWQuCi0gICAgICogPHA+PC9wPgotICAgICAqIEkgc2hvdWxkIGFkZCBhIHN3aXRjaCB0byB0aGUgZW5naW5lIHRoYXQgd2lsbCBnaXZlIHRoZSB1c2VyIHRoZSBhYmlsaXR5Ci0gICAgICogdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEga2V5IGlzIG5vdCBmb3VuZC4gUHJldHR5IGVhc3ksIGV4Y2VwdCB0aGlzCi0gICAgICogbWV0aG9kIGlzIGEgc3RyYW5nZSBwbGFjZSBmb3IgYW4gQW50RXhjZXB0aW9uIHRvIGJlIHRocm93bi4gUGVyaGFwcyBJCi0gICAgICogc2hvdWxkIHVzZSBhIFJ1bnRpbWVFeGNlcHRpb24gaW5zdGVhZC4uLgotICAgICAqIDxwPjwvcD4KLSAgICAgKiBBIGJyaWVmIHJ1bmRvd24gb24gdGhlIGxvZ2ljIGhlcmU6Ci0gICAgICogICAgIEkgY2hlY2sgZm9yIHRoZSBmaXJzdCBpbnN0YW5jZXMgb2YgYSBrZXkgcHJlZml4LgotICAgICAqICAgICBJZiBub25lIGZvdW5kIHdlIHJldHVybiB0aGUgcGhyYXNlIGFzIGlzLgotICAgICAqICAgICBJZiBrZXkgcHJlZml4IGlzIGZvdW5kIGdldCBsb2NhdGlvbiBvZiBuZXh0IGtleSBwcmVmaXggYW5kIHN1ZmZpeC4KLSAgICAgKiAgICAgSWYgc3VmZml4IGlzIGZvdW5kIGZpcnN0LCB3ZSBoYXZlIGZvdW5kIGEga2V5LgotICAgICAqICAgICBJZiB0aGVyZSBpcyBubyBzdWZmaXgsIHdlIHJldHVybiB0aGUgcGhyYXNlLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRUZJWCA9ICIkeyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1VGRklYID0gIn0iOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3Vic3RpdHV0ZShTdHJpbmcgcGhyYXNlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocGhyYXNlKTsKLSAgICAgICAgaW50IHN0YXJ0UG9pbnQgPSAwOwotICAgICAgICB3aGlsZSAoc3RhcnRQb2ludCA+PSAwICYmIHN0YXJ0UG9pbnQgPCBwaHJhc2UubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGludCBwcmUxID0gc3RhcnRQb2ludCArIHBocmFzZS5zdWJzdHJpbmcoc3RhcnRQb2ludCkuaW5kZXhPZihLRVlfUFJFRklYKTsKLSAgICAgICAgICAgIGlmIChwcmUxIDwgMCkgYnJlYWs7Ci0gICAgICAgICAgICBpbnQgc3VmMSA9IHBocmFzZS5zdWJzdHJpbmcocHJlMSArIEtFWV9QUkVGSVgubGVuZ3RoKCkpLmluZGV4T2YoS0VZX1NVRkZJWCk7Ci0gICAgICAgICAgICBpZiAoc3VmMSA8IDApIGJyZWFrOwotICAgICAgICAgICAgc3VmMSA9IHN1ZjEgKyBwcmUxICsgS0VZX1BSRUZJWC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBwcmUyID0gcGhyYXNlLnN1YnN0cmluZyhwcmUxICsgS0VZX1BSRUZJWC5sZW5ndGgoKSkuaW5kZXhPZihLRVlfUFJFRklYKTsKLSAgICAgICAgICAgIGlmIChwcmUyIDwgMCkgewotICAgICAgICAgICAgICAgIHByZTIgPSBwaHJhc2UubGVuZ3RoKCkgKyAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmUyID0gcHJlMiArIHByZTEgKyBLRVlfUFJFRklYLmxlbmd0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc3VmMSA8IHByZTIpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGZvdW5kIGEgdG9rZW4KLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gc2Iuc3Vic3RyaW5nKHByZTEgKyBLRVlfUFJFRklYLmxlbmd0aCgpLCBzdWYxKTsKLSAgICAgICAgICAgICAgICBzYi5kZWxldGUocHJlMSwgc3VmMSArIDEpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFByb3BlcnR5VmFsdWVOb1N1YnN0aXR1dGlvbihrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmluc2VydChwcmUxLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydFBvaW50ID0gcHJlMjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3QgZ2V0UHJvcGVydHlOYW1lcygpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5U3RhY2suaXNFbXB0eSgpKSByZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBIaWVyYXJjaGljYWxIYXNodGFibGUgaGFzaCA9IChIaWVyYXJjaGljYWxIYXNodGFibGUpcHJvcGVydHlTdGFjay5wZWVrKCk7Ci0gICAgICAgIHJldHVybiBoYXNoLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVN0YWNrLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7Ci0gICAgICAgIEhpZXJhcmNoaWNhbEhhc2h0YWJsZSBoYXNoID0gKEhpZXJhcmNoaWNhbEhhc2h0YWJsZSlwcm9wZXJ0eVN0YWNrLnBlZWsoKTsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGhhc2guZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUoKFN0cmluZylyZXN1bHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5VmFsdWVOb1N1YnN0aXR1dGlvbihTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAocHJvcGVydHlTdGFjay5pc0VtcHR5KCkpIHJldHVybiBudWxsOwotICAgICAgICBIaWVyYXJjaGljYWxIYXNodGFibGUgaGFzaCA9IChIaWVyYXJjaGljYWxIYXNodGFibGUpcHJvcGVydHlTdGFjay5wZWVrKCk7Ci0gICAgICAgIHJldHVybiBoYXNoLmdldFByb3BlcnR5VmFsdWUobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAocHJvcGVydHlTdGFjay5pc0VtcHR5KCkpIHJldHVybjsKLSAgICAgICAgSGllcmFyY2hpY2FsSGFzaHRhYmxlIGhhc2ggPSAoSGllcmFyY2hpY2FsSGFzaHRhYmxlKXByb3BlcnR5U3RhY2sucGVlaygpOwotICAgICAgICBoYXNoLnNldFByb3BlcnR5VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eVZhbHVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVN0YWNrLmlzRW1wdHkoKSkgcmV0dXJuOwotICAgICAgICBIaWVyYXJjaGljYWxIYXNodGFibGUgaGFzaCA9IChIaWVyYXJjaGljYWxIYXNodGFibGUpcHJvcGVydHlTdGFjay5wZWVrKCk7Ci0gICAgICAgIGhhc2gucmVtb3ZlKG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L3Rhc2tzL0Jhc2VUYXNrLmphdmEgYi9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC90YXNrcy9CYXNlVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y0YTJhLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L3Rhc2tzL0Jhc2VUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIlRvbWNhdCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQudGFza3M7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuQW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmVuZ2luZS5UYXNrRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LnRhc2tzLlRhc2s7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVGFzayBpbXBsZW1lbnRzIFRhc2sgewotICAgIAotICAgIHByb3RlY3RlZCBUYXNrIHBhcmVudDsKLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGFza05hbWU7Ci0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgCi0gICAgcHVibGljIEJhc2VUYXNrKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0KFRhc2tFbmdpbmUgZW5naW5lKSB0aHJvd3MgQW50RXhjZXB0aW9uIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShUYXNrRW5naW5lIGVuZ2luZSkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgfQotICAgIAotLy8gICAgYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRUYXNrVGFnKCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQW50RXhjZXB0aW9uIHt9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0gICAgICAgIGlmIChnZXRQYXJlbnQoKSA9PSBudWxsKSByZXR1cm4gVGFzay5OQU1FX1NFUEFSQVRPUiArIHRhc2tOYW1lOwotICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgKyBUYXNrLk5BTUVfU0VQQVJBVE9SICsgdGFza05hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGdWxseVF1YWxpZmllZE5hbWUoKS5oYXNoQ29kZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhc2tOYW1lKCkgewotICAgICAgICByZXR1cm4gdGFza05hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyB0YXNrTmFtZSkgewotICAgICAgICB0aGlzLnRhc2tOYW1lID0gdGFza05hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0RXhlY3V0aW9uTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIFRhc2suRVhFQ1VUSU9OX01PREVfUFJJT1JJVFk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLyoqQHRvZG86IEltcGxlbWVudCB0aGlzIG9yZy5hcGFjaGUuYW50LlRhc2sgbWV0aG9kKi8KLSAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIGdldEF0dHJpYnV0ZVZhbHVlKCkgbm90IHlldCBpbXBsZW1lbnRlZC4iKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRhc2sgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBXZSBoYXZlIHRvIHRydXN0IHRoZSBkZXZlbG9wZXJzIHRvIG5vdCBzY3JldyB1cCB0aGUgaGllcmFyY2h5IGJ5IGNoYW5naW5nCi0gICAgICogdGhlIHBhcmVudCBvZiBhIFRhc2sgd2hlbiBpdCBpcyBhIGNoaWxkIG9mIGFub3RoZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFRhc2sgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGFza1tdIGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gKFRhc2tbXSljaGlsZHJlbi50b0FycmF5KG5ldyBUYXNrW2NoaWxkcmVuLnNpemUoKV0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChUYXNrIHRhc2spIHsKLSAgICAgICAgY2hpbGRyZW4uYWRkKHRhc2spOwotICAgICAgICB0YXNrLnNldFBhcmVudCh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVGFzayB0YXNrKSB7Ci0gICAgICAgIGNoaWxkcmVuLnJlbW92ZSh0YXNrKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRhc2sgZ2V0Um9vdFRhc2soKSB7Ci0gICAgICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0Um9vdFRhc2soKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFRhc2sgZ2V0VGFza0J5TmFtZShTdHJpbmcgdGFza05hbWUpIHsKLSAgICAgICAgVGFza1tdIHRhc2tzID0gZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIGMgPSB0YXNrcy5sZW5ndGg7IGkgPCBjOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0YXNrc1tpXS5nZXRUYXNrTmFtZSgpLmVxdWFscyh0YXNrTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGFza3NbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUYXNrIGdldFRhc2soU3RyaW5nIHRhc2tQYXRoKSB7Ci0gICAgICAgIHRhc2tQYXRoID0gdGFza1BhdGgudHJpbSgpOwotICAgICAgICBpbnQgc2xhc2hQb3MgPSB0YXNrUGF0aC5pbmRleE9mKCIvIik7Ci0gICAgICAgIAotICAgICAgICAvLyBzdGFydHMgd2l0aCAnLycKLSAgICAgICAgaWYgKHNsYXNoUG9zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSb290VGFzaygpLmdldFRhc2sodGFza1BhdGguc3Vic3RyaW5nKHNsYXNoUG9zICsgMSkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gc3RhcnRzIHdpdGggJy4uLycKLSAgICAgICAgICAgIGlmICh0YXNrUGF0aC5zdGFydHNXaXRoKCIuLi8iKSB8fCB0YXNrUGF0aC5lcXVhbHMoIi4uIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0VGFzayh0YXNrUGF0aC5zdWJzdHJpbmcoMykpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gc3RhcnRzIHdpdGggJy4vJwotICAgICAgICAgICAgICAgIGlmICh0YXNrUGF0aC5zdGFydHNXaXRoKCIuLyIpIHx8IHRhc2tQYXRoLmVxdWFscygiLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRUYXNrKHRhc2tQYXRoLnN1YnN0cmluZygyKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBzdGFydHMgd2l0aCAnc29tZV9sZXZlbC8nCi0gICAgICAgICAgICAgICAgICAgIGlmIChzbGFzaFBvcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsZXZlbE5hbWUgPSB0YXNrUGF0aC5zdWJzdHJpbmcoMCwgc2xhc2hQb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFRhc2tCeU5hbWUobGV2ZWxOYW1lKS5nZXRUYXNrKHRhc2tQYXRoLnN1YnN0cmluZyhzbGFzaFBvcyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gdGhlcmUgYXJlIG5vIG1vcmUgZGlyZWN0b3JpZXM7IHdoYXQgcmVtYWlucyBpcyB0aGUgbmFtZSBvZiB0aGUgdGFzawotICAgICAgICBpZiAoc2xhc2hQb3MgPCAwKSB7Ci0gICAgICAgICAgICBpZiAodGFza1BhdGgubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VGFza0J5TmFtZSh0YXNrUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC90YXNrcy9UYXNrLmphdmEgYi9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC90YXNrcy9UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTZjN2EuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LnRhc2tzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5BbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuZW5naW5lLlRhc2tFbmdpbmU7Ci0KLS8qKgotICogVGFzayBpcyB0aGUgY29yZSBpbnRlcmZhY2UgZm9yIGFsbCBzdHJ1Y3R1cmVzIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlCi0gKiBUYXNrRW5naW5lLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYRUNVVElPTl9NT0RFX0lNUExJQ0lUID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEVDVVRJT05fTU9ERV9FWFBMSUNJVCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VUSU9OX01PREVfUFJJT1JJVFkgPSAyOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBOQU1FX1NFUEFSQVRPUiA9ICcvJzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYXVzZXMgdGhlIGV4aXN0aW5nIFRhc2sgaW1wbGVtZW50YXRpb24gdG8gZXhlY3V0ZS4KLSAgICAgKi8KLSAgICB2b2lkIGV4ZWN1dGUoVGFza0VuZ2luZSBlbmdpbmUpIHRocm93cyBBbnRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIFRhc2sgZmlyc3QgZ2V0cyAibm90aWNlZCIgYnkgdGhlIFRhc2tFbmdpbmUuCi0gICAgICovCi0gICAgdm9pZCBpbml0KFRhc2tFbmdpbmUgZW5naW5lKSB0aHJvd3MgQW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEVhY2ggVGFzayBzaG91bGQgaGF2ZSB0aGUgYWJpbGl0eSB0byB2YWxpZGF0ZSBpdHMgc3RhdGUuIFRoaXMgd291bGQgYmUKLSAgICAgKiBpbnZva2VkIGJ5IHRoZSBUYXNrRW5naW5lIHByaW9yIHRvIGNvbW1lbmNpbmcgYW4gZXhlY3V0aW9uIGN5Y2xlLgotICAgICAqLwotICAgIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEp1c3QgYSBzaW1wbGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IGEgVGFzay4gVGhpcyBuYW1lIGlzIG9ubHkgc3VmZmljaWVudAotICAgICAqIGZvciBzaW1wbGUgZGVidWdnaW5nIGFuZCBHVUkgb3V0cHV0LiBJdCBkb2VzIG5vdCB1bmlxdWVseSBpZGVudGlmeSBhCi0gICAgICogVGFzay4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldEZ1bGx5UXVhbGlmaWVkTmFtZQotICAgICAqLwotICAgIFN0cmluZyBnZXRUYXNrTmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEFsdGhvdWdoIHRoaXMgbWV0aG9kIHNlZW1zIHRvIHRpZSB0aGUgY29uY2VwdCBvZiBYTUwgInRhZ3MiLCBpdCBpcyBub3QKLSAgICAgKiBuZWNlc3NhcmlseSBzby4gVGhlIHRhZyBuYW1lIHdpbGwgc2VydmUgYXMgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgICAqIHR5cGUgb2YgdGFnIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xhc3MgaW5zdGFuY2UuIEl0IGlzIHByaW1hcmlseSB1c2VkIGJ5Ci0gICAgICogVGFza3Mgd2l0aCBzdWItVGFza3MgdGhhdCBhcmUgbm90IGFzc2lnbmVkIHRvIGEgc3BlY2lmaWMgY2xhc3MKLSAgICAgKiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hbnQudGFza3MuVW5rbm93blRhc2sKLSAgICAgKi8KLS8vICAgIFN0cmluZyBnZXRUYXNrVGFnKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBtZWNoYW5pc20gZm9yIGxvY2F0aW5nIGEgdGFzayByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB0YXNrLiBUaGlzCi0gICAgICogbmF2aWdhdGlvbiBzY2VtZSB3aWxsIG1pbWljIGEgdHlwaWNhbCBPUyBzeXN0ZW0uICcuLicgd2lsbCBtb3ZlIGJhY2sKLSAgICAgKiBhIGxldmVsIGluIHRoZSBUYXNrIHRyZWUuIElmIHRhc2tQYXRoIGJlZ2lucyB3aXRoICcvJyB0aGVuIHRoZSByb290IG5vZGUKLSAgICAgKiB3aWxsIGJlIHVzZWQgYXMgYSBzdGFydGluZyBwb2ludC4KLSAgICAgKiA8cD48L3A+Ci0gICAgICogUmV0dXJucyBudWxsIG9mIG5vIHRhc2sgaXMgZm91bmQgYXQgdGhpcyBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBUYXNrIGdldFRhc2soU3RyaW5nIHRhc2tQYXRoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQcm9jZWVkIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBub2RlcyB1bnRpbCB3ZSBjb21lIGFjcm9zcyB0aGUgZmlyc3QgVGFzawotICAgICAqIGluIHRoZSB0cmVlLiBUaGlzIGlzIHRoZSByb290IFRhc2suCi0gICAgICovCi0gICAgVGFzayBnZXRSb290VGFzaygpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSAiZnVsbHktcXVhbGlmaWVkIiBuYW1lIG9mIGEgVGFzayBpcyB0aGUgVGFzaydzIG5hbWUsIHByZXBlbmRlZCBieSBpdHMKLSAgICAgKiBwYXJlbnQncyBuYW1lLCBwcmVwZW5kZWQgYnkgaXRzIHBhcmVudCdzIG5hbWUsIGV0Yy4gVGhpcyBtZXRob2QgbWF5IGJlCi0gICAgICogdXNlZCBieSB0aGUgVGFzaydzIGhhc2hDb2RlKCkgbWV0aG9kIHRvIGNhbGN1bGF0ZSBhIGhhc2ggdGhhdCB3aWxsCi0gICAgICogdW5pcXVlbHkgaWRlbnRpZnkgYSBUYXNrLgotICAgICAqLwotICAgIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBUYXNrIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGl0cyBwYXJlbnQgaXMgZXhlY3V0ZWQsCi0gICAgICogb3IgaWYgaXRzIGV4ZWN1dGlvbiBtdXN0IGJlIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQuCi0gICAgICogPHA+PC9wPgotICAgICAqIDxkbD48ZHQ+RVhFQ1VUSU9OX01PREVfRVhQTElDSVQ8L2R0PgotICAgICAqIDxkZD5SZXF1aXJlcyBpbnRlcmFjdGlvbiBieSB0aGUgVGFza0VuZ2luZSBpbiBvcmRlciB0byBleGVjdXRlLjwvZGQ+Ci0gICAgICogPGR0PkVYRUNVVElPTl9NT0RFX0lNUExJQ0lUPC9kdD4KLSAgICAgKiA8ZGQ+VGhpcyBUYXNrIGlzIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZWQgd2hlbiBpdHMgcGFyZW50IGlzCi0gICAgICogZXhlY3V0ZWQuPC9kZD4KLSAgICAgKiA8ZHQ+RVhFQ1VUSU9OX01PREVfUFJJT1JJVFk8L2R0PgotICAgICAqIDxkZD5UaGVzZSBUYXNrcyBhcmUgZXhlY3V0ZWQgcHJpb3IgdG8gaXRzIHBhcmVudCdzIGV4ZWN1dGlvbjwvZGQ+PC9kbD4KLSAgICAgKiA8cD48L3A+Ci0gICAgICogVGhlIGRlZmF1bHQgbW9kZSBzaG91bGQgcHJvYmFibHkgYmUgRVhFQ1VUSU9OX01PREVfSU1QTElDSVQuIEluIHRoZQotICAgICAqIGJ1aWxkIGRvbWFpbiBvZiBBbnQsIGV2ZXJ5IFRhc2sgYmVsb3cgYSBUYXNrIHdpbGwgbm9ybWFsbHkgYmUgZXhlY3V0ZWQuCi0gICAgICogVGhlIG1ham9yIGV4Y2VwdGlvbiB0byB0aGlzIGlzIHRoZSBUYXJnZXQuIFdoZW4gYSBQcm9qZWN0IFRhc2sgaXMKLSAgICAgKiBleGVjdXRlZCwgYWxsIFRhcmdldCBUYXNrcyBkbyA8aT5ub3Q8L2k+IGF1dG9tYXRpY2FsbHkgZmlyZSwgaG93ZXZlciBhbGwKLSAgICAgKiBQcm9wZXJ0eSBUYXNrcyA8aT5kbzwvaT4gZXhlY3V0ZS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RXhlY3V0aW9uTW9kZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhIFRhc2sgaXMgc3VpdGFibGUgZm9yIGhvbGRpbmcgcHJvcGVydHkgdmFsdWVzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNQcm9wZXJ0eUNvbnRhaW5lcigpOwotICAgIAotICAgIC8qKgotICAgICAqIEVhY2ggVGFzayB3aWxsIGhvbGQgaXRzIGF0dHJpYnV0ZXMgaW4gc29tZSBtYW5uZXIuIFRoaXMgbWV0aG9kIHdpbGwgYWxsb3cKLSAgICAgKiB0aGUgVGFzayBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gdGhlIHZhbHVlIG9mIGl0cyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgVGFzaydzIHBhcmVudCBUYXNrLiBJZiB0aGlzIFRhc2sgaXMgdGhlIHJvb3QgVGFzaywgdGhlbiB0aGlzCi0gICAgICogbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwuCi0gICAgICovCi0gICAgVGFzayBnZXRQYXJlbnQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBUYXNrJ3MgcGFyZW50LgotICAgICAqLwotICAgIHZvaWQgc2V0UGFyZW50KFRhc2sgcGFyZW50KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbiBhcnJheSBvZiBUYXNrIG9iamVjdHMgdGhhdCBhcmUgc3Vib3JkaW5hdGUgdG8gdGhpcyBUYXNrLgotICAgICAqLwotICAgIFRhc2tbXSBnZXRDaGlsZHJlbigpOwotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvdGFza3MvYnVpbGQvUHJvamVjdC5qYXZhIGIvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvdGFza3MvYnVpbGQvUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjI4OTA0Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L3Rhc2tzL2J1aWxkL1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudC50YXNrcy5idWlsZDsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuQW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmVuZ2luZS5UYXNrRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LnRhc2tzLkJhc2VUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LnRhc2tzLlRhc2s7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0IGV4dGVuZHMgQmFzZVRhc2sgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGRlZjsKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlZGlyOwotICAgIAotICAgIHB1YmxpYyBQcm9qZWN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBkZWY7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5ld0RlZmF1bHQpIHsKLSAgICAgICAgZGVmID0gbmV3RGVmYXVsdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZWRpcihTdHJpbmcgbmV3QmFzZWRpcikgewotICAgICAgICBiYXNlZGlyID0gbmV3QmFzZWRpcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlZGlyKCkgewotICAgICAgICByZXR1cm4gYmFzZWRpcjsKLSAgICB9Ci0gICAgCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVRhc2sgSW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdChUYXNrRW5naW5lIGVuZ2luZSkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEhlcmUgaXMgd2hlcmUgd2UgY2hlY2sgYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IFRhcmdldHMgc3BlY2lmaWVkLiBXZSBkbwotICAgICAqIHRoaXMgYnkgcGVla2luZyBpbnRvIHRoZSBrbm93biB0YXNrU3RhY2sgYW5kIGNoZWNraW5nIHRvIHNlZSBpZiBhIFRhcmdldAotICAgICAqIGlzIG5leHQgdG8gYmUgZXhlY3V0ZWQuIElmIG5vdCwgd2UgYWRkIG91ciBkZWZhdWx0IFRhcmdldCB0byB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFRhc2tFbmdpbmUgZW5naW5lKSB0aHJvd3MgQW50RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc2VlIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBpbnZva2UgdGhlIGRlZmF1bHQgdGFzawotICAgICAgICBUYXNrIHRhc2sgPSBlbmdpbmUuZ2V0TmV4dEV4ZWN1dGVUYXNrKCk7Ci0gICAgICAgIGlmICh0YXNrID09IG51bGwgJiYgZ2V0RGVmYXVsdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRhc2sgZGVmYXVsdFRhc2sgPSBnZXRUYXNrKGdldERlZmF1bHQoKSk7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdFRhc2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVuZ2luZS5leGVjdXRlKGRlZmF1bHRUYXNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5Q29udGFpbmVyKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC90YXNrcy9idWlsZC9UYXJnZXQuamF2YSBiL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L3Rhc2tzL2J1aWxkL1RhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWUzZGM2Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L3Rhc2tzL2J1aWxkL1RhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LnRhc2tzLmJ1aWxkOwotCi0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LkFudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5lbmdpbmUuVGFza0VuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC50YXNrcy5CYXNlVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC50YXNrcy5UYXNrOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0IGV4dGVuZHMgQmFzZVRhc2sgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGRlcGVuZHM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWZDb25kOwotICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc0NvbmQ7Ci0gICAgCi0gICAgcHVibGljIFRhcmdldCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRJZigpIHsKLSAgICAgICAgcmV0dXJuIGlmQ29uZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SWYoU3RyaW5nIGNvbmRpdGlvbikgewotICAgICAgICB0aGlzLmlmQ29uZCA9IGNvbmRpdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRVbmxlc3MoKSB7Ci0gICAgICAgIHJldHVybiB1bmxlc3NDb25kOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoU3RyaW5nIGNvbmRpdGlvbikgewotICAgICAgICB0aGlzLnVubGVzc0NvbmQgPSBjb25kaXRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlcGVuZHMoU3RyaW5nIG5ld0RlcGVuZHMpIHsKLSAgICAgICAgdGhpcy5kZXBlbmRzID0gbmV3RGVwZW5kczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXREZXBlbmRzKCkgewotICAgICAgICByZXR1cm4gZGVwZW5kczsKLSAgICB9Ci0gICAgCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVRhc2sgSW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgCi0gICAgcHVibGljIGludCBnZXRFeGVjdXRpb25Nb2RlKCkgewotICAgICAgICByZXR1cm4gVGFzay5FWEVDVVRJT05fTU9ERV9FWFBMSUNJVDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTm90ZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSB0YXNrIGF0IGhhbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShUYXNrRW5naW5lIGVuZ2luZSkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXREZXBlbmRzKCkgIT0gbnVsbCAmJiBnZXREZXBlbmRzKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBUYXNrIGRlcGVuZGVuY3lUYXNrID0gZ2V0VGFzayhnZXREZXBlbmRzKCkpOwotICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lUYXNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBmaW5kIGRlcGVuZGVuY3ksICIgKyBnZXREZXBlbmRzKCkgKyAiIGZyb20gVGFzay4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW5naW5lLmV4ZWN1dGUoZGVwZW5kZW5jeVRhc2spOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L3Rhc2tzL3V0aWwvUHJvcGVydHkuamF2YSBiL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L3Rhc2tzL3V0aWwvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5YzgzNy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC90YXNrcy91dGlsL1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudC50YXNrcy51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LkFudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5lbmdpbmUuVGFza0VuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC50YXNrcy5CYXNlVGFzazsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5IGV4dGVuZHMgQmFzZVRhc2sgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVRhc2sgSW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShUYXNrRW5naW5lIGVuZ2luZSkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRQYXJlbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQW50RXhjZXB0aW9uKCJBIFByb3BlcnR5IFRhc2sgbXVzdCBoYXZlIGEgcGFyZW50IFRhc2suIik7Ci0gICAgICAgIH0KLSAgICAgICAgZW5naW5lLnNldFByb3BlcnR5VmFsdWUoZ2V0TmFtZSgpLCBnZXRWYWx1ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC90YXNrcy91dGlsL1Byb3BlcnR5RHVtcC5qYXZhIGIvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvdGFza3MvdXRpbC9Qcm9wZXJ0eUR1bXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjM2RkNy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9mcmFudGljL3NyYy9vcmcvYXBhY2hlL2FudC90YXNrcy91dGlsL1Byb3BlcnR5RHVtcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIlRvbWNhdCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQudGFza3MudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5BbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuZW5naW5lLlRhc2tFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQudGFza3MuQmFzZVRhc2s7Ci0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUR1bXAgZXh0ZW5kcyBCYXNlVGFzayB7Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5RHVtcCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVRhc2sgSW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShUYXNrRW5naW5lIGVuZ2luZSkgdGhyb3dzIEFudEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgcHJvcE5hbWVzID0gZW5naW5lLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJvcE5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZW5naW5lLmdldFByb3BlcnR5VmFsdWUobmFtZSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGVuZ2luZS5tZXNzYWdlKHRoaXMsIG5hbWUgKyAiID0gIiArIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2ZyYW50aWMvc3JjL29yZy9hcGFjaGUvYW50L3Rlc3QvU2ltcGxlVGVzdC5qYXZhIGIvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvdGVzdC9TaW1wbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmU1YzQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvZnJhbnRpYy9zcmMvb3JnL2FwYWNoZS9hbnQvdGVzdC9TaW1wbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIlRvbWNhdCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQudGVzdDsKLQotCi0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LkFudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5lbmdpbmUuRGVmYXVsdEVuZ2luZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmVuZ2luZS5UYXNrRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmVuZ2luZS5UYXNrRW5naW5lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC50YXNrcy5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LnRhc2tzLmJ1aWxkLlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQudGFza3MuYnVpbGQuVGFyZ2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LnRhc2tzLnV0aWwuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQudGFza3MudXRpbC5Qcm9wZXJ0eUR1bXA7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUZXN0IHsKLSAgICAKLSAgICBUYXNrIHRhcmdldDsKLSAgICAKLSAgICBwdWJsaWMgU2ltcGxlVGVzdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRhc2sgcm9vdFRhc2sgPSBidWlsZFByb2plY3QoKTsKLSAgICAgICAgICAgIFRhc2tFbmdpbmUgZW5naW5lID0gVGFza0VuZ2luZUltcGwuZ2V0VGFza0VuZ2luZSgpOwotICAgICAgICAgICAgZW5naW5lLmFkZEFudEVuZ2luZUxpc3RlbmVyKG5ldyBEZWZhdWx0RW5naW5lTGlzdGVuZXIoKSk7Ci0gICAgICAgICAgICBlbmdpbmUuZXhlY3V0ZShyb290VGFzaywgdGFyZ2V0KTsKLSAgICAgICAgfSBjYXRjaCAoQW50RXhjZXB0aW9uIGF4KSB7Ci0gICAgICAgICAgICBheC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFRhc2sgYnVpbGRQcm9qZWN0KCkgewotICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LnNldFRhc2tOYW1lKCJwcm9qZWN0Iik7Ci0gICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigic29tZWRpciIpOwotICAgICAgICBwcm9qZWN0LnNldERlZmF1bHQoImJ1aWxkIik7Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0eSBwcm9wZXJ0eTEgPSBuZXcgUHJvcGVydHkoKTsKLSAgICAgICAgcHJvcGVydHkxLnNldFRhc2tOYW1lKCJwcm9wMSIpOwotICAgICAgICBwcm9wZXJ0eTEuc2V0TmFtZSgiYmFzZWRpciIpOwotICAgICAgICBwcm9wZXJ0eTEuc2V0VmFsdWUoIi9vcmcvYXBhY2hlIik7Ci0gICAgICAgIHByb2plY3QuYWRkQ2hpbGQocHJvcGVydHkxKTsKLSAgICAgICAgCi0gICAgICAgIFByb3BlcnR5IHByb3BlcnR5MiA9IG5ldyBQcm9wZXJ0eSgpOwotICAgICAgICBwcm9wZXJ0eTIuc2V0VGFza05hbWUoInByb3AyIik7Ci0gICAgICAgIHByb3BlcnR5Mi5zZXROYW1lKCJkaXIxIik7Ci0gICAgICAgIHByb3BlcnR5Mi5zZXRWYWx1ZSgiJHtiYXNlZGlyfS9hbnQiKTsKLSAgICAgICAgcHJvamVjdC5hZGRDaGlsZChwcm9wZXJ0eTIpOwotICAgICAgICAKLSAgICAgICAgVGFyZ2V0IHRhcmdldDEgPSBuZXcgVGFyZ2V0KCk7Ci0gICAgICAgIHRhcmdldDEuc2V0VGFza05hbWUoImNsZWFuIik7Ci0gICAgICAgIHByb2plY3QuYWRkQ2hpbGQodGFyZ2V0MSk7Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0eUR1bXAgcGQgPSBuZXcgUHJvcGVydHlEdW1wKCk7Ci0gICAgICAgIHBkLnNldFRhc2tOYW1lKCJkdW1wIik7Ci0gICAgICAgIHRhcmdldDEuYWRkQ2hpbGQocGQpOwotICAgICAgICAKLSAgICAgICAgVGFyZ2V0IHRhcmdldDIgPSBuZXcgVGFyZ2V0KCk7Ci0gICAgICAgIHRhcmdldDIuc2V0VGFza05hbWUoInByZXBhcmUiKTsKLSAgICAgICAgdGFyZ2V0Mi5zZXREZXBlbmRzKCIuLi9jbGVhbiIpOwotICAgICAgICBwcm9qZWN0LmFkZENoaWxkKHRhcmdldDIpOwotICAgICAgICAKLSAgICAgICAgUHJvcGVydHkgcHJvcGVydHkzID0gbmV3IFByb3BlcnR5KCk7Ci0gICAgICAgIHByb3BlcnR5My5zZXRUYXNrTmFtZSgicHJvcDMiKTsKLSAgICAgICAgcHJvcGVydHkzLnNldE5hbWUoImRpcjIiKTsKLSAgICAgICAgcHJvcGVydHkzLnNldFZhbHVlKCIke2RpcjF9L3Rhc2tzIik7Ci0gICAgICAgIHRhcmdldDIuYWRkQ2hpbGQocHJvcGVydHkzKTsKLSAgICAgICAgCi0gICAgICAgIFRhcmdldCB0YXJnZXQzID0gbmV3IFRhcmdldCgpOwotICAgICAgICB0YXJnZXQzLnNldFRhc2tOYW1lKCJidWlsZCIpOwotICAgICAgICB0YXJnZXQzLnNldERlcGVuZHMoIi4uL3ByZXBhcmUiKTsKLSAgICAgICAgcHJvamVjdC5hZGRDaGlsZCh0YXJnZXQzKTsKLSAgICAgICAgCi0gICAgICAgIFByb3BlcnR5IHByb3BlcnR5NCA9IG5ldyBQcm9wZXJ0eSgpOwotICAgICAgICBwcm9wZXJ0eTQuc2V0VGFza05hbWUoInByb3A0Iik7Ci0gICAgICAgIHByb3BlcnR5NC5zZXROYW1lKCJkaXIzIik7Ci0gICAgICAgIHByb3BlcnR5NC5zZXRWYWx1ZSgicjJ9Iik7Ci0gICAgICAgIHRhcmdldDMuYWRkQ2hpbGQocHJvcGVydHk0KTsKLSAgICAgICAgCi0gICAgICAgIFByb3BlcnR5IHByb3BlcnR5NSA9IG5ldyBQcm9wZXJ0eSgpOwotICAgICAgICBwcm9wZXJ0eTUuc2V0VGFza05hbWUoInByb3A1Iik7Ci0gICAgICAgIHByb3BlcnR5NS5zZXROYW1lKCJkaXI0Iik7Ci0gICAgICAgIHByb3BlcnR5NS5zZXRWYWx1ZSgiJHtkaSR7ZGlyM30iKTsKLSAgICAgICAgdGFyZ2V0My5hZGRDaGlsZChwcm9wZXJ0eTUpOwotICAgICAgICAKLSAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0MjsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFNpbXBsZVRlc3Qgc2ltcGxlVGVzdDEgPSBuZXcgU2ltcGxlVGVzdCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2ZyYW50aWMvd2Vic2l0ZS9UYXNrLmh0bWwgYi9wcm9wb3NhbC9mcmFudGljL3dlYnNpdGUvVGFzay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2M4MDhmLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvd2Vic2l0ZS9UYXNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvZnJhbWVzZXQuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyBvbiBTYXQgRGVjIDE2IDIyOjE5OjQ2IEVTVCAyMDAwIC0tPgotPFRJVExFPgotOiBJbnRlcmZhY2UgIFRhc2sKLTwvVElUTEU+Ci08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci08L0hFQUQ+Ci08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci0KLTwhLS0gPT09PT09PT09PSBTVEFSVCBPRiBOQVZCQVIgPT09PT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC1hbGwuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWwiIFRBUkdFVD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVGFzay5odG1sIiBUQVJHRVQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTogJm5ic3A7SU5ORVImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiAmbmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTwhLS0gPT09PT09PT09PT0gRU5EIE9GIE5BVkJBUiA9PT09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmFwYWNoZS5hbnQudGFza3M8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgIFRhc2s8L0gyPgotPEhSPgotPERMPgotPERUPnB1YmxpYyBpbnRlcmZhY2UgPEI+VGFzazwvQj48L0RMPgotCi08UD4KLVRhc2sgaXMgdGhlIGNvcmUgaW50ZXJmYWNlIGZvciBhbGwgc3RydWN0dXJlcyB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZQotIFRhc2tFbmdpbmUuCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09IElOTkVSIENMQVNTIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLQotPCEtLSA9PT09PT09PT09PSBGSUVMRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgV0lEVEg9IjEwMCUiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEQgQ09MU1BBTj0yPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sI0VYRUNVVElPTl9NT0RFX0VYUExJQ0lUIj5FWEVDVVRJT05fTU9ERV9FWFBMSUNJVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCNFWEVDVVRJT05fTU9ERV9JTVBMSUNJVCI+RVhFQ1VUSU9OX01PREVfSU1QTElDSVQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL2FudC90YXNrcy9UYXNrLmh0bWwjRVhFQ1VUSU9OX01PREVfUFJJT1JJVFkiPkVYRUNVVElPTl9NT0RFX1BSSU9SSVRZPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtjaGFyPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCNOQU1FX1NFUEFSQVRPUiI+TkFNRV9TRVBBUkFUT1I8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFdJRFRIPSIxMDAlIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFREIENPTFNQQU49Mj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sI2V4ZWN1dGUob3JnLmFwYWNoZS5hbnQuZW5naW5lLlRhc2tFbmdpbmUpIj5leGVjdXRlPC9BPjwvQj4ob3JnLmFwYWNoZS5hbnQuZW5naW5lLlRhc2tFbmdpbmUmbmJzcDtlbmdpbmUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDYXVzZXMgdGhlIGV4aXN0aW5nIFRhc2sgaW1wbGVtZW50YXRpb24gdG8gZXhlY3V0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL2FudC90YXNrcy9UYXNrLmh0bWwjZ2V0QXR0cmlidXRlVmFsdWUoamF2YS5sYW5nLlN0cmluZykiPmdldEF0dHJpYnV0ZVZhbHVlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtFYWNoIFRhc2sgd2lsbCBob2xkIGl0cyBhdHRyaWJ1dGVzIGluIHNvbWUgbWFubmVyLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL2FudC90YXNrcy9UYXNrLmh0bWwiPlRhc2s8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sI2dldENoaWxkcmVuKCkiPmdldENoaWxkcmVuPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgYW4gYXJyYXkgb2YgVGFzayBvYmplY3RzIHRoYXQgYXJlIHN1Ym9yZGluYXRlIHRvIHRoaXMgVGFzay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCNnZXRFeGVjdXRpb25Nb2RlKCkiPmdldEV4ZWN1dGlvbk1vZGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBUYXNrIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGl0cyBwYXJlbnQgaXMgZXhlY3V0ZWQsCi0gb3IgaWYgaXRzIGV4ZWN1dGlvbiBtdXN0IGJlIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sI2dldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIj5nZXRGdWxseVF1YWxpZmllZE5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgImZ1bGx5LXF1YWxpZmllZCIgbmFtZSBvZiBhIFRhc2sgaXMgdGhlIFRhc2sncyBuYW1lLCBwcmVwZW5kZWQgYnkgaXRzCi0gcGFyZW50J3MgbmFtZSwgcHJlcGVuZGVkIGJ5IGl0cyBwYXJlbnQncyBuYW1lLCBldGMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCI+VGFzazwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sI2dldFBhcmVudCgpIj5nZXRQYXJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoaXMgVGFzaydzIHBhcmVudCBUYXNrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL2FudC90YXNrcy9UYXNrLmh0bWwiPlRhc2s8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCNnZXRSb290VGFzaygpIj5nZXRSb290VGFzazwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1Byb2NlZWQgYmFja3dhcmRzIHRocm91Z2ggdGhlIG5vZGVzIHVudGlsIHdlIGNvbWUgYWNyb3NzIHRoZSBmaXJzdCBUYXNrCi0gaW4gdGhlIHRyZWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCI+VGFzazwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sI2dldFRhc2soamF2YS5sYW5nLlN0cmluZykiPmdldFRhc2s8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dGFza1BhdGgpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIG1lY2hhbmlzbSBmb3IgbG9jYXRpbmcgYSB0YXNrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHRhc2suPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sI2dldFRhc2tOYW1lKCkiPmdldFRhc2tOYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SnVzdCBhIHNpbXBsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgYSBUYXNrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCNpbml0KG9yZy5hcGFjaGUuYW50LmVuZ2luZS5UYXNrRW5naW5lKSI+aW5pdDwvQT48L0I+KG9yZy5hcGFjaGUuYW50LmVuZ2luZS5UYXNrRW5naW5lJm5ic3A7ZW5naW5lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2FsbGVkIHdoZW4gdGhlIFRhc2sgZmlyc3QgZ2V0cyAibm90aWNlZCIgYnkgdGhlIFRhc2tFbmdpbmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sI2lzUHJvcGVydHlDb250YWluZXIoKSI+aXNQcm9wZXJ0eUNvbnRhaW5lcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0RldGVybWluZXMgd2hldGhlciBhIFRhc2sgaXMgc3VpdGFibGUgZm9yIGhvbGRpbmcgcHJvcGVydHkgdmFsdWVzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCNzZXRQYXJlbnQob3JnLmFwYWNoZS5hbnQudGFza3MuVGFzaykiPnNldFBhcmVudDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCI+VGFzazwvQT4mbmJzcDtwYXJlbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSBUYXNrJ3MgcGFyZW50LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCN2YWxpZGF0ZSgpIj52YWxpZGF0ZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0VhY2ggVGFzayBzaG91bGQgaGF2ZSB0aGUgYWJpbGl0eSB0byB2YWxpZGF0ZSBpdHMgc3RhdGUuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBXSURUSD0iMTAwJSI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxURCBDT0xTUEFOPTE+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgRGV0YWlsPC9CPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkVYRUNVVElPTl9NT0RFX0lNUExJQ0lUIj48IS0tIC0tPjwvQT48SDM+Ci1FWEVDVVRJT05fTU9ERV9JTVBMSUNJVDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgPEI+RVhFQ1VUSU9OX01PREVfSU1QTElDSVQ8L0I+PC9QUkU+Ci08REw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJFWEVDVVRJT05fTU9ERV9FWFBMSUNJVCI+PCEtLSAtLT48L0E+PEgzPgotRVhFQ1VUSU9OX01PREVfRVhQTElDSVQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IDxCPkVYRUNVVElPTl9NT0RFX0VYUExJQ0lUPC9CPjwvUFJFPgotPERMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iRVhFQ1VUSU9OX01PREVfUFJJT1JJVFkiPjwhLS0gLS0+PC9BPjxIMz4KLUVYRUNVVElPTl9NT0RFX1BSSU9SSVRZPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCA8Qj5FWEVDVVRJT05fTU9ERV9QUklPUklUWTwvQj48L1BSRT4KLTxETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Ik5BTUVfU0VQQVJBVE9SIj48IS0tIC0tPjwvQT48SDM+Ci1OQU1FX1NFUEFSQVRPUjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIDxCPk5BTUVfU0VQQVJBVE9SPC9CPjwvUFJFPgotPERMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFdJRFRIPSIxMDAlIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFREIENPTFNQQU49MT48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImV4ZWN1dGUob3JnLmFwYWNoZS5hbnQuZW5naW5lLlRhc2tFbmdpbmUpIj48IS0tIC0tPjwvQT48SDM+Ci1leGVjdXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5leGVjdXRlPC9CPihvcmcuYXBhY2hlLmFudC5lbmdpbmUuVGFza0VuZ2luZSZuYnNwO2VuZ2luZSkKLSAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5hbnQuQW50RXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+Q2F1c2VzIHRoZSBleGlzdGluZyBUYXNrIGltcGxlbWVudGF0aW9uIHRvIGV4ZWN1dGUuPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaW5pdChvcmcuYXBhY2hlLmFudC5lbmdpbmUuVGFza0VuZ2luZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWluaXQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmluaXQ8L0I+KG9yZy5hcGFjaGUuYW50LmVuZ2luZS5UYXNrRW5naW5lJm5ic3A7ZW5naW5lKQotICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmFudC5BbnRFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5DYWxsZWQgd2hlbiB0aGUgVGFzayBmaXJzdCBnZXRzICJub3RpY2VkIiBieSB0aGUgVGFza0VuZ2luZS48L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0ZSgpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+dmFsaWRhdGU8L0I+KCkKLSAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYW50LkFudEV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPkVhY2ggVGFzayBzaG91bGQgaGF2ZSB0aGUgYWJpbGl0eSB0byB2YWxpZGF0ZSBpdHMgc3RhdGUuIFRoaXMgd291bGQgYmUKLSBpbnZva2VkIGJ5IHRoZSBUYXNrRW5naW5lIHByaW9yIHRvIGNvbW1lbmNpbmcgYW4gZXhlY3V0aW9uIGN5Y2xlLjwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFRhc2tOYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFRhc2tOYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRUYXNrTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkp1c3QgYSBzaW1wbGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IGEgVGFzay4gVGhpcyBuYW1lIGlzIG9ubHkgc3VmZmljaWVudAotIGZvciBzaW1wbGUgZGVidWdnaW5nIGFuZCBHVUkgb3V0cHV0LiBJdCBkb2VzIG5vdCB1bmlxdWVseSBpZGVudGlmeSBhCi0gVGFzay48REQ+PERMPgotPERUPjxCPlNlZSBBbHNvOiA8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCNnZXRGdWxseVF1YWxpZmllZE5hbWUoKSI+PENPREU+Z2V0RnVsbHlRdWFsaWZpZWROYW1lKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VGFzayhqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VGFzazwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUvYW50L3Rhc2tzL1Rhc2suaHRtbCI+VGFzazwvQT4gPEI+Z2V0VGFzazwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3Rhc2tQYXRoKTwvUFJFPgotPERMPgotPEREPkEgbWVjaGFuaXNtIGZvciBsb2NhdGluZyBhIHRhc2sgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgdGFzay4gVGhpcwotIG5hdmlnYXRpb24gc2NlbWUgd2lsbCBtaW1pYyBhIHR5cGljYWwgT1Mgc3lzdGVtLiAnLi4nIHdpbGwgbW92ZSBiYWNrCi0gYSBsZXZlbCBpbiB0aGUgVGFzayB0cmVlLiBJZiB0YXNrUGF0aCBiZWdpbnMgd2l0aCAnLycgdGhlbiB0aGUgcm9vdCBub2RlCi0gd2lsbCBiZSB1c2VkIGFzIGEgc3RhcnRpbmcgcG9pbnQuCi0gPHA+PC9wPgotIFJldHVybnMgbnVsbCBvZiBubyB0YXNrIGlzIGZvdW5kIGF0IHRoaXMgbG9jYXRpb24uPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Um9vdFRhc2soKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Um9vdFRhc2s8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL2FudC90YXNrcy9UYXNrLmh0bWwiPlRhc2s8L0E+IDxCPmdldFJvb3RUYXNrPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UHJvY2VlZCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgbm9kZXMgdW50aWwgd2UgY29tZSBhY3Jvc3MgdGhlIGZpcnN0IFRhc2sKLSBpbiB0aGUgdHJlZS4gVGhpcyBpcyB0aGUgcm9vdCBUYXNrLjwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRGdWxseVF1YWxpZmllZE5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldEZ1bGx5UXVhbGlmaWVkTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlRoZSAiZnVsbHktcXVhbGlmaWVkIiBuYW1lIG9mIGEgVGFzayBpcyB0aGUgVGFzaydzIG5hbWUsIHByZXBlbmRlZCBieSBpdHMKLSBwYXJlbnQncyBuYW1lLCBwcmVwZW5kZWQgYnkgaXRzIHBhcmVudCdzIG5hbWUsIGV0Yy4gVGhpcyBtZXRob2QgbWF5IGJlCi0gdXNlZCBieSB0aGUgVGFzaydzIGhhc2hDb2RlKCkgbWV0aG9kIHRvIGNhbGN1bGF0ZSBhIGhhc2ggdGhhdCB3aWxsCi0gdW5pcXVlbHkgaWRlbnRpZnkgYSBUYXNrLjwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEV4ZWN1dGlvbk1vZGUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RXhlY3V0aW9uTW9kZTwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5nZXRFeGVjdXRpb25Nb2RlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgVGFzayBpcyBleGVjdXRlZCB3aGVuZXZlciBpdHMgcGFyZW50IGlzIGV4ZWN1dGVkLAotIG9yIGlmIGl0cyBleGVjdXRpb24gbXVzdCBiZSBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkLgotIDxwPjwvcD4KLSA8ZGw+PGR0PkVYRUNVVElPTl9NT0RFX0VYUExJQ0lUPC9kdD4KLSA8ZGQ+UmVxdWlyZXMgaW50ZXJhY3Rpb24gYnkgdGhlIFRhc2tFbmdpbmUgaW4gb3JkZXIgdG8gZXhlY3V0ZS48L2RkPgotIDxkdD5FWEVDVVRJT05fTU9ERV9JTVBMSUNJVDwvZHQ+Ci0gPGRkPlRoaXMgVGFzayBpcyBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIHdoZW4gaXRzIHBhcmVudCBpcwotIGV4ZWN1dGVkLjwvZGQ+Ci0gPGR0PkVYRUNVVElPTl9NT0RFX1BSSU9SSVRZPC9kdD4KLSA8ZGQ+VGhlc2UgVGFza3MgYXJlIGV4ZWN1dGVkIHByaW9yIHRvIGl0cyBwYXJlbnQncyBleGVjdXRpb248L2RkPjwvZGw+Ci0gPHA+PC9wPgotIFRoZSBkZWZhdWx0IG1vZGUgc2hvdWxkIHByb2JhYmx5IGJlIEVYRUNVVElPTl9NT0RFX0lNUExJQ0lULiBJbiB0aGUKLSBidWlsZCBkb21haW4gb2YgQW50LCBldmVyeSBUYXNrIGJlbG93IGEgVGFzayB3aWxsIG5vcm1hbGx5IGJlIGV4ZWN1dGVkLgotIFRoZSBtYWpvciBleGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgVGFyZ2V0LiBXaGVuIGEgUHJvamVjdCBUYXNrIGlzCi0gZXhlY3V0ZWQsIGFsbCBUYXJnZXQgVGFza3MgZG8gPGk+bm90PC9pPiBhdXRvbWF0aWNhbGx5IGZpcmUsIGhvd2V2ZXIgYWxsCi0gUHJvcGVydHkgVGFza3MgPGk+ZG88L2k+IGV4ZWN1dGUuPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNQcm9wZXJ0eUNvbnRhaW5lcigpIj48IS0tIC0tPjwvQT48SDM+Ci1pc1Byb3BlcnR5Q29udGFpbmVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5pc1Byb3BlcnR5Q29udGFpbmVyPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGEgVGFzayBpcyBzdWl0YWJsZSBmb3IgaG9sZGluZyBwcm9wZXJ0eSB2YWx1ZXMuPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QXR0cmlidXRlVmFsdWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEF0dHJpYnV0ZVZhbHVlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRBdHRyaWJ1dGVWYWx1ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9QUkU+Ci08REw+Ci08REQ+RWFjaCBUYXNrIHdpbGwgaG9sZCBpdHMgYXR0cmlidXRlcyBpbiBzb21lIG1hbm5lci4gVGhpcyBtZXRob2Qgd2lsbCBhbGxvdwotIHRoZSBUYXNrIGltcGxlbWVudGF0aW9uIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgaXRzIGF0dHJpYnV0ZS48L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQYXJlbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UGFyZW50PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sIj5UYXNrPC9BPiA8Qj5nZXRQYXJlbnQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoaXMgVGFzaydzIHBhcmVudCBUYXNrLiBJZiB0aGlzIFRhc2sgaXMgdGhlIHJvb3QgVGFzaywgdGhlbiB0aGlzCi0gbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwuPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0UGFyZW50KG9yZy5hcGFjaGUuYW50LnRhc2tzLlRhc2spIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRQYXJlbnQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldFBhcmVudDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sIj5UYXNrPC9BPiZuYnNwO3BhcmVudCk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBUYXNrJ3MgcGFyZW50LjwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldENoaWxkcmVuKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENoaWxkcmVuPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS9hbnQvdGFza3MvVGFzay5odG1sIj5UYXNrPC9BPltdIDxCPmdldENoaWxkcmVuPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgYW4gYXJyYXkgb2YgVGFzayBvYmplY3RzIHRoYXQgYXJlIHN1Ym9yZGluYXRlIHRvIHRoaXMgVGFzay48L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi08IS0tID09PT09PT09PT0gU1RBUlQgT0YgTkFWQkFSID09PT09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXgtYWxsLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIENMQVNTJm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sIiBUQVJHRVQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlRhc2suaHRtbCIgVEFSR0VUPSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6ICZuYnNwO0lOTkVSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDogJm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08IS0tID09PT09PT09PT09IEVORCBPRiBOQVZCQVIgPT09PT09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvZnJhbnRpYy93ZWJzaXRlL2ltYWdlcy9mcmFudGljX2xvZ28uZ2lmIGIvcHJvcG9zYWwvZnJhbnRpYy93ZWJzaXRlL2ltYWdlcy9mcmFudGljX2xvZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQwZGE0Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvd2Vic2l0ZS9pbWFnZXMvZnJhbnRpY19sb2dvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL2ZyYW50aWMvd2Vic2l0ZS9pbWFnZXMvdGFza19oaWVyYXJjaHkuZ2lmIGIvcHJvcG9zYWwvZnJhbnRpYy93ZWJzaXRlL2ltYWdlcy90YXNrX2hpZXJhcmNoeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGRiOTQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvZnJhbnRpYy93ZWJzaXRlL2ltYWdlcy90YXNrX2hpZXJhcmNoeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9mcmFudGljL3dlYnNpdGUvaW5kZXguaHRtbCBiL3Byb3Bvc2FsL2ZyYW50aWMvd2Vic2l0ZS9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDkxZGZlLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL2ZyYW50aWMvd2Vic2l0ZS9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QW50IFByb3Bvc2FsIC0gRnJhbnRpYzwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0ucXVvdGUgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMjRwdH0KLXAgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWZ9Ci1oMSB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgY29sb3I6ICMzMzAwOTk7IGZvbnQtd2VpZ2h0OiBib2xkfQotaDIgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiAjMzMwMENDfQotaDMgeyAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzMzMDBDQ30KLWEgeyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogIzk5MDBGRn0KLWE6aG92ZXIgeyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmV9Ci1oNSB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZn0KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Ci08aDEgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9mcmFudGljX2xvZ28uZ2lmIiB3aWR0aD0iMjUwIiBoZWlnaHQ9IjI2NCIgYWxpZ249ImxlZnQiPkFudCAKLSAgMi4wIFByb3Bvc2FsPC9oMT4KLTxoMiBhbGlnbj0iY2VudGVyIj5Db2RlIE5hbWUgLSBGcmFudGljPC9oMj4KLTxwPkZyYW50aWMgaGFyZGx5IGRlc2NyaWJlcyB0aGUgcHJvcG9zYWwgcHJvY2Vzcy4uLm1vcmUgbGlrZSBteSBjb2RpbmcgYW5kIGRlc2lnbiAKLSAgZWZmb3J0cyEgSSBhbSByZWxhdGl2ZWx5IG5ldyB0byBBbnQgYW5kIHRoZSBtYWlsIGxpc3QsIGFuZCBJIGhhdmUgcG9zdGVkIHNldmVyYWwgCi0gIGVtYWlscyByZWNlbnRseSByZWdhcmRpbmcgdGhlIHVzZSBvZiBET00gaW4gdGhlIGZ1dHVyZSBvZiBBbnQuIE9uY2UgSSBkaXNjb3ZlcmVkIAotICB0aGUgbWFpbCBhcmNoaXZlICh0aGFua3MgU2ltZW9uKSwgSSBoYWQgYSBjaGFuY2UgdG8gbm90aWNlIHRoYXQgbWFueSBvZiBteSBxdWVzdGlvbnMgCi0gIHdlcmUgYXNrZWQgYmVmb3JlLiBNeSBleHRlbXBvcmFuZW91cyBlbWFpbHMgd2VyZSBub3Qgd2l0aG91dCBjb25zZXF1ZW5jZSBpdCAKLSAgc2VlbXMuIEFmdGVyIHdyaXRpbmcgb25lIG9mIHRoZW0gaXQgc2V0IHNvbWUgd2hlZWxzIGluIG1vdGlvbiBmb3Igd2hhdCBJIGhvcGUgCi0gIGlzIGEgdXNlZnVsIGFkZGl0aW9uIHRvIHRoZSBjdXJyZW50IChhbmQgZ3Jvd2luZykgbnVtYmVyIG9mIHByb3Bvc2FscyBmb3IgQW50IAotICAyLjAuPC9wPgotPGNlbnRlcj4KLTx0YWJsZSB3aWR0aD0iNTAlIiBib3JkZXI9IjAiIGJnY29sb3I9IiM5OTMzRkYiIGNlbGxwYWRkaW5nPSIxIiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiPgotICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0iY2VudGVyIj4gCi0gICAgICAgICAgICA8dGQ+IAotICAgICAgICAgICAgICA8cD5JIHRoaW5rIHRoZSBjb25jZXB0IGJlaGluZCBBbnQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gYmUgYSAiVGFzayAKLSAgICAgICAgICAgICAgICBFeGVjdXRpb24gRW5naW5lIiwgYW5kIHRoZSBjb25jZXB0IG9mIFByb2plY3QgYW5kIFRhcmdldCBjYW4gYmUgCi0gICAgICAgICAgICAgICAgZ2VuZXJhbGl6ZWQgaW50byBhIHNwZWNpZmljIGZvcm0gb2YgYSBUYXNrLjwvcD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPC9jZW50ZXI+Ci08cD4mbmJzcDs8L3A+Ci08cD5UaGUgZW1haWwgbGlzdCBoYXMgcmVjZWl2ZWQgc29tZSByZXF1ZXN0cyBmcm9tIGRldmVsb3BlcnMgdG8gZXh0ZW5kIEFudCB0byAKLSAgc3VwcG9ydCBkaWZmZXJlbnQgcHJvYmxlbSBkb21haW5zLiBQZXRlciBEb25hbGQgaGFzIGxhdGNoZWQgb250byB0aGlzIGlzc3VlIAotICBhbmQgSSB1bmRlcnN0YW5kIHRoYXQgaGUgaGFzIGluY29ycG9yYXRlZCBzb21lIG9mIHRoZXNlIGlkZWFzIGludG8gaGlzIEFudCBwcm9wb3NhbC4gCi0gIEkgYWxzbyBoYXZlIHNlZW4gc29tZSB2ZXJ5IGltcHJlc3NpdmUgRE9NIHN1cHBvcnQgaW50ZWdyYXRlZCBpbnRvIEFudGlkb3RlLCAKLSAgYW4gZWxlZ2FudCBiYXNpcyBmb3IgYSBHVUkgZWRpdG9yIGNyYWZ0ZWQgYnkgU2ltZW9uIEZpdGNoLiBTaW0gYWNoaWV2ZXMgYSBncmVhdCAKLSAgZGVhbCBvZiBmbGV4aWJpbGl0eSBieSB1c2luZyB0aGUgVzNDIERPTSBhcyBhIHN1cGVyY2xhc3MgdG8gaGlzIFByb2plY3QvVGFyZ2V0L1Rhc2sgCi0gIG9iamVjdHMuIEhlIGhhcywgaW4gZWZmZWN0LCBhYnN0cmFjdGVkIGVhY2ggb2YgdGhlc2UgJnF1b3Q7Y29yZSZxdW90OyBBbnQgb2JqZWN0cyAKLSAgdW50aWwgdGhleSBhcmUgc2ltcGx5IERPTSBub2Rlcy48L3A+Ci08cD5QZXRlcidzIGFuZCBTaW0ncyBpZGVhcyBzdHJ1Y2sgYSBjaG9yZCBhbmQgSSB0aG91Z2h0IHRoYXQgUGV0ZXIncyBkZXNpcmUgdG8gCi0gIGFsbG93IEFudCB0byBicmVhayBmcmVlIGZyb20gdGhlIEJ1aWxkIGRvbWFpbiBhbmQgaW50byBJbnN0YWxsIGRvbWFpbnMgYnkgZXh0ZW5kaW5nIAotICBBbnQsIGNvdWxkIGJlIGFjaGlldmVkIGJ5IGxvb2tpbmcgYXQgdGhlIHByb2JsZW0gZnJvbSBhIGRpZmZlcmVudCBwb2ludCBvZiB2aWV3LiAKLSAgQXMgSSBzdGF0ZWQgaW4gbXkgZW1haWwsIHdlIGNhbiBhY2hpZXZlIGEgbXVjaCBoaWdoZXIgZGVncmVlIG9mIGZsZXhpYmlsaXR5IAotICBpbiBBbnQgYnkgZ2VuZXJhbGl6aW5nIG1vcmUuPC9wPgotPGgzPkRlc2lnbiBQcm9wb3NhbDwvaDM+Ci08cD5JIGJlbGlldmUgdGhhdCBBbnQgMi4wIHNob3VsZCBiZSByZS10ZXJtZWQgYSA8Yj48aT5UYXNrIEV4ZWN1dGlvbiBFbmdpbmU8L2k+PC9iPiwgCi0gIGFuZCB0aGUgY29yZSBvZiBBbnQgYmVjb21lcyB0aGUgRW5naW5lIGFuZCB0aGUgVGFzay4gVGhpcyBzZWVtcyBhIGxpdHRsZSByYWRpY2FsIAotICBjb25zaWRlcmluZyB0aGF0IHRoZSBQcm9qZWN0L1RhcmdldC9UYXNrIG9iamVjdCBtb2RlbCBoYXMgc2VydmVkIHVzIHNvIHdlbGwgCi0gIGluIEFudCAxLngsIGhvd2V2ZXIgaXQgaXMgdmVyeSBjbGVhciB0aGF0IFByb2plY3QgYW5kIFRhcmdldCBhcmUgc2ltcGxlIGFub3RoZXIgCi0gIHR5cGUgb2YgVGFzay48L3A+Ci08cD5BbiBlbm9ybW91cyBhbW91bnQgb2YgY29kZSBoYXMgYmVlbiBhZGRlZCB0byBtYWludGFpbiBQcm9qZWN0IGFuZCBUYXJnZXQgYXMgCi0gIHNlcGFyYXRlIGNsYXNzZXMgd2l0aCBkaXN0aW5jdCwgaGFyZC1jb2RlZCBiZWhhdmlvcnMuIEZyb20gdGhlIHByb29mLW9mLWNvbmNlcHQgCi0gIGNvZGUgdGhhdCBJIGhhdmUgYmVlbiBkZXZlbG9waW5nLCBJIGFtIGluc3BpcmVkIGJ5IGhvdyBtdWNoIG1vcmUgZWxlZ2FudCB0aGUgCi0gIGNvZGUgYmVjb21lcyB3aGVuIHRoaXMgc2ltcGxpZmllZCBtb2RlbCBpcyByZWFsaXplZC4gPC9wPgotCi08cD5IYXZpbmcgYSBiYXNlIFRhc2sgaW50ZXJmYWNlIHRoYXQgYWxsIFRhc2tzIGltcGxlbWVudCB3aWxsIGFsc28gb2ZmZXIgYSBnZW5lcmFsaXplZCAKLSAgYXBwcm9hY2ggdGhhdCBiZW5lZml0cyBHVUkncyBpbiBtdWNoIHRoZSBzYW1lIG1hbm5lciB0aGF0IHRoZSBET00gaGFzIGhlbHBlZCAKLSAgQW50aWRvdGUuIEFsc28sIGJ5IG1ha2luZyBUYXNrIGFuIGludGVyZmFjZSBpbnN0ZWFkIG9mIGEgY2xhc3MsIHdlIGNhbiBmaW5hbGx5IAotICBmcmVlIG91cnNlbHZlcyBvZiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpY3MuPC9wPgotPHA+QXMgSSB3YXMgd3JpdGluZyB0aGUgY29uY2VwdCBjb2RlLCBpdCBzdHJ1Y2sgbWUgdGhhdCBJIHdhcyB0b28gd29ycmllZCBhYm91dCAKLSAgdGhlIFhNTC4gU2ltZW9uIEZpdGNoIG1lbnRpb25lZCBpbiBhbiBlbWFpbCBpbiBlYXJseSBEZWNlbWJlciwgdGhlIHBvc3NpYmlsaXR5IAotICBvZiBzdG9yaW5nIGJ1aWxkIHNjcmlwdHMgaW4gYSBkYXRhYmFzZS4gSSB0aGluayB0aGlzLCBhbG9uZyB3aXRoIHZhcmlvdXMgY29tbWVudHMgCi0gIGFib3V0IERPTSBkZXBlbmRlbmNpZXMgZnJvbSBQZXRlciBEb25hbGQsIEpvc2UgQWxiZXJ0byBGZXJuYW5kZXosIGFuZCBTdGVmYW4gCi0gIEJvZGV3aWcgbWFkZSBtZSByZWFsaXplIHRoYXQgQ29yZSBBbnQgc2hvdWxkbid0IGNhcmUgd2hlcmUgdGhlIGJ1aWxkIHNjcmlwdCAKLSAgbGl2ZXMgb3IgaW4gd2hpY2ggZm9ybWF0IGl0IGlzIHN0b3JlZC4gSXQgaXMgdGhlIG9iamVjdCBtb2RlbCB0aGF0IGlzIHByaW1hcmlseSAKLSAgaW1wb3J0YW50LjwvcD4KLTxoMz5UaGUgVGFzazwvaDM+Ci08cD5UaGUgY29ybmVyc3RvbmUgb2YgdGhpcyBwcm9wb3NhbCBoaW5nZXMgb24gdGhlIDxhIGhyZWY9IlRhc2suaHRtbCIgdGFyZ2V0PSJuZXciPlRhc2s8L2E+IAotICBJbnRlcmZhY2UuIEl0IGlzIHRoZSBvbmx5IHR5cGUgb2YgZXh0ZXJuYWwgb2JqZWN0IHRoYXQgdGhlIEV4ZWN1dGlvbiBFbmdpbmUgCi0gIGtub3dzIGhvdyB0byBoYW5kbGUuIEl0IGlzIGluIHRoaXMgc2ltcGxpY2l0eSB0aGF0IHRoZSBtb3N0IHBvd2VyZnVsIEFudCBjYW4gCi0gIGJlIHJlYWxpemVkLjwvcD4KLTxwPlRoZSBUYXNrIGlzIGFuIG9iamVjdCB0aGF0IGlzIGF3YXJlIG9mIGl0J3MgcGxhY2UgaW4gYWhpZXJhcmNoeS4gVG8gdGhpcyBlbmQgCi0gIGl0IGlzIGF3YXJlIG9mIGl0cyBwYXJlbnQgYW5kIGl0cyBjaGlsZHJlbi4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGEgcnVudGltZSAKLSAgZGVwZW5kZW5jeSBhbmQgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKG9yIHRoZSBUYXNrIGl0c2VsZikgY2FuIGR5bmFtaWNhbGx5IGNoYW5nZSAKLSAgdGhlIHJlbGF0aW9uc2hpcCBvZiBUYXNrcy48L3A+Ci08dGFibGUgYm9yZGVyPSIwIiBhbGlnbj0ibGVmdCI+Ci0gIDx0cj4gCi0gICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvdGFza19oaWVyYXJjaHkuZ2lmIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjE0MCI+PC90ZD4KLSAgPC90cj4KLSAgPHRyIGFsaWduPSJjZW50ZXIiPiAKLSAgICA8dGQ+IAotICAgICAgPGg1PjxpPkZpZ3VyZSAxPC9pPjwvaDU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08cD5LZXkgdG8gYmVpbmcgYWJsZSB0byBtYW5pcHVsYXRlIFRhc2tzIGF0IHJ1bnRpbWUgaXMgc29tZSBzb3J0IG9mIG5hbWluZyBjb252ZW50aW9ucy4gCi0gIEN1cnJlbnRseSBpbiB0aGUgRnJhbnRpYyBkZXNpZ24gaXMgdGhlIGNvbmNlcHQgb2YgYSBUYXNrIG5hbWUuIFRhc2tzLCBiZWluZyAKLSAgaGllcmFyY2hpY2FsLCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHNlZSBmaWd1cmUgMSkuIElmIAotICBlYWNoIFRhc2sgaXMgYXNzaWduZWQgYSBuYW1lIHRoYXQgaXMgdW5pcXVlIGFtb25nIGl0cyBzaWJsaW5ncywgd2UgY2FuIHRoZW4gCi0gIGhhdmUgYSBwb3dlcmZ1bCBtZWFucyBvZiBsb2NhdGluZyBhbmQgcmVmZXJlbmNpbmcgYSBwYXJ0aWN1bGFyIFRhc2sgYW55d2hlcmUgCi0gIGluIHRoZSBoaWVyYXJjaHkuIDwvcD4KLTxwPkZvciBleGFtcGxlLCB0aGUgUHJvcGVydHkgVGFzayBiZWxvdyB0aGUgVGFyZ2V0IG5hbWVkICZxdW90O2J1aWxkJnF1b3Q7IGhhcyAKLSAgYSBuYW1lIG9mICZxdW90O3Byb3AzJnF1b3Q7LCBob3dldmVyIGl0cyAmcXVvdDtmdWxseS1xdWFsaWZpZWQmcXVvdDsgbmFtZSBpcyAKLSAgL3Jvb3QvYnVpbGQvcHJvcDMuIFRoZSByb290IG9mIGEgVGFzayBleGVjdXRpb24gbGlzdCBpcyAmcXVvdDsvJnF1b3Q7IGFuZCB0aGUgCi0gIHRhZyBuYW1lLCBpbiBvdXIgZXhhbXBsZSAvcm9vdC4gSW4gdGhlIGNvbmNlcHQgc291cmNlIGNvZGUgSSB1c2UgdGhpcyBwcmluY2lwYWwgCi0gIG9mIGhpZXJhcmNoaWNhbCBuYW1pbmcgdG8gc3VwcG9ydCBkZXBlbmRlbmNpZXMuIEN1cnJlbnRseSwgSSBhbSB0cmVhdGluZyB0aGVzZSAKLSAgVGFzayBuYW1lcyBhcyBkaXJlY3RvcmllcyBhbmQgbm90IGFzIGZpbGVzLiBUaGlzIHNob3VsZCBwZXJoYXBzIGNoYW5nZSBzbGlnaHRseSAKLSAgdG8gdGhlIGZpbGVuYW1lIGFwcHJvYWNoLiBJbiB0aGUgZGlyZWN0b3J5LWJhc2VkIGFwcHJvYWNoLCBhIHNpYmxpbmcgaXMgbmFtZWQgCi0gICZxdW90Oy4uL3NpYmxpbmcmcXVvdDsuIEl0IHdvdWxkIGJlIG1vcmUgY29udmVuaWVudCB0byBub3QgcmVxdWlyZSB0aGUgJnF1b3Q7Li4vJnF1b3Q7LiAKLSAgSW4gZmFjdCwgSSB0aGluayBJIGhhdmUgY29udmluY2VkIG15c2VsZiBvZiB0aGlzLjwvcD4KLTxoMz4gVGFzayBEaXNjb3Zlcnk8L2gzPgotPHA+SSBoYXZlbid0IGNvZGVkIHRoaXMgcG9ydGlvbiwgaG93ZXZlciBJIHBsYW4gb24gYmFzaW5nIGl0IG9uIER1bmNhbidzIGlkZWEgCi0gIG9mIHVzaW5nIHRoZSBKYXIgbWFuaWZlc3RzIHRvIGxvY2F0ZSBhbmQgaWRlbnRpZnkgdGFza3Mgb24gdGhlIGNsYXNzcGF0aC4gSSAKLSAgd2FzIGZpcnN0IGV4cG9zZWQgdG8gdGhpcyB0ZWNobmlxdWUgaW4gdGhlIE9wZW5Ub29scyBBUEkgb2YgQm9ybGFuZCdzIEpCdWlsZGVyIAotICBJREUsIGFuZCBJIGhhdmUgc2luY2UgdXNlZCBpdCBvbiBhIGxhcmdlIHByb2plY3QgZm9yIGEgY29uc3VsdGluZyBjdXN0b21lci48L3A+Ci08cD5UaGUgY2xhc3NwYXRoIGlzIHNjYW5uZWQgYXQgcnVudGltZSB0byBsb2NhdGUgYWxsIGRpcmVjdG9yaWVzIGFuZCBqYXIgZmlsZXMuIAotICBUaGVzZSBkaXJlY3RvcmllcyBhbmQgamFyIGZpbGVzIHdpbGwgaGF2ZSBhIG1hbmlmZXN0IGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gCi0gIG1hbmlmZXN0IGVudHJpZXMgdGhhdCBzZXJ2ZSB0byB0aWUgYSBzdHJpbmcgdG9rZW4gdG8gdGhlIFRhc2sgaW1wbGVtZW50YXRpb24gCi0gIGNsYXNzIHJlc3BvbnNpYmxlIGZvciB0aGF0IHRva2VuLiBEaXJlY3RvcmllcyBjYW5ub3QgaGF2ZSBtYW5pZmVzdHMgcGVyIHNlLCAKLSAgYnV0IHdlIHdpbGwgdXRpbGl6ZSBhIGZpbGUsIG9uZS1sZXZlbCB1cCBmcm9tIHRoZSBkaXJlY3RvcnksIHdpdGggYSBuYW1lICZxdW90O2RpcmVjdG9yeS1uYW1lLm1mJnF1b3Q7LiAKLSAgVGhpcyBmaWxlIHdpbGwgYmUgaW4gdGhlIGZvcm1hdCBvZiBhIG1hbmlmZXN0IGZpbGUuIFRoaXMgd2lsbCBhbGxvdyBkZXZlbG9wZXJzIAotICB0byBjcmVhdGUgYW5kIHRlc3QgbmV3IFRhc2tzIHdpdGhvdXQgdGhlIGJ1cmRlbiBvZiBoYXZpbmcgdG8gbWFrZSBhIEphciBhcmNoaXZlIAotICBldmVyeSB0aW1lLjwvcD4KLTxoMz5BdHRyaWJ1dGUgVmFsaWRhdGlvbjwvaDM+Ci08cD5CcmV0dCBNY0xhdWdobGluIGludHJvZHVjZWQgYSB2ZXJ5IGludGVyZXN0aW5nIHRlY2hpcXVlIHRvIHBlcmZvcm0gb2JqZWN0IHZhbGlkYXRpb24gCi0gIHVzaW5nIFhNTCBTY2hlbWEgaW4gYSBzZXJpZXMgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhd29ybGQuY29tL2phdmF3b3JsZC9qdy0wOS0yMDAwL2p3LTA5MDgtdmFsaWRhdGlvbi5odG1sIj5KYXZhV29ybGQgCi0gIGFydGljbGVzPC9hPi4gSSBjYW4gc2VlIHRoaXMgdGVjaG5pcXVlIGFwcGxpZWQgdG8gVGFza3MgYXMgd2VsbC4gVGhlIHVzZXIgY291bGQgCi0gIGluY2x1ZGUgYSBzY2hlbWEgd2l0aCBhIHNwZWNpYWwgbmFtZSBpbiB0aGUgamFyIGZpbGUgdGhhdCBhY2NvbXBhbmllcyB0aGUgVGFza3MuIAotICBUaGlzIHNjaGVtYSBjb3VsZCBiZSB1c2VkIGF0IHJ1bnRpbWUgdG8gdmFsaWRhdGUgYSBUYXNrJ3MgYXR0cmlidXRlcy48L3A+Ci08cD5JIHdvdWxkIGltYWdpbmUgdGhhdCB0aGlzIGZlYXR1cmUgd291bGQgYmUgb3V0c2lkZSBvZiB3aGF0IGlzIGNvbnNpZGVyZWQgJnF1b3Q7Y29yZSZxdW90OyAKLSAgQW50LjwvcD4KLTxoMz5UaGUgRXhlY3V0aW9uIEVuZ2luZTwvaDM+Ci08cD5UaGUgZW5naW5lIG9ubHkga25vd3MgaG93IHRvIHByb2Nlc3MgVGFzayBvYmplY3RzLCBhbmQgdGhhdCBpcyB3aGF0IG1ha2VzIGl0IAotICBleHRyZW1lbHkgZWZmaWNpZW50LiBJdCBpcyBtb2RlbGVkIGFmdGVyIGhvdyBJIGJlbGlldmUgYSBjb21waWxlciwgb3IgY29tbWFuZCAKLSAgaW50ZXJwcmV0ZXIgd291bGQgZnVuY3Rpb24uIEl0IGNvbnRhaW5zIGEgY2FsbCBzdGFjayB3aGljaCBJIGNhbGwgYSA8aT48Yj50YXNrIAotICBzdGFjazwvYj48L2k+LCBhbmQgdGhpcyB0YXNrIHN0YWNrIGlzIHVuZGVyIGNvbXBsZXRlIGNvbnRyb2wgb2YgdGhlIGVuZ2luZS4gCi0gIFRoaXMgaXMgbm90IHRvIHNheSB0aGF0IFRhc2tzIGNhbm5vdCBtYW5pcHVsYXRlIHRoZSB0YXNrIHN0YWNrIGF0IHJ1bnRpbWUsIGJlY2F1c2UgCi0gIHRoZXkgZG8uIEhvd2V2ZXIsIGFsbCBvZiB0aGlzIGFjY2VzcyB0YWtlcyBwbGFjZSB1bmRlciB0aGUgd2F0Y2hmdWwgZXllIG9mIHRoZSAKLSAgZXhlY3V0aW9uIGVuZ2luZS4gPC9wPgotPGgzPlByb3BlcnRpZXM8L2gzPgotPHA+S2VlcGluZyB0cmFjayBvZiBwcm9wZXJ0aWVzIGlzIGNsb3NlbHkgdGllZCB0byB0aGUgZXhlY3V0aW9uIGVuZ2luZSwgYW5kIEkgCi0gIG1vZGVsZWQgaXQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIGhvdyBJIGJlbGlldmUgY29tcGlsZXJzIG11c3Qgd29yay4gSSAKLSAgdXNlIHRoZSBjb25jZXB0IG9mIGEgaGllcmFyY2hpY2FsIHNlcmllcyBvZiBoYXNodGFibGVzIHRoYXQgc3VwcG9ydCB0aGUgY29uY2VwdCAKLSAgb2Ygc2NvcGUgaW4gcHJvcGVydHkgbGlzdHMuPC9wPgotPHA+SSBoYWQgb3JpZ2luYWxseSBwdXQgdGhlIGNvbmNlcHQgb2YgYSBwcm9wZXJ0eSBpbnRvIGEgVGFzayBhbmQgY29tcGxldGVseSBpbXBsZW1lbnRlZCAKLSAgdGhlIGJ1Z2dlci4gSXQgdHVybmVkIG91dCBkdXJpbmcgdGVzdGluZyB0aGF0IG15IGxvZ2ljIHdhcyBmbGF3ZWQuIEl0IHNlZW1lZCAKLSAgdG8gd29yayB3ZWxsIGF0IGZpcnN0Li4uYSBwcm9wZXJ0eSBkZWZpbmVkIGluIGEgVGFzayB3b3VsZCBiZSBhdmFpbGFibGUgdG8gYWxsIAotICBjaGlsZCBUYXNrcywgYnV0IHVuYXZhaWxhYmxlIHRvIGFueSBhbmNlc3RvcnMuIFdoZW4gYSBUYXNrIHJlcXVlc3RlZCB0aGUgbGF0ZXN0IAotICBkYXRhIG9uIGEgcHJvcGVydHksIGl0IHdvdWxkIGxvb2sgaW4gaXRzIHByb3BlcnR5IGxpc3QuIElmIGl0IHdhc24ndCBmb3VuZCB0aGVyZSwgCi0gIGl0IHdvdWxkIGxvb2sgaW4gaXRzIHBhcmVudCdzIGxpc3QsIGFuZCBzbyBvbi4gSW5zdGFudCBzY29wZS48L3A+Ci08cD5Ib3dldmVyLCBpdCBiZWNhbWUgcXVpY2tseSBhcHBhcmVudCB0aGF0IHByb3BlcnRpZXMgYXJlIGEgJnF1b3Q7cnVudGltZSZxdW90OyAKLSAgY29uc2lkZXJhdGlvbi4gVGhpcyBpcyBzb21ldGhpbmcgdGhhdCBKb3NlIEFsYmVydG8gRmVybmFuZGV6IHdpbGwgbm90IGxldCBhbnkgCi0gIG9mIHVzIGZvcmdldCBmb3IgbG9uZy4gOi0pIFdoYXQgSSBuZWVkZWQgd2FzIHRvIG1vdmUgdGhpcyBoaWVyYXJjaGljYWwgY2hhaW4gCi0gIG9mIHByb3BlcnR5IGxpc3RzIGludG8gdGhlIGVuZ2luZS4gRm9yIGVhY2ggbmV3IFRhc2sgZXhlY3V0ZWQsIGEgbmV3IHByb3BlcnR5IAotICBsaXN0IGlzIGNyZWF0ZWQgYW5kIGFsc28gcHVzaGVkIG9udG8gdGhlIHN0YWNrLiBJdCBzZWVtcyB0byB3b3JrIGxpa2UgYSBjaGFtcC48L3A+Ci08cD5JIGFsc28gY29kZWQgdXAga2V5IHN1YnN0aXR1dGlvbiBpbnRvIHRoZSBnZXRQYXJhbWV0ZXJWYWx1ZSgpIGV2ZW50cy4gVGhleSAKLSAgc2VlbSB0byB3b3JrIGZpbmUsIGFsdGhvdWdoIEkgaGF2ZW4ndCB3b3JrZWQgdXAgZW5vdWdoIHRlc3QgY2FzZXMgdG8gYmUgc3VyZS48L3A+Ci08cD5PbmUgYWRkaXRpb25hbCBjb29sIGZlYXR1cmUgaXMgdGhhdCBwYXJhbWV0ZXJzIG5lZWQgbm90IG9ubHkgaG9sZCBTdHJpbmdzLiAKLSAgSSB0aG91Z2h0IHRoYXQgdGhlcmUgd291bGQgYmUgb2NjYXNpb25zIHdoZXJlIHByb3BlcnRpZXMgd2lsbCBob2xkIFRhc2tzIGFzIAotICB3ZWxsLiBJIGJlbGlldmUgdGhpcyB3aWxsIHR1cm4gb3V0IHRvIGJlIGEgcHJpbWUgbWVjaGFuaXNtIGZvciBjcmVhdGluZyByZWZlcmVuY2UgCi0gIGlkIFRhc2tzIGxpa2UgdGhlIGN1cnJlbnQgRmlsZVNldCBvYmplY3RzIGFuZCByZWZlcnJpbmcgdG8gdGhlbSBpbiBvdGhlciBUYXNrcyAKLSAganVzdCBhcyB5b3Ugd291bGQgYW55IHByb3BlcnR5IHZhbHVlLjwvcD4KLTxoMz5BdHRyaWJ1dGVzPC9oMz4KLTxwPkkgaGF2ZW4ndCBzcGVudCBhbnkgdGltZSBhZGRyZXNpbmcgd2hhdCBpcyBjdXJyZW50bHkgcmVmZXJyZWQgdG8gYSBUYXNrJ3MgYXR0cmlidXRlcyAKLSAgaW4gQW50IDEueC4gSSBzdGlsbCBuZWVkIHRvIHRoaW5rIGFib3V0IHRoaXMgY29uY2VwdCBzb21lIG1vcmUsIGJ1dCBhcyBJIGR3ZWxsIAotICBvbiB3aGF0IGFuIGF0dHJpYnV0ZSBpcywgSSBrZWVwIGNvbWluZyBiYWNrIHRvIHRoZSBwcm9wZXJ0aWVzLiBKdXN0IGxpa2UgYSBwcm9wZXJ0eSAKLSAgZnVuY3Rpb25zIGFzIGEgc2NvcGVkIHZhcmlhYmxlLCBhbiBhdHRyaWJ1dGUgaXMgdGhlIHNhbWUgdGhpbmcuIEFsYmVpdCwgaXRzIAotICBzY29wZSBpcyBsaW1pdGVkIHRvIHRoZSBUYXNrIHRoYXQgdXNlcyBpdCwgYnV0IHNvIHdoYXQuPC9wPgotPGgzPkV4ZWN1dGlvbiBFdmVudHM8L2gzPgotPHA+VGhlIGV4ZWN1dGlvbiBlbmdpbmUgYWxzbyBzdXBwb3J0cyBhIGZldyBrZXkgZXZlbnRzIHRoYXQgY2FuIG9jY3VyIGR1cmluZyB0aGUgCi0gIGV4ZWN1dGlvbiBsaWZlY3ljbGUuIEN1cnJlbnRseSBldmVudHMgZXhpc3QgZm9yIGV4ZWN1dGlvbiBzdGFydC9maW5pc2gsIHRhc2sgCi0gIHN0YXJ0L2V4ZWN1dGUvZmluaXNoLCBleGNlcHRpb25zLCBhbmQgc2ltcGxlIG1lc3NhZ2luZy4gVGhlIG1lc3NhZ2luZyBldmVudCAKLSAgYWxsb3dzIFRhc2tzIHRvIGNvbW11bmljYXRlIGluIGEgc3RhbmRhcmQgd2F5IHRoYXQgd2lsbCBsZXZlcmFnZSB0aGUgZW5naW5lJ3MgCi0gIGV2ZW50IHN5c3RlbSB0byBhbGxvdyB2YXJpb3VzIGZyb250LWVuZHMgdG8gaW50ZWxsaWdlbnRseSBhbmQgYXBwcm9wcmlhdGVseSAKLSAgcHJvY2VzcyB0aGUgb3V0cHV0LjwvcD4KLTxoMz5TY3JpcHRpbmc8L2gzPgotPHA+SSBoYXZlIG5vIGV4cGVyaWVuY2Ugd2l0aCBpbmNvcnBvcmF0aW5nIGEgc2NyaXB0aW5nIGVuZ2luZSBpbnRvIGFuIGVuZ2luZSwgCi0gIGJ1dCBJIGRvIGtub3cgdGhhdCB0aGlzIHByb3Bvc2FsIHNob3VsZCBhZGRyZXNzIHRoZSBwcmltYXJ5IGlzc3VlcyB0aGF0IHN1cnJvdW5kIAotICBzdWNoIGFuIGludGVncmF0aW9uLiBJIHRoaW5rIHRoYXQgdHdvIGZlYXR1cmVzIHdoaWNoIGFyZSBhYnNvbHV0ZWx5IGVzc2VudGlhbCAKLSAgYXJlOjwvcD4KLTxwPiBQcm92aWRlIHNvbWUgc29ydCBvZiBuYW1pbmcgY29udmVudGlvbiBzdWNoIHRoYXQgYSBwYXJ0aWN1bGFyIFRhc2sgY2FuIGJlIAotICBmb3VuZCBnaXZlbiBhbiBhYnNvbHV0ZSBuYW1lIG9yIGEgbmFtZSByZWxhdGl2ZSB0byBhbm90aGVyIFRhc2suIFRoaXMgaXMgY29tcGxldGUgCi0gIGFuZCB3b3JraW5nIGluIHRoZSBjb25jZXB0IGNvZGUuPC9wPgotPHA+TGVhdmUgYWxsIGRlY2lzaW9ucyByZWdhcmRpbmcgcHJvcGVydHkgZXZhbHVhdGlvbiBhbmQgVGFzaydzIGtub3dsZWRnZSBvZiB0aGVzZSAKLSAgcHJvcGVydGllcyB1bnRpbCB0aGUgbGFzdCBwb3NzaWJsZSBtb21lbnQuPC9wPgotPGgzPlJlY3Vyc2l2ZSBUYXNrczwvaDM+Ci08cD5JIHJlYWxpemUgdGhhdCBBbnQgMS54IHNwZW50IHNvbWUgY2xvY2sgY3ljbGVzIGRlZGljYXRlZCB0byByZXNvbHZpbmcgY2lyY3VsYXIgCi0gIHJlZmVyZW5jZXMgaW4gdGhlIFRhc2sgZGVmaW5pdGlvbnMuIEkgZGlkbid0IHNwZW5kIGFueSB0aW1lIG9uIHRoYXQgaW50ZW50aW9uYWxseS4gCi0gIEkgYW0gbm90IHNvIHN1cmUgdGhhdCB0aGUgZWxpbWluYXRpb24gb2YgY2lyY3VsYXIgcmVmZXJlbmNlcyBpcyBhIGdvb2QgaWRlYS4gCi0gIEVzcGVjaWFsbHkgbW92aW5nIGZvcndhcmQsIHdpdGggdGhlIGluY29ycG9yYXRpb24gb2YgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UsIEkgCi0gIGNhbiBlbnZpc2lvbiBUYXNrcyB0aGUgYXNzZW1ibGVyIHdhbnRzIHRvIGV4ZWN1dGUgcmVwZWF0ZWRseSwgcGVyaGFwcyBldmVuIHJlY3Vyc2l2ZWx5LiAKLSAgSSB0aGluayB3ZSBzaG91bGQgdHJlYXQgdGhpcyB0aGUgc2FtZSB3YXkgdGhhdCBhbnkgbW9kZXJuIGNvbXB1dGVyIGxhbmd1YWdlIAotICB3b3VsZCAmIzE1MTsgPGk+Y2F2ZWF0IGVtcHRvcjwvaT4uPC9wPgotPGgzPlN1bW1hcnk8L2gzPgotPHA+VGhlcmUgaXMgYSBsb3QgbW9yZSB0byBkbyB3aXRoIHRoaXMgcHJvcG9zYWwgYW5kIHRoZSBjb25jZXB0IGNvZGUuIEl0IGhhcyBiZWVuIAotICBhbiBleGNpdGluZyB3ZWVrZW5kIGdldHRpbmcgdGhlc2UgdGhvdWdodHMgZG93biBhbmQgdHJ5aW5nIHRvIGJhY2sgdGhlbSB1cC4gCi0gIEkgbG9vayBmb3J3YXJkIHRvIGNvbGxhYm9yYXRpbmcgd2l0aCBvdGhlcnMgb24gdGhlIGxpc3QgaWYgdGhleSB3aXNoIHRvIGhlbHAgCi0gIG1lLCBldmVuIHRob3VnaCBJIGFtIGluIHByb3Bvc2FsIHBoYXNlLiBJIGNlcnRhaW5seSBkb24ndCBrbm93IG11Y2ggYWJvdXQgWE1MIAotICBwYXJzaW5nIGFuZCBJIGNvdWxkIHVzZSBzb21lIGlkZWFzIG9uIGhvdyB0byBmdXJ0aGVyIG15IHN0YXJ0aW5nIG1vZGVsLiBJIHdvdWxkIAotICBsb3ZlIHRvIHNob3cgdGhlIEFudCBjb3JlIG1vZGVsIGJ1aWx0IGluIGEgQnVpbGRlciBhZ25vc3RpYyBtYW5uZXIuIEJhc2ljYWxseSwgCi0gIEkgd2FudCBYTUwgdG8gYmUgYW4gb3B0aW9uLCBub3QgYSByZXF1aXJlbWVudC48L3A+Ci08cD5JIHdvdWxkIGFsc28gYmUgaW50ZXJlc3RlZCBpbiBwZXJoYXBzIGJ1aWxkaW5nIGFuIGFkYXB0ZXIgdGFzayB0aGF0IHdpbGwgYWxsb3cgCi0gIEFudCAxLnggdGFza3MgdG8gYmUgcmV1c2VkIHVuY2hhbmdlZCBpbiB0aGUgRnJhbnRpYyBwcm9wb3NhbC4gVGhlIGNvbmNlcHQgb2YgCi0gIGEgVGFzayBoYXNuJ3QgY2hhbmdlZCBtdWNoLCBzbyBwZXJoYXBzIHRoaXMgaXMgYSBwb3NzaWJpbGl0eS48L3A+Ci08cD5BcyBhbHdheXMsIHlvdXIgZmVlZGJhY2sgaXMgd2VsY29tZS4gSSBleHBlY3QgdGhhdCBJIGhhdmUgbWlzc2VkIHNvbWUgbWFqb3IgCi0gIGhvbGVzIGFuZCBJIHdvdWxkIGxpa2UgdGhlIG9wcG9ydHVuaXR5IHRvIHdvcmsgd2l0aCBvdGhlcnMgdG8gcGx1ZyB0aGVtIHVwITwvcD4KLTxwPjxhIGhyZWY9Im1haWx0bzpqaW1jb29rQHZpc3VhbHhzLmNvbSI+SmltIENvb2s8L2E+PGJyPgotICA8YSBocmVmPSJodHRwOi8vd3d3LnZpc3VhbHhzLmNvbS8iPlZpc3VhbCBYUzwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvYnVpbGQueG1sIGIvcHJvcG9zYWwvbXV0YW50L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwYzQyYS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iamFycyI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMvbWFpbiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21wb25lbnQuc3JjLmRpciIgdmFsdWU9IiR7c3JjLmRpcn0vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIHZhbHVlPSJidWlsZC9jbGFzc2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbXBvbmVudC5jbGFzc2VzLmRpciIgdmFsdWU9Im9yZy9hcGFjaGUvYW50L2NvbXBvbmVudCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5qYXZhZG9jcyIgdmFsdWU9ImJ1aWxkL2phdmFkb2NzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYiIgdmFsdWU9IiR7YnVpbGQuZGlyfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZnJvbnRlbmQubWFuaWZlc3QiIHZhbHVlPSIke3NyYy5kaXJ9L29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL21hbmlmZXN0Lm1mIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVnZy5tYW5pZmVzdCIgdmFsdWU9IiR7c3JjLmRpcn0vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvZWdnbWFuaWZlc3QubWYiLz4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxkZXBlbmQgc3JjZGlyPSIke3NyYy5kaXJ9IgotICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGNsb3N1cmU9InllcyIgCi0gICAgICAgICAgICAgICAgY2FjaGU9IiR7YnVpbGQuZGlyfS9kZXBjYWNoZSIvPgotICAgICAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IgotICAgICAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIKLSAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgZGVidWc9InRydWUiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGFzayI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkaW5nIFRhc2sgamFyIGZyb20gJHtjb21wb25lbnQuY2xhc3Nlcy5kaXJ9LyR7dGFza3NldH0vKiovKi5jbGFzcyIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQubGlifS90YXNrLyR7dGFza3NldH0udHNrIiAKLSAgICAgICAgICAgICBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtjb21wb25lbnQuc3JjLmRpcn0vJHt0YXNrc2V0fSIgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9IkFOVC1JTkYiIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9ImFudGxpYi54bWwiLz4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7Y29tcG9uZW50LmNsYXNzZXMuZGlyfS8ke3Rhc2tzZXR9LyoqLyouY2xhc3MiIC8+Ci0gICAgICAgIDwvamFyPgotICAgIDwvdGFyZ2V0PgotCi0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJqYXJzIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifS90YXNrIi8+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5saWJ9L2Zyb250ZW5kLmphciIgCi0gICAgICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIKLSAgICAgICAgICAgICBtYW5pZmVzdD0iJHtmcm9udGVuZC5tYW5pZmVzdH0iPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvKi5jbGFzcyIgLz4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5saWJ9L2VnZy5qYXIiIAotICAgICAgICAgICAgIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgICAgbWFuaWZlc3Q9IiR7ZWdnLm1hbmlmZXN0fSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2FudC9mcm9udGVuZC9SZW1vdGVMYXVuY2hlci5jbGFzcyIgLz4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYW50L2NvcmUvc3VwcG9ydC9BbnRDbGFzc0xvYWRlci5jbGFzcyIgLz4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5saWJ9L2NvcmUuamFyIiAKLSAgICAgICAgICAgICBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYW50L2NvcmUvKiovKi5jbGFzcyIgLz4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iYnVpbGQtdGFzayI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFza3NldCIgdmFsdWU9ImNvcmUiLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLXRhc2siPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRhc2tzZXQiIHZhbHVlPSJmaWxlIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10YXNrIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXNrc2V0IiB2YWx1ZT0idGhyZWFkIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQubGlifSI+Ci0gICAgICAgICAgPGZpbGVzZXQgZGlyPSJsaWIiLz4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5qYXZhZG9jc30iLz4KLSAgICAgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLioiCi0gICAgICAgICAgICAgICAgIHNvdXJjZXBhdGg9IiR7c3JjLmRpcn0iCi0gICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuamF2YWRvY3N9IgotICAgICAgICAgICAgICAgICBhdXRob3I9InRydWUiCi0gICAgICAgICAgICAgICAgIHZlcnNpb249InRydWUiCi0gICAgICAgICAgICAgICAgIHdpbmRvd3RpdGxlPSJBbnQgMi4wIEFQSSIKLSAgICAgICAgICAgICAgICAgZG9jdGl0bGU9IkFudCAyLjAiCi0gICAgICAgICAgICAgICAgIHByaXZhdGU9InRydWUiCi0gICAgICAgICAgICAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICYjMTY5OyAyMDAxIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiI+Ci0gICAgICAgICAgPGdyb3VwIHRpdGxlPSJBbnQgQ29yZSIgcGFja2FnZXM9Im9yZy5hcGFjaGUuYW50LmNvcmUqIiAvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iRnJvbnQgRW5kIiBwYWNrYWdlcz0ib3JnLmFwYWNoZS5hbnQuZnJvbnRlbmQqIiAvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iWE1MIFBhcnNpbmciIHBhY2thZ2VzPSJvcmcuYXBhY2hlLmFudC54bWwqIiAvPgotICAgICAgICA8L2phdmFkb2M+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9ib290c3RyYXAvb3JnL2FwYWNoZS9hbnQvYm9vdHN0cmFwL0Jvb3RzdHJhcExvYWRlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9ib290c3RyYXAvb3JnL2FwYWNoZS9hbnQvYm9vdHN0cmFwL0Jvb3RzdHJhcExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzQzMjE4Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvYm9vdHN0cmFwL29yZy9hcGFjaGUvYW50L2Jvb3RzdHJhcC9Cb290c3RyYXBMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmJvb3RzdHJhcDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotLyoqCi0gKiBCb290c3RyYXAgY2xhc3MgdG8gYnVpbGQgdGhlIHJlc3Qgb2YgYW50IHdpdGggYSBtaW5pbXVtIG9mIHVzZXIgaW50ZXJ2ZW50aW9uCi0gKgotICogVGhlIGJvb3RzdHJhcCBjbGFzcyBpcyBhYmxlIHRvIGFjdCBhcyBhIGNsYXNzIGxvYWRlciB0byBsb2FkIG5ldyBjbGFzc2VzL2phcnMKLSAqIGludG8gdGhlIFZNIGluIHdoaWNoIGl0IGlzIHJ1bm5pbmcuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCb290c3RyYXBMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7Ci0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgUkVDVVJTSU9OX0dVQVJEID0gImFudC5ib290c3RyYXAucmVjdXJzaW9uR3VhcmQiOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEwMjQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjbGFzc3BhdGhFbGVtZW50czsKLSAgICAKLSAgICBwdWJsaWMgQm9vdHN0cmFwTG9hZGVyKFN0cmluZyBjbGFzc3BhdGgpIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NwYXRoLCBGaWxlLnBhdGhTZXBhcmF0b3IpOwotICAgICAgICBjbGFzc3BhdGhFbGVtZW50cyA9IG5ldyBTdHJpbmdbdG9rZW5pemVyLmNvdW50VG9rZW5zKCldOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICsraSkgewotICAgICAgICAgICAgY2xhc3NwYXRoRWxlbWVudHNbaV0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkKLSAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSBuYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7Ci0gICAgICAgIElucHV0U3RyZWFtIGNsYXNzU3RyZWFtID0gZ2V0UmVzb3VyY2VTdHJlYW0ocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjbGFzc1N0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgeyAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzRnJvbVN0cmVhbShjbGFzc1N0cmVhbSwgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmVhbSB0byByZWFkIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggYSBzdHJlYW0gaXMgcmVxdWlyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIHRvIHRoZSByZXF1aXJlZCByZXNvdXJjZSBvciBudWxsIGlmIHRoZSByZXNvdXJjZSBjYW5ub3QgYmUKLSAgICAgKiBmb3VuZCBvbiB0aGUgbG9hZGVyJ3MgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VTdHJlYW0oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBzZWFyY2ggdGhlIGNvbXBvbmVudHMgb2YgdGhlIHBhdGggdG8gc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSAKLSAgICAgICAgLy8gY2xhc3Mgd2Ugd2FudC4gCi0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoRWxlbWVudHMubGVuZ3RoICYmIHN0cmVhbSA9PSBudWxsOyArK2kpIHsKLSAgICAgICAgICAgIEZpbGUgcGF0aENvbXBvbmVudCA9IG5ldyBGaWxlKGNsYXNzcGF0aEVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgIHN0cmVhbSA9IGdldFJlc291cmNlU3RyZWFtKHBhdGhDb21wb25lbnQsIG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0cmVhbTsKLSAgICB9Ci0gICAgCi0KLSAgICAgICAgICAgICAgICAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdHJlYW0gdG8gcmVhZCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIGEgc3RyZWFtIGlzIHJlcXVpcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmVhbSB0byB0aGUgcmVxdWlyZWQgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgY2Fubm90IGJlCi0gICAgICogZm91bmQgb24gdGhlIGxvYWRlcidzIGNsYXNzcGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VTdHJlYW0obmFtZSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyByZXF1ZXN0ZWRDbGFzcyA9IGZpbmRMb2FkZWRDbGFzcyhuYW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2xhc3MgPSBmaW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYXNzKHJlcXVlc3RlZENsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVxdWVzdGVkQ2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lLCByZXNvbHZlKTsKLSAgICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgICAgIAotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGlucHV0c3RyZWFtIHRvIGEgZ2l2ZW4gcmVzb3VyY2UgaW4gdGhlIGdpdmVuIGZpbGUgd2hpY2ggbWF5Ci0gICAgICogZWl0aGVyIGJlIGEgZGlyZWN0b3J5IG9yIGEgemlwIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSAoZGlyZWN0b3J5IG9yIGphcikgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgcmVzb3VyY2UuCi0gICAgICogQHBhcmFtIHJlc291cmNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIGEgc3RyZWFtIGlzIHJlcXVpcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmVhbSB0byB0aGUgcmVxdWlyZWQgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgY2Fubm90IGJlCi0gICAgICogZm91bmQgaW4gdGhlIGdpdmVuIGZpbGUgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZVN0cmVhbShGaWxlIGZpbGUsIFN0cmluZyByZXNvdXJjZU5hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSByZXNvdXJjZSA9IG5ldyBGaWxlKGZpbGUsIHJlc291cmNlTmFtZSk7IAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5leGlzdHMoKSkgeyAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVhZCB0aGUgZW50cnkgb3V0IG9mIHRoZSB6aXAgZmlsZSBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGJhb3MgYW5kIHRoZW4gCi0gICAgICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOwotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IHN0cmVhbS5yZWFkKGJ1ZmZlciwgMCwgQlVGRkVSX1NJWkUpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhb3Mud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOyAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoemlwRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aXBGaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIGEgY2xhc3MgZGVmaW5pdGlvbiBmcm9tIGEgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmVhbSB0aGUgc3RyZWFtIGZyb20gd2hpY2ggdGhlIGNsYXNzIGlzIHRvIGJlIHJlYWQuCi0gICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgaW4gdGhlIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIENsYXNzIG9iamVjdCByZWFkIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGNsYXNzIGZyb20gdGhlCi0gICAgICogc3RyZWFtLgotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3MgZ2V0Q2xhc3NGcm9tU3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGNsYXNzbmFtZSkgCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGludCBieXRlc1JlYWQgPSAtMTsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBzdHJlYW0ucmVhZChidWZmZXIsIDAsIDEwMjQpKSAhPSAtMSkgewotICAgICAgICAgICAgYmFvcy53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJ5dGVbXSBjbGFzc0RhdGEgPSBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKGNsYXNzbmFtZSwgY2xhc3NEYXRhLCAwLCBjbGFzc0RhdGEubGVuZ3RoKTsgCi0gICAgfQotCi0KLSAgICBzdGF0aWMgcHJpdmF0ZSB2b2lkIGJ1aWxkQW50KCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJvb3RzdHJhcHBpbmcgQW50IC4uLiIpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSB2b2lkIHJ1bldpdGhUb29sc0phcihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBqYXZhSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0gICAgICAgICAgICBpZiAoamF2YUhvbWUuZW5kc1dpdGgoImpyZSIpKSB7Ci0gICAgICAgICAgICAgICAgamF2YUhvbWUgPSBqYXZhSG9tZS5zdWJzdHJpbmcoMCwgamF2YUhvbWUubGVuZ3RoKCkgLSA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgdG9vbHNqYXIgPSBuZXcgRmlsZShqYXZhSG9tZSArICIvbGliL3Rvb2xzLmphciIpOwotICAgICAgICAgICAgaWYgKCF0b29sc2phci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGxvY2F0ZSB0b29scy5qYXIuIGV4cGVjdGVkIGl0IHRvIGJlIGluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzamFyLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIG5ld2NsYXNzcGF0aCA9IHRvb2xzamFyLmdldFBhdGgoKSArIEZpbGUucGF0aFNlcGFyYXRvciArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmV3IENsYXNzcGF0aCBpcyAiICsgbmV3Y2xhc3NwYXRoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQm9vdHN0cmFwTG9hZGVyIGxvYWRlciA9IG5ldyBCb290c3RyYXBMb2FkZXIobmV3Y2xhc3NwYXRoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ2xhc3MgbmV3Qm9vdENsYXNzID0gbG9hZGVyLmxvYWRDbGFzcygib3JnLmFwYWNoZS5hbnQuYm9vdHN0cmFwLkJvb3RzdHJhcExvYWRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgZmluYWwgQ2xhc3NbXSBwYXJhbSA9IHsgQ2xhc3MuZm9yTmFtZSgiW0xqYXZhLmxhbmcuU3RyaW5nOyIpIH07Ci0gICAgICAgICAgICBmaW5hbCBNZXRob2QgbWFpbiA9IG5ld0Jvb3RDbGFzcy5nZXRNZXRob2QoIm1haW4iLCBwYXJhbSk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBhcmd1bWVudCA9IHsgYXJncyB9OwotICAgICAgICAgICAgbWFpbi5pbnZva2UobnVsbCwgYXJndW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gcnVuIGJvb3Qgd2l0aCB0b29scy5qYXIiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHVibGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHRvb2xzLmphciBpcyBhbHJlYWR5IGluIHRoZSBjbGFzc3BhdGguCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjb21waWxlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgic3VuLnRvb2xzLmphdmFjLk1haW4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGlsZXIgaXMgYXZhaWxhYmxlIik7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShSRUNVUlNJT05fR1VBUkQpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbmZlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGxvYWQgY29tcGlsZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoUkVDVVJTSU9OX0dVQVJELCAieWVzIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGVyIGlzIG5vdCBvbiBjbGFzc3BhdGggLSBsb2NhdGluZyAuLi4iKTsKLSAgICAgICAgICAgIHJ1bldpdGhUb29sc0phcihhcmdzKTsKLSAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBidWlsZEFudCgpOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvQW50QXNwZWN0SGFuZGxlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9jb3JlL0FudEFzcGVjdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2OTE3NC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvQW50QXNwZWN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb21wb25lbnQuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQW50QXNwZWN0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0QXNwZWN0SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckNvbmZpZ0VsZW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBnZXRBc3BlY3RDb250ZXh0KCkuc2V0RGF0YVZhbHVlKGlkLCBlbGVtZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvRWNoby5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9jb3JlL0VjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzMDVjOS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29tcG9uZW50LmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUudHlwZXMuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogRWNobwotICoKLSAqIEBhdXRob3IgY29zdGluQGRudC5ybwotICovCi1wdWJsaWMgY2xhc3MgRWNobyBleHRlbmRzIEFic3RyYWN0VGFzayB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlID0gIiI7IC8vIHJlcXVpcmVkCi0gICAgcHJvdGVjdGVkIEZpbGUgZmlsZSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXBwZW5kID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gYnkgZGVmYXVsdCwgbWVzc2FnZXMgYXJlIGFsd2F5cyBkaXNwbGF5ZWQKLSAgICBwcm90ZWN0ZWQgaW50IGxvZ0xldmVsID0gQnVpbGRFdmVudC5NU0dfV0FSTjsgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBEb2VzIHRoZSB3b3JrLgotICAgICAqCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgc29tZXRpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIGxvZ0xldmVsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZpbGVXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgYXBwZW5kKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUobWVzc2FnZSwgMCwgbWVzc2FnZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGlvZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHt9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVzc2FnZSB2YXJpYWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1zZykgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaGFsbCB3ZSBhcHBlbmQgdG8gYW4gZXhpc3RpbmcgZmlsZT8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcHBlbmQoYm9vbGVhbiBhcHBlbmQpIHsKLSAgICAgICAgdGhpcy5hcHBlbmQgPSBhcHBlbmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbXVsdGlsaW5lIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgbXNnKSB7Ci0gICAgICAgIG1lc3NhZ2UgKz0gbXNnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbG9nZ2luZyBsZXZlbCB0byBvbmUgb2YKLSAgICAgKiA8dWw+Ci0gICAgICogIDxsaT5lcnJvcjwvbGk+Ci0gICAgICogIDxsaT53YXJuaW5nPC9saT4KLSAgICAgKiAgPGxpPmluZm88L2xpPgotICAgICAqICA8bGk+dmVyYm9zZTwvbGk+Ci0gICAgICogIDxsaT5kZWJ1ZzwvbGk+Ci0gICAgICogPHVsPgotICAgICAqIDxwPlRoZSBkZWZhdWx0IGlzICZxdW90O3dhcm5pbmcmcXVvdDsgdG8gZW5zdXJlIHRoYXQgbWVzc2FnZXMgYXJlCi0gICAgICogZGlzcGxheWVkIGJ5IGRlZmF1bHQgd2hlbiB1c2luZyB0aGUgLXF1aWV0IGNvbW1hbmQgbGluZSBvcHRpb24uPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExldmVsKEVjaG9MZXZlbCBlY2hvTGV2ZWwpIHsKLSAgICAgICAgU3RyaW5nIG9wdGlvbiA9IGVjaG9MZXZlbC5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAob3B0aW9uLmVxdWFscygiZXJyb3IiKSkgewotICAgICAgICAgICAgbG9nTGV2ZWwgPSBCdWlsZEV2ZW50Lk1TR19FUlI7Ci0gICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygid2FybmluZyIpKSB7Ci0gICAgICAgICAgICBsb2dMZXZlbCA9IEJ1aWxkRXZlbnQuTVNHX1dBUk47Ci0gICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiaW5mbyIpKSB7Ci0gICAgICAgICAgICBsb2dMZXZlbCA9IEJ1aWxkRXZlbnQuTVNHX0lORk87Ci0gICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygidmVyYm9zZSIpKSB7Ci0gICAgICAgICAgICBsb2dMZXZlbCA9IEJ1aWxkRXZlbnQuTVNHX1ZFUkJPU0U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtdXN0IGJlICJkZWJ1ZyIKLSAgICAgICAgICAgIGxvZ0xldmVsID0gQnVpbGRFdmVudC5NU0dfREVCVUc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVjaG9MZXZlbCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImVycm9yIiwgIndhcm5pbmciLCAiaW5mbyIsICJ2ZXJib3NlIiwgImRlYnVnIn07Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvRW51bWVyYXRlZEF0dHJpYnV0ZUNvbnZlcnRlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9jb3JlL0VudW1lcmF0ZWRBdHRyaWJ1dGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4MDkwNi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvRW51bWVyYXRlZEF0dHJpYnV0ZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb21wb25lbnQuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotCi0vKioKLSAqIENvbnZlcnQgYmV0d2VlbiBhIHN0cmluZyBhbmQgYW4gZW51bWVyYXRpb24KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLwotcHVibGljIGNsYXNzIEVudW1lcmF0ZWRBdHRyaWJ1dGVDb252ZXJ0ZXIgaW1wbGVtZW50cyBBbnRDb252ZXJ0ZXIgewotICAgIHByaXZhdGUgRXhlY3V0aW9uRnJhbWUgZnJhbWU7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdChFeGVjdXRpb25GcmFtZSBmcmFtZSkgewotICAgICAgICB0aGlzLmZyYW1lID0gZnJhbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY29udmVydChTdHJpbmcgdmFsdWUsIENsYXNzIHR5cGUpIHRocm93cyBDb252ZXJzaW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhlIHN0cmluZyByZXByZXNlbnRzIGEgdmFsdWUKLSAgICAgICAgLy8gZ2V0IHRoZSBmcmFtZSdzIFVSTAotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlID0gdHlwZS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBFbnVtZXJhdGVkQXR0cmlidXRlKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJzaW9uRXhjZXB0aW9uKCJUaGUgdHlwZSAiICsgdHlwZS5nZXROYW1lKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRW51bWVyYXRlZEF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW51bWVyYXRlZEF0dHJpYnV0ZSBlbnVtID0gKEVudW1lcmF0ZWRBdHRyaWJ1dGUpaW5zdGFuY2U7Ci0gICAgICAgICAgICBlbnVtLnNldFZhbHVlKHZhbHVlLnRyaW0oKSk7Ci0gICAgICAgICAgICByZXR1cm4gZW51bTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVyc2lvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIHRoZSBlbnVtZXJhdGVkIHR5cGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnNpb25FeGNlcHRpb24oIklsbGVnYWxlIGFjY2VzcyB3aGVuIGluc3RhbnRpYXRpb24gZW51bWVyYXRlZCB0eXBlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnNpb25FeGNlcHRpb24oIlVuYWJsZSB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhdGVkIHR5cGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvRmlsZUNvbnZlcnRlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9jb3JlL0ZpbGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1MmQ2ZC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvRmlsZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb21wb25lbnQuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci0KLS8qKgotICogQ29udmVydCBiZXR3ZWVuIGEgc3RyaW5nIGFuZCBhIGRhdGEgdHlwZQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUNvbnZlcnRlciBpbXBsZW1lbnRzIEFudENvbnZlcnRlciB7Ci0gICAgcHJpdmF0ZSBFeGVjdXRpb25GcmFtZSBmcmFtZTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0KEV4ZWN1dGlvbkZyYW1lIGZyYW1lKSB7Ci0gICAgICAgIHRoaXMuZnJhbWUgPSBmcmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBjb252ZXJ0KFN0cmluZyB2YWx1ZSwgQ2xhc3MgdHlwZSkgdGhyb3dzIENvbnZlcnNpb25FeGNlcHRpb24gewotICAgICAgICAvLyBUaGUgc3RyaW5nIHJlcHJlc2VudHMgYSB2YWx1ZQotICAgICAgICAvLyBnZXQgdGhlIGZyYW1lJ3MgVVJMCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChmcmFtZS5nZXRCYXNlVVJMKCksIHZhbHVlKTsKLSAgICAgICAgICAgIGlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbmQgcmV0dXJuIGFzIGEgZmlsZS4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZpbGUodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb21wb25lbnQvY29yZS9Qcm9wZXJ0eS5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9jb3JlL1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTY0ZDMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9jb3JlL1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb21wb25lbnQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbi4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLS8qKgotICogCi0gKi8gCi1wdWJsaWMgY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBBYnN0cmFjdFRhc2sgewotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0gICAgcHJpdmF0ZSBVUkwgZmlsZTsKLSAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZTsKLS8vICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZW52OwotLy8gICAgcHJpdmF0ZSBSZWZlcmVuY2UgcmVmID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKFVSTCBmaWxlKSB7Ci0gICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRGaWxlKCkgewotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihGaWxlIGxvY2F0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKGxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByZWYpIHsKLS8vICAgICAgICB0aGlzLnJlZiA9IHJlZjsKLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgUmVmZXJlbmNlIGdldFJlZmlkKCkgewotLy8gICAgICAgIHJldHVybiByZWY7Ci0vLyAgICB9Ci0vLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlKFN0cmluZyByZXNvdXJjZSkgewotICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KFN0cmluZyBlbnYpIHsKLSAgICAgICAgdGhpcy5lbnYgPSBlbnY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbnZpcm9ubWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGVudjsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgewotLy8gICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotLy8gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOwotLy8gICAgICAgIH0KLS8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotLy8gICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0vLyAgICB9Ci0vLyAgICAKLS8vICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotLy8gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwotLy8gICAgfQotLy8KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmICh2YWx1ZSAhPSBudWxsKSkgewotICAgICAgICAgICAgZ2V0VGFza0NvbnRleHQoKS5zZXREYXRhVmFsdWUobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9hZEZpbGUoZmlsZSk7Ci0gICAgICAgIH0KLQotLy8gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSBsb2FkUmVzb3VyY2UocmVzb3VyY2UpOwotLy8KLS8vICAgICAgICBpZiAoZW52ICE9IG51bGwpIGxvYWRFbnZpcm9ubWVudChlbnYpOwotLy8KLS8vICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKHJlZiAhPSBudWxsKSkgewotLy8gICAgICAgICAgICBPYmplY3Qgb2JqID0gcmVmLmdldFJlZmVyZW5jZWRPYmplY3QoZ2V0UHJvamVjdCgpKTsKLS8vICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eShuYW1lLCBvYmoudG9TdHJpbmcoKSk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9hZEZpbGUgKFVSTCB1cmwpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgbG9nKCJMb2FkaW5nICIgKyB1cmwsIEJ1aWxkRXZlbnQuTVNHX1ZFUkJPU0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIGlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgCi0gICAgICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsbFByb3BlcnRpZXMocHJvcHMpOwotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0aWVzKHByb3BzKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHByb3BlcnR5IGZpbGU6ICIgKyB1cmwsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGdldFRhc2tDb250ZXh0KCkuc2V0RGF0YVZhbHVlKHByb3BlcnR5TmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUYXNrQ29udGV4dCgpLnJlcGxhY2VQcm9wZXJ0eVJlZnMocHJvcGVydHlWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVBbGxQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBmb3IgKEl0ZXJhdG9yIHByb3BJdGVyYXRvciA9IHByb3BzLmtleVNldCgpLml0ZXJhdG9yKCk7IHByb3BJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpcHJvcEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KG5hbWUpOwotCi0gICAgICAgICAgICBib29sZWFuIHJlc29sdmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoIXJlc29sdmVkKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBwcm9wZXJ0eVJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgRXhlY3V0aW9uRnJhbWUucGFyc2VQcm9wZXJ0eVN0cmluZyh2YWx1ZSwgZnJhZ21lbnRzLCBwcm9wZXJ0eVJlZnMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlSZWZzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGZyYWdtZW50cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBqID0gcHJvcGVydHlSZWZzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50ID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpai5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiUHJvcGVydHkgIiArIG5hbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIGZpbGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBjaXJjdWxhcmx5IGRlZmluZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gcHJvcHMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gIiR7IiArIHByb3BlcnR5TmFtZSArICJ9IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZnJhZ21lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvcHMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ICAgIAotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvVVJMQ29udmVydGVyLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvVVJMQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDI5ZGIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9jb3JlL1VSTENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb21wb25lbnQuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBDb252ZXJ0IGJldHdlZW4gYSBzdHJpbmcgYW5kIGEgVVJMLCByZXNvbHZlZCB0byB0aGUgRXhlY3V0aW9uRnJhbWUncyBiYXNlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVUkxDb252ZXJ0ZXIgaW1wbGVtZW50cyBBbnRDb252ZXJ0ZXIgewotICAgIHByaXZhdGUgRXhlY3V0aW9uRnJhbWUgZnJhbWU7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdChFeGVjdXRpb25GcmFtZSBmcmFtZSkgewotICAgICAgICB0aGlzLmZyYW1lID0gZnJhbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY29udmVydChTdHJpbmcgdmFsdWUsIENsYXNzIHR5cGUpIHRocm93cyBDb252ZXJzaW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhlIHN0cmluZyByZXByZXNlbnRzIGEgdmFsdWUKLSAgICAgICAgLy8gZ2V0IHRoZSBmcmFtZSdzIFVSTAotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoZnJhbWUuZ2V0QmFzZVVSTCgpLCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdXJsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy90cnkgYSBsb2NhbCBmaWxlCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS50b1VSTCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJzaW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gY29udmVydCAiICsgdmFsdWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGludG8gYSBVUkwgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyBiYXNlIik7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9jb3JlL2FudGxpYi54bWwgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvYW50bGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlZjRkNy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L2NvcmUvYW50bGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTxhbnRsaWI+Ci0gICA8IS0tIFRhc2tzIC0tPgotICAgPHRhc2tkZWYgbmFtZT0icHJvcGVydHkiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5hbnQuY29tcG9uZW50LmNvcmUuUHJvcGVydHkiLz4KLSAgIDx0YXNrZGVmIG5hbWU9ImVjaG8iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5hbnQuY29tcG9uZW50LmNvcmUuRWNobyIvPgotICAgCi0gICA8IS0tIERhdGEgVHlwZXMgLS0+Ci0gICA8dGFza2RlZiBuYW1lPSJwYXR0ZXJuc2V0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYW50LmNvcmUudHlwZXMuUGF0dGVyblNldCIvPgotICAgPHRhc2tkZWYgbmFtZT0iZmlsZXNldCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmFudC5jb3JlLnR5cGVzLkZpbGVTZXQiLz4KLSAgIAotICAgPCEtLSBDb252ZXJ0ZXJzIC0tPgotICAgPGNvbnZlcnRlciB0YXJnZXQ9ImphdmEuaW8uRmlsZSIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmFudC5jb21wb25lbnQuY29yZS5GaWxlQ29udmVydGVyIi8+Ci0gICA8Y29udmVydGVyIHRhcmdldD0iamF2YS5uZXQuVVJMIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYW50LmNvbXBvbmVudC5jb3JlLlVSTENvbnZlcnRlciIvPgotICAgPGNvbnZlcnRlciB0YXJnZXQ9Im9yZy5hcGFjaGUuYW50LmNvcmUudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZSIgCi0gICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5hbnQuY29tcG9uZW50LmNvcmUuRW51bWVyYXRlZEF0dHJpYnV0ZUNvbnZlcnRlciIvPgotICAgICAgICAgICAgICAKLSAgIDwhLS0gQXNwZWN0IEhhbmRsZXJzIC0tPgotICAgPGFzcGVjdCBwcmVmaXg9ImFudCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmFudC5jb21wb25lbnQuY29yZS5BbnRBc3BlY3RIYW5kbGVyIi8+ICAgICAgICAgICAgICAKLTwvYW50bGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb21wb25lbnQvZmlsZS9hbnRsaWIueG1sIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9maWxlL2FudGxpYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmN2Y4N2MuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC9maWxlL2FudGxpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTxhbnRsaWI+Ci08L2FudGxpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L3RocmVhZC9QYXJhbGxlbC5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC90aHJlYWQvUGFyYWxsZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1ZTIyNi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L3RocmVhZC9QYXJhbGxlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb21wb25lbnQudGhyZWFkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb24uKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogUGFyYWxsZWwgZXhlY3V0aW9uIG9mIGNvbnRhaW5lZCB0YXNrcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbGxlbCBleHRlbmRzIEFic3RyYWN0VGFzayBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgewotICAgIHByaXZhdGUgTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgbmVzdGVkVGFzaykgewotICAgICAgICB0YXNrcy5hZGQobmVzdGVkVGFzayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YXNrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBUYXNrIG5lc3RlZFRhc2sgPSAoVGFzaylpLm5leHQoKTsKLSAgICAgICAgICAgIG5lc3RlZFRhc2suZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC90aHJlYWQvU2VxdWVudGlhbC5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC90aHJlYWQvU2VxdWVudGlhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWU4MjRjLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb21wb25lbnQvdGhyZWFkL1NlcXVlbnRpYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29tcG9uZW50LnRocmVhZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFNlcXVlbnRpYWwgZXhlY3V0aW9uIG9mIGNvbnRhaW5lZCB0YXNrcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXF1ZW50aWFsIGV4dGVuZHMgQWJzdHJhY3RUYXNrIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7Ci0gICAgcHJpdmF0ZSBMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayBuZXN0ZWRUYXNrKSB7Ci0gICAgICAgIHRhc2tzLmFkZChuZXN0ZWRUYXNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRhc2tzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFRhc2sgbmVzdGVkVGFzayA9IChUYXNrKWkubmV4dCgpOwotICAgICAgICAgICAgbmVzdGVkVGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L3RocmVhZC9hbnRsaWIueG1sIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvbXBvbmVudC90aHJlYWQvYW50bGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyMmY1Ni4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29tcG9uZW50L3RocmVhZC9hbnRsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08YW50bGliPgotICAgPHRhc2tkZWYgbmFtZT0icGFyYWxsZWwiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5hbnQuY29tcG9uZW50LnRocmVhZC5QYXJhbGxlbCIvPgotICAgPHRhc2tkZWYgbmFtZT0ic2VxdWVudGlhbCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmFudC5jb21wb25lbnQudGhyZWFkLlNlcXVlbnRpYWwiLz4KLTwvYW50bGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2NvbmZpZy9Db21wb25lbnRNYW5hZ2VyLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9jb25maWcvQ29tcG9uZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzczNThiLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2NvbmZpZy9Db21wb25lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5jb25maWc7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuc3VwcG9ydC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUueG1sLkFudExpYlBhcnNlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBNYW5hZ2VyIGZvciBBbnQgY29tcG9uZW50cwotICoKLSAqIFRoZSBjb21wb25lbnQgbWFuYWdlciBpcyByZXNwb25zaWJsZSBmb3IgbG9jYXRpbmcgYW5kIGxvYWRpbmcgdGhlIAotICogY29tcG9uZW50cyBjb250YWluZWQgaW4gQW50J3MgbGliL3Rhc2sgZGlyZWN0b3J5LgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLyAKLXB1YmxpYyBjbGFzcyBDb21wb25lbnRNYW5hZ2VyIHsKLSAgICAvKioKLSAgICAgKiBXaGVuIEFudCBpcyBydW4gcmVtb3RlbHksIHdlIG5lZWQgdG8gbG9vayB1cCB0aGUgbGlzdCBvZiBjb21wb25lbnQKLSAgICAgKiBsaWJyYXJpZXMgZnJvbSB0aGUgc2VydmVyLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIENPTVBPTkVOVF9JTkRFWCA9ICJ0YXNraW5kZXgiOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgY29tcG9uZW50IG1hbmFnZXIuIFdoZW4gdGhlIGNvbXBvbmVudCBtYW5hZ2VyIGlzIGNyZWF0ZWQKLSAgICAgKiBpdCB3aWxsIHJlYWQgdGhlIGNvbXBvbmVudCBkZWZpbml0aW9ucyBmcm9tIHRoZSAgZmlsZXMgaW4KLSAgICAgKiBBbnQncyBsaWIvdGFzayBkaXJlY3RvcnkKLSAgICAgKi8gCi0gICAgc3RhdGljIHB1YmxpYyBBbnRMaWJyYXJ5W10gZ2V0Q29tcG9uZW50cygpIHRocm93cyBMb2NhdGlvbkV4Y2VwdGlvbiwgQ29uZmlnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCBjb21wb25lbnRzTG9jYXRpb24gPSBuZXcgVVJMKEFudExvY2F0b3IuZ2V0TGlicmFyeVVSTCgpLCAidGFzay8iKTsKLSAgICAgICAgICAgIFVSTFtdIGNvbXBvbmVudEZpbGVzID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnRzTG9jYXRpb24uZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBkaXJlY3RvcnkgaXMgbG9jYWwgLSB3ZSBkZXRlcm1pbmUgdGhlIAotICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBmaWxlcyBieSBzY2FubmluZyB0aGUgbG9jYWwgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgSGFzaFNldCBjb21wb25lbnRGaWxlc1R5cGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRGaWxlc1R5cGVzLmFkZCgiLnRzayIpOwotICAgICAgICAgICAgICAgIGNvbXBvbmVudEZpbGVzVHlwZXMuYWRkKCIuamFyIik7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50RmlsZXNUeXBlcy5hZGQoIi56aXAiKTsKLSAgICAgICAgICAgICAgICBGaWxlIGNvbXBvbmVudHNEaXJlY3RvcnkgPSBuZXcgRmlsZShjb21wb25lbnRzTG9jYXRpb24uZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRGaWxlcyA9IEFudExvY2F0b3IuZ2V0RGlyZWN0b3J5VVJMcyhjb21wb25lbnRzRGlyZWN0b3J5LCBjb21wb25lbnRGaWxlc1R5cGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wb25lbnQgZGlyZWN0b3J5IGlzIHJlbW90ZSAtIHdlIGRldGVybWluZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGNvbXBvbmVudCBmaWxlcyBieSByZWFkaW5nIGEgImtub3duIiAgbGlzdCBmaWxlLgotICAgICAgICAgICAgICAgIFVSTCBjb21wb25lbnRMaXN0VVJMID0gbmV3IFVSTChjb21wb25lbnRzTG9jYXRpb24sIENPTVBPTkVOVF9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBMaXN0IGNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb21wb25lbnRMaXN0VVJMLm9wZW5TdHJlYW0oKSkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRMaXN0LmFkZChuZXcgVVJMKGNvbXBvbmVudHNMb2NhdGlvbiwgbGluZS50cmltKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb21wb25lbnRGaWxlcyA9IChVUkxbXSljb21wb25lbnRMaXN0LnRvQXJyYXkobmV3IFVSTFswXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIEFudExpYlBhcnNlciBsaWJkZWZQYXJzZXIgPSBuZXcgQW50TGliUGFyc2VyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgbGlicmFyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudEZpbGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRlIGEgY2xhc3Nsb2FkZXIgZm9yIHRoZSBjb21wb25lbnQgbGlicmFyeQotICAgICAgICAgICAgICAgIFVSTFtdIGNvbXBvbmVudFVSTHMgPSBuZXcgVVJMW117Y29tcG9uZW50RmlsZXNbaV19OwotICAgICAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGNvbXBvbmVudENsYXNzTG9hZGVyIAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBBbnRDbGFzc0xvYWRlcihjb21wb25lbnRVUkxzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50TWFuYWdlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGaWxlc1tpXS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBVUkwgbGliRGVmaW5pdGlvbiA9IGNvbXBvbmVudENsYXNzTG9hZGVyLmdldFJlc291cmNlKCJBTlQtSU5GL2FudGxpYi54bWwiKTsKLSAgICAgICAgICAgICAgICBpZiAobGliRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFudExpYnJhcnkgbGlicmFyeSAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gbGliZGVmUGFyc2VyLnBhcnNlQW50TGlicmFyeShsaWJEZWZpbml0aW9uLCBjb21wb25lbnRDbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcy5hZGQobGlicmFyeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIChBbnRMaWJyYXJ5W10pbGlicmFyaWVzLnRvQXJyYXkobmV3IEFudExpYnJhcnlbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQWJzdHJhY3RBc3BlY3RIYW5kbGVyLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQWJzdHJhY3RBc3BlY3RIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkN2Y5MDMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0Fic3RyYWN0QXNwZWN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXNwZWN0SGFuZGxlciBpbXBsZW1lbnRzIEFzcGVjdEhhbmRsZXIgewotICAgIHByaXZhdGUgRXhlY3V0aW9uQ29udGV4dCBhc3BlY3RDb250ZXh0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEFzcGVjdENvbnRleHQoRXhlY3V0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuYXNwZWN0Q29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEV4ZWN1dGlvbkNvbnRleHQgZ2V0QXNwZWN0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGFzcGVjdENvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbmZpZ0VsZW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gIHsKLX0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyQ29uZmlnRWxlbWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiAgewotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0Fic3RyYWN0VGFzay5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0Fic3RyYWN0VGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmFjMjlhLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9BYnN0cmFjdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFzayBpbXBsZW1lbnRzIFRhc2sgewotICAgIHByaXZhdGUgRXhlY3V0aW9uQ29udGV4dCB0YXNrQ29udGV4dDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrQ29udGV4dChFeGVjdXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy50YXNrQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEV4ZWN1dGlvbkNvbnRleHQgZ2V0VGFza0NvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0YXNrQ29udGV4dDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9nIGEgbWVzc2FnZSB3aXRoIHRoZSBkZWZhdWx0IChJTkZPKSBwcmlvcml0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhtc2csIEJ1aWxkRXZlbnQuTVNHX0lORk8pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2cgYSBtZXNhZ2Ugd2l0aCB0aGUgZ2l2ZSBwcmlvcml0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuCi0gICAgICogQHBhcmFtIG1zZ0xldmVsIHRoZSBtZXNzYWdlIHByaW9yaXR5IGF0IHdoaWNoIHRoaXMgbWVzc2FnZSBpcyB0byBiZSBsb2dnZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2csIGludCBtc2dMZXZlbCkgewotICAgICAgICB0YXNrQ29udGV4dC5sb2cobXNnLCBtc2dMZXZlbCk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9BbnRDb252ZXJ0ZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9BbnRDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0ZTU4OS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQW50Q29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uOwotCi0vKioKLSAqIEFuIEFudENvbnZlcnRlciBpcyBhIENvbnZlcnRlciB3aGljaCBpcyBpbml0aWFsaXNlZCB3aXRoIHRoZSAKLSAqIEV4ZWN1dGlvbkZyYW1lIGNvbnRleHQgaW4gd2hpY2ggaXQgd2lsbCBwZXJmb3JtIGl0cyBjb252ZXJzaW9ucwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFudENvbnZlcnRlciBleHRlbmRzIENvbnZlcnRlciB7Ci0gICAgdm9pZCBpbml0KEV4ZWN1dGlvbkZyYW1lIGZyYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9BbnRMaWJyYXJ5LmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQW50TGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQ4NzMxLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9BbnRMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuc3VwcG9ydC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCByZXByZXNlbnRzIGFuIEFudCBsaWJyYXJ5IGRlZmluaXRpb24uIEFuIEFudCBsaWJyYXJ5Ci0gKiBpcyBhIHNldCBvZiBwbHVnLWluIGZvciBBbnQgY29uc2lzdGluZyBwcmltYXJpbHkgb2YgdGFza3MgYnV0IG1heSBpbmNsdWRlCi0gKiBvdGhlciBhbnQgY29tcG9uZW50cy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLyAKLXB1YmxpYyBjbGFzcyBBbnRMaWJyYXJ5IHsKLSAgICAvKioKLSAgICAgKiBUaGUgdGFzayBkZWZpbml0aW9ucyBjb250YWluZWQgYnkgdGhpcyBsaWJyYXJ5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgdGFza0RlZmluaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY29udmVydGVyIGRlZmluaXRpb25zIGNvbnRhaW5lZCBieSB0aGlzIGxpYnJhcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBjb252ZXJ0ZXJEZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGFzcGVjdCBoYW5kbGVyIGRlZmluaXRpb25zIGNvbnRhaW5lZCBieSB0aGlzIGxpYnJhcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBhc3BlY3REZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGEgdGFzayBkZWZpbml0aW9uIHRvIHRoaXMgbGlicmFyeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRhc2tEZWZpbml0aW9uKFRhc2tEZWZpbml0aW9uIHRhc2tEZWZpbml0aW9uKSB7Ci0gICAgICAgIFN0cmluZyB0YXNrTmFtZSA9IHRhc2tEZWZpbml0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgdGFza0RlZmluaXRpb25zLnB1dCh0YXNrTmFtZSwgdGFza0RlZmluaXRpb24pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSBjb252ZXJ0ZXIgZGVmaW5pdGlvbiB0byB0aGlzIGxpYnJhcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDb252ZXJ0ZXJEZWZpbml0aW9uKENvbnZlcnRlckRlZmluaXRpb24gY29udmVydGVyRGVmKSB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRDbGFzc25hbWUgPSBjb252ZXJ0ZXJEZWYuZ2V0VGFyZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIGNvbnZlcnRlckRlZmluaXRpb25zLnB1dCh0YXJnZXRDbGFzc25hbWUsIGNvbnZlcnRlckRlZik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGFzcGVjdCBoYW5kbGVyIGRlZmluaXRpb24gdG8gdGhpcyBsaWJyYXJ5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQXNwZWN0RGVmaW5pdGlvbihBc3BlY3REZWZpbml0aW9uIGFzcGVjdERlZikgewotICAgICAgICBTdHJpbmcgYXNwZWN0UHJlZml4ID0gYXNwZWN0RGVmLmdldEFzcGVjdFByZWZpeCgpOwotICAgICAgICBhc3BlY3REZWZpbml0aW9ucy5wdXQoYXNwZWN0UHJlZml4LCBhc3BlY3REZWYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdGFzayBkZWZpbml0aW9ucwotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciB3aGljaCByZXR1cm5zIFRhc2tEZWZpbml0aW9uIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFRhc2tEZWZpbml0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tEZWZpbml0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLSAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29udmVydGVyIGRlZmluaXRpb25zCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIHdoaWNoIHJldHVybnMgQ29udmVydGVyRGVmaW5pdGlvbiBvYmplY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDb252ZXJ0ZXJEZWZpbml0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlckRlZmluaXRpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhc3BlY3QgaGFuZGxlciBkZWZpbml0aW9ucwotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciB3aGljaCByZXR1cm5zIEFzcGVjdERlZmluaXRpb24gb2JqZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QXNwZWN0RGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBhc3BlY3REZWZpbml0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0FzcGVjdERlZmluaXRpb24uamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9Bc3BlY3REZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjBlYzMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0FzcGVjdERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIEFzcGVjdERlZmluaXRpb24gewotICAgIC8qKiBUaGUgVVJMIG9mIHRoZSBsaWJyYXJ5IHdoaWNoIGRlZmluZXMgdGhpcyBhc3BlY3QgaGFuZGxlciAqLwotICAgIHByaXZhdGUgVVJMIGFzcGVjdExpYnJhcnlVUkw7Ci0gICAgIAotICAgIC8qKiBUaGUgYXNwZWN0J3MgdGFnICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXNwZWN0UHJlZml4OwotICAgIAotICAgIC8qKiBUaGUgYXNwZWN0IGhhbmRsZXIncyBjbGFzc25hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBhc3BlY3RDbGFzc05hbWU7Ci0gICAgCi0gICAgLyoqIFRoZSBhc3BlY3QgaGFuZGxlcidzIGNsYXNzIGxvYWRlci4gKi8KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGFzcGVjdENsYXNzTG9hZGVyOwotICAgIAotICAgIC8qKiBUaGUgY2xhc3MgdG8gd2hpY2ggdGhpcyBjb252ZXJ0ZXIgY29udmVydHMuICovCi0gICAgcHJpdmF0ZSBDbGFzcyBhc3BlY3RIYW5kbGVyQ2xhc3MgPSBudWxsOwotCi0gICAgcHVibGljIEFzcGVjdERlZmluaXRpb24oVVJMIGFzcGVjdExpYnJhcnlVUkwsIFN0cmluZyBhc3BlY3RQcmVmaXgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhc3BlY3RDbGFzc05hbWUsIENsYXNzTG9hZGVyIGFzcGVjdENsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuYXNwZWN0TGlicmFyeVVSTCA9IGFzcGVjdExpYnJhcnlVUkw7Ci0gICAgICAgIHRoaXMuYXNwZWN0UHJlZml4ID0gYXNwZWN0UHJlZml4OwotICAgICAgICB0aGlzLmFzcGVjdENsYXNzTmFtZSA9IGFzcGVjdENsYXNzTmFtZTsKLSAgICAgICAgdGhpcy5hc3BlY3RDbGFzc0xvYWRlciA9IGFzcGVjdENsYXNzTG9hZGVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFVSTCB3aGVyZSB0aGlzIGFzcGVjdCBoYW5kbGVyIHdhcyBkZWZpbmVkLgotICAgICAqCi0gICAgICogQHJldHVybnMgYSBVUkwgb2YgdGhlIGxpYiBkZWZpbnRpb24gZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0TGlicmFyeVVSTCgpIHsKLSAgICAgICAgcmV0dXJuIGFzcGVjdExpYnJhcnlVUkw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgQXNwZWN0J3MgUHJlZml4Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBc3BlY3RQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBhc3BlY3RQcmVmaXg7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGFzcGVjdCBoYW5kbGVyIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY2xhc3Mgb2JqZWN0IGZvciB0aGlzIGFzcGVjdCBoYW5kbGVyJ3MgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIENsYXNzIGdldEFzcGVjdEhhbmRsZXJDbGFzcygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFzcGVjdEhhbmRsZXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhc3BlY3RIYW5kbGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGFzcGVjdENsYXNzTmFtZSwgdHJ1ZSwgYXNwZWN0Q2xhc3NMb2FkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhc3BlY3RIYW5kbGVyQ2xhc3M7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2xhc3NuYW1lIG9mIHRoZSBhc3BlY3QgaGFuZGxlciB0aGF0IGlzIGJlaW5nIGRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBc3BlY3RIYW5kbGVyQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gYXNwZWN0Q2xhc3NOYW1lOwotICAgIH0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0FzcGVjdEhhbmRsZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9Bc3BlY3RIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTg2ZGMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0FzcGVjdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEFuIEFzcGVjdEhhbmRsZXIgaXMgdXNlZCB0byBoYW5kbGUgYSBzZXQgb2YgYXNwZWN0cyB3aGljaCBtYXkgb2NjdXIgaW4gYSBudW1iZXIKLSAqIG9mIGVsZW1lbnRzIGluIHRoZSBidWlsZCBtb2RlbC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgQXNwZWN0SGFuZGxlciB7Ci0gICAKLSAgICB2b2lkIHNldEFzcGVjdENvbnRleHQoRXhlY3V0aW9uQ29udGV4dCBjb250ZXh0KTsKLSAgICAKLSAgICB2b2lkIGJlZm9yZUNvbmZpZ0VsZW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gOwotICAgIHZvaWQgYWZ0ZXJDb25maWdFbGVtZW50KE9iamVjdCBlbGVtZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIDsKLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0J1aWxkRXZlbnQuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9CdWlsZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwY2Y2MzMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0J1aWxkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLm1vZGVsLio7Ci0KLS8qCi0gKiBBIEJ1aWxkRXZlbnQgaW5kaWNhdGVzIHRoZSBvY2N1cmVuY2Ugb2YgYSBzaWduaWZpY2FudCBldmVudAotICogaW4gdGhlIGJ1aWxkLgotICoKLSAqIEFsbCBidWlsZCBldmVudHMgY29tZSBmcm9tIGFuIEV4ZWN1dGlvbkZyYW1lIG9yIGFuIEV4ZWN1dGlvbk1hbmFnZXIuCi0gKiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IHR5cGVzIG9mIGV2ZW50IGFuZCB0aGV5IHdpbGwKLSAqIGdlbmVyYWxseSBiZSBhc3NvY2lhdGVkIHdpdGggc29tZSBidWlsZCBlbGVtZW50IGZyb20gdGhlIGJ1aWxkIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgQnVpbGRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfRVJSID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfV0FSTiA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lORk8gPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19WRVJCT1NFID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfREVCVUcgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfU1RBUlRFRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfRklOSVNIRUQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBUkdFVF9TVEFSVEVEID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVJHRVRfRklOSVNIRUQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0tfU1RBUlRFRCA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTS19GSU5JU0hFRCA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRSA9IDc7Ci0KLSAgICBwcml2YXRlIGludCBldmVudFR5cGU7Ci0gICAgcHJpdmF0ZSBCdWlsZEVsZW1lbnQgYnVpbGRFbGVtZW50ID0gbnVsbDsKLSAgICBwcml2YXRlIFRocm93YWJsZSBjYXVzZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgbWVzc2FnZVByaW9yaXR5OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgYnVpbGQgZXZlbnQuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyZSB0aGUgc291cmNlIG9mIHRoZSBidWlsZCBldmVudC4KLSAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIHRoZSB0eXBlIG9mIHRoZSBidWlsZEV2ZW50LgotICAgICAqIEBwYXJhbSBidWlsZEVsZW1lbnQgdGhlIGJ1aWxkIGVsZW1lbnQgd2l0aCB3aGljaCB0aGUgZXZlbnQgaXMgYXNzb2NpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRFdmVudChPYmplY3Qgc291cmNlLCBpbnQgZXZlbnRUeXBlLCBCdWlsZEVsZW1lbnQgYnVpbGRFbGVtZW50KSB7Ci0gICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICAgICAgICB0aGlzLmJ1aWxkRWxlbWVudCA9IGJ1aWxkRWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgYnVpbGQgZXZlbnQgd2l0aCBhbiBhc3NvY2lhdGVkIGV4Y2VwdGlvbi4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJlIHRoZSBzb3VyY2Ugb2YgdGhlIGJ1aWxkIGV2ZW50LgotICAgICAqIEBwYXJhbSBldmVudFR5cGUgdGhlIHR5cGUgb2YgdGhlIGJ1aWxkRXZlbnQuCi0gICAgICogQHBhcmFtIGJ1aWxkRWxlbWVudCB0aGUgYnVpbGQgZWxlbWVudCB3aXRoIHdoaWNoIHRoZSBldmVudCBpcyBhc3NvY2lhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEV2ZW50KE9iamVjdCBzb3VyY2UsIGludCBldmVudFR5cGUsIEJ1aWxkRWxlbWVudCBidWlsZEVsZW1lbnQsIAotICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICB0aGlzKHNvdXJjZSwgZXZlbnRUeXBlLCBidWlsZEVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgYnVpbGQgZXZlbnQgZm9yIGEgbWVzc2FnZSAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmUgdGhlIHNvdXJjZSBvZiB0aGUgYnVpbGQgZXZlbnQuCi0gICAgICogQHBhcmFtIGJ1aWxkRWxlbWVudCB0aGUgYnVpbGQgZWxlbWVudCB3aXRoIHdoaWNoIHRoZSBldmVudCBpcyBhc3NvY2lhdGVkLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gICAgICogQHBhcmFtIHByaW9yaXR5IHRoZSBtZXNzYWdlIHByaW9yaXR5Ci0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXZlbnQoT2JqZWN0IHNvdXJjZSwgQnVpbGRFbGVtZW50IGJ1aWxkRWxlbWVudCwgU3RyaW5nIG1lc3NhZ2UsIAotICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSkgewotICAgICAgICB0aGlzKHNvdXJjZSwgTUVTU0FHRSwgYnVpbGRFbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgdGhpcy5tZXNzYWdlUHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0eXBlIG9mIHRoaXMgZXZlbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGV2ZW50VHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBidWlsZCBlbGVtZW50IGludm9sdmVkIGluIHRoaXMgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBidWlsZCBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZXZlbnQgaXMgYXNzb2NpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRFbGVtZW50IGdldEJ1aWxkRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkRWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxvZ2dpbmcgbWVzc2FnZS4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgc2V0Ci0gICAgICogIGZvciAibWVzc2FnZUxvZ2dlZCIgZXZlbnRzLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcHJpb3JpdHkgb2YgdGhlIGxvZ2dpbmcgbWVzc2FnZS4gVGhpcyBmaWVsZCB3aWxsIG9ubHkKLSAgICAgKiAgYmUgc2V0IGZvciAibWVzc2FnZUxvZ2dlZCIgZXZlbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKXsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VQcmlvcml0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93biwgaWYgYW55LiBUaGlzIGZpZWxkIHdpbGwgb25seQotICAgICAqICBiZSBzZXQgZm9yICJ0YXNrRmluaXNoZWQiLCAidGFyZ2V0RmluaXNoZWQiLCBhbmQgImJ1aWxkRmluaXNoZWQiIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gY2F1c2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0J1aWxkRXZlbnRTdXBwb3J0LmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQnVpbGRFdmVudFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmZDVkYi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQnVpbGRFdmVudFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUubW9kZWwuKjsKLQotLyoqCi0gKiBCdWlsZEV2ZW50U3VwcG9ydCBpcyB1c2VkIGJ5IGNsYXNzZXMgd2hpY2ggd2hpY2ggdG8gc2VuZCAKLSAqIGJ1aWxkIGV2ZW50cyB0byB0aGUgQnVvbGRMaXN0ZW5lcnMKLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkRXZlbnRTdXBwb3J0IHsKLSAgICBwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZEJ1aWxkTGlzdGVuZXIoQnVpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQnVpbGRMaXN0ZW5lcihCdWlsZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZvcndhcmRFdmVudChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLnByb2Nlc3NCdWlsZEV2ZW50KGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmaXJlQnVpbGRTdGFydGVkKE9iamVjdCBzb3VyY2UsIEJ1aWxkRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudChzb3VyY2UsIEJ1aWxkRXZlbnQuQlVJTERfU1RBUlRFRCwgZWxlbWVudCk7Ci0gICAgICAgIGZvcndhcmRFdmVudChldmVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlyZUJ1aWxkRmluaXNoZWQoT2JqZWN0IHNvdXJjZSwgQnVpbGRFbGVtZW50IGVsZW1lbnQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBCdWlsZEV2ZW50IGV2ZW50ID0gbmV3IEJ1aWxkRXZlbnQoc291cmNlLCBCdWlsZEV2ZW50LkJVSUxEX0ZJTklTSEVELCBlbGVtZW50LCBjYXVzZSk7Ci0gICAgICAgIGZvcndhcmRFdmVudChldmVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlyZVRhcmdldFN0YXJ0ZWQoT2JqZWN0IHNvdXJjZSwgQnVpbGRFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHNvdXJjZSwgQnVpbGRFdmVudC5UQVJHRVRfU1RBUlRFRCwgZWxlbWVudCk7Ci0gICAgICAgIGZvcndhcmRFdmVudChldmVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlyZVRhcmdldEZpbmlzaGVkKE9iamVjdCBzb3VyY2UsIEJ1aWxkRWxlbWVudCBlbGVtZW50LCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHNvdXJjZSwgQnVpbGRFdmVudC5UQVJHRVRfRklOSVNIRUQsIGVsZW1lbnQsIGNhdXNlKTsKLSAgICAgICAgZm9yd2FyZEV2ZW50KGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaXJlVGFza1N0YXJ0ZWQoT2JqZWN0IHNvdXJjZSwgQnVpbGRFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHNvdXJjZSwgQnVpbGRFdmVudC5UQVNLX1NUQVJURUQsIGVsZW1lbnQpOwotICAgICAgICBmb3J3YXJkRXZlbnQoZXZlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVUYXNrRmluaXNoZWQoT2JqZWN0IHNvdXJjZSwgQnVpbGRFbGVtZW50IGVsZW1lbnQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBCdWlsZEV2ZW50IGV2ZW50ID0gbmV3IEJ1aWxkRXZlbnQoc291cmNlLCBCdWlsZEV2ZW50LlRBU0tfRklOSVNIRUQsIGVsZW1lbnQsIGNhdXNlKTsKLSAgICAgICAgZm9yd2FyZEV2ZW50KGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaXJlTWVzc2FnZUxvZ2dlZChPYmplY3Qgc291cmNlLCBCdWlsZEVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSkgewotICAgICAgICBCdWlsZEV2ZW50IGV2ZW50ID0gbmV3IEJ1aWxkRXZlbnQoc291cmNlLCAgZWxlbWVudCwgbWVzc2FnZSwgcHJpb3JpdHkpOwotICAgICAgICBmb3J3YXJkRXZlbnQoZXZlbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9CdWlsZExpc3RlbmVyLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQnVpbGRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDA3MWNkLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9CdWlsZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogIENsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBub3RpZmllZCB3aGVuCi0gKiAgdGhpbmdzIGhhcHBlbmQgZHVyaW5nIGEgYnVpbGQuCi0gKgotICogIEBzZWUgQnVpbGRFdmVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJ1aWxkTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLSAgICB2b2lkIHByb2Nlc3NCdWlsZEV2ZW50KEJ1aWxkRXZlbnQgZXZlbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9DbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24uamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9DbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YWMzNC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIC8qKiAKLSAgICAgKiBFeGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlZCB0aGlzIG9uZS4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgY2F1c2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgICAgIHN1cGVyKG1zZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlLgotICAgICAqIEBwYXJhbSBtc2cgRGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhyb3dhYmxlIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZSB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtc2cpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFzIGEgcm9vdCBjYXVzZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5lc3RlZCBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7Ci0gICAgICAgIHJldHVybiBjYXVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgc3RhY2sgdHJhY2UgdG8gU3lzdGVtLmVycgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLSAgICAgICAgcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgc3RhY2sgdHJhY2UgdG8gdGhlIGdpdmVuIFByaW50U3RyZWFtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHMgdGhlIFByaW50U3RyZWFtIG9udG8gd2hpY2ggdGhlIHN0YWNrIHRyYWNlIAotICAgICAqICAgICAgICAgICBvZiB0aGlzIGV4Y2VwdGlvbiBpcyB0byBiZSBwcmludGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHBzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocHMpIHsKLSAgICAgICAgICAgIHBzLnByaW50bG4odGhpcyk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBzLnByaW50bG4oIi0tLSBOZXN0ZWQgRXhjZXB0aW9uIC0tLSIpOwotICAgICAgICAgICAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZShwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGhlIHN0YWNrIHRyYWNlIHRvIHRoZSBnaXZlbiBQcmludFdyaXRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHB3IHRoZSBQcmludFdyaXRlciBvbnRvIHdoaWNoIHRoZSBzdGFjayB0cmFjZSAKLSAgICAgKiAgICAgICAgICAgb2YgdGhpcyBleGNlcHRpb24gaXMgdG8gYmUgcHJpbnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBwdykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHB3KSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKHRoaXMpOwotICAgICAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCItLS0gTmVzdGVkIEV4Y2VwdGlvbiAtLS0iKTsKLSAgICAgICAgICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0NsYXNzSW50cm9zcGVjdG9yLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQ2xhc3NJbnRyb3NwZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzNTIzYy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQ2xhc3NJbnRyb3NwZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogSW50cm9zcGVjdHMgYSBjbGFzcyBhbmQgYnVpbGRzIGEgc2V0IG9mIG9iamVjdHMgdG8gYXNzaXN0IGluIGludG9zcGVjdGluZyB0aGUgCi0gKiBjbGFzcy4KLSAqCi0gKiBAYXV0aG9yIFN0ZWZhbiBCb2Rld2lnIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BtZWdhYml0Lm5ldCI+c3RlZmFuLmJvZGV3aWdAbWVnYWJpdC5uZXQ8L2E+IAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0ludHJvc3BlY3RvciB7Ci0gICAgLyoqCi0gICAgICogaG9sZHMgdGhlIHR5cGVzIG9mIHRoZSBhdHRyaWJ1dGVzIHRoYXQgY291bGQgYmUgc2V0LgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGF0dHJpYnV0ZVR5cGVzOwotCi0gICAgLyoqCi0gICAgICogaG9sZHMgdGhlIGF0dHJpYnV0ZSBzZXR0ZXIgbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSBhdHRyaWJ1dGVTZXR0ZXJzOwotCi0gICAgLyoqCi0gICAgICogSG9sZHMgdGhlIHR5cGVzIG9mIG5lc3RlZCBlbGVtZW50cyB0aGF0IGNvdWxkIGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgbmVzdGVkVHlwZXM7Ci0KLSAgICAvKioKLSAgICAgKiBIb2xkcyBtZXRob2RzIHRvIGNyZWF0ZSBuZXN0ZWQgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgbmVzdGVkQ3JlYXRvcnM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIHRvIGFkZCBQQ0RBVEEgc3R1ZmYuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXRob2QgYWRkVGV4dCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgdGhhdCdzIGJlZW4gaW50cm9zcGVjdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3MgYmVhbjsKLQotICAgIC8qKgotICAgICAqIHJldHVybnMgdGhlIGJvb2xlYW4gZXF1aXZhbGVudCBvZiBhIHN0cmluZywgd2hpY2ggaXMgY29uc2lkZXJlZCB0cnVlCi0gICAgICogaWYgZWl0aGVyICJvbiIsICJ0cnVlIiwgb3IgInllcyIgaXMgZm91bmQsIGlnbm9yaW5nIGNhc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRvQm9vbGVhbihTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gKHMuZXF1YWxzSWdub3JlQ2FzZSgib24iKSB8fAotICAgICAgICAgICAgICAgIHMuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIHx8Ci0gICAgICAgICAgICAgICAgcy5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzSW50cm9zcGVjdG9yKGZpbmFsIENsYXNzIGJlYW4sIE1hcCBjb252ZXJ0ZXJzKSB7Ci0gICAgICAgIGF0dHJpYnV0ZVR5cGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBhdHRyaWJ1dGVTZXR0ZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBuZXN0ZWRUeXBlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgbmVzdGVkQ3JlYXRvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0KLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGJlYW4uZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgTWV0aG9kIG0gPSBtZXRob2RzW2ldOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBtLmdldE5hbWUoKTsKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBtLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIENsYXNzW10gYXJncyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQotICAgICAgICAgICAgaWYgKCJhZGRUZXh0Ii5lcXVhbHMobmFtZSkKLSAgICAgICAgICAgICAgICAmJiBqYXZhLmxhbmcuVm9pZC5UWVBFLmVxdWFscyhyZXR1cm5UeXBlKQotICAgICAgICAgICAgICAgICYmIGFyZ3MubGVuZ3RoID09IDEKLSAgICAgICAgICAgICAgICAmJiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmVxdWFscyhhcmdzWzBdKSkgewotCi0gICAgICAgICAgICAgICAgYWRkVGV4dCA9IG1ldGhvZHNbaV07Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJzZXQiKQotICAgICAgICAgICAgICAgICAgICAgICAmJiBqYXZhLmxhbmcuVm9pZC5UWVBFLmVxdWFscyhyZXR1cm5UeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAmJiBhcmdzLmxlbmd0aCA9PSAxCi0gICAgICAgICAgICAgICAgICAgICAgICYmICFhcmdzWzBdLmlzQXJyYXkoKSkgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gZ2V0UHJvcGVydHlOYW1lKG5hbWUsICJzZXQiKTsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVTZXR0ZXIgYXMgPSBjcmVhdGVBdHRyaWJ1dGVTZXR0ZXIobSwgYXJnc1swXSwgY29udmVydGVycyk7Ci0gICAgICAgICAgICAgICAgaWYgKGFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVHlwZXMucHV0KHByb3BOYW1lLCBhcmdzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlU2V0dGVycy5wdXQocHJvcE5hbWUsIGFzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJjcmVhdGUiKQotICAgICAgICAgICAgICAgICAgICAgICAmJiAhcmV0dXJuVHlwZS5pc0FycmF5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgIXJldHVyblR5cGUuaXNQcmltaXRpdmUoKQotICAgICAgICAgICAgICAgICAgICAgICAmJiBhcmdzLmxlbmd0aCA9PSAwKSB7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUobmFtZSwgImNyZWF0ZSIpOwotICAgICAgICAgICAgICAgIG5lc3RlZFR5cGVzLnB1dChwcm9wTmFtZSwgcmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICAgICAgbmVzdGVkQ3JlYXRvcnMucHV0KHByb3BOYW1lLCBuZXcgTmVzdGVkQ3JlYXRvcigpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGUoT2JqZWN0IHBhcmVudCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHt9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJhZGQiKQotICAgICAgICAgICAgICAgICAgICAgICAmJiBqYXZhLmxhbmcuVm9pZC5UWVBFLmVxdWFscyhyZXR1cm5UeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAmJiBhcmdzLmxlbmd0aCA9PSAxCi0gICAgICAgICAgICAgICAgICAgICAgICYmICFqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmVxdWFscyhhcmdzWzBdKQotICAgICAgICAgICAgICAgICAgICAgICAmJiAhYXJnc1swXS5pc0FycmF5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgIWFyZ3NbMF0uaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvciBjID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHt9KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gZ2V0UHJvcGVydHlOYW1lKG5hbWUsICJhZGQiKTsKLSAgICAgICAgICAgICAgICAgICAgbmVzdGVkVHlwZXMucHV0KHByb3BOYW1lLCBhcmdzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ3JlYXRvcnMucHV0KHByb3BOYW1lLCBuZXcgTmVzdGVkQ3JlYXRvcigpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKE9iamVjdCBwYXJlbnQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGMubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHt9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgT2JqZWN0W10ge299KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lZCBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiwgQ29udmVyc2lvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEF0dHJpYnV0ZVNldHRlciBhcyA9IChBdHRyaWJ1dGVTZXR0ZXIpIGF0dHJpYnV0ZVNldHRlcnMuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICBpZiAoYXMgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDbGFzcyAiICsgZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgIiBkb2Vzbid0IHN1cHBvcnQgdGhlIFwiIiArIGF0dHJpYnV0ZU5hbWUgKyAiXCIgYXR0cmlidXRlIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXMuc2V0KGVsZW1lbnQsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBnZXRNZXRob2RzIHNob3VsZCBvbmx5IHJldHVybiBwdWJsaWMgbWV0aG9kcwotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbihpZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbikgdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIFBDREFUQSBhcmVhcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgCi0gICAgICAgIHRocm93cyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24gewotICAgICAgICAgICAgCi0gICAgICAgIGlmIChhZGRUZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ2xhc3MgIiArIGVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICIgZG9lc24ndCBzdXBwb3J0IG5lc3RlZCB0ZXh0IGVsZW1lbnRzIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRkVGV4dC5pbnZva2UoZWxlbWVudCwgbmV3IFN0cmluZ1tdIHt0ZXh0fSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24oaWUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IChDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24pIHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOZXN0ZWRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICByZXR1cm4gbmVzdGVkQ3JlYXRvcnMuY29udGFpbnNLZXkoZWxlbWVudE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuYW1lZCBuZXN0ZWQgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUVsZW1lbnQoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBlbGVtZW50TmFtZSkgCi0gICAgICAgICB0aHJvd3MgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgTmVzdGVkQ3JlYXRvciBuYyA9IChOZXN0ZWRDcmVhdG9yKSBuZXN0ZWRDcmVhdG9ycy5nZXQoZWxlbWVudE5hbWUpOwotICAgICAgICBpZiAobmMgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDbGFzcyAiICsgZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgIiBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCBcIiIgKyBlbGVtZW50TmFtZSArICJcIiBlbGVtZW50IjsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5jLmNyZWF0ZShlbGVtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBnZXRNZXRob2RzIHNob3VsZCBvbmx5IHJldHVybiBwdWJsaWMgbWV0aG9kcwotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbihpZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaW5lKSB7Ci0gICAgICAgICAgICAvLyBpbXBvc3NpYmxlIGFzIGdldE1ldGhvZHMgc2hvdWxkIG9ubHkgcmV0dXJuIHB1YmxpYyBtZXRob2RzCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKGluZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbikgdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSB0eXBlIG9mIGEgbmFtZWQgbmVzdGVkIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldEVsZW1lbnRUeXBlKFN0cmluZyBlbGVtZW50TmFtZSkgCi0gICAgICAgIHRocm93cyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24gIHsKLSAgICAgICAgQ2xhc3MgbnQgPSAoQ2xhc3MpIG5lc3RlZFR5cGVzLmdldChlbGVtZW50TmFtZSk7Ci0gICAgICAgIGlmIChudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNsYXNzICIgKyBiZWFuLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgIiBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCBcIiIgKyBlbGVtZW50TmFtZSArICJcIiBlbGVtZW50IjsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0aGUgdHlwZSBvZiBhIG5hbWVkIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0QXR0cmlidXRlVHlwZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgCi0gICAgICAgIHRocm93cyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24gewotICAgICAgICBDbGFzcyBhdCA9IChDbGFzcykgYXR0cmlidXRlVHlwZXMuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICBpZiAoYXQgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDbGFzcyAiICsgYmVhbi5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICIgZG9lc24ndCBzdXBwb3J0IHRoZSBcIiIgKyBhdHRyaWJ1dGVOYW1lICsgIlwiIGF0dHJpYnV0ZSI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvZXMgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBzdXBwb3J0IFBDREFUQT8KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBhZGRUZXh0ICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCBhdHRyaWJ1ZXMgc3VwcG9ydGVkIGJ5IHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVTZXR0ZXJzLmtleXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYWxsIG5lc3RlZCBlbGVtZW50cyBzdXBwb3J0ZWQgYnkgdGhlIGludHJvc3BlY3RlZCBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TmVzdGVkRWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBuZXN0ZWRUeXBlcy5rZXlzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIEF0dHJpYnV0ZVNldHRlciBmb3IgdGhlIGdpdmVuCi0gICAgICogYXR0cmlidXRlIHR5cGUuICAKLSAgICAgKi8KLSAgICBwcml2YXRlIEF0dHJpYnV0ZVNldHRlciBjcmVhdGVBdHRyaWJ1dGVTZXR0ZXIoZmluYWwgTWV0aG9kIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGNvbnZlcnRlcnMpIHsKLQotICAgICAgICBpZiAoY29udmVydGVycyAhPSBudWxsICYmIGNvbnZlcnRlcnMuY29udGFpbnNLZXkoYXJnKSkgewotICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIGNvbnZlcnRlciB0byB1c2UgdG8gY29udmVydCB0aGUgc3RyaWduIAotICAgICAgICAgICAgLy8gdmFsdWUgb2YgaW50byBzb21ldGhpbmcgdGhlIHNldCBtZXRob2QgZXhwZWN0cy4KLSAgICAgICAgICAgIGZpbmFsIENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoQ29udmVydGVyKWNvbnZlcnRlcnMuZ2V0KGFyZyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uLCBDb252ZXJzaW9uRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHtjb252ZXJ0ZXIuY29udmVydCh2YWx1ZSwgYXJnKX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICAvLyBzaW1wbGVzdCBjYXNlIC0gc2V0QXR0cmlidXRlIGV4cGVjdHMgU3RyaW5nCi0gICAgICAgIGVsc2UgaWYgKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IFN0cmluZ1tdIHt2YWx1ZX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAvLyBub3cgZm9yIHRoZSBwcmltaXRpdmUgdHlwZXMsIHVzZSB0aGVpciB3cmFwcGVycwotICAgICAgICB9IGVsc2UgaWYgKGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MuZXF1YWxzKGFyZykKLSAgICAgICAgICAgICAgICAgICB8fCBqYXZhLmxhbmcuQ2hhcmFjdGVyLlRZUEUuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IENoYXJhY3RlcltdIHtuZXcgQ2hhcmFjdGVyKHZhbHVlLmNoYXJBdCgwKSl9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgfSBlbHNlIGlmIChqYXZhLmxhbmcuQnl0ZS5UWVBFLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBCeXRlW10ge25ldyBCeXRlKHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICB9IGVsc2UgaWYgKGphdmEubGFuZy5TaG9ydC5UWVBFLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBTaG9ydFtdIHtuZXcgU2hvcnQodmFsdWUpfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIH0gZWxzZSBpZiAoamF2YS5sYW5nLkludGVnZXIuVFlQRS5lcXVhbHMoYXJnKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3QgcGFyZW50LCBTdHJpbmcgdmFsdWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgSW50ZWdlcltdIHtuZXcgSW50ZWdlcih2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgfSBlbHNlIGlmIChqYXZhLmxhbmcuTG9uZy5UWVBFLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBMb25nW10ge25ldyBMb25nKHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICB9IGVsc2UgaWYgKGphdmEubGFuZy5GbG9hdC5UWVBFLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBGbG9hdFtdIHtuZXcgRmxvYXQodmFsdWUpfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIH0gZWxzZSBpZiAoamF2YS5sYW5nLkRvdWJsZS5UWVBFLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBEb3VibGVbXSB7bmV3IERvdWJsZSh2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICB9IGVsc2UgaWYgKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzLmVxdWFscyhhcmcpIAotICAgICAgICAgICAgICAgICAgIHx8IGphdmEubGFuZy5Cb29sZWFuLlRZUEUuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbltdIHtuZXcgQm9vbGVhbih0b0Jvb2xlYW4odmFsdWUpKX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgIC8vIENsYXNzIGRvZXNuJ3QgaGF2ZSBhIFN0cmluZyBjb25zdHJ1Y3RvciBidXQgYSBkZWNlbnQgZmFjdG9yeSBtZXRob2QKLSAgICAgICAgfSBlbHNlIGlmIChqYXZhLmxhbmcuQ2xhc3MuY2xhc3MuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBDbGFzc1tdIHtDbGFzcy5mb3JOYW1lKHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24oY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgLy8gd29yc3QgY2FzZS4gbG9vayBmb3IgYSBwdWJsaWMgU3RyaW5nIGNvbnN0cnVjdG9yIGFuZCB1c2UgaXQKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvciBjID0gCi0gICAgICAgICAgICAgICAgICAgIGFyZy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7amF2YS5sYW5nLlN0cmluZy5jbGFzc30pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHBhcmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7Yy5uZXdJbnN0YW5jZShuZXcgU3RyaW5nW10ge3ZhbHVlfSl9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24oaWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBubWUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZXh0cmFjdCB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IGZyb20gYSBtZXRob2QgbmFtZSAtIHN1YnRyYWN0aW5nCi0gICAgICogYSBnaXZlbiBwcmVmaXguICAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gcHJlZml4Lmxlbmd0aCgpOwotICAgICAgICByZXR1cm4gbWV0aG9kTmFtZS5zdWJzdHJpbmcoc3RhcnQpLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgTmVzdGVkQ3JlYXRvciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKE9iamVjdCBwYXJlbnQpIAotICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb247Ci0gICAgfQotICAgIHByaXZhdGUgaW50ZXJmYWNlIEF0dHJpYnV0ZVNldHRlciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3QgcGFyZW50LCBTdHJpbmcgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgQ2xhc3NJbnRyb3NwZWN0aW9uRXhjZXB0aW9uLCBDb252ZXJzaW9uRXhjZXB0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9Db252ZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI1ZDI0Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9Db252ZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAvKiogCi0gICAgICogRXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhpcyBvbmUuIAotICAgICAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aXZlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDb252ZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24gYXMKLSAgICAgKiBhIHJvb3QgY2F1c2UuCi0gICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaHJvd2FibGUgdGhhdCBtaWdodCBoYXZlIGNhdXNlIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBDb252ZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtc2cpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFzIGEgcm9vdCBjYXVzZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIENvbnZlcnNpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlLnRvU3RyaW5nKCkpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmVzdGVkIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBzdGFjayB0cmFjZSB0byBTeXN0ZW0uZXJyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotICAgICAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBzdGFjayB0cmFjZSB0byB0aGUgZ2l2ZW4gUHJpbnRTdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcyB0aGUgUHJpbnRTdHJlYW0gb250byB3aGljaCB0aGUgc3RhY2sgdHJhY2UgCi0gICAgICogICAgICAgICAgIG9mIHRoaXMgZXhjZXB0aW9uIGlzIHRvIGJlIHByaW50ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcHMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChwcykgewotICAgICAgICAgICAgcHMucHJpbnRsbih0aGlzKTsKLSAgICAgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnRsbigiLS0tIE5lc3RlZCBFeGNlcHRpb24gLS0tIik7Ci0gICAgICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgc3RhY2sgdHJhY2UgdG8gdGhlIGdpdmVuIFByaW50V3JpdGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHcgdGhlIFByaW50V3JpdGVyIG9udG8gd2hpY2ggdGhlIHN0YWNrIHRyYWNlIAotICAgICAqICAgICAgICAgICBvZiB0aGlzIGV4Y2VwdGlvbiBpcyB0byBiZSBwcmludGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHB3KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocHcpIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4odGhpcyk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIi0tLSBOZXN0ZWQgRXhjZXB0aW9uIC0tLSIpOwotICAgICAgICAgICAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQ29udmVydGVyLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2MwZDcuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbjsKLQotLyoqCi0gKiBDb252ZXJ0IGJldHdlZW4gYSBzdHJpbmcgYW5kIGEgZGF0YSB0eXBlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgc3RyaW5nIGZyb20gdGhlIHZhbHVlIGdpdmVuIHRvIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLgotICAgICAqLwotICAgIE9iamVjdCBjb252ZXJ0KFN0cmluZyB2YWx1ZSwgQ2xhc3MgdHlwZSkgdGhyb3dzIENvbnZlcnNpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQ29udmVydGVyRGVmaW5pdGlvbi5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0NvbnZlcnRlckRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhNDY0MC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vQ29udmVydGVyRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBDb252ZXJ0ZXIgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgd2hpY2ggd2lsbCBjb252ZXJ0Ci0gKiBhIHN0cmluZyBpbnRvIGFuIGluc3RhbmNlIG9mIGEgcGFydGljdWxhciB0eXBlIG9mIGNsYXNzLiBDb252ZXJ0ZXJzCi0gKiBhcmUgdHlwaWNhbGx5IG9ubHkgbmVlZGVkIHdoZW4gc29tZSBjb250ZXh0IGluZm9ybWF0aW9uIGlzIAotICogcmVxdWlyZWQgdG8gcGVyZm9ybSB0aGUgY29udmVyc2lvbi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLyAKLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJEZWZpbml0aW9uIHsKLSAgICAvKiogVGhlIFVSTCBvZiB0aGUgbGlicmFyeSB3aGljaCBkZWZpbmVzIHRoaXMgY29udmVydGVyICovCi0gICAgcHJpdmF0ZSBVUkwgY29udmVydGVyTGlicmFyeVVSTDsKLSAgICAgCi0gICAgLyoqIFRoZSBjb252ZXJ0ZXIncyBjbGFzcyBuYW1lICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3NOYW1lOwotICAgIAotICAgIC8qKiBUaGUgY29udmVydGVkIGNsYXNzIHJldHVybmVkIGJ5IHRoaXMgY29udmVydGVyICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lOwotICAgIAotICAgIC8qKiBUaGUgY29udmVydGVyIGNsYXNzIGxvYWRlZCBmcm9tIHRoZSBsb2FkZXIgb24gZGVtYW5kLgotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3MgY29udmVydGVyQ2xhc3MgPSBudWxsOwotICAgIAotICAgIC8qKiBUaGUgY2xhc3MgdG8gd2hpY2ggdGhpcyBjb252ZXJ0ZXIgY29udmVydHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyB0YXJnZXRDbGFzcyA9IG51bGw7Ci0gICAgCi0gICAgLyoqIFRoZSBjb252ZXJ0ZXJzJ3MgY2xhc3MgbG9hZGVyLiAqLwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY29udmVydGVyQ2xhc3NMb2FkZXI7Ci0gICAgCi0gICAgcHVibGljIENvbnZlcnRlckRlZmluaXRpb24oVVJMIGNvbnZlcnRlckxpYnJhcnlVUkwsIFN0cmluZyBjb252ZXJ0ZXJDbGFzc05hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRDbGFzc05hbWUsIENsYXNzTG9hZGVyIGNvbnZlcnRlckNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuY29udmVydGVyTGlicmFyeVVSTCA9IGNvbnZlcnRlckxpYnJhcnlVUkw7Ci0gICAgICAgIHRoaXMuY29udmVydGVyQ2xhc3NOYW1lID0gY29udmVydGVyQ2xhc3NOYW1lOwotICAgICAgICB0aGlzLnRhcmdldENsYXNzTmFtZSA9IHRhcmdldENsYXNzTmFtZTsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZXJDbGFzc0xvYWRlciA9IGNvbnZlcnRlckNsYXNzTG9hZGVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgdGhpcyBjb252ZXJ0ZXIgd2lsbCByZXR1cm4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXRDbGFzc05hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2xhc3NuYW1lIG9mIHRoZSBjb252ZXJ0ZXIgdGhhdCBpcyBiZWluZyBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gY29udmVydGVyQ2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFVSTCB3aGVyZSB0aGlzIGNvbnZlcnRlciB3YXMgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm5zIGEgVVJMIG9mIHRoZSBsaWIgZGVmaW50aW9uIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldExpYnJhcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZXJMaWJyYXJ5VVJMOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbnZlcnRlciBjbGFzcwotICAgICAqCi0gICAgICogQHJldHVybiBhIGNsYXNzIG9iamVjdCBmb3IgdGhpcyBjb252ZXJ0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIENsYXNzIGdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAoY29udmVydGVyQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udmVydGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNvbnZlcnRlckNsYXNzTmFtZSwgdHJ1ZSwgY29udmVydGVyQ2xhc3NMb2FkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZXJDbGFzczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjb252ZXJ0ZXIgY2xhc3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBjbGFzcyBvYmplY3QgZm9yIHRoaXMgY29udmVydGVyCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBDbGFzcyBnZXRUYXJnZXRDbGFzcygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRhcmdldENsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRhcmdldENsYXNzID0gQ2xhc3MuZm9yTmFtZSh0YXJnZXRDbGFzc05hbWUsIHRydWUsIGNvbnZlcnRlckNsYXNzTG9hZGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3M7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vRXhlY3V0aW9uQ29udGV4dC5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0V4ZWN1dGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0Yjc2OC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vRXhlY3V0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoZSBFeGVjdXRpb25Db250ZXh0IGludGVyZmFjZSBwcm92aWRlcyBhIHRhc2sgb3IgYXBzZWN0IGluc3RhbmNlIHdpdGggYWNjZXNzIHRvIHRoZSAKLSAqIGNvbnRhaW5lci1wcm92aWRlZCBzZXJ2aWNlcy4gVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gYWNjZXNzIHRoZSBjb250YWluZXIuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8gCi1wdWJsaWMgY2xhc3MgRXhlY3V0aW9uQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBFeGVjdXRpb25GcmFtZSBmcmFtZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCdWlsZEV2ZW50U3VwcG9ydCBldmVudFN1cHBvcnQ7Ci0gICAgcHJpdmF0ZSBCdWlsZEVsZW1lbnQgYnVpbGRFbGVtZW50OwotCi0gICAgcHVibGljIEV4ZWN1dGlvbkNvbnRleHQoRXhlY3V0aW9uRnJhbWUgZnJhbWUsIEJ1aWxkRXZlbnRTdXBwb3J0IGV2ZW50U3VwcG9ydCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRFbGVtZW50IGJ1aWxkRWxlbWVudCkgewotICAgICAgICB0aGlzLmZyYW1lID0gZnJhbWU7Ci0gICAgICAgIHRoaXMuZXZlbnRTdXBwb3J0ID0gZXZlbnRTdXBwb3J0OwotICAgICAgICB0aGlzLmJ1aWxkRWxlbWVudCA9IGJ1aWxkRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2cgYSBtZXNhZ2Ugd2l0aCB0aGUgZ2l2ZSBwcmlvcml0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuCi0gICAgICogQHBhcmFtIG1zZ0xldmVsIHRoZSBtZXNzYWdlIHByaW9yaXR5IGF0IHdoaWNoIHRoaXMgbWVzc2FnZSBpcyB0byBiZSBsb2dnZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2csIGludCBtc2dMZXZlbCkgewotICAgICAgICBldmVudFN1cHBvcnQuZmlyZU1lc3NhZ2VMb2dnZWQodGhpcywgYnVpbGRFbGVtZW50LCBtc2csIG1zZ0xldmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGZyYW1lLnNldERhdGFWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXREYXRhVmFsdWUoU3RyaW5nIG5hbWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZnJhbWUuZ2V0RGF0YVZhbHVlKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2UgJHt9IHN0eWxlIGNvbnN0cnVjdGlvbnMgaW4gdGhlIGdpdmVuIHZhbHVlIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZgotICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgdHlwZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB0byBiZSBzY2FubmVkIGZvciBwcm9wZXJ0eSByZWZlcmVuY2VzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcmVwbGFjZVByb3BlcnR5UmVmcyhTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZnJhbWUucmVwbGFjZVByb3BlcnR5UmVmcyh2YWx1ZSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODJlOGMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0V4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEFuIEV4ZWN1dGl1b25FeGNlcHRpb24gaW5kaWNhdGVzIGEgcHJvYmxlbSBkdXJpbmcgCi0gKiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBidWlsZCBmaWxlcyB0YXNrcwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRXhlY3V0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQW50RXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdGl2ZSBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRpb25FeGNlcHRpb24oU3RyaW5nIG1zZykgewotICAgICAgICBzdXBlcihtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aXZlIG1lc3NhZ2UgYW5kIGEgbG9jYXRpb24KLSAgICAgKiBpbiBhIGZpbGUuCi0gICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiBMb2NhdGlvbiBpbiB0aGUgcHJvamVjdCBmaWxlIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRpb25FeGNlcHRpb24oU3RyaW5nIG1zZywgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIobXNnLCBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaHJvd2FibGUgdGhhdCBtaWdodCBoYXZlIGNhdXNlIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRpb25FeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBhcwotICAgICAqIGEgcm9vdCBjYXVzZSBhbmQgYSBsb2NhdGlvbiBpbiBhIGZpbGUuCi0gICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBjYXVzZSBFeGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlIHRoaXMgb25lLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiBMb2NhdGlvbiBpbiB0aGUgcHJvamVjdCBmaWxlIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRpb25FeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlLCBMb2NhdGlvbiBsb2NhdGlvbikgewotICAgICAgICBzdXBlcihtc2csIGNhdXNlLCBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFzIGEgcm9vdCBjYXVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXVzZSBFeGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlZCB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlIGFuZCBhIGxvY2F0aW9uIGluIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZSB0aGlzIG9uZS4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gTG9jYXRpb24gaW4gdGhlIHByb2plY3QgZmlsZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSwgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIoY2F1c2UsIGxvY2F0aW9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vRXhlY3V0aW9uRnJhbWUuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9FeGVjdXRpb25GcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ0ZGY2Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9FeGVjdXRpb25GcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuc3VwcG9ydC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUudHlwZXMuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLS8qKgotICogQW4gRXhlY3V0aW9uRnJhbWUgaXMgdGhlIHN0YXRlIG9mIGEgcHJvamVjdCBkdXJpbmcgYW4gZXhlY3V0aW9uLiAKLSAqIFRoZSBFeGVjdXRpb25GcmFtZSBjb250YWlucyB0aGUgZGF0YSB2YWx1ZXMgc2V0IGJ5IEFudCB0YXNrcyBhcwotICogdGhleSBhcmUgZXhlY3V0ZWQsIGluY2x1ZGluZyB0YXNrIGRlZmluaXRpb25zLCBwcm9wZXJ0eSB2YWx1ZXMsIGV0Yy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLwotcHVibGljIGNsYXNzIEV4ZWN1dGlvbkZyYW1lIHsKLSAgICAvKiogU3RhdGUgdXNlZCBpbiBkZXBlbmRlbmN5IGFuYWx5c2lzIHdoZW4gYSB0YXJnZXQncyBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nCi0gICAgICAgIGV4YW1pbmVkLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVElORyA9ICJWSVNJVElORyI7Ci0KLSAgICAvKiogU3RhdGUgdXNlZCBpbiBkZXBlbmRlbmN5IGFuYWx5c2lzIHRvIGluZGljYXRlIGEgdGFyZ2V0IGhhcyBiZWVuIGV4YW1pbmVkICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lURUQgPSAiVklTSVRFRCI7Ci0KLSAgICAvKiogVGhlIFByb2plY3QgdGhhdCB0aGlzIGV4ZWNpdG9uIGZyYW1lIGlzIHByb2Nlc3NpbmcgKi8KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0gICAgCi0gICAgLyoqIFRoZSBiYXNlIFVSTCBmb3IgdGhpcyBmcmFtZS4gVGhpcyBpcyBkZXJpdmVkIGZyb20gdGhlIAotICAgICAgICBQcm9qZWN0J3Mgc291cmNlIFVSTCBhbmQgaXQncyBiYXNlIGF0dHJpYnV0ZS4gKi8KLSAgICBwcml2YXRlIFVSTCBiYXNlVVJMID0gbnVsbDsKLSAgICAKLSAgICAvKiogVGhlIGltcG9ydGVkIGZyYW1lcyBvZiB0aGlzIGZyYW1lLiBGb3IgZWFjaCBwcm9qZWN0IGltcG9ydGVkIGJ5IHRoaXMgZnJhbWUncwotICAgICAgICBwcm9qZWN0LCBhIGNvcnJlc3BvbmRpbmcgRXhlY3V0aW9uRnJhbWUgaXMgY3JlYXRlZC4gKi8KLSAgICBwcml2YXRlIE1hcCBpbXBvcnRlZEZyYW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgLyoqIEJ1aWxkRXZlbnQgc3VwcG9ydCB1c2VkIHRvIGZpcmUgZXZlbnRzIGFuZCBtYW5hZ2UgbGlzdGVuZXJzICovCi0gICAgcHJpdmF0ZSBCdWlsZEV2ZW50U3VwcG9ydCBldmVudFN1cHBvcnQgPSBuZXcgQnVpbGRFdmVudFN1cHBvcnQoKTsKLSAgICAKLSAgICAvKiogVGhlIGNvbnRleHQgb2YgdGhpcyBleGVjdXRpb24uIFRoaXMgY29udGFpbnMgYWxsIGRhdGEgb2JqZWN0J3MKLSAgICAgICAgY3JlYXRlZCBieSB0YXNrcyB0aGF0IGhhdmUgYmVlbiBleGVjdXRlZCAqLwotICAgIHByaXZhdGUgTWFwIGRhdGFWYWx1ZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIC8qKiBJbnRyb3NwZWN0b3Igb2JqZWN0cyB1c2VkIHRvIGNvbmZpZ3VyZSBUYXNrcyBmcm9tIHRoZSBUYXNrIG1vZGVscy4qLwotICAgIHByaXZhdGUgTWFwIGludHJvc3BlY3RvcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIC8qKiBUaGUgdGFzayBkZWZzIHRoYXQgdGhpcyBmcmFtZSB3aWxsIHVzZSB0byBwcm9jZXNzIHRhc2tzICovCi0gICAgcHJpdmF0ZSBNYXAgdGFza0RlZnMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIC8qKiBUeXBlIGNvbnZlcnRlcnMgZm9yIHRoaXMgZXhlY3V0aW9uRnJhbWUuIENvbnZlcnRlcnMgYXJlIHVzZWQgd2hlbiBjb25maWd1cmluZwotICAgICAgICBUYXNrcyB0byBoYW5kbGUgc3BlY2lhbCB0eXBlIGNvbnZlcnNpb25zLiAqLwotICAgIHByaXZhdGUgTWFwIGNvbnZlcnRlcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIC8qKiBUaGUgYXNwZWN0IGhhbmRsZXIgYWN0aXZlIGluIHRoaXMgZnJhbWUgKi8KLSAgICBwcml2YXRlIE1hcCBhc3BlY3RIYW5kbGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgLyoqIFRoZSBuYW1lc3BhY2UgdW5kZXIgd2hpY2ggdGhpcyBleGVjdXRpb24gZnJhbWUgbGl2ZXMgaW4gdGhlIGhpZXJhcmNoaWNhbAotICAgICAgICBwcm9qZWN0IG5hbWVzcGFjZSAtIG51bGwgZm9yIHRoZSByb290IG5hbWVzcGFjZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYW4gZXhlY3V0aW9uIGZyYW1lIHRvIHByb2Nlc3MgdGhlIGdpdmVuIHByb2plY3QgbW9kZWwgd2l0aCAKLSAgICAgKiB0aGUgY29uZmlndXJhdGlvbiByZXByZXNlbnRlZCBieSB0aGUgbGlicmFyaWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIG1vZGVsIG9mIHRoZSBwcm9qZWN0IHRvIGJlIGJ1aWx0LgotICAgICAqIEBwYXJhbSBsaWJyYXJpZXMgYW4gQXJyYXkgb2YgQW50TGlicmFyeSBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIAotICAgICAqICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBBbnQgZm9yIHRoaXMgYnVpbGQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB3aGVuIHRoZSBwcm9qZWN0IGNhbm5vdCBiZSBzZXR1cCB3aXRoIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0aW9uRnJhbWUoUHJvamVjdCBwcm9qZWN0LCBBbnRMaWJyYXJ5W10gbGlicmFyaWVzKSAKLSAgICAgICAgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7Ci0gICAgCi0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgc2V0dXBGcmFtZShwcm9qZWN0LCBsaWJyYXJpZXMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBzdWJmcmFtZSBmb3IgbWFuYWdpbmcgYSBwcm9qZWN0IGltcG9ydGVkIGludG8gdGhlIG1haW4gcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgbW9kZWwgb2YgdGhlIHByb2plY3QgdG8gYmUgYnVpbHQuCi0gICAgICogQHBhcmFtIGxpYnJhcmllcyBhbiBBcnJheSBvZiBBbnRMaWJyYXJ5IG9iamVjdHMgY29udGFpbmluZyB0aGUgCi0gICAgICogICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9mIEFudCBmb3IgdGhpcyBidWlsZC4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIHRoZSBsb2NhdGlvbiBvZiB0aGlzIHByb2plY3Qgd2l0aGluIHRoZSBvdmVyYWxsIGltcG9ydAotICAgICAqICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLgotICAgICAqCi0gICAgICogQHRocm93cyBDb25maWdFeGNlcHRpb24gd2hlbiB0aGUgcHJvamVjdCBjYW5ub3QgYmUgc2V0dXAgd2l0aCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBjb25maWd1cmF0aW9uCi0gICAgICovICAgICAKLSAgICBwcml2YXRlIEV4ZWN1dGlvbkZyYW1lKFByb2plY3QgcHJvamVjdCwgQW50TGlicmFyeVtdIGxpYnJhcmllcywgU3RyaW5nIG5hbWVzcGFjZSkgCi0gICAgICAgIHRocm93cyBDb25maWdFeGNlcHRpb24gewotICAgIAotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgc2V0dXBGcmFtZShwcm9qZWN0LCBsaWJyYXJpZXMpOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIFNldCB1cCB0aGUgZXhlY3V0aW9uIGZyYW1lLiAKLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGV4YW1pbmVzIHRoZSBwcm9qZWN0IG1vZGVsIGFuZCBjb25zdHJ1Y3RzIHRoZSByZXF1aXJlZAotICAgICAqIHN1YmZyYW1lcyB0byBoYW5kbGUgaW1wb3J0ZWQgcHJvamVjdHMuCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIG1vZGVsIG9mIHRoZSBwcm9qZWN0IHRvIGJlIGJ1aWx0LgotICAgICAqIEBwYXJhbSBsaWJyYXJpZXMgYW4gQXJyYXkgb2YgQW50TGlicmFyeSBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIAotICAgICAqICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBBbnQgZm9yIHRoaXMgYnVpbGQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB3aGVuIHRoZSBwcm9qZWN0IGNhbm5vdCBiZSBzZXR1cCB3aXRoIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBGcmFtZShQcm9qZWN0IHByb2plY3QsIEFudExpYnJhcnlbXSBsaWJyYXJpZXMpIAotICAgICAgICB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIHsKLQotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpYnJhcmllcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgYWRkTGlicmFyeShsaWJyYXJpZXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSBwcm9qZWN0LmdldEJhc2UoKTsKLSAgICAgICAgICAgIGlmIChiYXNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiYXNlVVJMID0gcHJvamVjdC5nZXRTb3VyY2VVUkwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoIWJhc2UuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICBiYXNlICs9ICIvIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmFzZVVSTCA9IG5ldyBVUkwocHJvamVjdC5nZXRTb3VyY2VVUkwoKSwgYmFzZSk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJQcm9qZWN0J3MgYmFzZSB2YWx1ZSBcIiIgKyBwcm9qZWN0LmdldEJhc2UoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgaXMgbm90IHZhbGlkIiwgZSwgcHJvamVjdC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcm9qZWN0LmdldEltcG9ydGVkUHJvamVjdE5hbWVzKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIGltcG9ydE5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgUHJvamVjdCBpbXBvcnRlZFByb2plY3QgPSBwcm9qZWN0LmdldEltcG9ydGVkUHJvamVjdChpbXBvcnROYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBpbXBvcnROYW1lc3BhY2UgCi0gICAgICAgICAgICAgICAgPSBuYW1lc3BhY2UgPT0gbnVsbCA/IGltcG9ydE5hbWUgOiBuYW1lc3BhY2UgKyAiOiIgKyBpbXBvcnROYW1lOwotICAgICAgICAgICAgRXhlY3V0aW9uRnJhbWUgaW1wb3J0ZWRGcmFtZSAKLSAgICAgICAgICAgICAgICA9IG5ldyBFeGVjdXRpb25GcmFtZShpbXBvcnRlZFByb2plY3QsIGxpYnJhcmllcywgaW1wb3J0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGltcG9ydGVkRnJhbWVzLnB1dChpbXBvcnROYW1lLCBpbXBvcnRlZEZyYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIGNvbmZpZ3VyYXRpb24gbGlicmFyeSB0byB0aGlzIGV4ZWN1dGlvbiBmcmFtZS4gVGhlIGxpYnJhcnkKLSAgICAgKiB3aWxsIGNvbnRhaW4gdGFzayBkZWZpbml0aW9ucywgY29udmVydGVycywgYXBzZWN0IGhhbmRsZXIgZGVmaW5pdGlvbnMsCi0gICAgICogZXRjLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpYnJhcnkgdGhlIGNvbmZpZ3VyYXRpb24gbGlicmFyeSB0byBhZGQgdG8gdGhpcyBmcmFtZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIGlmIHRoZSBpdGVtcyBpbiB0aGUgbGlicmFyeSBjYW5ub3QgYmUgY29uZmlndXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaWJyYXJ5KEFudExpYnJhcnkgbGlicmFyeSkgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpYnJhcnkuZ2V0VGFza0RlZmluaXRpb25zKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFRhc2tEZWZpbml0aW9uIHRhc2tEZWZpbml0aW9uID0gKFRhc2tEZWZpbml0aW9uKWkubmV4dCgpOwotICAgICAgICAgICAgYWRkVGFza0RlZmluaXRpb24odGFza0RlZmluaXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpYnJhcnkuZ2V0Q29udmVydGVyRGVmaW5pdGlvbnMoKTsgaS5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgQ29udmVydGVyRGVmaW5pdGlvbiBjb252ZXJ0ZXJEZWYgPSAoQ29udmVydGVyRGVmaW5pdGlvbilpLm5leHQoKTsKLSAgICAgICAgICAgIGFkZENvbnZlcnRlckRlZmluaXRpb24oY29udmVydGVyRGVmKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaWJyYXJ5LmdldEFzcGVjdERlZmluaXRpb25zKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIEFzcGVjdERlZmluaXRpb24gYXNwZWN0RGVmID0gKEFzcGVjdERlZmluaXRpb24paS5uZXh0KCk7Ci0gICAgICAgICAgICBhZGRBc3BlY3RIYW5kbGVyKGFzcGVjdERlZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSB0YXNrIGRlZmluaXRpb24gdG8gdGhpcyBleGVjdXRpb24gZnJhbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXNrRGVmaW5pdGlvbiB0aGUgVGFza0RlZmluaXRpb24gdG8gYmUgYWRkZWQgdG8gdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGFza0RlZmluaXRpb24oVGFza0RlZmluaXRpb24gdGFza0RlZmluaXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHRhc2tOYW1lID0gdGFza0RlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgICAgICB0YXNrRGVmcy5wdXQodGFza05hbWUsIHRhc2tEZWZpbml0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGEgYXNwZWN0IGhhbmRsZXIgZGVmaW5pdGlvbiB0byB0aGlzIGV4ZWN1dGlvbiBmcmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHRhc2tEZWZpbml0aW9uIHRoZSBUYXNrRGVmaW5pdGlvbiB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIGlmIHRoZSBhc3BlY3QgaGFuZGxlciBjYW5ub3QgYmUgY3JlYXRlZCBvciBjb25maWd1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEFzcGVjdEhhbmRsZXIoQXNwZWN0RGVmaW5pdGlvbiBhc3BlY3REZWZpbml0aW9uKSAKLSAgICAgICAgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhc3BlY3RQcmVmaXggPSBhc3BlY3REZWZpbml0aW9uLmdldEFzcGVjdFByZWZpeCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYXNwZWN0SGFuZGxlckNsYXNzID0gYXNwZWN0RGVmaW5pdGlvbi5nZXRBc3BlY3RIYW5kbGVyQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzcGVjdEhhbmRsZXJzLnB1dChhc3BlY3RQcmVmaXgsIGFzcGVjdEhhbmRsZXJDbGFzcyk7Ci0gICAgICAgIH0gICAgCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIGFzcGVjdCBoYW5kbGVyIGNsYXNzIGZvciAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFzcGVjdERlZmluaXRpb24uZ2V0QXNwZWN0SGFuZGxlckNsYXNzTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBjb252ZXJ0ZXIgZnJvbSAiICsgYXNwZWN0RGVmaW5pdGlvbi5nZXRMaWJyYXJ5VVJMKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhIGNvbnZlcnRlciBkZWZpbml0aW9uIHRvIHRoaXMgbGlicmFyeS4KLSAgICAgKgotICAgICAqIFRoZSBjb252ZXJ0ZXIgaXMgY3JlYXRlZCBpbW1lZGlhdGVseSB0byBoYW5kbGUgY29udmVyc2lvbnMKLSAgICAgKiB3aGVuIGl0ZW1zIGFyZSBiZWluZyBjb25maWd1cmVkLiBJZiB0aGUgY29udmVydGVyIGlzIGFuIGluc3RhbmNlIG9mCi0gICAgICogYW4gQW50Q29udmVydGVyLCB0aGUgY29udmVydGVyIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIGV4ZWN1dGlvbgotICAgICAqIGZyYW1lIGdpdmluZyBpdCB0aGUgY29udGV4dCBpdCBuZWVkcyB0byByZXNvbHZlIGl0ZW1zIHJlbGF0aXZlIHRvIHRoZQotICAgICAqIHByb2plY3QncyBiYXNlLCBldGMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udmVydGVyRGVmIHRoZSBjb252ZXJ0ZXIgZGVmaW5pdGlvbiB0byBsb2FkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiBpZiB0aGUgY29udmVydGVyIGNhbm5vdCBiZSBjcmVhdGVkIG9yIGNvbmZpZ3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29udmVydGVyRGVmaW5pdGlvbihDb252ZXJ0ZXJEZWZpbml0aW9uIGNvbnZlcnRlckRlZikgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gdGFyZ2V0TG9hZGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IGNvbnZlcnRlckRlZi5nZXRUYXJnZXRDbGFzcygpOwotICAgICAgICAgICAgdGFyZ2V0TG9hZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBDbGFzcyBjb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckRlZi5nZXRDb252ZXJ0ZXJDbGFzcygpOwotICAgICAgICAgICAgQ29udmVydGVyIGNvbnZlcnRlciA9IChBbnRDb252ZXJ0ZXIpY29udmVydGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIgaW5zdGFuY2VvZiBBbnRDb252ZXJ0ZXIpIHsKLSAgICAgICAgICAgICAgICAoKEFudENvbnZlcnRlciljb252ZXJ0ZXIpLmluaXQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb252ZXJ0ZXJzLnB1dCh0YXJnZXRDbGFzcywgY29udmVydGVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0TG9hZGVkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgY29udmVydGVyIGNsYXNzIGZvciAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb252ZXJ0ZXJEZWYuZ2V0Q29udmVydGVyQ2xhc3NOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBjb252ZXJ0ZXIgZnJvbSAiICsgY29udmVydGVyRGVmLmdldExpYnJhcnlVUkwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgdGFyZ2V0IGNsYXNzICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRlckRlZi5nZXRUYXJnZXRDbGFzc05hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIGNvbnZlcnRlciBmcm9tICIgKyBjb252ZXJ0ZXJEZWYuZ2V0TGlicmFyeVVSTCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGNvbnZlcnRlciBjbGFzcyAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRlckRlZi5nZXRUYXJnZXRDbGFzc05hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gY29udmVydGVyIGZyb20gIiArIGNvbnZlcnRlckRlZi5nZXRMaWJyYXJ5VVJMKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIlVuYWJsZSB0byBhY2Nlc3MgY29udmVydGVyIGNsYXNzICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydGVyRGVmLmdldFRhcmdldENsYXNzTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBjb252ZXJ0ZXIgZnJvbSAiICsgY29udmVydGVyRGVmLmdldExpYnJhcnlVUkwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGJhZSBVUkwgb2YgdGhpcyBmcmFtZS4gVGhpcyB3aWxsIGVpdGhlciBiZSBzcGVjaWZpZWQgYnkgdGhlIHByb2plY3QncwotICAgICAqIGJhc2UgYXR0cmlidXRlIG9yIGJlIGRlcml2ZWQgaW1wbGljaXRseSBmcm9tIHRoZSBwcm9qZWN0J3MgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRCYXNlVVJMKCkgewotICAgICAgICByZXR1cm4gYmFzZVVSTDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEJ1aWxkTGlzdGVuZXIoQnVpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRJbXBvcnRlZEZyYW1lcygpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBFeGVjdXRpb25GcmFtZSBzdWJGcmFtZSA9IChFeGVjdXRpb25GcmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIHN1YkZyYW1lLmFkZEJ1aWxkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50U3VwcG9ydC5hZGRCdWlsZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQnVpbGRMaXN0ZW5lcihCdWlsZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEltcG9ydGVkRnJhbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIEV4ZWN1dGlvbkZyYW1lIHN1YkZyYW1lID0gKEV4ZWN1dGlvbkZyYW1lKWkubmV4dCgpOwotICAgICAgICAgICAgc3ViRnJhbWUucmVtb3ZlQnVpbGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgZXZlbnRTdXBwb3J0LnJlbW92ZUJ1aWxkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGVjdXRpb24gZnJhbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgaXd0aCB0aGlzIGV4ZWN1dGlvbiBmcmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBmcmFtZXMgcmVwcmVzZW50aW5nIGltcG9ydGVkIHByb2plY3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciB3aGljaCByZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgaW1wb3J0ZWQgZnJhbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRJbXBvcnRlZEZyYW1lTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBpbXBvcnRlZEZyYW1lcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZnJhbWVzIHJlcHJlc2VudGluZyBpbXBvcnRlZCBwcm9qZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgaW1wb3J0ZWQgRXhldWN0aW9uRnJhbWVzLi4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0SW1wb3J0ZWRGcmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBpbXBvcnRlZEZyYW1lcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYW4gaW1wb3J0ZWQgZnJhbWUgYnkgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGltcG9ydE5hbWUgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlIGZyYW1lIHdhcyBpbXBvcnRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIEV4ZWN1dGlvbkZyYW1lIGFzc2NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGltcG9ydCBuYW1lIG9yIG51bGwgCi0gICAgICogICAgICAgICBpZiB0aGVyZSBpcyBubyBzdWNoIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dGlvbkZyYW1lIGdldEltcG9ydGVkRnJhbWUoU3RyaW5nIGltcG9ydE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChFeGVjdXRpb25GcmFtZSlpbXBvcnRlZEZyYW1lcy5nZXQoaW1wb3J0TmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbG9jYXRpb24gb2YgdGhpcyBmcmFtZSBpbiB0aGUgbmFtZXNwYWNlIGhpZXJhcmNoeQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhpcyBmcmFtZSB3aXRoaW4gdGhlIHByb2plY3QgaW1wb3J0Ci0gICAgICogICAgICAgICBuYW1lc3BhY2UgaGllcmFyY2h5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHNvbWV0aGluZyB3aXRoIHJlc3BlY3QgdG8gdGhpcyAKLSAgICAgKiBleGVjdXRpb24gZnJhbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHVucXVhbGlmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSA9PSBudWxsID8gbmFtZSA6IG5hbWVzcGFjZSArICI6IiArIG5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhlIGdpdmVuIHRhcmdldCdzIHRhc2tzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3aXRoaW4gdGhpcyBmcmFtZSB0aGF0IGlzIHRvIGJlIGV4ZWN1dGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXJnZXRUYXNrcyhTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgQ29uZmlnRXhjZXB0aW9uIHsKLSAgICAgICAgVGFyZ2V0IHRhcmdldCA9IHByb2plY3QuZ2V0VGFyZ2V0KHRhcmdldE5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSXRlcmF0b3IgdGFza0l0ZXJhdG9yID0gdGFyZ2V0LmdldFRhc2tzKCk7Ci0gICAgICAgICAgICBldmVudFN1cHBvcnQuZmlyZVRhcmdldFN0YXJ0ZWQodGhpcywgdGFyZ2V0KTsKLSAgICAgICAgICAgIGV4ZWN1dGVUYXNrcyh0YXNrSXRlcmF0b3IpOwotICAgICAgICAgICAgZXZlbnRTdXBwb3J0LmZpcmVUYXJnZXRGaW5pc2hlZCh0aGlzLCB0YXJnZXQsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV2ZW50U3VwcG9ydC5maXJlVGFyZ2V0RmluaXNoZWQodGhpcywgdGFyZ2V0LCBlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgZnJhbWUgYnkgZXhlY3V0aW5nIHRoZSBwcm9qZWN0IGxldmVsIHRhc2tzIGlmIGFueQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBDb25maWdFeGNlcHRpb24gewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRJbXBvcnRlZEZyYW1lcygpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBFeGVjdXRpb25GcmFtZSBzdWJGcmFtZSA9IChFeGVjdXRpb25GcmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIHN1YkZyYW1lLmluaXRpYWxpemUoKTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciB0YXNrSXRlcmF0b3IgPSBwcm9qZWN0LmdldFRhc2tzKCk7Ci0gICAgICAgIGV4ZWN1dGVUYXNrcyh0YXNrSXRlcmF0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxpbkRlcGVuZGVuY3lPcmRlcihTdHJpbmcgdGFyZ2V0TmFtZSwgTGlzdCBkZXBlbmRlbmN5T3JkZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc3RhdGUsIFN0YWNrIHZpc2l0aW5nKSB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZ1bGxUYXJnZXROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZSh0YXJnZXROYW1lKTsgCi0gICAgICAgIGlmIChzdGF0ZS5nZXQoZnVsbFRhcmdldE5hbWUpID09IFZJU0lURUQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gZ2V0UHJvamVjdCgpLmdldFRhcmdldCh0YXJnZXROYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJUYXJnZXQgYCIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHRhcmdldE5hbWUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCInIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgcHJvamVjdC4gIik7Ci0gICAgICAgICAgICBpZiAoIXZpc2l0aW5nLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50ID0gKFN0cmluZyl2aXNpdGluZy5wZWVrKCk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJJdCBpcyB1c2VkIGZyb20gdGFyZ2V0IGAiKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFyZW50KTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIicuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24obmV3IFN0cmluZyhzYiksIGdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3RhdGUucHV0KGZ1bGxUYXJnZXROYW1lLCBWSVNJVElORyk7Ci0gICAgICAgIHZpc2l0aW5nLnB1c2goZnVsbFRhcmdldE5hbWUpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YXJnZXQuZ2V0RGVwZW5kZW5jaWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFN0cmluZyBkZXBlbmRlbmN5ID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRXhlY3V0aW9uRnJhbWUgZGVwZW5kZW5jeUZyYW1lID0gZ2V0UmVsYXRpdmVGcmFtZShkZXBlbmRlbmN5KTsKLSAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeUZyYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVGFyZ2V0IGAiKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGRlcGVuZGVuY3kpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIicgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBwcm9qZWN0LiAiKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbihuZXcgU3RyaW5nKHNiKSwgdGFyZ2V0LmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZShkZXBlbmRlbmN5KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVwZW5kZW5jeVN0YXRlID0gKFN0cmluZylzdGF0ZS5nZXQoZnVsbHlRdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeVN0YXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUZyYW1lLmZpbGxpbkRlcGVuZGVuY3lPcmRlcihnZXROYW1lSW5GcmFtZShkZXBlbmRlbmN5KSwgZGVwZW5kZW5jeU9yZGVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgdmlzaXRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXBlbmRlbmN5U3RhdGUgPT0gVklTSVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNpcmNsZURlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA9IGdldENpcmN1bGFyRGVzYyhkZXBlbmRlbmN5LCB2aXNpdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oY2lyY2xlRGVzY3JpcHRpb24sIHRhcmdldC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlLCB0YXJnZXQuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN0YXRlLnB1dChmdWxsVGFyZ2V0TmFtZSwgVklTSVRFRCk7Ci0gICAgICAgIFN0cmluZyBwb3BwZWROb2RlID0gKFN0cmluZyl2aXNpdGluZy5wb3AoKTsKLSAgICAgICAgaWYgKHBvcHBlZE5vZGUgIT0gZnVsbFRhcmdldE5hbWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIlByb2JsZW0gZGV0ZXJtaW5pbmcgZGVwZW5kZW5jaWVzICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC0gZXhwZWN0aW5nICciICsgZnVsbFRhcmdldE5hbWUgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBidXQgZ290ICciICsgcG9wcGVkTm9kZSArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGVwZW5kZW5jeU9yZGVyLmFkZChmdWxsVGFyZ2V0TmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2lyY3VsYXJEZXNjKFN0cmluZyBlbmQsIFN0YWNrIHZpc2l0aW5nTm9kZXMpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQ2lyY3VsYXIgZGVwZW5kZW5jeTogIik7Ci0gICAgICAgIHNiLmFwcGVuZChlbmQpOwotICAgICAgICBTdHJpbmcgYzsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgYyA9IChTdHJpbmcpdmlzaXRpbmdOb2Rlcy5wb3AoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiIDwtICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICB9IHdoaWxlKCFjLmVxdWFscyhlbmQpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc2IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIHRhcmdldHMgaW4gdGhpcyBmcmFtZSBhbmQgaXRzIHN1YmZyYW1lcyBhcmUgT0sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1RhcmdldHMoTGlzdCBkZXBlbmRlbmN5T3JkZXIsIE1hcCBzdGF0ZSwgU3RhY2sgdmlzaXRpbmcpIAotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGdldCB0aGUgdGFyZ2V0cyBhbmQganVzdCBpdGVyYXRlIHRocm91Z2ggdGhlbS4KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0UHJvamVjdCgpLmdldFRhcmdldHMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldClpLm5leHQoKTsKLSAgICAgICAgICAgIGZpbGxpbkRlcGVuZGVuY3lPcmRlcih0YXJnZXQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lPcmRlciwgc3RhdGUsIHZpc2l0aW5nKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTm93IGRvIHRoZSBzdWJmcmFtZXMuCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEltcG9ydGVkRnJhbWVzKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRXhlY3V0aW9uRnJhbWUgaW1wb3J0ZWRGcmFtZSA9IChFeGVjdXRpb25GcmFtZSlpLm5leHQoKTsKLSAgICAgICAgICAgIGltcG9ydGVkRnJhbWUuY2hlY2tUYXJnZXRzKGRlcGVuZGVuY3lPcmRlciwgc3RhdGUsIHZpc2l0aW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBUYXNrIGFuZCBjb25maWd1cmUgaXQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBtb2RlbC4KLSAgICAgKi8gICAgICAgIAotICAgIHByaXZhdGUgVGFzayBjb25maWd1cmVUYXNrKFRhc2tFbGVtZW50IG1vZGVsKSAKLSAgICAgICAgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdGFza1R5cGUgPSBtb2RlbC5nZXRUeXBlKCk7Ci0gICAgICAgIFRhc2tEZWZpbml0aW9uIHRhc2tEZWZpbml0aW9uID0gKFRhc2tEZWZpbml0aW9uKXRhc2tEZWZzLmdldCh0YXNrVHlwZSk7Ci0gICAgICAgIGlmICh0YXNrRGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBkZWZpbnRpb24gZm9yIHRhc2tzIG9mIHR5cGUgPCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza1R5cGUgKyAiPiIsIG1vZGVsLmdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgZWxlbWVudENsYXNzID0gdGFza0RlZmluaXRpb24uZ2V0RXhlY3V0aW9uVGFza0NsYXNzKCk7Ci0gICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgVGFzayB0YXNrID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFRhc2sgY29udGV4dCBmb3IgdGhlIFRhc2sKLSAgICAgICAgICAgICAgICB0YXNrID0gKFRhc2spZWxlbWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRhc2sgPSBuZXcgVGFza0FkYXB0ZXIodGFza1R5cGUsIGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb25maWd1cmVFbGVtZW50KGVsZW1lbnQsIG1vZGVsKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRhc2s7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiRXhlY3V0aW9uIGNsYXNzICIgKyB0YXNrRGVmaW5pdGlvbi5nZXRUYXNrQ2xhc3NOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBub3QgZm91bmQiLCBlLCBtb2RlbC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZXhlY3V0aW9uIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza0RlZmluaXRpb24uZ2V0VGFza0NsYXNzTmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsIG1vZGVsLmdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIlVuYWJsZSB0byBhY2Nlc3MgZXhlY3V0aW9uIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza0RlZmluaXRpb24uZ2V0VGFza0NsYXNzTmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsIG1vZGVsLmdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfSAgICAgICAgCi0KLSAgICBwcml2YXRlIExpc3QgZ2V0QWN0aXZlQXNwZWN0cyhCdWlsZEVsZW1lbnQgbW9kZWwpIAotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCAKLSAgICAgICAgICAgICAgICAgICBDbGFzc0ludHJvc3BlY3Rpb25FeGNlcHRpb24sIENvbnZlcnNpb25FeGNlcHRpb24gewotICAgICAgICBMaXN0IGFjdGl2ZUFzcGVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVsLmdldEFzcGVjdE5hbWVzKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIGFzcGVjdFByZWZpeCA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBDbGFzcyBhc3BlY3RIYW5kbGVyQ2xhc3MgPSAoQ2xhc3MpYXNwZWN0SGFuZGxlcnMuZ2V0KGFzcGVjdFByZWZpeCk7Ci0gICAgICAgICAgICBpZiAoYXNwZWN0SGFuZGxlckNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBBc3BlY3RIYW5kbGVyIGFzcGVjdEhhbmRsZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IChBc3BlY3RIYW5kbGVyKWFzcGVjdEhhbmRsZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBDbGFzc0ludHJvc3BlY3RvciBpbnRyb3NwZWN0b3IgPSBnZXRJbnRyb3NwZWN0b3IoYXNwZWN0SGFuZGxlckNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFeGVjdXRpb25Db250ZXh0KHRoaXMsIGV2ZW50U3VwcG9ydCwgbW9kZWwpOwotICAgICAgICAgICAgICAgICAgICBhc3BlY3RIYW5kbGVyLnNldEFzcGVjdENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBNYXAgYXNwZWN0QXR0cmlidXRlcyA9IG1vZGVsLmdldEFzcGVjdEF0dHJpYnV0ZXMoYXNwZWN0UHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYXNwZWN0QXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKFN0cmluZylqLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IChTdHJpbmcpYXNwZWN0QXR0cmlidXRlcy5nZXQoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRyb3NwZWN0b3Iuc2V0QXR0cmlidXRlKGFzcGVjdEhhbmRsZXIsIGF0dHJpYnV0ZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlUHJvcGVydHlSZWZzKGF0dHJpYnV0ZVZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlQXNwZWN0cy5hZGQoYXNwZWN0SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGFzcGVjdCBoYW5kbGVyIGNsYXNzICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhc3BlY3RIYW5kbGVyQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGFjY2VzcyBhc3BlY3QgaGFuZGxlciBjbGFzcyAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXNwZWN0SGFuZGxlckNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIGFjdGl2ZUFzcGVjdHM7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIGFuIGVsZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBtb2RlbC4KLSAgICAgKi8gICAKLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlRWxlbWVudChPYmplY3QgZWxlbWVudCwgVGFza0VsZW1lbnQgbW9kZWwpIAotICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBDb25maWdFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0gICAgICAgICAgICBUYXNrIHRhc2sgPSAoVGFzayllbGVtZW50OwotICAgICAgICAgICAgRXhlY3V0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEV4ZWN1dGlvbkNvbnRleHQodGhpcywgZXZlbnRTdXBwb3J0LCBtb2RlbCk7Ci0gICAgICAgICAgICB0YXNrLnNldFRhc2tDb250ZXh0KGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzc0ludHJvc3BlY3RvciBpbnRyb3NwZWN0b3IgPSBnZXRJbnRyb3NwZWN0b3IoZWxlbWVudC5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgYXNwZWN0cyA9IGdldEFjdGl2ZUFzcGVjdHMobW9kZWwpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYXNwZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgQXNwZWN0SGFuZGxlciBhc3BlY3RIYW5kbGVyID0gKEFzcGVjdEhhbmRsZXIpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYXNwZWN0SGFuZGxlci5iZWZvcmVDb25maWdFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzdGFydCBieSBzZXR0aW5nIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWwuZ2V0QXR0cmlidXRlTmFtZXMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IG1vZGVsLmdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICAgICAgIGludHJvc3BlY3Rvci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlUHJvcGVydHlSZWZzKGF0dHJpYnV0ZVZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBtb2RlbFRleHQgPSBtb2RlbC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKG1vZGVsVGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50cm9zcGVjdG9yLmFkZFRleHQoZWxlbWVudCwgcmVwbGFjZVByb3BlcnR5UmVmcyhtb2RlbFRleHQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IGRvIHRoZSBuZXN0ZWQgZWxlbWVudHMKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVsLmdldE5lc3RlZEVsZW1lbnRzKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFRhc2tFbGVtZW50IG5lc3RlZEVsZW1lbnRNb2RlbCA9IChUYXNrRWxlbWVudClpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tDb250YWluZXIgJiYKLSAgICAgICAgICAgICAgICAgICAgIWludHJvc3BlY3Rvci5zdXBwb3J0c05lc3RlZEVsZW1lbnQobmVzdGVkRWxlbWVudE1vZGVsLmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFRhc2sgbmVzdGVkVGFzayA9IGNvbmZpZ3VyZVRhc2sobmVzdGVkRWxlbWVudE1vZGVsKTsKLSAgICAgICAgICAgICAgICAgICAgVGFza0NvbnRhaW5lciBjb250YWluZXIgPSAoVGFza0NvbnRhaW5lcillbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkVGFzayhuZXN0ZWRUYXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXN0ZWRFbGVtZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnRyb3NwZWN0b3IuY3JlYXRlRWxlbWVudChlbGVtZW50LCBuZXN0ZWRFbGVtZW50TW9kZWwuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlRWxlbWVudChuZXN0ZWRFbGVtZW50LCBuZXN0ZWRFbGVtZW50TW9kZWwpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYXNwZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgQXNwZWN0SGFuZGxlciBhc3BlY3RIYW5kbGVyID0gKEFzcGVjdEhhbmRsZXIpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYXNwZWN0SGFuZGxlci5hZnRlckNvbmZpZ0VsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUsIG1vZGVsLmdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb252ZXJzaW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZSwgbW9kZWwuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW4gdGhlIHRhc2tzIHJldHVybmVkIGJ5IHRoZSBnaXZlIGl0ZXJhdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFza0l0ZXJhdG9yIHRoZSBpdGVyYXRvciBnaXZpbmcgdGhlIHRhc2tzIHRvIGV4ZWN1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFza3MoSXRlcmF0b3IgdGFza0l0ZXJhdG9yKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBDb25maWdFeGNlcHRpb24gewotICAgICAgICBUYXNrRWxlbWVudCB0YXNrID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICh0YXNrSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgdGFzayA9IChUYXNrRWxlbWVudCl0YXNrSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhc2sgY29uZmlndXJlZFRhc2sgPSBjb25maWd1cmVUYXNrKHRhc2spOwotICAgICAgICAgICAgICAgICAgICBldmVudFN1cHBvcnQuZmlyZVRhc2tTdGFydGVkKHRoaXMsIHRhc2spOwotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkVGFzay5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRMb2NhdGlvbigpID09IG51bGwgfHwgZS5nZXRMb2NhdGlvbigpID09IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0TG9jYXRpb24odGFzay5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ29uZmlnRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUuZ2V0TG9jYXRpb24oKSA9PSBudWxsIHx8IGUuZ2V0TG9jYXRpb24oKSA9PSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLnNldExvY2F0aW9uKHRhc2suZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXZlbnRTdXBwb3J0LmZpcmVUYXNrRmluaXNoZWQodGhpcywgdGFzaywgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXZlbnRTdXBwb3J0LmZpcmVUYXNrRmluaXNoZWQodGhpcywgdGFzaywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfSAgICAgICAgCi0KLSAgICBwcml2YXRlIENsYXNzSW50cm9zcGVjdG9yIGdldEludHJvc3BlY3RvcihDbGFzcyBjKSB7Ci0gICAgICAgIGlmIChpbnRyb3NwZWN0b3JzLmNvbnRhaW5zS2V5KGMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENsYXNzSW50cm9zcGVjdG9yKWludHJvc3BlY3RvcnMuZ2V0KGMpOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzSW50cm9zcGVjdG9yIGludHJvc3BlY3RvciA9IG5ldyBDbGFzc0ludHJvc3BlY3RvcihjLCBjb252ZXJ0ZXJzKTsKLSAgICAgICAgaW50cm9zcGVjdG9ycy5wdXQoYywgaW50cm9zcGVjdG9yKTsKLSAgICAgICAgcmV0dXJuIGludHJvc3BlY3RvcjsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSAke30gc3R5bGUgY29uc3RydWN0aW9ucyBpbiB0aGUgZ2l2ZW4gdmFsdWUgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mCi0gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSB0eXBlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgc3RyaW5nIHRvIGJlIHNjYW5uZWQgZm9yIHByb3BlcnR5IHJlZmVyZW5jZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZXBsYWNlUHJvcGVydHlSZWZzKFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBMaXN0IHByb3BlcnR5UmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGFyc2VQcm9wZXJ0eVN0cmluZyh2YWx1ZSwgZnJhZ21lbnRzLCBwcm9wZXJ0eVJlZnMpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGZyYWdtZW50cy5pdGVyYXRvcigpOwotICAgICAgICBJdGVyYXRvciBqID0gcHJvcGVydHlSZWZzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50ID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpai5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0RhdGFWYWx1ZVNldChwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wZXJ0eU5hbWUgKyAiIGhhcyBub3QgYmVlbiBzZXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBnZXREYXRhVmFsdWUocHJvcGVydHlOYW1lKS50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKGZyYWdtZW50KTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBwYXJzZSBhIHN0cmluZyBjb250YWluaW5nICR7dmFsdWV9IHN0eWxlIAotICAgICAqIHByb3BlcnR5IHZhbHVlcyBpbnRvIHR3byBsaXN0LiBUaGUgZmlyc3QgbGlzdCBpcyBhIGNvbGxlY3Rpb24KLSAgICAgKiBvZiB0ZXh0IGZyYWdtZW50cywgd2hpbGUgdGhlIG90aGVyIGlzIGEgc2V0IG9mIHN0cmluZyBwcm9wZXJ0eSBuYW1lcwotICAgICAqIG51bGwgZW50cmllcyBpbiB0aGUgZmlyc3QgbGlzdCBpbmRpY2F0ZSBhIHByb3BlcnR5IHJlZmVyZW5jZSBmcm9tIHRoZQotICAgICAqIHNlY29uZCBsaXN0LgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBwYXJzZVByb3BlcnR5U3RyaW5nKFN0cmluZyB2YWx1ZSwgTGlzdCBmcmFnbWVudHMsIExpc3QgcHJvcGVydHlSZWZzKSAKLSAgICAgICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBwcmV2ID0gMDsKLSAgICAgICAgaW50IHBvczsKLSAgICAgICAgd2hpbGUgKChwb3MgPSB2YWx1ZS5pbmRleE9mKCIkIiwgcHJldikpID49IDApIHsKLSAgICAgICAgICAgIGlmIChwb3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnRzLmFkZCh2YWx1ZS5zdWJzdHJpbmcocHJldiwgcG9zKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwb3MgPT0gKHZhbHVlLmxlbmd0aCgpIC0gMSkpIHsKLSAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkKCIkIik7Ci0gICAgICAgICAgICAgICAgcHJldiA9IHBvcyArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5jaGFyQXQocG9zICsgMSkgIT0gJ3snICkgewotICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGQodmFsdWUuc3Vic3RyaW5nKHBvcyArIDEsIHBvcyArIDIpKTsKLSAgICAgICAgICAgICAgICBwcmV2ID0gcG9zICsgMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGVuZE5hbWUgPSB2YWx1ZS5pbmRleE9mKCd9JywgcG9zKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kTmFtZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiU3ludGF4IGVycm9yIGluIHByb3BlcnR5OiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHZhbHVlLnN1YnN0cmluZyhwb3MgKyAyLCBlbmROYW1lKTsKLSAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5UmVmcy5hZGQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgICBwcmV2ID0gZW5kTmFtZSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJldiA8IHZhbHVlLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBmcmFnbWVudHMuYWRkKHZhbHVlLnN1YnN0cmluZyhwcmV2KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIG5hbWUgb2YgYW4gb2JqZWN0LCBnZXQgdGhlIGZyYW1lIHJlbGF0aXZlIGZyb20gdGhpcyBmcmFtZSB0aGF0Ci0gICAgICogY29udGFpbnMgdGhhdCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dGlvbkZyYW1lIGdldFJlbGF0aXZlRnJhbWUoU3RyaW5nIG5hbWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCI6Iik7Ci0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEV4ZWN1dGlvbkZyYW1lIGN1cnJlbnRGcmFtZSA9IHRoaXM7Ci0gICAgICAgIFN0cmluZyByZWxhdGl2ZUZyYW1lTmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVsYXRpdmVGcmFtZU5hbWUsICI6Iik7Ci0gICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZnJhbWVOYW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lLmdldEltcG9ydGVkRnJhbWUoZnJhbWVOYW1lKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50RnJhbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlRoZSBwcm9qZWN0ICIgKyBmcmFtZU5hbWUgKyAiIGluICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiIHdhcyBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRGcmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgYW4gb2JqZWN0IGluIGl0cyBmcmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluRnJhbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiOiIpOwotICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSB2YWx1ZSBpbiB0aGlzIGZyYW1lIG9yIGFueSBvZiBpdHMgaW1wb3J0ZWQgZnJhbWVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBFeGVjdXRpb25GcmFtZSBmcmFtZSA9IGdldFJlbGF0aXZlRnJhbWUobmFtZSk7Ci0gICAgICAgIGZyYW1lLnNldERpcmVjdERhdGFWYWx1ZShnZXROYW1lSW5GcmFtZShuYW1lKSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYSB2YWx1ZSBmcm9tIHRoaXMgZnJhbWUgb3IgYW55IGltcG9ydGVkIGZyYW1lCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREYXRhVmFsdWUoU3RyaW5nIG5hbWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBFeGVjdXRpb25GcmFtZSBmcmFtZSA9IGdldFJlbGF0aXZlRnJhbWUobmFtZSk7Ci0gICAgICAgIHJldHVybiBmcmFtZS5nZXREaXJlY3REYXRhVmFsdWUoZ2V0TmFtZUluRnJhbWUobmFtZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgYSB2YWx1ZSBpbiB0aGlzIGZyYW1lIG9ubHkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0RGlyZWN0RGF0YVZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgZGF0YVZhbHVlcy5wdXQobmFtZSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYSB2YWx1ZSBmcm9tIHRoaXMgZnJhbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXREaXJlY3REYXRhVmFsdWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFWYWx1ZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIGEgZGF0YSB2YWx1ZSBoYXMgYmVlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFWYWx1ZVNldChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4ZWN1dGlvbkZyYW1lIGZyYW1lID0gZ2V0UmVsYXRpdmVGcmFtZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIGZyYW1lLmlzRGlyZWN0RGF0YVZhbHVlU2V0KGdldE5hbWVJbkZyYW1lKG5hbWUpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIGEgZGF0YSB2YWx1ZSBoYXMgYmVlbiBzZXQgaW4gdGhpcyBmcmFtZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RpcmVjdERhdGFWYWx1ZVNldChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZGF0YVZhbHVlcy5jb250YWluc0tleShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW5CdWlsZChMaXN0IHRhcmdldE5hbWVzKSB0aHJvd3MgQW50RXhjZXB0aW9uIHsKLSAgICAgICAgVGhyb3dhYmxlIGJ1aWxkRmFpbHVyZUNhdXNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV2ZW50U3VwcG9ydC5maXJlQnVpbGRTdGFydGVkKHRoaXMsIHByb2plY3QpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOwotCi0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UganVzdCBleGVjdXRlIHRoZSBkZWZhdWx0IHRhcmdldCBpZiBhbnkKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFRhcmdldCA9IHByb2plY3QuZ2V0RGVmYXVsdFRhcmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhcmdldChkZWZhdWx0VGFyZ2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YXJnZXROYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgoU3RyaW5nKWkubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBldmVudFN1cHBvcnQuZmlyZUJ1aWxkRmluaXNoZWQodGhpcywgcHJvamVjdCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYnVpbGRGYWlsdXJlQ2F1c2UgPSBlOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGJ1aWxkRmFpbHVyZUNhdXNlID0gZTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBldmVudFN1cHBvcnQuZmlyZUJ1aWxkRmluaXNoZWQodGhpcywgcHJvamVjdCwgYnVpbGRGYWlsdXJlQ2F1c2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhcmdldChTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgQ29uZmlnRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gdG8gZXhlY3V0ZSBhIHRhcmdldCB3ZSBtdXN0IGRldGVybWluZSBpdHMgZGVwZW5kZW5jaWVzIGFuZCAKLSAgICAgICAgLy8gZXhlY3V0ZSB0aGVtIGluIG9yZGVyLgotICAgICAgICBNYXAgc3RhdGUgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBTdGFjayB2aXNpdGluZyA9IG5ldyBTdGFjaygpOwotICAgICAgICBMaXN0IGRlcGVuZGVuY3lPcmRlciA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgRXhlY3V0aW9uRnJhbWUgc3RhcnRpbmdGcmFtZSA9IGdldFJlbGF0aXZlRnJhbWUodGFyZ2V0TmFtZSk7Ci0gICAgICAgIHN0YXJ0aW5nRnJhbWUuZmlsbGluRGVwZW5kZW5jeU9yZGVyKGdldE5hbWVJbkZyYW1lKHRhcmdldE5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5T3JkZXIsIHN0YXRlLCB2aXNpdGluZyk7Ci0KLSAgICAgICAgLy8gTm93IHRlbGwgZWFjaCBmcmFtZSB0byBleGVjdXRlIHRoZSB0YXJnZXRzIHJlcXVpcmVkCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlcGVuZGVuY3lPcmRlci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBmdWxsVGFyZ2V0TmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBFeGVjdXRpb25GcmFtZSBmcmFtZSA9IGdldFJlbGF0aXZlRnJhbWUoZnVsbFRhcmdldE5hbWUpOwotICAgICAgICAgICAgZnJhbWUuZXhlY3V0ZVRhcmdldFRhc2tzKGdldE5hbWVJbkZyYW1lKGZ1bGxUYXJnZXROYW1lKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vSW5wdXRQcm92aWRlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL0lucHV0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjYjAzNi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vSW5wdXRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLS8qCi0gKiBBbiBpbnB1dCBwcm92aWRlciBpcyBhbiBvYmplY3Qgd2hpY2ggaXMgcHJvdmlkZWQgdG8gQW50J3MgY29yZQotICogZXhlY3V0aW9uIHN5c3RlbSB0byBwcm92aWRlIGlucHV0IGZyb20gdGhlIHVzZXIuIFR5cGljYWxseSBjb21tYW5kCi0gKiBsaW5lIGJhc2VkIGNsaWVudHMgd2lsbCByZXF1ZXN0IGlucHV0IGZyb20gdGhlIGNvbnNvbGUgd2hpbHN0IAotICogR1VJIGNsaWVudHMgbWF5IHBvcCB1cCBhbiBpbnB1dCBkaWFsb2cuIFVuYXR0ZW5kZWQgb3BlcmF0aW9uIG1heQotICogYmUgYWJsZSB0byBzb3VyY2UgaW5wdXQgZnJvbSBzb21lIGZvcm0gb2Ygc2NyaXB0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElucHV0UHJvdmlkZXIgewotICAgIC8qKiAKLSAgICAgKiBSZXF1ZXN0IGlucHV0IGZyb20gdGhlIHVzZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9tcHQgYSBzdHJpbmcgd2hpY2ggaXMgdXNlZCB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIGlucHV0LgotICAgICAqIEBwYXJhbSBkZWZhdWx0SW5wdXQgdGhlIGRlZmF1bHQgdmFsdWUgaW5pdGlhbGx5IHN1cHBsaWVkIHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHRpbWVvdXQgYSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB3aGljaCBzb21lIGNsaWVudHMgbWF5IHVzZQotICAgICAqICAgICAgICB0byBlaXRoZXIgYWNjZXB0IHRoZSBkZWZhdWx0IG9yIHRvIGZhaWwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIG9mIHRoZSB1c2VyJ3MgaW5wdXQgaWYgdGhlIHVzZXIgcHJvdmlkZWQgYW55LgotICAgICAqCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhlIG5vIGlucHV0IGNvdWxkIGJlIG9idGFpbmVkIGZyb20gdGhlIHVzZXIKLSAgICAgKi8KLSAgICBTdHJpbmcgdXNlcklucHV0KFN0cmluZyBwcm9tcHQsIFN0cmluZyBkZWZhdWx0SW5wdXQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vVGFzay5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5ODE1Mi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSB0YXNrIGlzIGEgdG9wIGxldmVsIGVsZW1lbnQgaW4gdGhlIGJ1aWRsIHdoaWNoIHdpbGwgYmUgcHJvY2Vzc2VkLiBBbnQKLSAqIGN1cnJlbnRseSBoYW5kbGVzIHR3byB0eXBlcyBvZiB0YXNrcyAtIERhdGFUeXBlIHRhc2tzIGFuZCBleGVjdXRpb24gdGFza3MuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgewotICAgIHZvaWQgc2V0VGFza0NvbnRleHQoRXhlY3V0aW9uQ29udGV4dCBjb250ZXh0KTsKLSAgICAKLSAgICB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vVGFza0FkYXB0ZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9UYXNrQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjg3MTEwLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9UYXNrQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFVzZSBpbnRyb3NwZWN0aW9uIHRvICJhZGFwdCIgYW4gYXJiaXRyYXJ5IEJlYW4gKCBub3QgZXh0ZW5kaW5nIFRhc2ssIGJ1dCB3aXRoIHNpbWlsYXIKLSAqIHBhdHRlcm5zKS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RUYXNrIHsKLQotICAgIC8qKgotICAgICAqIFRoZSByZWFsIG9iamVjdCB0aGF0IGlzIHBlcmZvcm1pbmcgdGhlIHdvcmsKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCB3b3JrZXI7Ci0KLSAgICBwcml2YXRlIE1ldGhvZCBleGVjdXRlTWV0aG9kID0gbnVsbDsKLQotICAgIHB1YmxpYyBUYXNrQWRhcHRlcihTdHJpbmcgdGFza1R5cGUsIE9iamVjdCB3b3JrZXIpIAotICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyB3b3JrZXJDbGFzcyA9IHdvcmtlci5nZXRDbGFzcygpOwotICAgICAgICAgICAgZXhlY3V0ZU1ldGhvZCA9IHdvcmtlckNsYXNzLmdldE1ldGhvZCgiZXhlY3V0ZSIsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICBpZiAoZXhlY3V0ZU1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiTm8gZXhlY3V0ZSBtZXRob2QgaW4gdGhlIGNsYXNzIGZvciB0aGUgPCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza1R5cGUgKyAiPiB0YXNrLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGVNZXRob2QuaW52b2tlKHdvcmtlciwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL1Rhc2tDb250YWluZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9UYXNrQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDZmYmYuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvZXhlY3V0aW9uL1Rhc2tDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBUYXNrQ29udGFpbmVyIGlzIGFuIG9iamVjdCB3aGljaCBjYW4gY29udGFpbiBhbmQgbWFuYWdlIAotICogRXhlY3V0aW9uVGFza3MuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tDb250YWluZXIgewotICAgIC8qKgotICAgICAqIEFkZCBhIHRhc2sgdG8gdGhlIGNvbnRhaW5lci4KLSAgICAgKi8KLSAgICB2b2lkIGFkZFRhc2soVGFzayB0YXNrKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9leGVjdXRpb24vVGFza0RlZmluaXRpb24uamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9UYXNrRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDAyMTgxLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL2V4ZWN1dGlvbi9UYXNrRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBUYXNrIGRlZmluaXRpb24gcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBleGVjdXRlCi0gKiBhIHRhc2sgaW1wbGVtZW50YXRpb24uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8gCi1wdWJsaWMgY2xhc3MgVGFza0RlZmluaXRpb24gewotICAgIC8qKiBUaGUgVVJMIG9mIHRoZSBsaWJyYXJ5IHdoaWNoIGRlZmluZXMgdGhpcyB0YXNrICovCi0gICAgcHJpdmF0ZSBVUkwgdGFza0xpYnJhcnlVUkw7Ci0gICAgIAotICAgIC8qKiBUaGUgdGFzaydzIG5hbWUgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXNrTmFtZTsKLSAgICAKLSAgICAvKiogVGhlIHRhc2sncyBjbGFzcyAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRhc2tDbGFzc05hbWU7Ci0gICAgCi0gICAgLyoqIFRoZSB0YXNrJ3MgY2xhc3MgbG9hZGVkIGZyb20gdGhlIGxvYWRlciBvbiBkZW1hbmQuICovCi0gICAgcHJpdmF0ZSBDbGFzcyB0YXNrQ2xhc3MgPSBudWxsOwotICAgIAotICAgIC8qKiBUaGUgdGFzaydzIGNsYXNzIGxvYWRlci4gKi8KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIHRhc2tDbGFzc0xvYWRlcjsKLSAgICAKLSAgICBwdWJsaWMgVGFza0RlZmluaXRpb24oVVJMIHRhc2tMaWJyYXJ5VVJMLCBTdHJpbmcgdGFza05hbWUsIFN0cmluZyB0YXNrQ2xhc3NOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGFza0NsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMudGFza0xpYnJhcnlVUkwgPSB0YXNrTGlicmFyeVVSTDsKLSAgICAgICAgdGhpcy50YXNrTmFtZSA9IHRhc2tOYW1lOwotICAgICAgICB0aGlzLnRhc2tDbGFzc05hbWUgPSB0YXNrQ2xhc3NOYW1lOwotICAgICAgICB0aGlzLnRhc2tDbGFzc0xvYWRlciA9IHRhc2tDbGFzc0xvYWRlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0YXNrIHRoYXQgaXMgYmVpbmcgZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0YXNrTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGFzc25hbWUgb2YgdGhlIHRhc2sgdGhhdCBpcyBiZWluZyBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFza0NsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tDbGFzc05hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgVVJMIHdoZXJlIHRoaXMgdGFzayB3YXMgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm5zIGEgVVJMIG9mIHRoZSBsaWIgZGVmaW50aW9uIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldExpYnJhcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiB0YXNrTGlicmFyeVVSTDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0YXNrIGNsYXNzIGZvciB0aGlzIHRhc2sKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBjbGFzcyBvYmplY3QgZm9yIHRoaXMgdGFzawotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ2xhc3MgZ2V0RXhlY3V0aW9uVGFza0NsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAodGFza0NsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRhc2tDbGFzcyA9IENsYXNzLmZvck5hbWUodGFza0NsYXNzTmFtZSwgdHJ1ZSwgdGFza0NsYXNzTG9hZGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFza0NsYXNzOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvbW9kZWwvQnVpbGRFbGVtZW50LmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9tb2RlbC9CdWlsZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0Zjc3Zi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9tb2RlbC9CdWlsZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci0KLS8qKgotICogQSBCdWlsZEVsZW1lbnQgaXMgYW4gZWxlbWVudCBvZiBhIGJ1aWxkIGZpbGUgYW5kIGhhcyBhIGxvY2F0aW9uCi0gKiB3aXRoaW4gdGhhdCBmaWxlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIEJ1aWxkRWxlbWVudCB7Ci0gICAgLyoqIFRoZSBhc3BlY3RzIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudC4gKi8KLSAgICBwcml2YXRlIE1hcCBhc3BlY3RNYXBzOwotCi0gICAgLyoqIFRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgKi8KLSAgICBwcml2YXRlIExvY2F0aW9uIGxvY2F0aW9uOwotICAgIAotICAgIC8qKiBBIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCwgaWYgYW55ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBidWlsZCBlbGVtZW50IGdpdmluZyBpdHMgbG9jYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gaWRlbnRpZmllcyB3aGVyZSB0aGlzIGVsZW1lbnQgaXMgZGVmaW5lZAotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEVsZW1lbnQoTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBzb3VyY2Ugd2hlcmUgdGhpcyBlbGVtZW50IGlzIGRlZmluZWQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQncyBsb2NhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgYSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQncyBjb21tZW50IHdoaWNoIG1heSBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgYXNwZWN0cyBvZiB0aGlzIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3BlY3RzIGEgTWFwIG9mIGFwZWN0cyB0aGF0IHJlbGF0ZSB0byB0aGlzIGJ1aWxkIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXNwZWN0cyhNYXAgYXNwZWN0cykgewotICAgICAgICBhc3BlY3RNYXBzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYXNwZWN0cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXNwZWN0TmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gYXNwZWN0TmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgICAgICAgICBpZiAoc2VwYXJhdG9yICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGFzcGVjdE5hbWUuc3Vic3RyaW5nKDAsIHNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhc3BlY3ROYW1lLnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpICE9IDAgJiYgbmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBwcmVmaXhNYXAgPSAoTWFwKWFzcGVjdE1hcHMuZ2V0KHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXhNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdE1hcHMucHV0KHByZWZpeCwgcHJlZml4TWFwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcmVmaXhNYXAucHV0KG5hbWUsIGFzcGVjdHMuZ2V0KGFzcGVjdE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGl0ZXJhdG9yIG9uIHRoZSBhc3BlY3RzIHdoaWNoIGhhdmUgYmVlbiBnaXZlbiB2YWx1ZXMgb24gdGhpcyBlbGVtZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvZiBTdHJpbmdzICwgYmVpbmcgdGhlIGFzcGVjdHMgd2hpY2ggaGF2ZSBiZWVuIGdpdmVuIHZhbHVlcyBvbgotICAgICAqIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QXNwZWN0TmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBhc3BlY3RNYXBzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgc2V0IG9mIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gYXNwZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXBzZWN0UHJlZml4IHRoZSBwcmVmaXggdXNlZCB0byBpZGVudGlmeSB0aGUgcHJlZml4LgotICAgICAqCi0gICAgICogQHJldHVybiBhIG1hcCBvZiB0aGUgYXR0cmlidXRlIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGFzcGVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldEFzcGVjdEF0dHJpYnV0ZXMoU3RyaW5nIGFzcGVjdFByZWZpeCkgewotICAgICAgICByZXR1cm4gKE1hcClhc3BlY3RNYXBzLmdldChhc3BlY3RQcmVmaXgpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvbW9kZWwvUHJvamVjdC5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvbW9kZWwvUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmI3NDZmLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL21vZGVsL1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBwcm9qZWN0IGlzIGEgY29sbGVjdGlvbiBvZiB0YXJnZXRzIGFuZCBnbG9iYWwgdGFza3MuIEEgcHJvamVjdAotICogbWF5IHJlZmVyZW5jZSBvYmplY3RzIGluIG90aGVyIHByb2plY3RzIHVzaW5nIG5hbWVkIHJlZmVyZW5jZXMgb2YgCi0gKiB0aGUgZm9ybSBwcm9qZWN0Om9iamVjdAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIFByb2plY3QgZXh0ZW5kcyBCdWlsZEVsZW1lbnQgewotICAgIC8qKiBUaGUgZGVmYXVsdCB0YXJnZXQgaW4gdGhpcyBwcm9qZWN0LiAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRUYXJnZXQgPSBudWxsOwotCi0gICAgLyoqIFRoZSBiYXNlIFVSTCBvZiB0aGlzIHByb2plY3QuIFJlbGF0aXZlIGxvY2F0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBiYXNlLiovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIHByb2plY3Qgd2hlbiByZWZlcmVuY2VkIGJ5IGEgc2NyaXB0IHdpdGhpbiB0aGlzIHByb2plY3QuIAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlc2UgYXJlIHRoZSB0YXJnZXRzIHdoaWNoIGJlbG9uZyB0byB0aGUgcHJvamVjdC4gVGhleQotICAgICAqIHdpbGwgaGF2ZSBpbnRlcmRlcGVuZGVuY2llcyB3aGljaCBhcmUgdXNlZCB0byBkZXRlcm1pbmUKLSAgICAgKiB3aGljaCB0YXJnZXRzIG5lZWQgdG8gYmUgZXhlY3V0ZWQgYmVmb3JlIGEgZ2l2ZW4gdGFyZ2V0LgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIHRhcmdldHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBnbG9iYWwgdGFza3MgZm9yIHRoaXMgcHJvamVjdC4gVGhlc2UgYXJlIHRoZSB0YXNrcyB0aGF0IHdpbGwgZ2V0IGV4ZWN1dGVkCi0gICAgICogd2hlbmV2ZXIgYW4gZXhlY3V0aW9uIGNvbnRleHQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHByb2plY3RzIGltcG9ydGVkIGludG8gdGhpcyBwcm9qZWN0LiBFYWNoIGltcG9ydGVkIHByb2plY3QgaXMKLSAgICAgKiBnaXZlbiBhIG5hbWUgd2hpY2ggaXMgdXNlZCB0byBpZGVudGlmeSBhY2Nlc3MgdG8gdGhhdCBwcm9qZWN0J3MKLSAgICAgKiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBpbXBvcnRlZFByb2plY3RzID0gbmV3IEhhc2hNYXAoKTsgCi0KLSAgICAvKioKLSAgICAgKiBUaGUgVVJMIHdoZXJlIHRoZSBwcm9qZWN0IGlzIGRlZmluZWQuCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSBVUkwgc291cmNlVVJMOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgUHJvamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZVVSTCB0aGUgVVJMIHdoZXJlIHRoZSBwcm9qZWN0IGlzIGRlZmluZWQuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgd2l0aGluIHRoZSBzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3QoVVJMIHNvdXJjZVVSTCwgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotICAgICAgICB0aGlzLnNvdXJjZVVSTCA9IHNvdXJjZVVSTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFVSTCB3aGVyZSB0aGlzIHByb2plY3QgaXMgZGVmaW5lZAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBzb3VyY2UgVVJMCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRTb3VyY2VVUkwoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VVUkw7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB0YXJnZXQgdG8gdGhlIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBUYXJnZXQgdG8gYmUgYWRkZWQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFByb2plY3RNb2RlbEV4Y2VwdGlvbiBpZiBhIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGFyZ2V0KFRhcmdldCB0YXJnZXQpIHRocm93cyBQcm9qZWN0TW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAodGFyZ2V0cy5jb250YWluc0tleSh0YXJnZXQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2plY3RNb2RlbEV4Y2VwdGlvbigiQSB0YXJnZXQgd2l0aCBuYW1lICciICsgdGFyZ2V0LmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBpbiB0aGlzIHByb2plY3QiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldExvY2F0aW9uKCkpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdGFyZ2V0cy5wdXQodGFyZ2V0LmdldE5hbWUoKSwgdGFyZ2V0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZWZhdXRsIHRhcmdldCBvZiB0aGlzIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFRhcmdldCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdFRhcmdldCBvZiB0aGlzIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhcmdldChTdHJpbmcgZGVmYXVsdFRhcmdldCkgewotICAgICAgICB0aGlzLmRlZmF1bHRUYXJnZXQgPSBkZWZhdWx0VGFyZ2V0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFByb2plY3QncyBkZWZhdWx0IFRhcmdldCwgaWYgYW55Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0J3MgZGVmYXV0bCB0YXJnZXQgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBkZWZhdWx0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRUYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBiYXNlIFVSTCBmb3IgdGhpcyBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2UgdGhlIGJhc2VVUkwgZm9yIHRoaXMgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlKFN0cmluZyBiYXNlKSB7Ci0gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGJhc2UgVVJMIGZvciB0aGlzIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBiYXNlVVJMIGZvciB0aGlzIHByb2plY3QgYXMgYSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlKCkgewotICAgICAgICByZXR1cm4gYmFzZTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGlzIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBmb3IgdGhpcyBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0gICAgICAgIAotCi0gICAgLyoqCi0gICAgICogQWRkIGEgdGFzayB0byB0aGUgbGlzdCBvZiBnbG9iYWwgdGFza3MgZm9yIHRoaXMgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXNrIGEgdGFzayB0byBiZSBleGVjdXRlZCB3aGVuIGFuIGV4ZWN1dGlvbiBjb250ZXh0Ci0gICAgICogaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBQcm9qZWN0IChhIG5vbi10YXJnZXQgdGFzaykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2tFbGVtZW50IHRhc2spIHsKLSAgICAgICAgdGFza3MuYWRkKHRhc2spOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbXBvcnQgYSBwcm9qZWN0IHRvIGJlIHJlZmVyZW5jZWQgdXNpbmcgdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW1wb3J0TmFtZSB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGUgcHJvamVjdCB3aWxsIGJlIHJlZmVyZW5jZWQuCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIGltcG9ydGVkIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFByb2plY3RNb2RlbEV4Y2VwdGlvbiBpZiBhbiBleGlzdGluZyBwcm9qZWN0IGhhcyBhbHJlYWR5IAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gaW1wb3J0ZWQgd2l0aCB0aGF0IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW1wb3J0UHJvamVjdChTdHJpbmcgaW1wb3J0TmFtZSwgUHJvamVjdCBwcm9qZWN0KSAKLSAgICAgICAgICAgIHRocm93cyBQcm9qZWN0TW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoaW1wb3J0ZWRQcm9qZWN0cy5jb250YWluc0tleShpbXBvcnROYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2plY3RNb2RlbEV4Y2VwdGlvbigiQSBwcm9qZWN0IGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQgd2l0aCBuYW1lICciICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydE5hbWUgKyAiJyIpOwotICAgICAgICB9Ci0gICAgICAgIGltcG9ydGVkUHJvamVjdHMucHV0KGltcG9ydE5hbWUsIHByb2plY3QpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHRhcmdldHMgaW4gdGhpcyBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciByZXR1cm5pbmcgVGFyZ2V0IG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFRhcmdldHMoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdGFyZ2V0IHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXROYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHRhcmdldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLSAgICAgKiAgICAgICAgIHN1Y2ggdGFyZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBUYXJnZXQgZ2V0VGFyZ2V0KFN0cmluZyB0YXJnZXROYW1lKSB7Ci0gICAgICAgIHJldHVybiAoVGFyZ2V0KXRhcmdldHMuZ2V0KHRhcmdldE5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgc29mIHRoZSBpbXBvcnRlZCBwcm9qZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgbmFtZSBzb2YgdGhlIGltcG9ydGVkIHByb2plY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRJbXBvcnRlZFByb2plY3ROYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGltcG9ydGVkUHJvamVjdHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGltcG9ydGVkIHByb2plY3QgYnkgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGltcG9ydE5hbWUgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlIHByb2plY3Qgd2FzIGltcG9ydGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBhc3Njb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbXBvcnQgbmFtZSBvciBudWxsIAotICAgICAqICAgICAgICAgaWYgdGhlcmUgaXMgbm8gc3VjaCBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0IGdldEltcG9ydGVkUHJvamVjdChTdHJpbmcgaW1wb3J0TmFtZSkgewotICAgICAgICByZXR1cm4gKFByb2plY3QpaW1wb3J0ZWRQcm9qZWN0cy5nZXQoaW1wb3J0TmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5pdGlhbGlzYXRpb24gdGFza3MgZm9yIHRoaXMgcHJvamVjdAotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBzZXQgb2YgdGFza3MgZm9yIHRoaXMgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0VGFza3MoKSB7Ci0gICAgICAgIHJldHVybiB0YXNrcy5pdGVyYXRvcigpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvbW9kZWwvUHJvamVjdE1vZGVsRXhjZXB0aW9uLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9tb2RlbC9Qcm9qZWN0TW9kZWxFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjYzlhOC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9tb2RlbC9Qcm9qZWN0TW9kZWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBwcm9qZWN0IG1vZGVsIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgYXR0ZW1wdGVkCi0gKiB3aGljaCB3b3VsZCB2aW9sYXRlIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIFByb2plY3QvVGFyZ2V0L1Rhc2sgb2JqZWN0Ci0gKiBtb2RlbAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIFByb2plY3RNb2RlbEV4Y2VwdGlvbiBleHRlbmRzIEFudEV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgRGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdE1vZGVsRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdGl2ZSBtZXNzYWdlIGFuZCBhIGxvY2F0aW9uCi0gICAgICogaW4gYSBmaWxlLgotICAgICAqIEBwYXJhbSBtc2cgRGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gTG9jYXRpb24gaW4gdGhlIHByb2plY3QgZmlsZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdE1vZGVsRXhjZXB0aW9uKFN0cmluZyBtc2csIExvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKG1zZywgbG9jYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBhcwotICAgICAqIGEgcm9vdCBjYXVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgRGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhyb3dhYmxlIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZSB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdE1vZGVsRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24gYXMKLSAgICAgKiBhIHJvb3QgY2F1c2UgYW5kIGEgbG9jYXRpb24gaW4gYSBmaWxlLgotICAgICAqIEBwYXJhbSBtc2cgRGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZSB0aGlzIG9uZS4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gTG9jYXRpb24gaW4gdGhlIHByb2plY3QgZmlsZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdE1vZGVsRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSwgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIobXNnLCBjYXVzZSwgbG9jYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGV4Y2VwdGlvbiBhcyBhIHJvb3QgY2F1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RNb2RlbEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGV4Y2VwdGlvbiBhcwotICAgICAqIGEgcm9vdCBjYXVzZSBhbmQgYSBsb2NhdGlvbiBpbiBhIGZpbGUuCi0gICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2UgdGhpcyBvbmUuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RNb2RlbEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UsIExvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlLCBsb2NhdGlvbik7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9tb2RlbC9UYXJnZXQuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL21vZGVsL1RhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODY1ODJmLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL21vZGVsL1RhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuc3VwcG9ydC4qOwotCi0vKioKLSAqIEEgVGFyZ2V0IGlzIGEgY29sbGVjdGlvbiBvZiB0YXNrcy4gSXQgbWF5IGhhdmUKLSAqIGRlcGVuZGVuY2llcyBvbiBvdGhlciB0YXJnZXRzCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLyAKLXB1YmxpYyBjbGFzcyBUYXJnZXQgZXh0ZW5kcyBCdWlsZEVsZW1lbnQgewotICAgIHByaXZhdGUgTGlzdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB0YXJnZXQncyBsaXN0IG9mIHRhc2tzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSB0YXJnZXQncyBuYW1lLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSB0YXJnZXQsIGdpdmVuIGl0cyBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIG5hbWUgdGhlIHRhcmdldCdzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFRhcmdldChMb2NhdGlvbiBsb2NhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhpcyB0YXJnZXQncyBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGFyZ2V0J3MgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHRhc2sgdG8gdGhpcyB0YXJnZXQKLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIHRvIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrRWxlbWVudCB0YXNrKSB7Ci0gICAgICAgIHRhc2tzLmFkZCh0YXNrKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIHRhcmdldAotICAgICAqCi0gICAgICogQHBhcmFtIGRlcGVuZGVuY3kgdGhlIG5hbWUgb2YgYSB0YXJnZXQgdXBvbiB3aGljaCB0aGlzIHRhcmdldCAKLSAgICAgKiAgICAgICAgICAgICAgICAgICBkZXBlbmRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGVwZW5kZW5jeShTdHJpbmcgZGVwZW5kZW5jeSkgewotICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGlzIHRhcmdldCdzIGRlcGVuZGVuY2llcy4KLSAgICAgKiAgIAotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdGFyZ2V0J3MgZGVwZW5kZW5jaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXREZXBlbmRlbmNpZXMoKSB7Ci0gICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0YXNrcyBmb3IgdGhpcyB0YXJnZXQKLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgc2V0IG9mIHRhc2tzIGZvciB0aGlzIHRhcmdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0VGFza3MoKSB7Ci0gICAgICAgIHJldHVybiB0YXNrcy5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvbW9kZWwvVGFza0VsZW1lbnQuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL21vZGVsL1Rhc2tFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMGI3MzguLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvbW9kZWwvVGFza0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci0KLS8qKgotICogQSBUYXNrRWxlbWVudCBpcyBhIGhvbGRlciBmb3IgVGFzayBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICogVGFza0VsZW1lbnRzIG1heSBiZSBncm91cGVkIGludG8gYSBoaWVyYXJjaHkgdG8gY2FwdHVyZQotICogYW55IGxldmVsIG9mIFRhc2sgZWxlbWVudCBuZXN0aW5nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIFRhc2tFbGVtZW50IGV4dGVuZHMgQnVpbGRFbGVtZW50IHsKLSAgICAvKiogVGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyB0YXNrIGVsZW1lbnQgKi8KLSAgICBwcml2YXRlIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSB0YXNrJ3MgbmFtZSBvciB0eXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgdGFzayBlbGVtZW50cyB0aGF0IG1ha2UgdXAgdGhpcyB0YXNrLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCB0YXNrRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgLyoqIFRoZSBjb250ZW50ICh0ZXh0KSBvZiB0aGlzIHRhc2sgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0ZXh0ID0gIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVGFzayBvZiB0aGUgZ2l2ZW4gdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudAotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0YXNrIGVsZW1lbnQncyB0eXBlCi0gICAgICovCi0gICAgcHVibGljIFRhc2tFbGVtZW50KExvY2F0aW9uIGxvY2F0aW9uLCBTdHJpbmcgdHlwZSkgewotICAgICAgICBzdXBlcihsb2NhdGlvbik7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCB0ZXh0IHRvIHRoaXMgdGFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBlbGVtZW50IHRleHQgdG8gYWRkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgdGhpcy50ZXh0ICs9IHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0ZXh0IG9mIHRoaXMgdGFzawotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGFzaydzIHRleHQuCi0gICAgICovCi0gICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotICAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB0YXNrIGVsZW1lbnQgdG8gdGhpcyB0YXNrCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhc2tFbGVtZW50IHRoZSB0YXNrIGVsZW1lbnQgdG8gYmUgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGFza0VsZW1lbnQoVGFza0VsZW1lbnQgdGFza0VsZW1lbnQpIHsKLSAgICAgICAgdGFza0VsZW1lbnRzLmFkZCh0YXNrRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBlbGVtZW50J3MgbmV4dGVkIGVsZW1lbnRzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIHdoaWNoIHByb3ZpZGVzIFRhc2tFbGVtZW50IGluc3RhbmNlcwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXROZXN0ZWRFbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHR5cGUgb2YgdGhpcyB0YXNrIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQncyB0eXBlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gYXR0cmlidXRlIHRvIHRoaXMgdGFzayBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgewotICAgICAgICBhdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSB0YXNrJ3MgYXR0cmlidXRlcwotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciB3aGljaCBwcm92aWRlJ3MgYXR0cmlidXRlIG5hbWVzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEF0dHJpYnV0ZU5hbWVzKCkgewotICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKWF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvc3VwcG9ydC9BbnRDbGFzc0xvYWRlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvc3VwcG9ydC9BbnRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTdkYTMzLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3N1cHBvcnQvQW50Q2xhc3NMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUuc3VwcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFRoZSBBbnRDbGFzc0xvYWRlciBpcyBhIHR5cGUgb2YgVVJMIGNsYXNzbG9hZGVyIHdoaWNoIHJldmVyc2VzIHRoZSBzdGFuZGFyZAotICogbG9va3VwIG9yZGVyIHRvIGxvYWQgdGhpbmdzIGZyb20gdGhlIFVSTHMgZmlyc3QgYW5kIHRoZW4gdG8gdXNlIHRoZSBwYXJlbnQgY2xhc3MKLSAqIGxvYWRlciBvbmx5IGlmIHRoZSBjbGFzcyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgVVJMcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLyAKLXB1YmxpYyBjbGFzcyBBbnRDbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKLSAgICAvKiogQSBEZWJ1ZyBsYWJlbCB0byBwcmludCB3aGVuIHRoZSBDbGFzc2xvYWRlciBmaW5kcyBvciBmYWlscyB0byBmaW5kIGEgY2xhc3MuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVidWdMYWJlbCA9IG51bGw7Ci0gICAgCi0gICAgLyoqIEEgZmxhZyB3aGloYyBjb250cm9scyB3aGV0aGVyIG1lc3NhZ2VzIGFyZSBsb2dnZWQgYnkgdGhlIGxvYWRlciAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBVUkxzKCkgewotICAgICAgICBpZiAoZGVidWcgJiYgZGVidWdMYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVidWdMYWJlbCArICI6IGxvYWRlciBVUkxzIik7Ci0gICAgICAgICAgICBVUkxbXSB1cmxzID0gZ2V0VVJMcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlYnVnTGFiZWwgKyAiOiBVUkw6ICIgKyB1cmxzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gICAgICAgIAotICAgIAotICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzKSB7Ci0gICAgICAgIHN1cGVyKHVybHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBTdHJpbmcgZGVidWdMYWJlbCkgewotICAgICAgICBzdXBlcih1cmxzKTsKLSAgICAgICAgdGhpcy5kZWJ1Z0xhYmVsID0gZGVidWdMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHVybHMsIHBhcmVudCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQsIFN0cmluZyBkZWJ1Z0xhYmVsKSB7Ci0gICAgICAgIHN1cGVyKHVybHMsIHBhcmVudCk7Ci0gICAgICAgIHRoaXMuZGVidWdMYWJlbCA9IGRlYnVnTGFiZWw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKLSAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOwotICAgICAgICBkdW1wVVJMcygpOyAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpIAotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAoZGVidWcgJiYgZGVidWdMYWJlbCAhPSBudWxsKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlYnVnTGFiZWwgKyAiOiBUcnlpbmcgdG8gbG9hZCBjbGFzcyAiICsgbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyBjID0gZmluZExvYWRlZENsYXNzKG5hbWUpOwotICAgICAgICBpZiAoYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGMgPSBmaW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlYnVnICYmIGRlYnVnTGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVidWdMYWJlbCArICI6IEZvdW5kIGNsYXNzICIgKyBuYW1lICsgIiBpbiB0aGlzIGxvYWRlciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGMgPSBzdXBlci5sb2FkQ2xhc3MobmFtZSwgcmVzb2x2ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlYnVnICYmIGRlYnVnTGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVidWdMYWJlbCArICI6IEZvdW5kIGNsYXNzICIgKyBuYW1lICsgIiBpbiBwYXJlbnQgbG9hZGVyIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNvbHZlKSB7Ci0gICAgICAgICAgICByZXNvbHZlQ2xhc3MoYyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRVUkwoVVJMIHVybCkgewotICAgICAgICBzdXBlci5hZGRVUkwodXJsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFVSTCB1cmwgPSBmaW5kUmVzb3VyY2UobmFtZSk7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgdXJsID0gc3VwZXIuZ2V0UmVzb3VyY2UobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9zdXBwb3J0L0FudEV4Y2VwdGlvbi5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvc3VwcG9ydC9BbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyMDQ1Mi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9zdXBwb3J0L0FudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUuc3VwcG9ydDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEFuIEFudEV4Y2VwdGlvbiBpbmRpY2F0ZXMgc29tZSBleGNlcHRpb25hbCBjYXNlIGhhcyBiZWVuIGVuY291bnRlcmVkIGluCi0gKiB0aGUgcHJvY2Vzc2luZyBvZiBBbnQuIEFudEV4Y2VwdGlvbnMgbWF5IGFjY2VwdCBhIFRocm93YWJsZSBhcyBhCi0gKiBjYXVzZSBhbGxvd2luZyBleGNlcHRpb25zIHRvIGJlIG5lc3RlZAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW50RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAvKiogCi0gICAgICogRXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhpcyBvbmUuIAotICAgICAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24gaWYga25vd24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBMb2NhdGlvbiBsb2NhdGlvbiA9IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT047Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIEFudEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgICAgIHN1cGVyKG1zZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlLgotICAgICAqIEBwYXJhbSBtc2cgRGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhyb3dhYmxlIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZSB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW50RXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtc2cpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlIGFuZCBhIGxvY2F0aW9uIGluIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2UgdGhpcyBvbmUuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIEFudEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UsIExvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMobXNnLCBjYXVzZSk7Ci0gICAgICAgIHNldExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBleGNlcHRpb24gYXMgYSByb290IGNhdXNlLgotICAgICAqIEBwYXJhbSBjYXVzZSBFeGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlZCB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW50RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZSBhbmQgYSBsb2NhdGlvbgotICAgICAqIGluIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIEFudEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBMb2NhdGlvbiBsb2NhdGlvbikgewotICAgICAgICBzdXBlcihtc2cpOwotICAgICAgICBzZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlIGFuZCBhIGxvY2F0aW9uIGluIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZSB0aGlzIG9uZS4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gTG9jYXRpb24gaW4gdGhlIHByb2plY3QgZmlsZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW50RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSwgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcyhjYXVzZSk7Ci0gICAgICAgIHNldExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXN0ZWQgZXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdW5kZXJseWluZyBleGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBsb2NhdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgewotICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBzdGFjayB0cmFjZSB0byBTeXN0ZW0uZXJyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotICAgICAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBzdGFjayB0cmFjZSB0byB0aGUgZ2l2ZW4gUHJpbnRTdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcyB0aGUgUHJpbnRTdHJlYW0gb250byB3aGljaCB0aGUgc3RhY2sgdHJhY2UgCi0gICAgICogICAgICAgICAgIG9mIHRoaXMgZXhjZXB0aW9uIGlzIHRvIGJlIHByaW50ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcHMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChwcykgewotICAgICAgICAgICAgcHMucHJpbnRsbih0aGlzKTsKLSAgICAgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnRsbigiLS0tIE5lc3RlZCBFeGNlcHRpb24gLS0tIik7Ci0gICAgICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgc3RhY2sgdHJhY2UgdG8gdGhlIGdpdmVuIFByaW50V3JpdGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHcgdGhlIFByaW50V3JpdGVyIG9udG8gd2hpY2ggdGhlIHN0YWNrIHRyYWNlIAotICAgICAqICAgICAgICAgICBvZiB0aGlzIGV4Y2VwdGlvbiBpcyB0byBiZSBwcmludGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHB3KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocHcpIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4odGhpcyk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIi0tLSBOZXN0ZWQgRXhjZXB0aW9uIC0tLSIpOwotICAgICAgICAgICAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9zdXBwb3J0L0FudExvY2F0b3IuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3N1cHBvcnQvQW50TG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTlhNjM1Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3N1cHBvcnQvQW50TG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogVGhlIEFudCBMb2NhdG9yIGlzIHVzZWQgdG8gZmluZCB2YXJpb3VzIEFudCBjb21wb25lbnRzIHdpdGhvdXQKLSAqIHJlcXVpcmluZyB0aGUgdXNlciB0byBtYWludGFpbiBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzLiAKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLyAKLXB1YmxpYyBjbGFzcyBBbnRMb2NhdG9yIHsKLSAgICBwcml2YXRlIEFudExvY2F0b3IoKSB7fQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgVVJMIGZvciB0aGUgZ2l2ZW4gY2xhc3MncyBsb2FkIGxvY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHRoZUNsYXNzIHRoZSBjbGFzcyB3aG9zZSBsb2FkVVJMIGlzIGRlc2lyZWQuCi0gICAgICogQHJldHVybiBhIFVSTCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb21wb25lbnQgZnJvbSB3aGljaCB0aGlzIGNsYXNzIHdhcyBsb2FkZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIExvY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBjbGFzcycgVVJMIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFVSTCBnZXRDbGFzc0xvY2F0aW9uVVJMKENsYXNzIHRoZUNsYXNzKSAKLSAgICAgICAgICAgIHRocm93cyBMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0aGVDbGFzcy5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKLSAgICAgICAgVVJMIGNsYXNzUmF3VVJMID0gdGhlQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShjbGFzc05hbWUpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlQ29tcG9uZW50ID0gY2xhc3NSYXdVUkwuZ2V0RmlsZSgpOwotICAgICAgICAgICAgaWYgKGNsYXNzUmF3VVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICAvLyBDbGFzcyBjb21lcyBmcm9tIGEgZGlyZWN0b3J5IG9mIGNsYXNzIGZpbGVzIHJhdGhlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhIGphci4gCi0gICAgICAgICAgICAgICAgaW50IGNsYXNzRmlsZUluZGV4ID0gZmlsZUNvbXBvbmVudC5sYXN0SW5kZXhPZihjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjbGFzc0ZpbGVJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlQ29tcG9uZW50ID0gZmlsZUNvbXBvbmVudC5zdWJzdHJpbmcoMCwgY2xhc3NGaWxlSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCgiZmlsZToiICsgZmlsZUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjbGFzc1Jhd1VSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiamFyIikpIHsKLSAgICAgICAgICAgICAgICAvLyBDbGFzcyBpcyBjb21pbmcgZnJvbSBhIGphci4gVGhlIGZpbGUgY29tcG9uZW50IG9mIHRoZSBVUkwKLSAgICAgICAgICAgICAgICAvLyBpcyBhY3R1YWxseSB0aGUgVVJMIG9mIHRoZSBqYXIgZmlsZQotICAgICAgICAgICAgICAgIGludCBjbGFzc1NlcGFyYXRvckluZGV4ID0gZmlsZUNvbXBvbmVudC5sYXN0SW5kZXhPZigiISIpOwotICAgICAgICAgICAgICAgIGlmIChjbGFzc1NlcGFyYXRvckluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVDb21wb25lbnQgPSBmaWxlQ29tcG9uZW50LnN1YnN0cmluZygwLCBjbGFzc1NlcGFyYXRvckluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoZmlsZUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpdHMgcnVubmluZyBvdXQgb2Ygc29tZXRoaW5nIGJlc2lkZXMgYSBqYXIuIFdlIGp1c3QgcmV0dXJuIHRoZSBSYXcKLSAgICAgICAgICAgICAgICAvLyBVUkwgYXMgYSBiZXN0IGd1ZXNzCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzUmF3VVJMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IExvY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxvY2F0aW9uIG9mIEFudEhvbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFVSTCBjb250YWluaW5nIEFudEhvbWUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIExvY2F0aW9uRXhjZXB0aW9uIGlmIEFudCdzIGhvbWUgY2Fubm90IGJlIGRldGVybWluZWQuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0QW50SG9tZSgpIHRocm93cyBMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgbGlicmFyeVVSTCA9IGdldExpYnJhcnlVUkwoKTsKLSAgICAgICAgICAgIGlmIChsaWJyYXJ5VVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTChsaWJyYXJ5VVJMLCAiLi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgVVJMIHRvIHRoZSBBbnQgY29yZSBqYXIuIE90aGVyIGphcnMgY2FuIGJlIGxvY2F0ZWQgCi0gICAgICogZnJvbSB0aGlzIGFzIHJlbGF0aXZlIFVSTHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBVUkwgY29udGFpbmluZyB0aGUgQW50IGNvcmUgb3IgbnVsbCBpZiB0aGUgY29yZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgTG9jYXRpb25FeGNlcHRpb24gaWYgdGhlIFVSTCBvZiB0aGUgY29yZS5qYXIgY2Fubm90IGJlIGRldGVybWluZWQuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0Q29yZVVSTCgpIHRocm93cyBMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzc0xvY2F0aW9uVVJMKEFudExvY2F0b3IuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYSBVUkwgdG8gdGhlIEFudCBMaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgTG9jYXRpb25FeGNlcHRpb24gaWYgdGhlIGxvY2F0aW9uIG9mIHRoZSBBbnQgbGlicmFyeSBkaXJlY3RvcnkgY2Fubm90IAotICAgICAqICAgICAgICAgYmUgZGV0ZXJtaW5lZAotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgVVJMIGdldExpYnJhcnlVUkwoKSB0aHJvd3MgTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICBVUkwgY29yZVVSTCA9IGdldENvcmVVUkwoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY29yZVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpICYmCi0gICAgICAgICAgICAgICAgY29yZVVSTC5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBydW5uaW5nIGZyb20gYSBzZXQgb2YgY2xhc3Nlcy4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4KLSAgICAgICAgICAgICAgICAvLyBpbiBhbiBBbnQgYnVpbGQgc2l0dWF0aW9uLiBXZSB1c2Ugc29tZSBlbWJlZGRlZCBrbm93bGVkZ2UgdG8KLSAgICAgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIGxpYiBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICBGaWxlIGNvcmVDbGFzc0RpcmVjdG9yeSA9IG5ldyBGaWxlKGNvcmVVUkwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICBGaWxlIGxpYkRpcmVjdG9yeSA9IGNvcmVDbGFzc0RpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgICAgIGlmICghbGliRGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NhdGlvbkV4Y2VwdGlvbigiQW50IGxpYnJhcnkgZGlyZWN0b3J5ICIgKyBsaWJEaXJlY3RvcnkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgZXhpc3QiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgRmlsZShsaWJEaXJlY3RvcnksICJsaWIiKSkudG9VUkwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb3JlVVJMU3RyaW5nID0gY29yZVVSTC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNvcmVVUkxTdHJpbmcubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29yZVVSTFN0cmluZyA9IGNvcmVVUkxTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KzEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTChjb3JlVVJMU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBMb2NhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYSBjbGFzc2xvYWRlciB3aXRoIHdoaWNoIHRvIGxvYWQgdGhlIFNBWCBwYXJzZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzbG9hZGVyIHRvIHVzZSB0byBsb2FkIEFudCdzIFhNTCBwYXJzZXIKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTG9jYXRpb25FeGNlcHRpb24gaWYgdGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJzZXIgamFycyAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0UGFyc2VyQ2xhc3NMb2FkZXIoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSAKLSAgICAgICAgICAgIHRocm93cyBMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHdlIGxvb2sgZm9yIHRoZSBwYXJzZXIgZGlyZWN0b3J5IGJhc2VkIG9uIGEgc3lzdGVtIHByb3BlcnR5IGZpcnN0Ci0gICAgICAgIFN0cmluZyBwYXJzZXJVUkxTdHJpbmcgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KENvbnN0YW50cy5Qcm9wZXJ0eU5hbWVzLlBBUlNFUl9VUkwpOwotICAgICAgICBVUkwgcGFyc2VyVVJMID0gbnVsbDsKLSAgICAgICAgaWYgKHBhcnNlclVSTFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlclVSTCA9IG5ldyBVUkwocGFyc2VyVVJMU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NhdGlvbkV4Y2VwdGlvbigiWE1MIFBhcnNlciBVUkwgIiArIHBhcnNlclVSTFN0cmluZyArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG1hbGZvcm1lZC4iLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyVVJMID0gbmV3IFVSTChnZXRMaWJyYXJ5VVJMKCksICJwYXJzZXIvIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgLSB3ZSB3aWxsIGp1c3QgdXNlIHRoZSBkZWZhdWx0IGNsYXNzIGxvYWRlci4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJzZXJVUkwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkxbXSBwYXJzZXJVUkxzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocGFyc2VyVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgdXAgdGhlIFVSTHMgZm9yIGVhY2ggamFyIGZpbGUgaW4gdGhlIAotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZXIgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlclVSTHMgPSBnZXREaXJlY3RvcnlKYXJVUkxzKG5ldyBGaWxlKHBhcnNlclVSTC5nZXRGaWxlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IHNlYXJjaCB0aGUgVVJMIHNvIHdlIGxvb2sgZm9yIGEga25vd24gcGFyc2VyIHJlbGF0aXZlIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgVVJMCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0UGFyc2VyID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShDb25zdGFudHMuUHJvcGVydHlOYW1lcy5ERUZBVUxUX1BBUlNFUik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0UGFyc2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQYXJzZXIgPSBDb25zdGFudHMuRGVmYXVsdHMuREVGQVVMVF9QQVJTRVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlclVSTHMgPSBuZXcgVVJMWzFdOwotICAgICAgICAgICAgICAgICAgICBwYXJzZXJVUkxzWzBdID0gbmV3IFVSTChwYXJzZXJVUkwsIGRlZmF1bHRQYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBbnRDbGFzc0xvYWRlcihwYXJzZXJVUkxzLCAicGFyc2VyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9jYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBBbnRMb2NhdG9yLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGFycmF5IG9mIFVSTHMgZm9yIGVhY2ggZmlsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gc2V0IG9mIGV4dGVuc2lvbnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgdGhlIGxvY2FsIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBleHRlbnNpb25zIHRoZSBzZXQgb2YgZXh0ZW5zaW9ucyB0byBiZSByZXR1cm5lZAotICAgICAqCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBVUkxzIGZvciB0aGUgZmlsZSBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgVVJMW10gZ2V0RGlyZWN0b3J5VVJMcyhGaWxlIGRpcmVjdG9yeSwgZmluYWwgU2V0IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbMF07Ci0gICAgICAgIAotICAgICAgICBpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIHVybHM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEZpbGVbXSBqYXJzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dGVuc2lvbkluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25JbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBuYW1lLnN1YnN0cmluZyhleHRlbnNpb25JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuY29udGFpbnMoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHVybHMgPSBuZXcgVVJMW2phcnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHVybHNbaV0gPSBqYXJzW2ldLnRvVVJMKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmxzOwotICAgIH0KLSAgICAKLQotCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGFycmF5IG9mIFVSTHMgZm9yIGVhY2ggamFyIGZpbGUgaW4gYSBsb2NhbCBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IHRoZSBsb2NhbCBkaXJlY3RvcnkKLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgVVJMcyBmb3IgdGhlIGphcnMgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBVUkxbXSBnZXREaXJlY3RvcnlKYXJVUkxzKEZpbGUgZGlyZWN0b3J5KSB7Ci0gICAgICAgIEhhc2hTZXQgZXh0ZW5zaW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGV4dGVuc2lvbnMuYWRkKCIuamFyIik7Ci0gICAgICAgIHJldHVybiBnZXREaXJlY3RvcnlVUkxzKGRpcmVjdG9yeSwgZXh0ZW5zaW9ucyk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBDb3JlIENsYXNzIExvYWRlci4gVGhlIGNvcmUgcmVxdWlyZXMgYSBTQVggcGFyc2VyIHdoaWNoIG11c3QgY29tZSBmcm9tIHRoZQotICAgICAqIGdpdmVuIGNsYXNzbG9hZGVyCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIExvY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29yZSBhbnQgY2xhc3NlcyBjb3VsZCAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSBkZXRlcm1pbmVkCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBBbnRDbGFzc0xvYWRlciBnZXRDb3JlQ2xhc3NMb2FkZXIoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSAKLSAgICAgICAgICAgIHRocm93cyBMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTFtdIGNvcmVVUkwgPSBuZXcgVVJMWzFdOwotICAgICAgICBjb3JlVVJMWzBdID0gZ2V0Q29yZVVSTCgpOwotICAgICAgICBBbnRDbGFzc0xvYWRlciBjb3JlTG9hZGVyIAotICAgICAgICAgICAgPSBuZXcgQW50Q2xhc3NMb2FkZXIoY29yZVVSTCwgZ2V0UGFyc2VyQ2xhc3NMb2FkZXIocHJvcGVydGllcyksICJjb3JlIik7Ci0gICAgICAgIFVSTCBsaWJyYXJ5VVJMID0gZ2V0TGlicmFyeVVSTCgpOwotICAgICAgICBpZiAobGlicmFyeVVSTCAhPSBudWxsICYmIGxpYnJhcnlVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgLy8gd2UgY2FuIHNlYXJjaCB0aGlzCi0KLSAgICAgICAgICAgIFVSTFtdIG9wdGlvbmFsVVJMcyA9IGdldERpcmVjdG9yeUphclVSTHMobmV3IEZpbGUobGlicmFyeVVSTC5nZXRGaWxlKCksICJvcHRpb25hbCIpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9uYWxVUkxzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY29yZUxvYWRlci5hZGRVUkwob3B0aW9uYWxVUkxzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29yZUxvYWRlcjsgICAgICAgICAgCi0gICAgfSAgICAgICAgCi19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3N1cHBvcnQvQ29uZmlnRXhjZXB0aW9uLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9zdXBwb3J0L0NvbmZpZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDg2M2RlLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3N1cHBvcnQvQ29uZmlnRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEEgQ29uZmlnRXhjZXB0aW9uIGluZGljYXRlcyBhIHByb2JsZW0gd2l0aCAKLSAqIEFudCdzIGNvbmZpZ3VyYXRpb24uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdFeGNlcHRpb24gZXh0ZW5kcyBBbnRFeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aXZlIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIENvbmZpZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgICAgIHN1cGVyKG1zZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZSBhbmQgYSBsb2NhdGlvbgotICAgICAqIGluIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIENvbmZpZ0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBMb2NhdGlvbiBsb2NhdGlvbikgewotICAgICAgICBzdXBlcihtc2csIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24gYXMKLSAgICAgKiBhIHJvb3QgY2F1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGNhdXNlIFRocm93YWJsZSB0aGF0IG1pZ2h0IGhhdmUgY2F1c2UgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIENvbmZpZ0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobXNnLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlIGFuZCBhIGxvY2F0aW9uIGluIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2UgdGhpcyBvbmUuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIENvbmZpZ0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UsIExvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKG1zZywgY2F1c2UsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBleGNlcHRpb24gYXMgYSByb290IGNhdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBDb25maWdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBleGNlcHRpb24gYXMKLSAgICAgKiBhIHJvb3QgY2F1c2UgYW5kIGEgbG9jYXRpb24gaW4gYSBmaWxlLgotICAgICAqIEBwYXJhbSBjYXVzZSBFeGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlIHRoaXMgb25lLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiBMb2NhdGlvbiBpbiB0aGUgcHJvamVjdCBmaWxlIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBDb25maWdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBMb2NhdGlvbiBsb2NhdGlvbikgewotICAgICAgICBzdXBlcihjYXVzZSwgbG9jYXRpb24pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvc3VwcG9ydC9Db25zdGFudHMuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3N1cHBvcnQvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTYyM2QuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvc3VwcG9ydC9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogQ29uc3RhbnRzIHVzZWQgYnkgdGhlIEFudCBjb3JlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8gCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIFByb3BlcnR5TmFtZXMgewotICAgICAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBQQVJTRVJfVVJMID0gImFudC5wYXJzZXIudXJsIjsKLSAgICAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQVJTRVIgPSAiYW50LnBhcnNlci5kZWZhdWx0IjsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBEZWZhdWx0cyB7Ci0gICAgICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFSU0VSID0gImNyaW1zb24uamFyIjsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3N1cHBvcnQvTG9jYXRpb24uamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3N1cHBvcnQvTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1NWJkZC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9zdXBwb3J0L0xvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQ7Ci0KLS8qKgotICogU3RvcmVzIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGluIGEgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIExvY2F0aW9uIHsKLSAgICAvKioKLSAgICAgKiBUaGUgc291cmNlIFVSTCB0byB3aGljaCB0aGlzIGxvY2F0aW9uIHJlbGF0ZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBsaW5lIG51bWJlciBvZiB0aGlzIGxvY2F0aW9uIHdpdGhpbiB0aGUgc291cmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY29sdW1uIG51bWJlciBvZiB0aGlzIGxvY2F0aW4gd2l0aGluIHRoZSBzb3VyY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjb2x1bW5OdW1iZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFuZGFyZCB1bmtub3duIGxvY2F0aW9uIGNvbnN0YW50OwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYXRpb24gVU5LTk9XTl9MT0NBVElPTiA9IG5ldyBMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiAidW5rbm93biIgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBMb2NhdGlvbigpIHsKLSAgICAgICAgdGhpcyhudWxsLCAwLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9jYXRpb24gY29uc2lzdGluZyBvZiBhIHNvdXJjZSBsb2NhdGlvbiBidXQgbm8gbGluZSBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgKFVSTCkgdG8gd2hpY2ggdGhpcyBsb2NhdGlvbiBpcyBhc3NvY2lhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdGlvbihTdHJpbmcgc291cmNlKSB7Ci0gICAgICAgIHRoaXMoc291cmNlLCAxLCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9jYXRpb24gY29uc2lzdGluZyBvZiBhIHNvdXJjZSBsb2NhdGlvbiBhbmQgY28tb3JkaW5hdGVzIHdpdGhpbiB0aGF0Ci0gICAgICogc291cmNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgKFVSTCkgdG8gd2hpY2ggdGhpcyBsb2NhdGlvbiBpcyBhc3NvY2lhdGVkLgotICAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIHRoZSBsaW5lIG51bWJlciBvZiB0aGlzIGxvY2F0aW9uCi0gICAgICogQHBhcmFtIGNvbHVtbk51bWJlciB0aGUgY29sdW1uIG51bWJlciBvZiB0aGlzIGxvY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIExvY2F0aW9uKFN0cmluZyBzb3VyY2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyKSB7Ci0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwotICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgICAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgbmFtZSwgbGluZSBudW1iZXIgYW5kIGEgdHJhaWxpbmcgc3BhY2UuIEFuIGVycm9yCi0gICAgICogbWVzc2FnZSBjYW4gYmUgYXBwZW5kZWQgZWFzaWx5LiBGb3IgdW5rbm93biBsb2NhdGlvbnMsIHJldHVybnMKLSAgICAgKiBhbiBlbXB0eSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc3VpdGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsb2NhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcoNSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChzb3VyY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGluZU51bWJlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiOiIpOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZU51bWJlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjogIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgc291cmNlIFVSTCBmb3IgdGhpcyBsb2NhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBhIFVSTCBzdHJpbmcgCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VVUkwoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGluZSBudW1iZXIgb2YgdGhpcyBsb2NhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpbnRlZ2VyIGxpbmUgbnVtYmVyCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhpcyBsb2NhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpbnRlZ2VyIGNvbHVtbiBudW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9zdXBwb3J0L0xvY2F0aW9uRXhjZXB0aW9uLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS9zdXBwb3J0L0xvY2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYTMyYWEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvc3VwcG9ydC9Mb2NhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBMb2NhdGlvbkV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gZGV0ZXJtaW5pbmcKLSAqIHRoZSBsb2NhdGlvbiBvZiBhbiBBbnQgY29tcG9uZW50LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIExvY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQW50RXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdGl2ZSBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgICAgIHN1cGVyKG1zZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaHJvd2FibGUgdGhhdCBtaWdodCBoYXZlIGNhdXNlIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobXNnLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFzIGEgcm9vdCBjYXVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXVzZSBFeGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlZCB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvQWJzdHJhY3RTY2FubmVyLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS90eXBlcy9BYnN0cmFjdFNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5NmM3OS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS90eXBlcy9BYnN0cmFjdFNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUudHlwZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb24uKjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgRmlsZVNldEluZm8gcGVyZm9ybXMgYWxsIG9mIHRoZSBuYW1lIG1hdGNoaW5nIGFuZCBtYXBwaW5nIG9wZXJhdGlvbnMKLSAqIGNvbW1vbiB0byBGaWxlU2V0SW5mbyBjbGFzc2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTY2FubmVyIGltcGxlbWVudHMgRmlsZVNldFNjYW5uZXIgewotICAgIC8qKiBUaGUgbGlzdCBvZiBwYXR0ZXJuU2V0cyB0byBwcm9jZXNzIG9uIHRoaXMgZGlyZWN0b3J5ICovCi0gICAgTGlzdCBwYXR0ZXJuU2V0czsKLSAgICAKLSAgICAvKiogSW5kaWNhdG9yIGZvciB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIGFwcGxpZWQuICovCi0gICAgYm9vbGVhbiB1c2VEZWZhdWx0RXhjbHVkZXM7ICAgICAgCi0gICAgCi0gICAgLyoKLSAgICAgKiBUaGUgcGF0dGVybnMgZm9yIHRoZSBmaWxlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGluY2x1ZGVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhdHRlcm5zIGZvciB0aGUgZmlsZXMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBleGNsdWRlczsKLQotICAgIC8qKgotICAgICAqIFBhdHRlcm5zIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGJ5IGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAc2VlICNhZGREZWZhdWx0RXhjbHVkZXMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gREVGQVVMVEVYQ0xVREVTID0gewotICAgICAgICAiKiovKn4iLAotICAgICAgICAiKiovIyojIiwKLSAgICAgICAgIioqLy4jKiIsCi0gICAgICAgICIqKi8lKiUiLAotICAgICAgICAiKiovQ1ZTIiwKLSAgICAgICAgIioqL0NWUy8qKiIsCi0gICAgICAgICIqKi8uY3ZzaWdub3JlIiwKLSAgICAgICAgIioqL1NDQ1MiLAotICAgICAgICAiKiovU0NDUy8qKiIKLSAgICB9OwotCi0gICAgcHVibGljIEFic3RyYWN0U2Nhbm5lcihMaXN0IHBhdHRlcm5TZXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5wYXR0ZXJuU2V0cyA9IHBhdHRlcm5TZXRzOwotICAgICAgICB0aGlzLnVzZURlZmF1bHRFeGNsdWRlcyA9IHVzZURlZmF1bHRFeGNsdWRlczsgCi0gICAgICAgIAotICAgICAgICAvL2NvbnZlcnQgcGF0dGVybnNldHMgaW50byBleGNsdWRlcwotICAgICAgICBQYXR0ZXJuU2V0IGNvbWJpbmVkU2V0ID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGF0dGVyblNldHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgUGF0dGVyblNldCBzZXQgPSAoUGF0dGVyblNldClpLm5leHQoKTsKLSAgICAgICAgICAgIGNvbWJpbmVkU2V0LmFwcGVuZChzZXQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBpbmNsdWRlcyA9IGNvbWJpbmVkU2V0LmdldEluY2x1ZGVQYXR0ZXJucygpOwotICAgICAgICBpZiAoaW5jbHVkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTm8gaW5jbHVkZXMgc3VwcGxpZWQsIHNvIHNldCBpdCB0byAnbWF0Y2hlcyBhbGwnCi0gICAgICAgICAgICBpbmNsdWRlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgICAgICBpbmNsdWRlc1swXSA9ICIqKiI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gZXhjbHVkZXMgPSBjb21iaW5lZFNldC5nZXRFeGNsdWRlUGF0dGVybnMoKTsKLSAgICAgICAgaWYgKGV4Y2x1ZGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4Y2x1ZGVzID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEluY2x1ZGVzKGluY2x1ZGVzKTsKLSAgICAgICAgc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgICAgICBpZiAodXNlRGVmYXVsdEV4Y2x1ZGVzKSB7Ci0gICAgICAgICAgICBhZGREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNldCBvZiBpbmNsdWRlIHBhdHRlcm5zIHRvIHVzZS4gQWxsICcvJyBhbmQgJ1wnIGNoYXJhY3RlcnMgYXJlCi0gICAgICogcmVwbGFjZWQgYnkgPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4gU28gdGhlIHNlcGFyYXRvciB1c2VkIG5lZWQKLSAgICAgKiBub3QgbWF0Y2ggPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIGEgcGF0dGVybiBlbmRzIHdpdGggYSAnLycgb3IgJ1wnLCAiKioiIGlzIGFwcGVuZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluY2x1ZGVzIGxpc3Qgb2YgaW5jbHVkZSBwYXR0ZXJucwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEluY2x1ZGVzKFN0cmluZ1tdIGluY2x1ZGVzKSB7Ci0gICAgICAgIGlmIChpbmNsdWRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSBuZXcgU3RyaW5nW2luY2x1ZGVzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm47Ci0gICAgICAgICAgICAgICAgcGF0dGVybiA9IGluY2x1ZGVzW2ldLnJlcGxhY2UoJy8nLEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnXFwnLEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gKz0gIioqIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5pbmNsdWRlc1tpXSA9IHBhdHRlcm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXQgb2YgZXhjbHVkZSBwYXR0ZXJucyB0byB1c2UuIEFsbCAnLycgYW5kICdcJyBjaGFyYWN0ZXJzIGFyZQotICAgICAqIHJlcGxhY2VkIGJ5IDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uIFNvIHRoZSBzZXBhcmF0b3IgdXNlZCBuZWVkCi0gICAgICogbm90IG1hdGNoIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBhIHBhdHRlcm4gZW5kcyB3aXRoIGEgJy8nIG9yICdcJywgIioqIiBpcyBhcHBlbmRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGNsdWRlcyBsaXN0IG9mIGV4Y2x1ZGUgcGF0dGVybnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmdbXSBleGNsdWRlcykgewotICAgICAgICBpZiAoZXhjbHVkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5leGNsdWRlcyA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gbmV3IFN0cmluZ1tleGNsdWRlcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuOwotICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBleGNsdWRlc1tpXS5yZXBsYWNlKCcvJyxGaWxlLnNlcGFyYXRvckNoYXIpLnJlcGxhY2UoJ1xcJyxGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICs9ICIqKiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZXNbaV0gPSBwYXR0ZXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgcGF0aCBtYXRjaCB0aGUgc3RhcnQgb2YgdGhpcyBwYXR0ZXJuIHVwIHRvIHRoZSBmaXJzdCAiKioiLgotICAgICArCi0gICAgICogPHA+VGhpcyBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgdGVzdCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKLSAgICAgKiBjYW4gbGl2ZSB3aXRoIGZhbHNlIHBvc2l0aXZlcy48L3A+Ci0gICAgICoKLSAgICAgKiA8cD48Y29kZT5wYXR0ZXJuPSoqXFxhPC9jb2RlPiBhbmQgPGNvZGU+c3RyPWI8L2NvZGU+IHdpbGwgeWllbGQgdHJ1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSAobm9uLW51bGwpIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdAotICAgICAqIEBwYXJhbSBzdHIgICAgIHRoZSAobm9uLW51bGwpIHN0cmluZyAocGF0aCkgdG8gbWF0Y2gKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuU3RhcnQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIpIHsKLSAgICAgICAgLy8gV2hlbiBzdHIgc3RhcnRzIHdpdGggYSBGaWxlLnNlcGFyYXRvciwgcGF0dGVybiBoYXMgdG8gc3RhcnQgd2l0aCBhCi0gICAgICAgIC8vIEZpbGUuc2VwYXJhdG9yLgotICAgICAgICAvLyBXaGVuIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBGaWxlLnNlcGFyYXRvciwgc3RyIGhhcyB0byBzdGFydCB3aXRoIGEKLSAgICAgICAgLy8gRmlsZS5zZXBhcmF0b3IuCi0gICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikgIT0KLSAgICAgICAgICAgIHBhdHRlcm4uc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFZlY3RvciBwYXREaXJzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdHRlcm4sRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBwYXREaXJzLmFkZEVsZW1lbnQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVjdG9yIHN0ckRpcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBzdHJEaXJzLmFkZEVsZW1lbnQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKLSAgICAgICAgaW50IHBhdElkeEVuZCAgID0gcGF0RGlycy5zaXplKCktMTsKLSAgICAgICAgaW50IHN0cklkeFN0YXJ0ID0gMDsKLSAgICAgICAgaW50IHN0cklkeEVuZCAgID0gc3RyRGlycy5zaXplKCktMTsKLQotICAgICAgICAvLyB1cCB0byBmaXJzdCAnKionCi0gICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCA8PSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0RGlyID0gKFN0cmluZylwYXREaXJzLmVsZW1lbnRBdChwYXRJZHhTdGFydCk7Ci0gICAgICAgICAgICBpZiAocGF0RGlyLmVxdWFscygiKioiKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtYXRjaChwYXREaXIsKFN0cmluZylzdHJEaXJzLmVsZW1lbnRBdChzdHJJZHhTdGFydCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKLSAgICAgICAgICAgIHN0cklkeFN0YXJ0Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIC8vIFN0cmluZyBpcyBleGhhdXN0ZWQKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHBhdElkeFN0YXJ0ID4gcGF0SWR4RW5kKSB7Ci0gICAgICAgICAgICAvLyBTdHJpbmcgbm90IGV4aGF1c3RlZCwgYnV0IHBhdHRlcm4gaXMuIEZhaWx1cmUuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBwYXR0ZXJuIG5vdyBob2xkcyAqKiB3aGlsZSBzdHJpbmcgaXMgbm90IGV4aGF1c3RlZAotICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGdlbmVyYXRlIGZhbHNlIHBvc2l0aXZlcyBidXQgd2UgY2FuIGxpdmUgd2l0aCB0aGF0LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXRjaGVzIGEgcGF0aCBhZ2FpbnN0IGEgcGF0dGVybi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSAobm9uLW51bGwpIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdAotICAgICAqIEBwYXJhbSBzdHIgICAgIHRoZSAobm9uLW51bGwpIHN0cmluZyAocGF0aCkgdG8gbWF0Y2gKLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgcGF0dGVybiBtYXRjaGVzIGFnYWluc3QgdGhlIHN0cmluZy4KLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoUGF0aChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0cikgewotICAgICAgICAvLyBXaGVuIHN0ciBzdGFydHMgd2l0aCBhIEZpbGUuc2VwYXJhdG9yLCBwYXR0ZXJuIGhhcyB0byBzdGFydCB3aXRoIGEKLSAgICAgICAgLy8gRmlsZS5zZXBhcmF0b3IuCi0gICAgICAgIC8vIFdoZW4gcGF0dGVybiBzdGFydHMgd2l0aCBhIEZpbGUuc2VwYXJhdG9yLCBzdHIgaGFzIHRvIHN0YXJ0IHdpdGggYQotICAgICAgICAvLyBGaWxlLnNlcGFyYXRvci4KLSAgICAgICAgaWYgKHN0ci5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSAhPQotICAgICAgICAgICAgcGF0dGVybi5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVjdG9yIHBhdERpcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybixGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIHBhdERpcnMuYWRkRWxlbWVudChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBWZWN0b3Igc3RyRGlycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cixGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIHN0ckRpcnMuYWRkRWxlbWVudChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcGF0SWR4U3RhcnQgPSAwOwotICAgICAgICBpbnQgcGF0SWR4RW5kICAgPSBwYXREaXJzLnNpemUoKS0xOwotICAgICAgICBpbnQgc3RySWR4U3RhcnQgPSAwOwotICAgICAgICBpbnQgc3RySWR4RW5kICAgPSBzdHJEaXJzLnNpemUoKS0xOwotCi0gICAgICAgIC8vIHVwIHRvIGZpcnN0ICcqKicKLSAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0IDw9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXREaXIgPSAoU3RyaW5nKXBhdERpcnMuZWxlbWVudEF0KHBhdElkeFN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChwYXREaXIuZXF1YWxzKCIqKiIpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1hdGNoKHBhdERpciwoU3RyaW5nKXN0ckRpcnMuZWxlbWVudEF0KHN0cklkeFN0YXJ0KSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRJZHhTdGFydCsrOwotICAgICAgICAgICAgc3RySWR4U3RhcnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIC8vIFN0cmluZyBpcyBleGhhdXN0ZWQKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghcGF0RGlycy5lbGVtZW50QXQoaSkuZXF1YWxzKCIqKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwYXRJZHhTdGFydCA+IHBhdElkeEVuZCkgewotICAgICAgICAgICAgICAgIC8vIFN0cmluZyBub3QgZXhoYXVzdGVkLCBidXQgcGF0dGVybiBpcy4gRmFpbHVyZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cCB0byBsYXN0ICcqKicKLSAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0IDw9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXREaXIgPSAoU3RyaW5nKXBhdERpcnMuZWxlbWVudEF0KHBhdElkeEVuZCk7Ci0gICAgICAgICAgICBpZiAocGF0RGlyLmVxdWFscygiKioiKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtYXRjaChwYXREaXIsKFN0cmluZylzdHJEaXJzLmVsZW1lbnRBdChzdHJJZHhFbmQpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdElkeEVuZC0tOwotICAgICAgICAgICAgc3RySWR4RW5kLS07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICAvLyBTdHJpbmcgaXMgZXhoYXVzdGVkCi0gICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBhdERpcnMuZWxlbWVudEF0KGkpLmVxdWFscygiKioiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAocGF0SWR4U3RhcnQgIT0gcGF0SWR4RW5kICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgewotICAgICAgICAgICAgaW50IHBhdElkeFRtcCA9IC0xOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0KzE7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0RGlycy5lbGVtZW50QXQoaSkuZXF1YWxzKCIqKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdElkeFRtcCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXRJZHhUbXAgPT0gcGF0SWR4U3RhcnQrMSkgewotICAgICAgICAgICAgICAgIC8vICcqKi8qKicgc2l0dWF0aW9uLCBzbyBza2lwIG9uZQotICAgICAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSBwYXR0ZXJuIGJldHdlZW4gcGFkSWR4U3RhcnQgJiBwYWRJZHhUbXAgaW4gc3RyIGJldHdlZW4KLSAgICAgICAgICAgIC8vIHN0cklkeFN0YXJ0ICYgc3RySWR4RW5kCi0gICAgICAgICAgICBpbnQgcGF0TGVuZ3RoID0gKHBhdElkeFRtcC1wYXRJZHhTdGFydC0xKTsKLSAgICAgICAgICAgIGludCBzdHJMZW5ndGggPSAoc3RySWR4RW5kLXN0cklkeFN0YXJ0KzEpOwotICAgICAgICAgICAgaW50IGZvdW5kSWR4ICA9IC0xOwotc3RyTG9vcDoKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ckxlbmd0aCAtIHBhdExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXRMZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViUGF0ID0gKFN0cmluZylwYXREaXJzLmVsZW1lbnRBdChwYXRJZHhTdGFydCtqKzEpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViU3RyID0gKFN0cmluZylzdHJEaXJzLmVsZW1lbnRBdChzdHJJZHhTdGFydCtpK2opOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKHN1YlBhdCxzdWJTdHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzdHJMb29wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm91bmRJZHggPSBzdHJJZHhTdGFydCtpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm91bmRJZHggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhdElkeFN0YXJ0ID0gcGF0SWR4VG1wOwotICAgICAgICAgICAgc3RySWR4U3RhcnQgPSBmb3VuZElkeCtwYXRMZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghcGF0RGlycy5lbGVtZW50QXQoaSkuZXF1YWxzKCIqKiIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIE1hdGNoZXMgYSBzdHJpbmcgYWdhaW5zdCBhIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIGNvbnRhaW5zIHR3byBzcGVjaWFsCi0gICAgICogY2hhcmFjdGVyczoKLSAgICAgKiAnKicgd2hpY2ggbWVhbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMsCi0gICAgICogJz8nIHdoaWNoIG1lYW5zIG9uZSBhbmQgb25seSBvbmUgY2hhcmFjdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIChub24tbnVsbCkgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0Ci0gICAgICogQHBhcmFtIHN0ciAgICAgdGhlIChub24tbnVsbCkgc3RyaW5nIHRoYXQgbXVzdCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlCi0gICAgICogICAgICAgICAgICAgICAgcGF0dGVybgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIpIHsKLSAgICAgICAgY2hhcltdIHBhdEFyciA9IHBhdHRlcm4udG9DaGFyQXJyYXkoKTsKLSAgICAgICAgY2hhcltdIHN0ckFyciA9IHN0ci50b0NoYXJBcnJheSgpOwotICAgICAgICBpbnQgcGF0SWR4U3RhcnQgPSAwOwotICAgICAgICBpbnQgcGF0SWR4RW5kICAgPSBwYXRBcnIubGVuZ3RoLTE7Ci0gICAgICAgIGludCBzdHJJZHhTdGFydCA9IDA7Ci0gICAgICAgIGludCBzdHJJZHhFbmQgICA9IHN0ckFyci5sZW5ndGgtMTsKLSAgICAgICAgY2hhciBjaDsKLQotICAgICAgICBib29sZWFuIGNvbnRhaW5zU3RhciA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdEFyci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHBhdEFycltpXSA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICBjb250YWluc1N0YXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjb250YWluc1N0YXIpIHsKLSAgICAgICAgICAgIC8vIE5vICcqJ3MsIHNvIHdlIG1ha2UgYSBzaG9ydGN1dAotICAgICAgICAgICAgaWYgKHBhdElkeEVuZCAhPSBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFBhdHRlcm4gYW5kIHN0cmluZyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGNoID0gcGF0QXJyW2ldOwotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPycgJiYgY2ggIT0gc3RyQXJyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFN0cmluZyBtYXRjaGVzIGFnYWluc3QgcGF0dGVybgotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhdElkeEVuZCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gUGF0dGVybiBjb250YWlucyBvbmx5ICcqJywgd2hpY2ggbWF0Y2hlcyBhbnl0aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBjaGFyYWN0ZXJzIGJlZm9yZSBmaXJzdCBzdGFyCi0gICAgICAgIHdoaWxlKChjaCA9IHBhdEFycltwYXRJZHhTdGFydF0pICE9ICcqJyAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIGlmIChjaCAhPSAnPycgJiYgY2ggIT0gc3RyQXJyW3N0cklkeFN0YXJ0XSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7Ci0gICAgICAgICAgICBzdHJJZHhTdGFydCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgewotICAgICAgICAgICAgLy8gQWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXNlZC4gQ2hlY2sgaWYgb25seSAnKidzIGFyZQotICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgcGF0dGVybi4gSWYgc28sIHdlIHN1Y2NlZWRlZC4gT3RoZXJ3aXNlIGZhaWx1cmUuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0QXJyW2ldICE9ICcqJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcm9jZXNzIGNoYXJhY3RlcnMgYWZ0ZXIgbGFzdCBzdGFyCi0gICAgICAgIHdoaWxlKChjaCA9IHBhdEFycltwYXRJZHhFbmRdKSAhPSAnKicgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICBpZiAoY2ggIT0gJz8nICYmIGNoICE9IHN0ckFycltzdHJJZHhFbmRdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0SWR4RW5kLS07Ci0gICAgICAgICAgICBzdHJJZHhFbmQtLTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIC8vIEFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVzZWQuIENoZWNrIGlmIG9ubHkgJyoncyBhcmUKLSAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSAhPSAnKicpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJvY2VzcyBwYXR0ZXJuIGJldHdlZW4gc3RhcnMuIHBhZElkeFN0YXJ0IGFuZCBwYXRJZHhFbmQgcG9pbnQKLSAgICAgICAgLy8gYWx3YXlzIHRvIGEgJyonLgotICAgICAgICB3aGlsZSAocGF0SWR4U3RhcnQgIT0gcGF0SWR4RW5kICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgewotICAgICAgICAgICAgaW50IHBhdElkeFRtcCA9IC0xOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0KzE7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0QXJyW2ldID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICBwYXRJZHhUbXAgPSBpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGF0SWR4VG1wID09IHBhdElkeFN0YXJ0KzEpIHsKLSAgICAgICAgICAgICAgICAvLyBUd28gc3RhcnMgbmV4dCB0byBlYWNoIG90aGVyLCBza2lwIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBhdHRlcm4gYmV0d2VlbiBwYWRJZHhTdGFydCAmIHBhZElkeFRtcCBpbiBzdHIgYmV0d2VlbgotICAgICAgICAgICAgLy8gc3RySWR4U3RhcnQgJiBzdHJJZHhFbmQKLSAgICAgICAgICAgIGludCBwYXRMZW5ndGggPSAocGF0SWR4VG1wLXBhdElkeFN0YXJ0LTEpOwotICAgICAgICAgICAgaW50IHN0ckxlbmd0aCA9IChzdHJJZHhFbmQtc3RySWR4U3RhcnQrMSk7Ci0gICAgICAgICAgICBpbnQgZm91bmRJZHggID0gLTE7Ci1zdHJMb29wOgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyTGVuZ3RoIC0gcGF0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhdExlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0K2orMV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPycgJiYgY2ggIT0gc3RyQXJyW3N0cklkeFN0YXJ0K2kral0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHN0ckxvb3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3VuZElkeCA9IHN0cklkeFN0YXJ0K2k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3VuZElkeCA9PSAtMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGF0SWR4U3RhcnQgPSBwYXRJZHhUbXA7Ci0gICAgICAgICAgICBzdHJJZHhTdGFydCA9IGZvdW5kSWR4K3BhdExlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVzZWQuIENoZWNrIGlmIG9ubHkgJyoncyBhcmUgbGVmdAotICAgICAgICAvLyBpbiB0aGUgcGF0dGVybi4gSWYgc28sIHdlIHN1Y2NlZWRlZC4gT3RoZXJ3aXNlIGZhaWx1cmUuCi0gICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgewotICAgICAgICAgICAgaWYgKHBhdEFycltpXSAhPSAnKicpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciBhIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZSBpbmNsdWRlIHBhdHRlcm4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBtYXRjaAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgbmFtZSBtYXRjaGVzIGFnYWluc3QgYXQgbGVhc3Qgb25lCi0gICAgICogICAgICAgICBpbmNsdWRlIHBhdHRlcm4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlZChTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobWF0Y2hQYXRoKGluY2x1ZGVzW2ldLG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgYSBuYW1lIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIGF0IGxlYXN0IG9uZSBpbmNsdWRlIHBhdHRlcm4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBtYXRjaAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgbmFtZSBtYXRjaGVzIGFnYWluc3QgYXQgbGVhc3Qgb25lCi0gICAgICogICAgICAgICBpbmNsdWRlIHBhdHRlcm4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY291bGRIb2xkSW5jbHVkZWQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG1hdGNoUGF0dGVyblN0YXJ0KGluY2x1ZGVzW2ldLG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgYSBuYW1lIG1hdGNoZXMgYWdhaW5zdCBhdCBsZWFzdCBvbmUgZXhjbHVkZSBwYXR0ZXJuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gbWF0Y2gKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZQotICAgICAqICAgICAgICAgZXhjbHVkZSBwYXR0ZXJuLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG1hdGNoUGF0aChleGNsdWRlc1tpXSxuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBhcnJheSB3aXRoIGRlZmF1bHQgZXhjbHVzaW9ucyB0byB0aGUgY3VycmVudCBleGNsdXNpb25zIHNldC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRFeGNsdWRlcygpIHsKLSAgICAgICAgaW50IGV4Y2x1ZGVzTGVuZ3RoID0gZXhjbHVkZXMgPT0gbnVsbCA/IDAgOiBleGNsdWRlcy5sZW5ndGg7Ci0gICAgICAgIFN0cmluZ1tdIG5ld0V4Y2x1ZGVzOwotICAgICAgICBuZXdFeGNsdWRlcyA9IG5ldyBTdHJpbmdbZXhjbHVkZXNMZW5ndGggKyBERUZBVUxURVhDTFVERVMubGVuZ3RoXTsKLSAgICAgICAgaWYgKGV4Y2x1ZGVzTGVuZ3RoID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShleGNsdWRlcywwLG5ld0V4Y2x1ZGVzLDAsZXhjbHVkZXNMZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREVGQVVMVEVYQ0xVREVTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBuZXdFeGNsdWRlc1tpK2V4Y2x1ZGVzTGVuZ3RoXSA9IERFRkFVTFRFWENMVURFU1tpXS5yZXBsYWNlKCcvJyxGaWxlLnNlcGFyYXRvckNoYXIpLnJlcGxhY2UoJ1xcJyxGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICB9Ci0gICAgICAgIGV4Y2x1ZGVzID0gbmV3RXhjbHVkZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvRGF0YVR5cGUuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3R5cGVzL0RhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWJiZDUuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb24uKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogQSBEYXRhVHlwZSBpcyBhbiBlbGVtZW50IHdoaWNoIGNhbiByZWdpc3RlciBhIG5hbWVkIHZhbHVlIGluIHRoZQotICogRXhlY3V0aW9uRnJhbWUncyBjb250ZXh0LiAKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFUeXBlIGV4dGVuZHMgQWJzdHJhY3RUYXNrIHsKLSAgICBwcml2YXRlIFN0cmluZyByZWZlcmVuY2UgPSBudWxsOwotICAgIHByaXZhdGUgT2JqZWN0IHJlZmVyZW5jZWRPYmplY3QgPSBudWxsOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBleGNlcHRpb24gdGhhdCBpbmRpY2F0ZXMgdGhhdCByZWZpZCBoYXMgdG8gYmUgdGhlCi0gICAgICogb25seSBhdHRyaWJ1dGUgaWYgaXQgaXMgc2V0LiAgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEV4ZWN1dGlvbkV4Y2VwdGlvbiB0b29NYW55QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hlbiB1c2luZyByZWZpZCIgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGV4Y2VwdGlvbiB0aGF0IGluZGljYXRlcyB0aGF0IHRoaXMgWE1MIGVsZW1lbnQgbXVzdAotICAgICAqIG5vdCBoYXZlIGNoaWxkIGVsZW1lbnRzIGlmIHRoZSByZWZpZCBhdHRyaWJ1dGUgaXMgc2V0LiAgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEV4ZWN1dGlvbkV4Y2VwdGlvbiBub0NoaWxkcmVuQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBleGNlcHRpb24gdGhhdCBpbmRpY2F0ZXMgdGhlIHVzZXIgaGFzIGdlbmVyYXRlZCBhCi0gICAgICogbG9vcCBvZiBkYXRhIHR5cGVzIHJlZmVyZW5jaW5nIGVhY2ggb3RoZXIuICAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRXhlY3V0aW9uRXhjZXB0aW9uIGNpcmN1bGFyUmVmZXJlbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgRGF0YVR5cGUKLSAgICAgKiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChTdHJpbmcgcmVmZXJlbmNlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7Ci0gICAgICAgIE9iamVjdCByZWZlcmVuY2VkT2JqZWN0ID0gZ2V0VGFza0NvbnRleHQoKS5nZXREYXRhVmFsdWUocmVmZXJlbmNlKTsKLQotICAgICAgICBpZiAocmVmZXJlbmNlZE9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9jYXRlIHRoZSByZWZlcmVuY2Ugc3BlY2lmaWVkIGJ5IHJlZmlkICciICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVmZXJlbmNlKCkgKyAiJyIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIXRoaXMuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKHJlZmVyZW5jZWRPYmplY3QuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSByZWZpZCAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZmVyZW5jZSgpICsgIicgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIGVsZW1lbnQgIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYXMgdGhlIHJlZmlkIGF0dHJpYnV0ZSBvZiB0aGlzIGVsZW1lbnQgYmVlbiBzZXQ/Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKSB7Ci0gICAgICAgIHJldHVybiByZWZlcmVuY2VkT2JqZWN0ICE9IG51bGw7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJlZmVyZW5jZWRPYmplY3QoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJZb3UgY2Fubm90IGdldCBhIHJlZmVyZW5jZWQgdmFsdWUgZnJvbSBhIGRhdGEgdHlwZSAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBkb2VzIG5vdCBoYXZlIHRoZSByZWZpZCBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRPYmplY3Q7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlKCkgewotICAgICAgICByZXR1cm4gcmVmZXJlbmNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3R5cGVzL0RpcmVjdG9yeVNjYW5uZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3R5cGVzL0RpcmVjdG9yeVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1ZjA5MS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS90eXBlcy9EaXJlY3RvcnlTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5jb3JlLnR5cGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci0KLS8qKgotICogQSBEaXJlY3RvcnlGaWxlc2V0IGlzIGEgZmlsZXNldCB3aGVyZSB0aGUgZmlsZXMgY29tZSBmcm9tIGEgZGlyZWN0b3J5IGFuZAotICogaXRzIHN1YmRpcmVjdG9yaWVzLiAKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeVNjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFNjYW5uZXIgewotICAgIC8qKiBUaGUgZGlyZWN0b3J5IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBzZWFyY2ggc3BhY2UuICovCi0gICAgRmlsZSBiYXNlZGlyOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBmaWxlcyB0aGF0IHdoZXJlIGZvdW5kIGFuZCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBpbmNsdWRlcywgYW5kIG1hdGNoZWQKLSAgICAgKiBubyBleGNsdWRlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBmaWxlc0luY2x1ZGVkOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIGRpZCBub3QgbWF0Y2ggYW55IGluY2x1ZGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGZpbGVzTm90SW5jbHVkZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlsZXMgdGhhdCB3aGVyZSBmb3VuZCBhbmQgbWF0Y2hlZCBhdCBsZWFzdCBvbmUgaW5jbHVkZXMsIGFuZCBhbHNvCi0gICAgICogbWF0Y2hlZCBhdCBsZWFzdCBvbmUgZXhjbHVkZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZmlsZXNFeGNsdWRlZDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3RvcmllcyB0aGF0IHdoZXJlIGZvdW5kIGFuZCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBpbmNsdWRlcywgYW5kCi0gICAgICogbWF0Y2hlZCBubyBleGNsdWRlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBkaXJzSW5jbHVkZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3JpZXMgdGhhdCB3aGVyZSBmb3VuZCBhbmQgZGlkIG5vdCBtYXRjaCBhbnkgaW5jbHVkZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZGlyc05vdEluY2x1ZGVkOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGluY2x1ZGVzLCBhbmQgYWxzbwotICAgICAqIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGV4Y2x1ZGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGRpcnNFeGNsdWRlZDsKLQotICAgIC8qKiBNYXAgdG8gbWFwIGZpbGVuYW1lcyB0byBhY3R1YWwgRmlsZSBvYmplY3RzICovCi0gICAgcHJpdmF0ZSBNYXAgZmlsZW5hbWVNYXAgPSBudWxsOwotCi0gICAgcHVibGljIERpcmVjdG9yeVNjYW5uZXIoRmlsZSBiYXNlZGlyLCBMaXN0IHBhdHRlcm5TZXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlcykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHBhdHRlcm5TZXRzLCB1c2VEZWZhdWx0RXhjbHVkZXMpOwotICAgICAgICB0aGlzLmJhc2VkaXIgPSBiYXNlZGlyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZWRGaWxlcygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoZmlsZXNJbmNsdWRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzY2FuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoU3RyaW5nW10pZmlsZXNJbmNsdWRlZC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNjYW5zIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgZmlsZXMgdGhhdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5jbHVkZQotICAgICAqIHBhdHRlcm4sIGFuZCBkb24ndCBtYXRjaCBhbnkgZXhjbHVkZSBwYXR0ZXJucy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHdoZW4gYmFzZWRpciB3YXMgc2V0IGluY29ycmVjbHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzY2FuKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiAgewotICAgICAgICBpZiAoYmFzZWRpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJUaGUgZGlyZWN0b3J5IHRvIHNjYW4gaGFzIG5vdCBiZWVuIHNldCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYmFzZWRpci5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiYmFzZWRpciBcIiIgKyBiYXNlZGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IGV4aXN0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiYXNlZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oImJhc2VkaXIgXCIiICsgYmFzZWRpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBpcyBub3QgYSBkaXJlY3RvcnkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGVzSW5jbHVkZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbGVzTm90SW5jbHVkZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbGVzRXhjbHVkZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGRpcnNJbmNsdWRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZGlyc05vdEluY2x1ZGVkID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBkaXJzRXhjbHVkZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbGVuYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBTdHJpbmcgcm9vdCA9ICIiOwotICAgICAgICBTdHJpbmcgbWFwcGVkUm9vdCA9IG1hcE5hbWUocm9vdCk7Ci0gICAgICAgIGZpbGVuYW1lTWFwLnB1dChtYXBwZWRSb290LCByb290KTsKLSAgICAgICAgaWYgKGlzSW5jbHVkZWQocm9vdCkpIHsKLSAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZChyb290KSkgewotICAgICAgICAgICAgICAgIGRpcnNJbmNsdWRlZC5hZGQobWFwcGVkUm9vdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGQobWFwcGVkUm9vdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkaXJzTm90SW5jbHVkZWQuYWRkKG1hcHBlZFJvb3QpOwotICAgICAgICB9Ci0gICAgICAgIHNjYW5kaXIoYmFzZWRpciwgcm9vdCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NhbnMgdGhlIHBhc3NlZCBkaXIgZm9yIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gRm91bmQgZmlsZXMgYW5kCi0gICAgICogZGlyZWN0b3JpZXMgYXJlIHBsYWNlZCBpbiB0aGVpciByZXNwZWN0aXZlIGNvbGxlY3Rpb25zLCBiYXNlZCBvbiB0aGUKLSAgICAgKiBtYXRjaGluZyBvZiBpbmNsdWRlcyBhbmQgZXhjbHVkZXMuIFdoZW4gYSBkaXJlY3RvcnkgaXMgZm91bmQsIGl0IGlzCi0gICAgICogc2Nhbm5lZCByZWN1cnNpdmVseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkaXIgICB0aGUgZGlyZWN0b3J5IHRvIHNjYW4KLSAgICAgKiBAcGFyYW0gdnBhdGggdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIgKG5lZWRlZCB0byBwcmV2ZW50Ci0gICAgICogICAgICAgICAgICAgIHByb2JsZW1zIHdpdGggYW4gYWJzb2x1dGUgcGF0aCB3aGVuIHVzaW5nIGRpcikKLSAgICAgKgotICAgICAqIEBzZWUgI2ZpbGVzSW5jbHVkZWQKLSAgICAgKiBAc2VlICNmaWxlc05vdEluY2x1ZGVkCi0gICAgICogQHNlZSAjZmlsZXNFeGNsdWRlZAotICAgICAqIEBzZWUgI2RpcnNJbmNsdWRlZAotICAgICAqIEBzZWUgI2RpcnNOb3RJbmNsdWRlZAotICAgICAqIEBzZWUgI2RpcnNFeGNsdWRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNjYW5kaXIoRmlsZSBkaXIsIFN0cmluZyB2cGF0aCwgYm9vbGVhbiBmYXN0KSAKLSAgICAgICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIG5ld2ZpbGVzID0gZGlyLmxpc3QoKTsKLQotICAgICAgICBpZiAobmV3ZmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIHR3byByZWFzb25zIGFyZSBtZW50aW9uZWQgaW4gdGhlIEFQSSBkb2NzIGZvciBGaWxlLmxpc3QKLSAgICAgICAgICAgICAqICgxKSBkaXIgaXMgbm90IGEgZGlyZWN0b3J5LiBUaGlzIGlzIGltcG9zc2libGUgYXMKLSAgICAgICAgICAgICAqICAgICB3ZSB3b3VsZG4ndCBnZXQgaGVyZSBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgKiAoMikgYW4gSU8gZXJyb3Igb2NjdXJyZWQgKHdoeSBkb2Vzbid0IGl0IHRocm93IGFuIGV4Y2VwdGlvbiAKLSAgICAgICAgICAgICAqICAgICB0aGVuPz8/KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uICgiSU8gZXJyb3Igc2Nhbm5pbmcgZGlyZWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld2ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHZwYXRoK25ld2ZpbGVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIG1hcHBlZE5hbWUgPSBtYXBOYW1lKG5hbWUpOwotICAgICAgICAgICAgZmlsZW5hbWVNYXAucHV0KG1hcHBlZE5hbWUsIG5hbWUpOwotICAgICAgICAgICAgRmlsZSAgIGZpbGUgPSBuZXcgRmlsZShkaXIsbmV3ZmlsZXNbaV0pOwotICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlyc0luY2x1ZGVkLmFkZChtYXBwZWROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lK0ZpbGUuc2VwYXJhdG9yLCBmYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGQobWFwcGVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkaXJzTm90SW5jbHVkZWQuYWRkKG1hcHBlZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdCAmJiBjb3VsZEhvbGRJbmNsdWRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lK0ZpbGUuc2VwYXJhdG9yLCBmYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWZhc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lK0ZpbGUuc2VwYXJhdG9yLCBmYXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRXhjbHVkZWQobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzSW5jbHVkZWQuYWRkKG1hcHBlZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNFeGNsdWRlZC5hZGQobWFwcGVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlc05vdEluY2x1ZGVkLmFkZChtYXBwZWROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtYXBOYW1lKFN0cmluZyByYXdOYW1lKSB7Ci0gICAgICAgIHJldHVybiAiYm96by8iICsgcmF3TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRMb2NhbEZpbGUoU3RyaW5nIG1hcHBlZE5hbWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoZmlsZXNJbmNsdWRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzY2FuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZWFsTmFtZSA9IChTdHJpbmcpZmlsZW5hbWVNYXAuZ2V0KG1hcHBlZE5hbWUpOwotICAgICAgICBpZiAocmVhbE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiXCIiICsgbWFwcGVkTmFtZSArICJcIiB3YXMgbm90IGluY2x1ZGVkIGluIHRoZSBzY2FuLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IEZpbGUoYmFzZWRpciwgcmVhbE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIFN0cmluZyBsc2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChmaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxzZXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAiRmlsZXNldCBmcm9tIFwiIiArIGJhc2VkaXIgKyAiXCIiOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZS5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmUwM2JhLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3R5cGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbi4qOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgYXR0cmlidXRlcyB0aGF0IGNhbiBvbmx5IHRha2Ugb25lIG9mIGEgZml4ZWQgbGlzdAotICogb2YgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLQotICAgIC8qKiBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHRoZSBvbmx5IG1ldGhvZCBhIHN1YmNsYXNzIG5lZWRzIHRvIGltcGxlbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgaG9sZGluZyBhbGwgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsdWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEludm9rZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLkludHJvc3BlY3Rpb25IZWxwZXIgSW50cm9zcGVjdGlvbkhlbHBlcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhdGlvbgotICAgICAqCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY29udGFpbnNWYWx1ZSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24odmFsdWUgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGlzIHZhbHVlIGluY2x1ZGVkIGluIHRoZSBlbnVtZXJhdGlvbj8KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc1ZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHModmFsdWVzW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS90eXBlcy9GaWxlU2V0LmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS90eXBlcy9GaWxlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODU3NmIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvRmlsZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS50eXBlczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5leGVjdXRpb24uKjsKLQotLyoqCi0gKiBNb3ZlZCBvdXQgb2YgTWF0Y2hpbmdUYXNrIHRvIG1ha2UgaXQgYSBzdGFuZGFsb25lIG9iamVjdCB0aGF0IGNvdWxkCi0gKiBiZSByZWZlcmVuY2VkIChieSBzY3JpcHRzIGZvciBleGFtcGxlKS4KLSAqCi0gKiBAYXV0aG9yIEFybm91dCBKLiBLdWlwZXIgPGEgaHJlZj0ibWFpbHRvOmFqa3VpcGVyQHd4cy5ubCI+YWprdWlwZXJAd3hzLm5sPC9hPiAKLSAqIEBhdXRob3IgU3RlZmFubyBNYXp6b2NjaGkgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbm9AYXBhY2hlLm9yZyI+c3RlZmFub0BhcGFjaGUub3JnPC9hPgotICogQGF1dGhvciBTYW0gUnVieSA8YSBocmVmPSJtYWlsdG86cnVieXNAdXMuaWJtLmNvbSI+cnVieXNAdXMuaWJtLmNvbTwvYT4KLSAqIEBhdXRob3IgSm9uIFMuIFN0ZXZlbnMgPGEgaHJlZj0ibWFpbHRvOmpvbkBjbGVhcmluay5jb20iPmpvbkBjbGVhcmluay5jb208L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU2V0IGV4dGVuZHMgRGF0YVR5cGUgewotICAgIHByaXZhdGUgRmlsZVNldFNjYW5uZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBQYXR0ZXJuU2V0IGRlZmF1bHRQYXR0ZXJucyA9IG5ldyBQYXR0ZXJuU2V0KCk7Ci0gICAgcHJpdmF0ZSBMaXN0IHBhdHRlcm5TZXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqIAotICAgICAqIFRoZSBkaXIgYXR0cmlidXRlIGlzIHNldCB3aGVuIHlvdSBhcmUgZ2VuZXJhdGluZyB0aGUgbGlzdCBvZiBmaWxlcwotICAgICAqICBmcm9tIGEgZGlyZWN0b3J5LiAKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZGlyID0gbnVsbDsKLSAgICAKLSAgICAvKiogVGhlIHppcGZpbGUgYXR0cmlidXRlIGlzIHVzZWQgd2hlbiB0aGUgc291cmNlIG9mIGZpbGVzIGlzIGEgemlwIGZpbGUgKi8KLSAgICBwcml2YXRlIFVSTCB6aXBGaWxlID0gbnVsbDsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIGZpbGVsaXN0IGF0dHJpYnV0ZSBpcyBhIGZpbGUgd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mIGZpbGUgbmFtZXMuIEl0IG11c3QgYmUgdXNlZAotICAgICAqIHdpdGggdGhlIGJhc2UgYXR0cmlidXRlIHdoaWNoIGluZGljYXRlcyB3aGVyZSB0aGUgZmlsZXMgYXJlIHN0b3JlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFVSTCBmaWxlTGlzdCA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogV2hlbiB1c2luZyB0aGUgZmlsZWxpc3QgdGhpcyBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoZSBiYXNlIGxvY2F0aW9uIG9mIHRoZSBmaWxlcyBpbgotICAgICAqIHRoZSBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgVVJMIGZpbGVMaXN0QmFzZSA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlcyA9IHRydWU7Ci0KLSAgICBwdWJsaWMgRmlsZVNldCgpIHsKLSAgICAgICAgcGF0dGVyblNldHMuYWRkKGRlZmF1bHRQYXR0ZXJucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZXMgdGhpcyBpbnN0YW5jZSBpbiBlZmZlY3QgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBGaWxlU2V0Ci0gICAgICogaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCi0gICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVmaWQoU3RyaW5nIHJlZmVyZW5jZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkaXIgIT0gbnVsbCB8fCBkZWZhdWx0UGF0dGVybnMuaGFzUGF0dGVybnMoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShwYXR0ZXJuU2V0cy5zaXplKCkgPT0gMSkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0UmVmaWQocmVmZXJlbmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkaXIpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZGlyID0gZGlyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFppcEZpbGUoVVJMIHppcEZpbGUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuemlwRmlsZSA9IHppcEZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZUxpc3QoVVJMIGZpbGVMaXN0KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmZpbGVMaXN0ID0gZmlsZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZUxpc3RCYXNlKFVSTCBmaWxlTGlzdEJhc2UpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZmlsZUxpc3RCYXNlID0gZmlsZUxpc3RCYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXR0ZXJuU2V0IGNyZWF0ZVBhdHRlcm5TZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUGF0dGVyblNldCBwYXR0ZXJuU2V0ID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcGF0dGVyblNldHMuYWRkKHBhdHRlcm5TZXQpOwotICAgICAgICByZXR1cm4gcGF0dGVyblNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUluY2x1ZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUV4Y2x1ZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRQYXR0ZXJucy5jcmVhdGVFeGNsdWRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0UGF0dGVybnMuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKLSAgICAgKiBvciBhIHNwYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVzIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZXhjbHVkZSBwYXR0ZXJucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzKFN0cmluZyBleGNsdWRlcykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdFBhdHRlcm5zLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGluY2wgVGhlIGZpbGUgdG8gZmV0Y2ggdGhlIGluY2x1ZGUgcGF0dGVybnMgZnJvbS4gIAotICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0ZpbGUoVVJMIGluY2wpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICAgfQotCi0gICAgICAgICBkZWZhdWx0UGF0dGVybnMuc2V0SW5jbHVkZXNGaWxlKGluY2wpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2wgVGhlIGZpbGUgdG8gZmV0Y2ggdGhlIGV4Y2x1ZGUgcGF0dGVybnMgZnJvbS4gIAotICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlc0ZpbGUoVVJMIGV4Y2wpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICAgfQotCi0gICAgICAgICBkZWZhdWx0UGF0dGVybnMuc2V0RXhjbHVkZXNGaWxlKGV4Y2wpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VEZWZhdWx0RXhjbHVkZXMgInRydWUifCJvbiJ8InllcyIgd2hlbiBkZWZhdWx0IGV4Y2x1c2lvbnMgCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCwgImZhbHNlInwib2ZmInwibm8iIHdoZW4gdGhleQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkbid0IGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEV4Y2x1ZGVzKGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnVzZURlZmF1bHRFeGNsdWRlcyA9IHVzZURlZmF1bHRFeGNsdWRlczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZVNldCBnZXRSZWZlcmVuY2VkRmlsZVNldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgbyA9IGdldFJlZmVyZW5jZWRPYmplY3QoKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEZpbGVTZXQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGdldFJlZmVyZW5jZSgpICsgIiBkb2VzblwndCBkZW5vdGUgYSBmaWxlc2V0Iik7OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChGaWxlU2V0KSBvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBmaXJzdGx5IHZhbGlkYXRlIHRoYXQgdGhlIG90aGVyIGF0dHJpYnV0ZXMgYXJlIG5vdCBzZXQKLSAgICAgICAgICAgIGlmICh6aXBGaWxlICE9IG51bGwgfHwgZmlsZUxpc3QgIT0gbnVsbCB8fCBmaWxlTGlzdEJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlRoZSAnZGlyJyBhdHRyaWJ1dGUgbWF5IG5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib2YgdGhlICd6aXBmaWxlJywgJ2ZpbGVsaXN0JyBhbmQgJ2Jhc2UnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh6aXBGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChmaWxlTGlzdCAhPSBudWxsIHx8IGZpbGVMaXN0QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiVGhlICd6aXBmaWxlJyBhdHRyaWJ1dGUgbWF5IG5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib2YgdGhlICdkaXInLCAnZmlsZWxpc3QnIGFuZCAnYmFzZScgYXR0cmlidXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZpbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChmaWxlTGlzdEJhc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIkEgJ2Jhc2UnIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSAnZmlsZWxpc3QnICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmeSBvbmUgb2YgdGhlICdkaXInLCAnemlwZmlsZScsIG9yICdmaWxlbGlzdCcgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBGaWxlU2V0U2Nhbm5lciBnZXRTY2FubmVyKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVmZXJlbmNlZEZpbGVTZXQoKS5nZXRTY2FubmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzY2FubmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzY2FubmVyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBuZWVkIHRvIGNyZWF0ZSB0aGUgZmlsZXNldCBpbmZvLiBGb3IgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbmVlZAotICAgICAgICAvLyB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZSBvZiBGaWxlU2V0SW5mbyBpbXBsZW1lbnRhdGlvbiB3ZSBzaG91bGQgdXNlLgotICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcihkaXIsIHBhdHRlcm5TZXRzLCB1c2VEZWZhdWx0RXhjbHVkZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHppcEZpbGUgIT0gbnVsbCkgewotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZpbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNjYW5uZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2Nhbm5lcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkZpbGVTZXQiOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvRmlsZVNldFNjYW5uZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3R5cGVzL0ZpbGVTZXRTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZjJkNGIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvRmlsZVNldFNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUudHlwZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci0KLS8qKgotICogVGhlIEZpbGVTZXRJbmZvIGludGVyZmFjZSBkZWZpbmVzIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgZmlsdGVyaW5nIHRvCi0gKiBzb21lIGJhc2UgY29sbGVjdGlvbiBvZiBmaWxlcy4gRmlsdGVyaW5nIGludm9sdmVzIGJvdGggZmlsZSBleGNsdXNpb24gCi0gKiBhbmQgZmlsZSBuYW1lIG1hcHBpbmcuCi0gKgotICogRmlsZVNldEluZm8gc2hvdWxkIGJlIGxhemlseSBldmFsdWF0ZWQgdG8gYWxsb3cgdGhlbSB0byBiZSBkZWZpbmVkIGJlZm9yZSB0aGUKLSAqIHJlcXVpcmVkIGZpbGVzIGhhdmUgYmVlbiBjcmVhdGVkLiBUaGV5IHNob3VsZCBiZSBldmFsdWF0ZWQgYXQgZmlyc3QgdXNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGVTZXRTY2FubmVyIHsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluY2x1ZGVkIGZpbGVzIGFmdGVyIHRoZWlyIGZpbGUgbmFtZXMgaGF2ZSBiZWVuIG1hcHBlZAotICAgICAqCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIG9uZSBpcyB0aGUgbWFwcGVkIG5hbWUgb2YgYSBmaWxlLgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldEluY2x1ZGVkRmlsZXMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIDsKLS8vICAgIAotLy8gICAgLyoqCi0vLyAgICAgKiBHZXQgZGlyZWN0b3JpZXMgaW5jbHVkZWQgYWZ0ZXIgdGhlaXIgZmlsZSBuYW1lcyBoYXZlIGJlZW4gbWFwcGVkCi0vLyAgICAgKgotLy8gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIG9uZSBpcyB0aGUgbWFwcGVkIG5hbWUgb2YgYSBmaWxlLgotLy8gICAgICovCi0vLyAgICBTdHJpbmdbXSBnZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7Ci0vLwotLy8gICAgLyoqCi0vLyAgICAgKiBHZXQgYSBmaWxlIGZvciB0aGUgY29udGVudCBvZiB0aGUgbmFtZWQgaW5jbHVkZWQgZmlsZS4gSWYgdGhlIGNvbnRlbnQKLS8vICAgICAqIGlzIG5vdCBzdG9yZWQgaW4gdGhlIGxvY2FsIGZpbGVzeXN0ZW0sIGEgdGVtcG9yYXJ5IGZpbGUgaXMgY3JlYXRlZCB3aXRoIHRoZSBjb250ZW50LiAKLS8vICAgICAqIENhbGxlcnMgc2hvdWxkIG5vdCByZWx5IG9uIHRoaXMgZmlsZSByZXByZXNlbnRpbmcgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZiB0aGUgdW5kZXJseWluZwotLy8gICAgICogZGF0YS4KLS8vICAgICAqLwotLy8gICAgRmlsZSBnZXRDb250ZW50RmlsZShTdHJpbmcgbWFwcGVkTmFtZSk7Ci0vLyAgICAKLS8vICAgIC8qKgotLy8gICAgICogR2V0IGEgVVJMIGZvciB0aGUgY29udGVudC4gVGhlIGNvbnRlbnQgbWF5IGJlIGNhY2hlZCBvbiB0aGUgbG9jYWwgc3lzdGVtIGFuZCB0aHVzCi0vLyAgICAgKiBjYWxsZXJzIHNob3VsZCBub3QgcmVseSBvbiB0aGUgbG9jYXRpb24KLS8vICAgICAqCi0vLyAgICAgKi8KLS8vICAgIFVSTCBnZXRDb250ZW50VVJMKFN0cmluZyBtYXBwZWROYW1lKTsKLS8vICAgIAotLy8gICAgLyoqCi0vLyAgICAgKiBHZXQgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBjb250ZW50IG9mIHRoZSBuYW1lZCBlbnRyeSBvZiB0aGUgZmlsZXNldC4KLS8vICAgICAqLwotLy8gICAgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIG1hcHBlZE5hbWUpOwotLy8gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGEgbG9jYWwgZmlsZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBmaWxlIHBvaW50aW5nIHRvIHRoZSBhY3R1YWwgbG9jYWwgZmlsZXN5c3RlbSBmaWxlIGZyb20gCi0gICAgICogd2hpY2ggdGhlIGZpbGUgY29udGVudCBjb21lcy4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgbG9jYWxseSwgYSBudWxsIGlzIAotICAgICAqIHJldHVybmVkLiBOb3RlIHRoYXQgZHVlIHRvIG5hbWUgbWFwcGluZywgdGhlIGFjdHVhbCBmaWxlIG5hbWUgbWF5IGJlIGRpZmZlcmVudAotICAgICAqIGZyb20gdGhlIG1hcHBlZCBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBtYXBwZWQgZmlsZSBpbiB0aGUgbG9jYWwgZmlsZXN5c3RlbS4KLSAgICAgKi8KLSAgICBGaWxlIGdldExvY2FsRmlsZShTdHJpbmcgbWFwcGVkTmFtZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiA7Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS90eXBlcy9QYXR0ZXJuU2V0LmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS90eXBlcy9QYXR0ZXJuU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMGEzMWYuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUvdHlwZXMvUGF0dGVyblNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS50eXBlczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbi4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBOYW1lZCBjb2xsZWN0aW9uIG9mIGluY2x1ZGUvZXhjbHVkZSB0YWdzLgotICoKLSAqIEBhdXRob3IgQXJub3V0IEouIEt1aXBlciA8YSBocmVmPSJtYWlsdG86YWprdWlwZXJAd3hzLm5sIj5hamt1aXBlckB3eHMubmw8L2E+IAotICogQGF1dGhvciBTdGVmYW5vIE1henpvY2NoaSA8YSBocmVmPSJtYWlsdG86c3RlZmFub0BhcGFjaGUub3JnIj5zdGVmYW5vQGFwYWNoZS5vcmc8L2E+Ci0gKiBAYXV0aG9yIFNhbSBSdWJ5IDxhIGhyZWY9Im1haWx0bzpydWJ5c0B1cy5pYm0uY29tIj5ydWJ5c0B1cy5pYm0uY29tPC9hPgotICogQGF1dGhvciBKb24gUy4gU3RldmVucyA8YSBocmVmPSJtYWlsdG86am9uQGNsZWFyaW5rLmNvbSI+am9uQGNsZWFyaW5rLmNvbTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQG1lZ2FiaXQubmV0Ij5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuU2V0IGV4dGVuZHMgRGF0YVR5cGUgewotICAgIHByaXZhdGUgYm9vbGVhbiBmaWxlc1JlYWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIExpc3QgaW5jbHVkZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBMaXN0IGV4Y2x1ZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHByaXZhdGUgVVJMIGluY2x1ZGVGaWxlID0gbnVsbDsKLSAgICBwcml2YXRlIFVSTCBleGNsdWRlRmlsZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBpbm5lciBjbGFzcyB0byBob2xkIGEgbmFtZSBvbiBsaXN0LiAgIklmIiBhbmQgIlVubGVzcyIgYXR0cmlidXRlcwotICAgICAqIG1heSBiZSB1c2VkIHRvIGludmFsaWRhdGUgdGhlIGVudHJ5IGJhc2VkIG9uIHRoZSBleGlzdGVuY2Ugb2YgYSAKLSAgICAgKiBwcm9wZXJ0eSAodHlwaWNhbGx5IHNldCB0aHJ1IHRoZSB1c2Ugb2YgdGhlIEF2YWlsYWJsZSB0YXNrKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgTmFtZUVudHJ5IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLS8vICAgICAgICBwcml2YXRlIFN0cmluZyBpZkNvbmQ7Ci0vLyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdW5sZXNzQ29uZDsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IAotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsgCi0gICAgICAgIH0KLQotLy8gICAgICAgIHB1YmxpYyB2b2lkIHNldElmKFN0cmluZyBjb25kKSB7Ci0vLyAgICAgICAgICAgIGlmQ29uZCA9IGNvbmQ7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoU3RyaW5nIGNvbmQpIHsKLS8vICAgICAgICAgICAgdW5sZXNzQ29uZCA9IGNvbmQ7Ci0vLyAgICAgICAgfQotLy8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotLy8gICAgICAgIHB1YmxpYyBTdHJpbmcgZXZhbE5hbWUoUHJvamVjdCBwKSB7IAotLy8gICAgICAgICAgICByZXR1cm4gdmFsaWQocCkgPyBuYW1lIDogbnVsbDsgCi0vLyAgICAgICAgfQotCi0vLyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkKFByb2plY3QgcCkgewotLy8gICAgICAgICAgICBpZiAoaWZDb25kICE9IG51bGwgJiYgcC5nZXRQcm9wZXJ0eShpZkNvbmQpID09IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLS8vICAgICAgICAgICAgfSBlbHNlIGlmICh1bmxlc3NDb25kICE9IG51bGwgJiYgcC5nZXRQcm9wZXJ0eSh1bmxlc3NDb25kKSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0vLyAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUGF0dGVyblNldAotICAgICAqIGluc3RhbmNlLgotICAgICAqCi0gICAgICogPHA+WW91IG11c3Qgbm90IHNldCBhbm90aGVyIGF0dHJpYnV0ZSBvciBuZXN0IGVsZW1lbnRzIGluc2lkZQotICAgICAqIHRoaXMgZWxlbWVudCBpZiB5b3UgbWFrZSBpdCBhIHJlZmVyZW5jZS48L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFN0cmluZyByZWZlcmVuY2UpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoIWluY2x1ZGVMaXN0LmlzRW1wdHkoKSB8fCAhZXhjbHVkZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldFJlZmlkKHJlZmVyZW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIE5hbWVFbnRyeSBjcmVhdGVJbmNsdWRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhZGRQYXR0ZXJuVG9MaXN0KGluY2x1ZGVMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIE5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhZGRQYXR0ZXJuVG9MaXN0KGV4Y2x1ZGVMaXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCi0gICAgICogb3IgYSBzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmNsdWRlcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGUgcGF0dGVybnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmcgaW5jbHVkZXMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5jbHVkZXMgIT0gbnVsbCAmJiBpbmNsdWRlcy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGVzLCAiLCAiLCBmYWxzZSk7Ci0gICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIGNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKHRvay5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXQgb2YgZXhjbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCi0gICAgICogb3IgYSBzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGNsdWRlcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGUgcGF0dGVybnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmcgZXhjbHVkZXMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhjbHVkZXMgIT0gbnVsbCAmJiBleGNsdWRlcy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4Y2x1ZGVzLCAiLCAiLCBmYWxzZSk7Ci0gICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIGNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKHRvay5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IHRvIHRoZSBnaXZlbiBsaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBOYW1lRW50cnkgYWRkUGF0dGVyblRvTGlzdChMaXN0IGxpc3QpIHsKLSAgICAgICAgTmFtZUVudHJ5IHJlc3VsdCA9IG5ldyBOYW1lRW50cnkoKTsKLSAgICAgICAgbGlzdC5hZGQocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGluY2wgVGhlIGZpbGUgdG8gZmV0Y2ggdGhlIGluY2x1ZGUgcGF0dGVybnMgZnJvbS4gIAotICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0ZpbGUoVVJMIGluY2x1ZGVGaWxlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIAotLy8gICAgICAgICBpZiAoIWluY2wuZXhpc3RzKCkpIHsKLS8vICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW5jbHVkZXNmaWxlICIraW5jbC5nZXRBYnNvbHV0ZVBhdGgoKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIG5vdCBmb3VuZC4iKTsKLS8vICAgICAgICAgfQotICAgICAgICAgdGhpcy5pbmNsdWRlRmlsZSA9IGluY2x1ZGVGaWxlOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVGaWxlIFRoZSBmaWxlIHRvIGZldGNoIHRoZSBleGNsdWRlIHBhdHRlcm5zIGZyb20uICAKLSAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXNGaWxlKFVSTCBleGNsdWRlRmlsZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICB9Ci0vLyAgICAgICAgIGlmICghZXhjbC5leGlzdHMoKSkgewotLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGNsdWRlc2ZpbGUgIitleGNsLmdldEFic29sdXRlUGF0aCgpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgbm90IGZvdW5kLiIpOwotLy8gICAgICAgICB9Ci0gICAgICAgICB0aGlzLmV4Y2x1ZGVGaWxlID0gZXhjbHVkZUZpbGU7Ci0gICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgUmVhZHMgcGF0aCBtYXRjaGluZyBwYXR0ZXJucyBmcm9tIGEgZmlsZSBhbmQgYWRkcyB0aGVtIHRvIHRoZQotICAgICAqICBpbmNsdWRlcyBvciBleGNsdWRlcyBsaXN0IChhcyBhcHByb3ByaWF0ZSkuICAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZFBhdHRlcm5zKFVSTCBwYXR0ZXJuRmlsZSwgTGlzdCBwYXR0ZXJuTGlzdCkKLSAgICAgICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBCdWZmZXJlZFJlYWRlciBwYXR0ZXJuUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEdldCBhIEZpbGVSZWFkZXIKLSAgICAgICAgICAgIHBhdHRlcm5SZWFkZXIgPSAKLSAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHBhdHRlcm5GaWxlLm9wZW5TdHJlYW0oKSkpOyAKLSAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgb25lIE5hbWVFbnRyeSBpbiB0aGUgYXBwcm9wcmlhdGUgcGF0dGVybiBsaXN0IGZvciBlYWNoIAotICAgICAgICAgICAgLy8gbGluZSBpbiB0aGUgZmlsZS4KLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHBhdHRlcm5SZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBsaW5lID0gZ2V0VGFza0NvbnRleHQoKS5yZXBsYWNlUHJvcGVydHlSZWZzKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuVG9MaXN0KHBhdHRlcm5MaXN0KS5zZXROYW1lKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHJlYWRpbmcgZnJvbSBwYXR0ZXJuIGZpbGU6ICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGF0dGVybkZpbGUsIGlvZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocGF0dGVyblJlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVyblJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgcGF0dGVybnMgb2YgdGhlIG90aGVyIGluc3RhbmNlIHRvIHRoaXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZChQYXR0ZXJuU2V0IG90aGVyKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIkNhbm5vdCBhcHBlbmQgdG8gYSByZWZlcmVuY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGluY2wgPSBvdGhlci5nZXRJbmNsdWRlUGF0dGVybnMoKTsKLSAgICAgICAgaWYgKGluY2wgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGluY2wubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjcmVhdGVJbmNsdWRlKCkuc2V0TmFtZShpbmNsW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gZXhjbCA9IG90aGVyLmdldEV4Y2x1ZGVQYXR0ZXJucygpOwotICAgICAgICBpZiAoZXhjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXhjbC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKGV4Y2xbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsdGVyZWQgaW5jbHVkZSBwYXR0ZXJucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZVBhdHRlcm5zKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVmZXJlbmNlZFBhdHRlcm5TZXQoKS5nZXRJbmNsdWRlUGF0dGVybnMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlYWRGaWxlcygpOwotICAgICAgICAgICAgcmV0dXJuIG1ha2VBcnJheShpbmNsdWRlTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJlZCBpbmNsdWRlIHBhdHRlcm5zLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlUGF0dGVybnMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZWZlcmVuY2VkUGF0dGVyblNldCgpLmdldEV4Y2x1ZGVQYXR0ZXJucygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZEZpbGVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbWFrZUFycmF5KGV4Y2x1ZGVMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGhlbHBlciBmb3IgRmlsZVNldC4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc1BhdHRlcm5zKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZUZpbGUgIT0gbnVsbCB8fCBleGNsdWRlRmlsZSAhPSBudWxsCi0gICAgICAgICAgICB8fCBpbmNsdWRlTGlzdC5zaXplKCkgPiAwIHx8IGV4Y2x1ZGVMaXN0LnNpemUoKSA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlZmVyZW5jZWQgUGF0dGVyblNldC4gIAotICAgICAqLwotICAgIHByaXZhdGUgUGF0dGVyblNldCBnZXRSZWZlcmVuY2VkUGF0dGVyblNldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgbyA9IGdldFJlZmVyZW5jZWRPYmplY3QoKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFBhdHRlcm5TZXQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGdldFJlZmVyZW5jZSgpICsgIiBkb2VzblwndCBkZW5vdGUgYSBwYXR0ZXJuc2V0Iik7OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChQYXR0ZXJuU2V0KSBvOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgbGlzdCBvZiBOYW1lRW50cnkgZWxlbWVudHMgaW50byBhbiBhcnJheSBvZiBTdHJpbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gbWFrZUFycmF5KExpc3QgbGlzdCkgewotICAgICAgICBpZiAobGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IHRtcE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7KSB7Ci0gICAgICAgICAgICBOYW1lRW50cnkgbmUgPSAoTmFtZUVudHJ5KWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBuZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsICYmIHBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdG1wTmFtZXMuYWRkKHBhdHRlcm4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gKFN0cmluZ1tdKXRtcE5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBSZWFkIGluY2x1ZGVmaWxlIG90IGV4Y2x1ZGVmaWxlIGlmIG5vdCBhbHJlYWR5IGRvbmUgc28uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRGaWxlcygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoIWZpbGVzUmVhZCkgewotICAgICAgICAgICAgZmlsZXNSZWFkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVhZFBhdHRlcm5zKGluY2x1ZGVGaWxlLCBpbmNsdWRlTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXhjbHVkZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlYWRQYXR0ZXJucyhleGNsdWRlRmlsZSwgZXhjbHVkZUxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUveG1sL0FudExpYlBhcnNlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUveG1sL0FudExpYlBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWJjMjcxLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3htbC9BbnRMaWJQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUueG1sOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLmV4ZWN1dGlvbi4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBQYXJzZXMgdGhlIFRBU0stSU5GL2FudGxpYi54bWwgZmlsZSBvZiBhbiBhbnQgbGlicmFyeQotICogY29tcG9uZW50LiBBbiBBbnQgbGlicmFyeSBtYXkgY29udGFpbnMgdGFza3MsIGFwc2VjdHMgYW5kCi0gKiBvdGhlciBhbnQgcGx1ZyBpbiBjb21wb25lbnRzCi0gKi8gCi1wdWJsaWMgY2xhc3MgQW50TGliUGFyc2VyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0VMRU1FTlQgPSAidGFza2RlZiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVEVSX0VMRU1FTlQgPSAiY29udmVydGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1BFQ1RfRUxFTUVOVCA9ICJhc3BlY3QiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIFNBWCBwYXJzZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIGxpYnJhcnkgZGVmaW5pdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGxpYlNvdXJjZSB0aGUgVVJMIGZyb20gd2hlcmUgdGhlIGxpYnJhcnkgWE1MIGlzIHJlYWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSB0YXNrIGRlZmluaXRpb25zCi0gICAgICovCi0gICAgcHVibGljIEFudExpYnJhcnkgcGFyc2VBbnRMaWJyYXJ5KFVSTCBsaWJTb3VyY2UsIENsYXNzTG9hZGVyIGNvbXBvbmVudExvYWRlcikgCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICAgIFhNTFJlYWRlciB4bWxSZWFkZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0KLSAgICAgICAgICAgIEFudExpYlJvb3RIYW5kbGVyIHJvb3RIYW5kbGVyID0gbmV3IEFudExpYlJvb3RIYW5kbGVyKGxpYlNvdXJjZSwgeG1sUmVhZGVyLCBjb21wb25lbnRMb2FkZXIpOwotICAgICAgICAgICAgc2F4UGFyc2VyLnBhcnNlKGxpYlNvdXJjZS50b1N0cmluZygpLCByb290SGFuZGxlcik7Ci0gICAgICAgICAgICByZXR1cm4gcm9vdEhhbmRsZXIuZ2V0QW50TGlicmFyeSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKGxpYlNvdXJjZS50b1N0cmluZygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TGluZU51bWJlcigpLCBlLmdldENvbHVtbk51bWJlcigpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIEFudCBsaWJyYXJ5IGNvbXBvbmVudCIsIGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYXRpb24obGliU291cmNlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBBbnQgbGlicmFyeSBjb21wb25lbnQiLCBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKGxpYlNvdXJjZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBBbnQgbGlicmFyeSBjb21wb25lbnQiLCBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKGxpYlNvdXJjZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHJvb3QgaGFuZGxlciBoYW5kbGVzIHRoZSBhbnRsaWIgZWxlbWVudC4gQW4gYW50IGxpYiBtYXkKLSAgICAgKiBjb250YWluIGEgbnVtYmVyIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBlbGVtZW50cwotICAgICAqIDx1bD4KLSAgICAgKiAgICA8bGk+dGFza2RlZjwvbGk+Ci0gICAgICogICAgPGxpPmFzcGVjdDwvbGk+Ci0gICAgICogICAgPGxpPmNvbnZlcnRlcjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEFudExpYlJvb3RIYW5kbGVyIGV4dGVuZHMgUm9vdEhhbmRsZXIgewotICAgICAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfTE9PS0lOR19GT1JfUk9PVCA9IDE7Ci0gICAgICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9ST09UX1NFRU4gPSAyOwotICAgICAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfRklOSVNIRUQgPSAzOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBTVEFURV9MT09LSU5HX0ZPUl9ST09UOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBBbnRMaWJyYXJ5IHRoYXQgd2lsbCBiZSBkZWZpbmVkIGJ5IHBhcnNpbmcgdGhlIGxpYnJhcnkncyBkZWZpbml0aW9uCi0gICAgICAgICAqIGZpbGUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIEFudExpYnJhcnkgbGlicmFyeSA9IG51bGw7Ci0KLSAgICAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjb21wb25lbnRMb2FkZXIgPSBudWxsOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgYW4gQW50IExpYnJhcnkgUm9vdCBIYW5kbGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdGFza2RlZlNvdXJjZSB0aGUgVVJMIGZyb20gd2hlcmUgdGhlIHRhc2sgZGVmaW5pdGlvbnMgZXhpc3QKLSAgICAgICAgICogQHBhcmFtIHJlYWRlciB0aGUgWE1MIHBhcnNlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBbnRMaWJSb290SGFuZGxlcihVUkwgdGFza2RlZlNvdXJjZSwgWE1MUmVhZGVyIHJlYWRlciwgQ2xhc3NMb2FkZXIgY29tcG9uZW50TG9hZGVyKSB7Ci0gICAgICAgICAgICBzdXBlcih0YXNrZGVmU291cmNlLCByZWFkZXIpOwotICAgICAgICAgICAgdGhpcy5jb21wb25lbnRMb2FkZXIgPSBjb21wb25lbnRMb2FkZXI7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgbGlicmFyeSB3aGljaCBoYXMgYmVlbiBwYXJzZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gYW4gQW50TGliYXJ5IHdpdGggdGhlIGxpYnJhcnkgZGVmaW5pdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBbnRMaWJyYXJ5IGdldEFudExpYnJhcnkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlicmFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydCBhIG5ldyBlbGVtZW50IGluIHRoZSByb290LiBUaGlzIG11c3QgYmUgYSB0YXNrZGVmcyBlbGVtZW50Ci0gICAgICAgICAqIEFsbCBvdGhlciBlbGVtZW50cyBhcmUgaW52YWxpZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgTmFtZXNwYWNlIFVSSS4KLSAgICAgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLgotICAgICAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgKHdpdGggcHJlZml4KQotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudC4gCi0gICAgICAgICAqCi0gICAgICAgICAqIEB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwYXJzaW5nIHByb2JsZW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9MT09LSU5HX0ZPUl9ST09UOgotICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHMoImFudGxpYiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1JPT1RfU0VFTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgPSBuZXcgQW50TGlicmFyeSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJBbiBBbnQgbGlicmFyeSBjb21wb25lbnQgbXVzdCBzdGFydCB3aXRoIGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YW50bGliPiBlbGVtZW50IGFuZCBub3Qgd2l0aCA8IiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lICsgIj4iLCBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUk9PVF9TRUVOOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZWROYW1lLmVxdWFscyhUQVNLX0VMRU1FTlQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVUYXNrRGVmKGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHF1YWxpZmllZE5hbWUuZXF1YWxzKENPTlZFUlRFUl9FTEVNRU5UKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29udmVydGVyRGVmKGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWFsaWZpZWROYW1lLmVxdWFscyhBU1BFQ1RfRUxFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFzcGVjdEhhbmRsZXIoYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgZWxlbWVudCA8IiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lICsgIj4gaW4gQW50IGxpYnJhcnkgZGVmaW5pdGlvbiIsIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgcHVibGljIHZvaWQgY3JlYXRlVGFza0RlZihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTZXQgdmFsaWRBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIHZhbGlkQXR0cmlidXRlcy5hZGQoIm5hbWUiKTsKLSAgICAgICAgICAgIHZhbGlkQXR0cmlidXRlcy5hZGQoImNsYXNzbmFtZSIpOwotICAgICAgICAgICAgTWFwIGF0dHJpYnV0ZVZhbHVlcyAKLSAgICAgICAgICAgICAgICA9IEF0dHJpYnV0ZVZhbGlkYXRvci52YWxpZGF0ZUF0dHJpYnV0ZXMoVEFTS19FTEVNRU5ULCBhdHRyaWJ1dGVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRBdHRyaWJ1dGVzLCBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgU3RyaW5nIHRhc2tOYW1lID0gKFN0cmluZylhdHRyaWJ1dGVWYWx1ZXMuZ2V0KCJuYW1lIik7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylhdHRyaWJ1dGVWYWx1ZXMuZ2V0KCJjbGFzc25hbWUiKTsKLSAgICAgICAgICAgIGlmICh0YXNrTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCInbmFtZScgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGluIGEgPCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVEFTS19FTEVNRU5UICsgIj4gZWxlbWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIidjbGFzc25hbWUnIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBpbiBhICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwiICsgVEFTS19FTEVNRU5UICsgIj4gZWxlbWVudCIsIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRhc2tEZWZpbml0aW9uIHRhc2tkZWYgPSBuZXcgVGFza0RlZmluaXRpb24oZ2V0U291cmNlVVJMKCksIHRhc2tOYW1lLCBjbGFzc05hbWUsIGNvbXBvbmVudExvYWRlcik7Ci0gICAgICAgICAgICBsaWJyYXJ5LmFkZFRhc2tEZWZpbml0aW9uKHRhc2tkZWYpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udmVydGVyRGVmKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFNldCB2YWxpZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgdmFsaWRBdHRyaWJ1dGVzLmFkZCgidGFyZ2V0Iik7Ci0gICAgICAgICAgICB2YWxpZEF0dHJpYnV0ZXMuYWRkKCJjbGFzc25hbWUiKTsKLSAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVWYWx1ZXMgCi0gICAgICAgICAgICAgICAgPSBBdHRyaWJ1dGVWYWxpZGF0b3IudmFsaWRhdGVBdHRyaWJ1dGVzKENPTlZFUlRFUl9FTEVNRU5ULCBhdHRyaWJ1dGVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRBdHRyaWJ1dGVzLCBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgU3RyaW5nIHRhcmdldENsYXNzTmFtZSA9IChTdHJpbmcpYXR0cmlidXRlVmFsdWVzLmdldCgidGFyZ2V0Iik7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylhdHRyaWJ1dGVWYWx1ZXMuZ2V0KCJjbGFzc25hbWUiKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiJ3RhcmdldCcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGluIGEgPCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09OVkVSVEVSX0VMRU1FTlQgKyAiPiBlbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiJ2NsYXNzbmFtZScgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGluIGEgIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPCIgKyBDT05WRVJURVJfRUxFTUVOVCArICI+IGVsZW1lbnQiLCBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBDb252ZXJ0ZXJEZWZpbml0aW9uIGNvbnZlcnRlckRlZiAKLSAgICAgICAgICAgICAgICA9IG5ldyBDb252ZXJ0ZXJEZWZpbml0aW9uKGdldFNvdXJjZVVSTCgpLCBjbGFzc05hbWUsIHRhcmdldENsYXNzTmFtZSwgY29tcG9uZW50TG9hZGVyKTsKLSAgICAgICAgICAgIGxpYnJhcnkuYWRkQ29udmVydGVyRGVmaW5pdGlvbihjb252ZXJ0ZXJEZWYpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgcHVibGljIHZvaWQgY3JlYXRlQXNwZWN0SGFuZGxlcihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTZXQgdmFsaWRBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIHZhbGlkQXR0cmlidXRlcy5hZGQoInByZWZpeCIpOwotICAgICAgICAgICAgdmFsaWRBdHRyaWJ1dGVzLmFkZCgiY2xhc3NuYW1lIik7Ci0gICAgICAgICAgICBNYXAgYXR0cmlidXRlVmFsdWVzIAotICAgICAgICAgICAgICAgID0gQXR0cmlidXRlVmFsaWRhdG9yLnZhbGlkYXRlQXR0cmlidXRlcyhBU1BFQ1RfRUxFTUVOVCwgYXR0cmlidXRlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQXR0cmlidXRlcywgZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgICAgIFN0cmluZyBhc3BlY3RQcmVmaXggPSAoU3RyaW5nKWF0dHJpYnV0ZVZhbHVlcy5nZXQoInByZWZpeCIpOwotICAgICAgICAgICAgU3RyaW5nIGFzcGVjdENsYXNzbmFtZSAgPSAoU3RyaW5nKWF0dHJpYnV0ZVZhbHVlcy5nZXQoImNsYXNzbmFtZSIpOwotICAgICAgICAgICAgaWYgKGFzcGVjdFByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCIncHJlZml4JyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaW4gYSA8IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBU1BFQ1RfRUxFTUVOVCArICI+IGVsZW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFzcGVjdENsYXNzbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCInY2xhc3NuYW1lJyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaW4gYSAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8IiArIEFTUEVDVF9FTEVNRU5UICsgIj4gZWxlbWVudCIsIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzcGVjdERlZmluaXRpb24gYXNwZWN0RGVmIAotICAgICAgICAgICAgICAgID0gbmV3IEFzcGVjdERlZmluaXRpb24oZ2V0U291cmNlVVJMKCksIGFzcGVjdFByZWZpeCwgYXNwZWN0Q2xhc3NuYW1lLCBjb21wb25lbnRMb2FkZXIpOwotICAgICAgICAgICAgbGlicmFyeS5hZGRBc3BlY3REZWZpbml0aW9uKGFzcGVjdERlZik7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfUk9PVF9TRUVOICYmIHFOYW1lLmVxdWFscygiYW50bGliIikpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS94bWwvQXR0cmlidXRlVmFsaWRhdG9yLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS94bWwvQXR0cmlidXRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGIwYmQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUveG1sL0F0dHJpYnV0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS54bWw7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLQotLyoqCi0gKiBWYWxpZGF0ZXMgYW5kIGV4dHJhY3RzIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBhIHNldCBvZiBlbGVtZW50IGF0dHJpYnV0ZXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8gCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXR0cmlidXRlVmFsaWRhdG9yIHsKLSAgICBzdGF0aWMgcHVibGljIE1hcCB2YWxpZGF0ZUF0dHJpYnV0ZXMoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHZhbGlkQXR0cmlidXRlcywgTG9jYXRvciBsb2NhdG9yKSAKLSAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gdmFsaWRhdGVBdHRyaWJ1dGVzKGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVzLCBudWxsLCB2YWxpZEF0dHJpYnV0ZXMsIGxvY2F0b3IpOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgTWFwIHZhbGlkYXRlQXR0cmlidXRlcyhTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTWFwIGFzcGVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdmFsaWRBdHRyaWJ1dGVzLCBMb2NhdG9yIGxvY2F0b3IpIAotICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgCi0gICAgICAgIE1hcCBhdHRyaWJ1dGVWYWx1ZXMgPSBuZXcgSGFzaE1hcCgpOyAgICAKLSAgICAgICAgU2V0IGludmFsaWRBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICBpZiAodmFsaWRBdHRyaWJ1dGVzLmNvbnRhaW5zKGF0dHJpYnV0ZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1dChhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhc3BlY3RzICE9IG51bGwgJiYgYXR0cmlidXRlTmFtZS5pbmRleE9mKCI6IikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhc3BlY3RzLnB1dChhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnZhbGlkQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpbnZhbGlkQXR0cmlidXRlcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBib29sZWFuIGp1c3RPbmUgPSBpbnZhbGlkQXR0cmlidXRlcy5zaXplKCkgPT0gMTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGp1c3RPbmUgPyAiVGhlIGF0dHJpYnV0ZSAiIDogIlRoZSBhdHRyaWJ1dGVzICIpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW52YWxpZEF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGF0dHJpYnV0ZU5hbWUgKyAiICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoanVzdE9uZSA/ICJpcyAiIDogImFyZSAiKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJub3QgdmFsaWQgZm9yIHRoZSA8IiArIGVsZW1lbnROYW1lICsgIj4gZWxlbWVudC4iKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKG1lc3NhZ2UudG9TdHJpbmcoKSwgbG9jYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS94bWwvRWxlbWVudEhhbmRsZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3htbC9FbGVtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGM1YzczLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9jb3JlL3htbC9FbGVtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS54bWw7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLS8qKgotICogQW4gRWxlbWVudCBIYW5kbGVyIGlzIGEgaGFuZGxlciB3aGljaCBoYW5kbGVzIGEgc2luZ2xlIGVsZW1lbnQgYnkgYmVjb21pbmcKLSAqIHRoZSBoYW5kbGVyIGZvciB0aGUgcGFyc2VyIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGVsZW1lbnQuIEFueSBzdWIgZWxlbWVudHMgCi0gKiBtdXN0IGJlIGRlbGVnYXRlZCB0byBzZXBhcmF0ZSBoYW5kbGVycy4gV2hlbiB0aGlzIGVsZW1lbnQgaXMgZmluaXNoZWQsIAotICogY29udHJvbCByZXR1cm5zIHRvIHRoZSBwYXJlbnQgaGFuZGxlci4KLSAqLyAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLSAgICBwcml2YXRlIFhNTFJlYWRlciByZWFkZXI7Ci0gICAgcHJpdmF0ZSBDb250ZW50SGFuZGxlciBwYXJlbnQ7Ci0gICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3I7Ci0KLSAgICBwdWJsaWMgRWxlbWVudEhhbmRsZXIoWE1MUmVhZGVyIHJlYWRlciwgQ29udGVudEhhbmRsZXIgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdG9yIGxvY2F0b3IpIHsKLSAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotICAgICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBlbGVtZW50IGlzIGZpbmlzaGVkIC0gY29tcGxldGUgYW55IG5lY2Vzc2FyeSBwcm9jZXNzaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFhNTCBSZWFkZXIgYmVpbmcgdXNlZCB0byBwYXJzZSB0aGUgWE1MLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgWE1MIFJlYWRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGdldFhNTFJlYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsb2NhdG9yIHVzZWQgdG8gbG9jYXRlIGVsZW1lbnRzIGluIHRoZSBYTUwgc291cmNlIGFzCi0gICAgICogdGhleSBhcmUgcGFyc2VkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbG9jYXRvciBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGFuIGVsZW1lbnRzIGxvY2F0aW9uCi0gICAgICogICAgICAgICB3aXRoaW4gdGhlIFhNTCBzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTG9jYXRvciBnZXRMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gbG9jYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgewotICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHBhcmVudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUveG1sL1Jvb3RIYW5kbGVyLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS94bWwvUm9vdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhMzllMi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS94bWwvUm9vdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmNvcmUueG1sOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBIYW5kbGUgdGhlIHJvb3Qgb2YgYSBYTUwgcGFyc2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJvb3RIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotICAgIC8qKgotICAgICAqIExvY2F0b3IgdXNlZCB0byBpZGVudGlmeSB3aGVyZSBpbiB0aGUgYnVpbGQgc291cmNlIHBhcnRpY3VsYXIgZWxlbWVudHMKLSAgICAgKiBvY2N1ci4KLSAgICAgKi8KLSAgICBwcml2YXRlIExvY2F0b3IgbG9jYXRvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIFhNTCBwYXJzZXIgdXNlZCB0byBwYXJzZSB0aGUgYnVpbGQgc291cmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBYTUxSZWFkZXIgcmVhZGVyOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBVUkwgZnJvbSB3aGljaCB0aGUgWE1MIHNvdXJjZSBpcyBiZWluZyByZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgVVJMIHNvdXJjZVVSTDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFJvb3QgSGFuZGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2VVUkwgdGhlIFVSTCBjb250YWluaW5nIHRoZSBYTUwgc291cmNlCi0gICAgICogQHBhcmFtIHJlYWRlciB0aGUgWE1MIHBhcnNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUm9vdEhhbmRsZXIoVVJMIHNvdXJjZVVSTCwgWE1MUmVhZGVyIHJlYWRlcikgewotICAgICAgICB0aGlzLnNvdXJjZVVSTCA9IHNvdXJjZVVSTDsKLSAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgbG9jYXRvciB0byB1c2Ugd2hlbiBwYXJzaW5nIGVsZW1lbnRzLiBUaGlzIGlzIHBhc3NlZCBvbnRvCi0gICAgICogY2hpbGQgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYXRvciB0aGUgbG9jYXRvciBmb3IgbG9jYXRpbmcgZWxlbWVudHMgaW4gdGhlIGJ1aWxkIHNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0gICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBYTUwgUmVhZGVyIGJlaW5nIHVzZWQgdG8gcGFyc2UgdGhlIFhNTC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFhNTCBSZWFkZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhNTFJlYWRlciBnZXRYTUxSZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbG9jYXRvciB1c2VkIHRvIGxvY2F0ZSBlbGVtZW50cyBpbiB0aGUgWE1MIHNvdXJjZSBhcwotICAgICAqIHRoZXkgYXJlIHBhcnNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxvY2F0b3Igb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBhbiBlbGVtZW50cyBsb2NhdGlvbgotICAgICAqICAgICAgICAgd2l0aGluIHRoZSBYTUwgc291cmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExvY2F0b3IgZ2V0TG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzb3VyY2UgVVJMCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgVVJMIGlkZW50aWZpeWluZyBmcm9tIHdoZXJlIHRoZSBYTUwgaXMgYmVpbmcgcmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFNvdXJjZVVSTCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZVVSTDsKLSAgICB9Ci19Ci0gICAgCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS94bWwvWE1MUHJvamVjdFBhcnNlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2NvcmUveG1sL1hNTFByb2plY3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxNzI2OC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvY29yZS94bWwvWE1MUHJvamVjdFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuY29yZS54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogUGFyc2VzIGEgcHJvamVjdCBmcm9tIGFuIFhNTCBzb3VyY2UgdXNpbmcgYSBTQVggUGFyc2VyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIFhNTFByb2plY3RQYXJzZXIgewotICAgIHByaXZhdGUgU3RhY2sgcmVjdXJzaW9uQ2hlY2sgPSBuZXcgU3RhY2soKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSBTQVggcGFyc2Vycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeTsKLQotICAgIHN0YXRpYyBwcml2YXRlIExvY2F0aW9uIGdldExvY2F0aW9uKExvY2F0b3IgbG9jYXRvcikgewotICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uKGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSwgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGEgYnVpbGQgZmlsZSBmb3JtIHRoZSBnaXZlbiBVUkwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVpbGRTb3VyY2UgdGhlIFVSTCBmcm9tIHdoZXJlIHRoZSBidWlsZCBzb3VyY2UgbWF5IGJlIHJlYWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBidWlsZCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0IHBhcnNlQnVpbGRGaWxlKFVSTCBidWlsZFNvdXJjZSkgCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICAgIFhNTFJlYWRlciB4bWxSZWFkZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0KLSAgICAgICAgICAgIHJlY3Vyc2lvbkNoZWNrLnB1c2goYnVpbGRTb3VyY2UpOwotICAgICAgICAgICAgUHJvamVjdFJvb3RIYW5kbGVyIHByb2plY3RSb290SGFuZGxlciAKLSAgICAgICAgICAgICAgICA9IG5ldyBQcm9qZWN0Um9vdEhhbmRsZXIoYnVpbGRTb3VyY2UsIHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBzYXhQYXJzZXIucGFyc2UoYnVpbGRTb3VyY2UudG9TdHJpbmcoKSwgcHJvamVjdFJvb3RIYW5kbGVyKTsKLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0Um9vdEhhbmRsZXIuZ2V0UHJvamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKGJ1aWxkU291cmNlLnRvU3RyaW5nKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMaW5lTnVtYmVyKCksIGUuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9Qcm9qZWN0UmVhZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJObyBwcm9qZWN0IGRlZmluZWQgaW4gYnVpbGQgc291cmNlIiwgZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhdGlvbihidWlsZFNvdXJjZS50b1N0cmluZygpKSk7Ci0gICAgICAgfQotICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJVbmFibGUgdG8gcGFyc2UgcHJvamVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKGJ1aWxkU291cmNlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBwcm9qZWN0OiAiICsgZS5nZXRNZXNzYWdlKCksIGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYXRpb24oYnVpbGRTb3VyY2UudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJVbmFibGUgdG8gcGFyc2UgcHJvamVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKGJ1aWxkU291cmNlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgcm9vdCBoYW5kbGVyIGhhbmRsZXMgdGhlIHN0YXJ0IG9mIHBhcnNpbmcuIFRoaXMgZWxlbWVudCBsb29rcyBmb3IgdGhlIAotICAgICAqIHJvb3QgZWxlbWVudCB3aGljaCBtdXN0IGJlIGEgcHJvamVjdCBlbGVtZW50LiBJdCB0aGVuIGRlbGVnYXRlcyBoYW5kbGluZyBvZiB0aGUKLSAgICAgKiBwcm9qZWN0IGVsZW1lbnQgdG8gYSBwcm9qZWN0IGhhbmRsZXIgZnJvbSB3aGljaCBpdCBleHRyYWN0cyB0aGUgcGFyc2VkIHByb2plY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBQcm9qZWN0Um9vdEhhbmRsZXIgZXh0ZW5kcyBSb290SGFuZGxlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcHJvamVjdCBoYW5kbGVyIGNyZWF0ZWQgdG8gcGFyc2UgdGhlIHByb2plY3QgZWxlbWVudC4KLSAgICAgICAgICovCi0gICAgICAgIFByb2plY3RIYW5kbGVyIHByb2plY3RIYW5kbGVyOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIFJvb3QgSGFuZGxlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGJ1aWxkU291cmNlIHRoZSBVUkwgY29udGFpbmluZyB0aGUgYnVpbGQgZGVmaW5pdGlvbgotICAgICAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBYTUwgcGFyc2VyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb2plY3RSb290SGFuZGxlcihVUkwgYnVpbGRTb3VyY2UsIFhNTFJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGJ1aWxkU291cmNlLCByZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0IGEgbmV3IGVsZW1lbnQgaW4gdGhlIHJvb3QuIFRoaXMgbXVzdCBiZSBhIHByb2plY3QgZWxlbWVudAotICAgICAgICAgKiBBbGwgb3RoZXIgZWxlbWVudHMgYXJlIGludmFsaWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIE5hbWVzcGFjZSBVUkkuCi0gICAgICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUgKHdpdGhvdXQgcHJlZml4KS4KLSAgICAgICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUgVGhlIHF1YWxpZmllZCBuYW1lICh3aXRoIHByZWZpeCkKLSAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGF0dHJpYnV0ZXMgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQuIAotICAgICAgICAgKgotICAgICAgICAgKiBAdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcGFyc2luZyBwcm9ibGVtLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxdWFsaWZpZWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChxdWFsaWZpZWROYW1lLmVxdWFscygicHJvamVjdCIpKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdEhhbmRsZXIgPSBuZXcgUHJvamVjdEhhbmRsZXIoZ2V0WE1MUmVhZGVyKCksIHRoaXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0b3IoKSwgYXR0cmlidXRlcywgZ2V0U291cmNlVVJMKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIkJ1aWxkIGZpbGUgc2hvdWxkIHN0YXJ0IHdpdGggYSA8cHJvamVjdD4gZWxlbWVudCBub3QgPCIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgKyAiPiIsIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHByb2plY3QgdGhhdCBoYXMgYmVlbiBwYXJzZWQgZnJvbSB0aGUgZWxlbWVudAotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gdGhlIGJ1aWxkIG9zdXJjZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHRocm93cyBOb1Byb2plY3RSZWFkRXhjZXB0aW9uIHRocm93biBpZiBubyBwcm9qZWN0IHdhcyByZWFkIGluLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHRocm93cyBOb1Byb2plY3RSZWFkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0SGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vUHJvamVjdFJlYWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0SGFuZGxlci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUm9vdCBIYW5kbGVyIGZvciBpbmNsdWRlIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEluY2x1ZGVzIG11c3QgY29udGFpbiBlaXRoZXIgYSBwcm9qZWN0ICh3aGljaCBpcyBiZWluZyBleHRlbmRlZCkgb3IgCi0gICAgICogYSBmcmFnbWVudCBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBmcmFnbWVudCB0byBiZSBpbmNsdWRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEluY2x1ZGVSb290SGFuZGxlciBleHRlbmRzIFJvb3RIYW5kbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBwcm9qZWN0IGludG8gd2hpY2ggdGhlIGZyYWdtZW50IGlzIHRvIGJlIGluY2x1ZGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGFuIEluY2x1ZGUgUm9vdCBIYW5kbGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gYnVpbGRTb3VyY2UgdGhlIFVSTCBjb250YWluaW5nIHRoZSBmcmFnbWVudCBkZWZpbml0aW9uCi0gICAgICAgICAqIEBwYXJhbSByZWFkZXIgdGhlIFhNTCBwYXJzZXIuCi0gICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGludG8gd2hpY2ggdGhlIGZyYWdtZW50J3MgZWxlbWVudHMgd2lsbCBiZSBpbmNsdWRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbmNsdWRlUm9vdEhhbmRsZXIoVVJMIGJ1aWxkU291cmNlLCBYTUxSZWFkZXIgcmVhZGVyLCBQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgICAgIHN1cGVyKGJ1aWxkU291cmNlLCByZWFkZXIpOwotICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydCBhIG5ldyBlbGVtZW50IGluIHRoZSBpbmNsdWRlIHJvb3QuIFRoaXMgbXVzdCBiZSBhIHByb2plY3QgZWxlbWVudAotICAgICAgICAgKiBvciBhIGZyYWdtZW50IGVsZW1lbnQuIEFsbCBvdGhlciBlbGVtZW50cyBhcmUgaW52YWxpZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgTmFtZXNwYWNlIFVSSS4KLSAgICAgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLgotICAgICAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgKHdpdGggcHJlZml4KQotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudC4gCi0gICAgICAgICAqCi0gICAgICAgICAqIEB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwYXJzaW5nIHByb2JsZW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHF1YWxpZmllZE5hbWUuZXF1YWxzKCJwcm9qZWN0IikgfHwKLSAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lLmVxdWFscygiZnJhZ21lbnQiKSkgewotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIGEgZnJhZ21lbnQsIGl0IG11c3QgaGF2ZSBubyBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gYW55IHByb2plY3QgYXR0cmlidXRlcyBhcmUgaWdub3JlZAotICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZWROYW1lLmVxdWFscygiZnJhZ21lbnQiKSAmJiBhdHRyaWJ1dGVzLmdldExlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCI8ZnJhZ21lbnQ+IGVsZW1lbnQgbWF5IG5vdCBoYXZlIGFueSBhdHRyaWJ1dGVzIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBuZXcgUHJvamVjdEhhbmRsZXIoZ2V0WE1MUmVhZGVyKCksIHRoaXMsIGdldExvY2F0b3IoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZVVSTCgpLCBwcm9qZWN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJBbiBpbmNsdWRlZCBmaWxlIHNob3VsZCBjb250YWluIGVpdGhlciBhICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHByb2plY3Q+IG9yIDxmcmFnbWVudD4gZWxlbWVudCBhbmQgbm90IGEgPCIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSArICI+IGVsZW1lbnQiLCBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEVsZW1lbnQgdG8gcGFyc2UgdGhlIHByb2plY3QgZWxlbWVudC4KLSAgICAgKgotICAgICAqIFRoZSBwcm9qZWN0IGhhbmRsZXIgY3JlYXRlcyBhIG51bWJlciBvZiBkaWZmZXJlbnQgaGFuZGxlcnMgdG8gd2hpY2ggaXQKLSAgICAgKiBkZWxlZ2F0ZXMgcHJvY2Vzc2luZyBvZiBjaGlsZCBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFByb2plY3RIYW5kbGVyIGV4dGVuZHMgRWxlbWVudEhhbmRsZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHByb2plY3QgYmVpbmcgcGFyc2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHNvdXJjZVVSTCBmb3IgdGhlIGN1cnJlbnQgY29udGVudCBiZWluZyBhZGRlZCB0byB0aGUgcHJvamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgVVJMIHNvdXJjZVVSTDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgUHJvamVjdEhhbmRsZXIgdG8gcmVhZCBpbiBhIGNvbXBsZXRlIHByb2plY3QuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geG1sUmVhZGVyIHRoZSBYTUwgcGFyc2VyIGJlaW5nIHVzZWQgdG8gcGFyc2UgdGhlIHByb2plY3QgZWxlbWVudC4KLSAgICAgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGVsZW1lbnQgaGFuZGxlci4KLSAgICAgICAgICogQHBhcmFtIGxvY2F0b3IgdGhlIFNBWCBsb2NhdG9yIG9iamVjdCB1c2VkIHRvIGFzc29jaWF0ZSBlbGVtZW50cyB3aXRoIHNvdXJjZQotICAgICAgICAgKiAgICAgICAgbG9jYXRpb25zLgotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgcHJvamVjdCBlbGVtZW50J3MgYXR0cmlidXRlcy4KLSAgICAgICAgICogQHBhcmFtIHByb2plY3RTb3VyY2UgdGhlIFVSTCBmcm9tIHdoaWNoIHRoZSBYTUwgc291cmNlIGlzIGJlaW5nIHBhcnNlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQcm9qZWN0SGFuZGxlcihYTUxSZWFkZXIgeG1sUmVhZGVyLCBDb250ZW50SGFuZGxlciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdG9yIGxvY2F0b3IsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgVVJMIHByb2plY3RTb3VyY2UpIAotICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHN1cGVyKHhtbFJlYWRlciwgcGFyZW50LCBsb2NhdG9yKTsKLSAgICAgICAgICAgIHRoaXMuc291cmNlVVJMID0gcHJvamVjdFNvdXJjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QocHJvamVjdFNvdXJjZSwgZ2V0TG9jYXRpb24obG9jYXRvcikpOwotCi0gICAgICAgICAgICBTdHJpbmcgYmFzZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBNYXAgYXNwZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7ICsraSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygiYmFzZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoImRlZmF1bHQiKSkgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VGFyZ2V0ID0gYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJuYW1lIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUgPSBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5pbmRleE9mKCI6IikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcG90ZW50aWFsIGFzcGVjdCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy5wdXQoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJUaGUgYXR0cmlidXRlICciICsgYXR0cmlidXRlTmFtZSArICInIGlzIG5vdCAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIGJ5IHRoZSA8cHJvamVjdD4gZWxlbWVudCIsIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcm9qZWN0LnNldERlZmF1bHRUYXJnZXQoZGVmYXVsdFRhcmdldCk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldEJhc2UoYmFzZSk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgcHJvamVjdC5zZXRBc3BlY3RzKGFzcGVjdHMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgUHJvamVjdCBoYW5kbGVyIGZvciBhbiBpbmNsdWRlZCBmcmFnbWVudC4gVGhlIGVsZW1lbnRzCi0gICAgICAgICAqIGZyb20gdGhlIGZyYWdtZW50IGFyZSBhZGRlZCB0byB0aGUgZ2l2ZW4gcHJvamVjdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHhtbFJlYWRlciB0aGUgWE1MIHBhcnNlciBiZWluZyB1c2VkIHRvIHBhcnNlIHRoZSBwcm9qZWN0IGVsZW1lbnQuCi0gICAgICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBlbGVtZW50IGhhbmRsZXIuCi0gICAgICAgICAqIEBwYXJhbSBsb2NhdG9yIHRoZSBTQVggbG9jYXRvciBvYmplY3QgdXNlZCB0byBhc3NvY2lhdGUgZWxlbWVudHMgd2l0aCBzb3VyY2UKLSAgICAgICAgICogICAgICAgIGxvY2F0aW9ucy4KLSAgICAgICAgICogQHBhcmFtIGluY2x1ZGVTb3VyY2UgdGhlIFVSTCBmcm9tIHdoaWNoIHRoZSBYTUwgc291cmNlIGlzIGJlaW5nIGluY2x1ZGVkLgotICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgaW5jbHVkZWQgZnJhZ21lbnRzIGVsZW1lbnRzIGFyZSBhZGRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQcm9qZWN0SGFuZGxlcihYTUxSZWFkZXIgeG1sUmVhZGVyLCBDb250ZW50SGFuZGxlciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdG9yIGxvY2F0b3IsIFVSTCBpbmNsdWRlU291cmNlLCBQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgICAgIHN1cGVyKHhtbFJlYWRlciwgcGFyZW50LCBsb2NhdG9yKTsKLSAgICAgICAgICAgIHRoaXMuc291cmNlVVJMID0gaW5jbHVkZVNvdXJjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU3RhcnQgYSBuZXcgZWxlbWVudCBpbiB0aGUgcHJvamVjdC4gUHJvamVjdCBjdXJyZW50bHkgaGFuZGxlIHRoZSAKLSAgICAgICAgICogZm9sbG93aW5nIGVsZW1lbnRzCi0gICAgICAgICAqIDx1bD4KLSAgICAgICAgICogICA8bGk+aW1wb3J0PC9saT4KLSAgICAgICAgICogICA8bGk+aW5jbHVkZTwvbGk+Ci0gICAgICAgICAqICAgPGxpPnRhcmdldDwvbGk+Ci0gICAgICAgICAqIDwvdWw+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyB0cmVhdGVkIGFzIGEgdGFzay4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgTmFtZXNwYWNlIFVSSS4KLSAgICAgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLgotICAgICAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgKHdpdGggcHJlZml4KQotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudC4gCi0gICAgICAgICAqCi0gICAgICAgICAqIEB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwYXJzaW5nIHByb2JsZW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHMoImltcG9ydCIpKSB7Ci0gICAgICAgICAgICAgICAgSW1wb3J0SGFuZGxlciBpbXBvcnRIYW5kbGVyIAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBJbXBvcnRIYW5kbGVyKGdldFhNTFJlYWRlcigpLCB0aGlzLCBnZXRMb2NhdG9yKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsIHNvdXJjZVVSTCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuaW1wb3J0UHJvamVjdChpbXBvcnRIYW5kbGVyLmdldEltcG9ydE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEhhbmRsZXIuZ2V0SW1wb3J0ZWRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoUHJvamVjdE1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBnZXRMb2NhdG9yKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHF1YWxpZmllZE5hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsKLSAgICAgICAgICAgICAgICBJbmNsdWRlSGFuZGxlciBpbmNsdWRlSGFuZGxlciAKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgSW5jbHVkZUhhbmRsZXIoZ2V0WE1MUmVhZGVyKCksIHRoaXMsIGdldExvY2F0b3IoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsIHNvdXJjZVVSTCwgcHJvamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChxdWFsaWZpZWROYW1lLmVxdWFscygidGFyZ2V0IikpIHsKLSAgICAgICAgICAgICAgICBUYXJnZXRIYW5kbGVyIHRhcmdldEhhbmRsZXIgCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IFRhcmdldEhhbmRsZXIoZ2V0WE1MUmVhZGVyKCksIHRoaXMsIGdldExvY2F0b3IoKSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmFkZFRhcmdldCh0YXJnZXRIYW5kbGVyLmdldFRhcmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFByb2plY3RNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZ2V0TG9jYXRvcigpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGVsc2UgaXMgYSB0YXNrCi0gICAgICAgICAgICAgICAgVGFza0VsZW1lbnRIYW5kbGVyIHRhc2tFbGVtZW50SGFuZGxlciAKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgVGFza0VsZW1lbnRIYW5kbGVyKGdldFhNTFJlYWRlcigpLCB0aGlzLCBnZXRMb2NhdG9yKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLCBxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmFkZFRhc2sodGFza0VsZW1lbnRIYW5kbGVyLmdldFRhc2tFbGVtZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHByb2plY3QgdGhhdCBoYXMgYmVlbiBwYXJzZWQgZnJvbSB0aGUgWE1MIHNvdXJjZQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IG1vZGVsIG9mIHRoZSBwYXJzZWQgcHJvamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaW1wb3J0IGhhbmRsZXIgaGFuZGxlcyB0aGUgaW1wb3J0aW5nIG9mIG9uZSBwcm9qZWN0IGludG8gYW5vdGhlci4KLSAgICAgKiAKLSAgICAgKiBUaGUgcHJvamVjdCB0byBiZSBpbXBvcnRlZCBpcyBwYXJzZWQgd2l0aCBhIG5ldyBwYXJzZXIgYW5kIHRoZW4gYWRkZWQgdG8gdGhlCi0gICAgICogY3VycmVudCBwcm9qZWN0IHVuZGVyIHRoZSBnaXZlbiBpbXBvcnQgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSW1wb3J0SGFuZGxlciBleHRlbmRzIEVsZW1lbnRIYW5kbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgdXNlZCB0byBuYW1lIHRoZSBpbXBvcnQuCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBJTVBPUlRfTkFNRV9BVFRSID0gIm5hbWUiOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSB1c2VkIHRvIGxvY2F0ZSB0aGUgcHJvamVjdCB0byBiZSBpbXBvcnRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIElNUE9SVF9TWVNURU1JRF9BVFRSID0gInByb2plY3QiOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBwcm9qZWN0IHRoYXQgaGFzIGJlZW4gaW1wb3J0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFByb2plY3QgaW1wb3J0ZWRQcm9qZWN0OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBwcm9qZWN0IGlzIGJlaW5nIGltcG9ydGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaW1wb3J0TmFtZTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgc3lzdGVtSWQgKFVSTCkgd2hlcmUgdGhlIHByb2plY3QgaXMgdG8gYmUgaW1wb3J0ZWQgZnJvbS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3RTeXN0ZW1JZDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGFuIGltcG9ydCBoYW5kbGVyIHRvIGltcG9ydCBhIHByb2plY3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB4bWxSZWFkZXIgdGhlIFhNTCBwYXJzZXIgYmVpbmcgdXNlZCB0byBwYXJzZSB0aGUgaW1wb3J0IGVsZW1lbnQuCi0gICAgICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBlbGVtZW50IGhhbmRsZXIuCi0gICAgICAgICAqIEBwYXJhbSBsb2NhdG9yIHRoZSBTQVggbG9jYXRvciBvYmplY3QgdXNlZCB0byBhc3NvY2lhdGUgZWxlbWVudHMgd2l0aCBzb3VyY2UKLSAgICAgICAgICogICAgICAgIGxvY2F0aW9ucy4KLSAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgYXR0cmlidXRlcyBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudC4KLSAgICAgICAgICogQHBhcmFtIGltcG9ydGluZ1NvdXJjZSB0aGUgVVJMIG9mIHRoZSBpbXBvcnRpbmcgc291cmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcG9ydEhhbmRsZXIoWE1MUmVhZGVyIHhtbFJlYWRlciwgQ29udGVudEhhbmRsZXIgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdG9yIGxvY2F0b3IsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgVVJMIGltcG9ydGluZ1NvdXJjZSkgCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKHhtbFJlYWRlciwgcGFyZW50LCBsb2NhdG9yKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKElNUE9SVF9OQU1FX0FUVFIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydE5hbWUgPSBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSU1QT1JUX1NZU1RFTUlEX0FUVFIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3RTeXN0ZW1JZCA9IGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgIiArIGF0dHJpYnV0ZU5hbWUgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IGFsbG93ZWQgaW4gYW4gPGltcG9ydD4gZWxlbWVudCIsIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGltcG9ydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiQXR0cmlidXRlICIgKyBJTVBPUlRfTkFNRV9BVFRSICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgcmVxdWlyZWQgaW4gYW4gPGltcG9ydD4gZWxlbWVudCIsIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwcm9qZWN0U3lzdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiQXR0cmlidXRlICIgKyBJTVBPUlRfU1lTVEVNSURfQVRUUiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIHJlcXVpcmVkIGluIGFuIDxpbXBvcnQ+IGVsZW1lbnQiLCBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgcGFyc2VyIHRvIHJlYWQgdGhpcyBwcm9qZWN0IHJlbGF0aXZlIHRvIHRoZSAKLSAgICAgICAgICAgIC8vIHByb2plY3QncyBVUkkKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVVJMIGltcG9ydFVSTCA9IG5ldyBVUkwoaW1wb3J0aW5nU291cmNlLCBwcm9qZWN0U3lzdGVtSWQpOwotICAgICAgICAgICAgICAgIFNBWFBhcnNlciBpbXBvcnRTQVhQYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgICAgICAgIFhNTFJlYWRlciBpbXBvcnRYTUxSZWFkZXIgPSBpbXBvcnRTQVhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2lvbkNoZWNrLmNvbnRhaW5zKGltcG9ydFVSTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJDaXJjdWxhciBpbXBvcnQgZGV0ZWN0ZWQgd2hlbiBpbXBvcnRpbmcgJyIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFVSTCArICInIiwgZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVjdXJzaW9uQ2hlY2sucHVzaChpbXBvcnRVUkwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFByb2plY3RSb290SGFuZGxlciBpbXBvcnRSb290SGFuZGxlciA9IG5ldyBQcm9qZWN0Um9vdEhhbmRsZXIoaW1wb3J0VVJMLCBpbXBvcnRYTUxSZWFkZXIpOwotICAgICAgICAgICAgICAgIGltcG9ydFNBWFBhcnNlci5wYXJzZShpbXBvcnRVUkwudG9TdHJpbmcoKSwgaW1wb3J0Um9vdEhhbmRsZXIpOwotICAgICAgICAgICAgICAgIGlmIChyZWN1cnNpb25DaGVjay5wb3AoKSAhPSBpbXBvcnRVUkwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWx1cmUgdG8gcG9wIGV4cGVjdGVkIGVsZW1lbnQgb2ZmIHJlY3Vyc2lvbiBzdGFjayIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbXBvcnRlZFByb2plY3QgPSBpbXBvcnRSb290SGFuZGxlci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9Qcm9qZWN0UmVhZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJObyBwcm9qZWN0IHdhcyBpbXBvcnRlZCBmcm9tICIgKyBwcm9qZWN0U3lzdGVtSWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmFibGUgdG8gaW1wb3J0IHByb2plY3QgZnJvbSAiICsgcHJvamVjdFN5c3RlbUlkICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmFibGUgdG8gcGFyc2UgcHJvamVjdCBpbXBvcnRlZCBmcm9tICIgKyBwcm9qZWN0U3lzdGVtSWQgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIHByb2plY3QgaW1wb3J0ZWQgZnJvbSAiICsgcHJvamVjdFN5c3RlbUlkICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyBwcm9qZWN0IGltcG9ydGVkIGZyb20gIiArIHByb2plY3RTeXN0ZW1JZCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgZS5nZXRNZXNzYWdlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogSW1wb3J0IGRvZXMgbm90IHN1cHBvcnQgbmVzdGVkIGVsZW1lbnRzLiBUaGlzIG1ldGhvZCB3aWxsIGFsd2F5cyB0aHJvdyBhbgotICAgICAgICAgKiBleGNlcHRpb24KLSAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgTmFtZXNwYWNlIFVSSS4KLSAgICAgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLgotICAgICAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgKHdpdGggcHJlZml4KQotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudC4gCi0gICAgICAgICAqCi0gICAgICAgICAqIEB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gYWx3YXlzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxdWFsaWZpZWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyBhIHRhc2sKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiPGltcG9ydD4gZG9lcyBub3Qgc3VwcG9ydCBuZXN0ZWQgZWxlbWVudHMiLCBnZXRMb2NhdG9yKCkpOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgcHJvamVjdCBpbXBvcnRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBhbiBpbXBvcnRlZCBQcm9qZWN0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb2plY3QgZ2V0SW1wb3J0ZWRQcm9qZWN0KCkgewotICAgICAgICAgICAgcmV0dXJuIGltcG9ydGVkUHJvamVjdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGUgcHJvamVjdCBpcyBpbXBvcnRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgaW1wb3J0IG5hbWUgb2YgdGhlIHByb2plY3QKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBpbXBvcnROYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGluY2x1ZGUgaGFuZGxlciBpcyB1c2VkIHRvIHJlYWQgaW4gaW5jbHVkZWQgcHJvamVjdHMgb3IKLSAgICAgKiBmcmFnbWVudHMgaW50byBhIHByb2plY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBJbmNsdWRlSGFuZGxlciBleHRlbmRzIEVsZW1lbnRIYW5kbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSB3aGljaCBpZGVudGlmaWVzIHRoZSBmcmFnbWVudCB0byBiZSBpbmNsdWRlZAotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9TWVNURU1JRF9BVFRSID0gImZyYWdtZW50IjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgc3lzdGVtIGlkIG9mIHRoZSBmcmFnbWVudCB0byBiZSBpbmNsdWRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGluY2x1ZGVTeXN0ZW1JZDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGFuIEluY2x1ZGVIYW5kbGVyIHRvIGluY2x1ZGUgYW4gZWxlbWVudCBpbnRvIHRoZQotICAgICAgICAgKiBjdXJyZW50IHByb2plY3QKLSAgICAgICAgICogICAgICAgCi0gICAgICAgICAqIEBwYXJhbSB4bWxSZWFkZXIgdGhlIFhNTCBwYXJzZXIgYmVpbmcgdXNlZCB0byBwYXJzZSB0aGUgaW5jbHVkZSBlbGVtZW50LgotICAgICAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZWxlbWVudCBoYW5kbGVyLgotICAgICAgICAgKiBAcGFyYW0gbG9jYXRvciB0aGUgU0FYIGxvY2F0b3Igb2JqZWN0IHVzZWQgdG8gYXNzb2NpYXRlIGVsZW1lbnRzIHdpdGggc291cmNlCi0gICAgICAgICAqICAgICAgICBsb2NhdGlvbnMuCi0gICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgb2YgdGhlIGluY2x1ZGUgc3RhdGVtZW50LgotICAgICAgICAgKiBAcGFyYW0gaW5jbHVkaW5nU291cmNlIHRoZSBVUkwgb2YgdGhlIGluY2x1ZGluZyBzb3VyY2UuCi0gICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGludG8gd2hpY2ggdGhlIGluY2x1ZGVkIGVsZW1lbnRzIGFyZSBhZGRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbmNsdWRlSGFuZGxlcihYTUxSZWFkZXIgeG1sUmVhZGVyLCBDb250ZW50SGFuZGxlciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdG9yIGxvY2F0b3IsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgVVJMIGluY2x1ZGluZ1NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCkgCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKHhtbFJlYWRlciwgcGFyZW50LCBsb2NhdG9yKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKElOQ0xVREVfU1lTVEVNSURfQVRUUikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVN5c3RlbUlkID0gYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIkF0dHJpYnV0ZSAiICsgYXR0cmlidXRlTmFtZSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3QgYWxsb3dlZCBpbiBhbiA8aW5jbHVkZT4gZWxlbWVudCIsIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGluY2x1ZGVTeXN0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgIiArIElOQ0xVREVfU1lTVEVNSURfQVRUUiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIHJlcXVpcmVkIGluIGFuIDxpbmNsdWRlPiBlbGVtZW50IiwgZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHBhcnNlciB0byByZWFkIHRoaXMgcHJvamVjdCByZWxhdGl2ZSB0byB0aGUgCi0gICAgICAgICAgICAvLyBwcm9qZWN0J3MgVVJJCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFVSTCBpbmNsdWRlVVJMID0gbmV3IFVSTChpbmNsdWRpbmdTb3VyY2UsIGluY2x1ZGVTeXN0ZW1JZCk7Ci0gICAgICAgICAgICAgICAgU0FYUGFyc2VyIGluY2x1ZGVTQVhQYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgICAgICAgIFhNTFJlYWRlciBpbmNsdWRlWE1MUmVhZGVyID0gaW5jbHVkZVNBWFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVjdXJzaW9uQ2hlY2suY29udGFpbnMoaW5jbHVkZVVSTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJDaXJjdWxhciBpbmNsdWRlIGRldGVjdGVkIHdoZW4gaW5jbHVkaW5nICciICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlVVJMICsgIiciLCBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWN1cnNpb25DaGVjay5wdXNoKGluY2x1ZGVVUkwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEluY2x1ZGVSb290SGFuZGxlciBpbmNsdWRlUm9vdEhhbmRsZXIgCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IEluY2x1ZGVSb290SGFuZGxlcihpbmNsdWRlVVJMLCBpbmNsdWRlWE1MUmVhZGVyLCBwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBpbmNsdWRlU0FYUGFyc2VyLnBhcnNlKGluY2x1ZGVVUkwudG9TdHJpbmcoKSwgaW5jbHVkZVJvb3RIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjdXJzaW9uQ2hlY2sucG9wKCkgIT0gaW5jbHVkZVVSTCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbHVyZSB0byBwb3AgZXhwZWN0ZWQgZWxlbWVudCBvZmYgcmVjdXJzaW9uIHN0YWNrIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5jbHVkZSAiICsgaW5jbHVkZVN5c3RlbUlkICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmFibGUgdG8gcGFyc2UgaW5jbHVkZSAiICsgaW5jbHVkZVN5c3RlbUlkICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBpbmNsdWRlICIgKyBpbmNsdWRlU3lzdGVtSWQgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIGluY2x1ZGUgIiArIGluY2x1ZGVTeXN0ZW1JZCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgZS5nZXRNZXNzYWdlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluY2x1ZGUgZG9lcyBub3Qgc3VwcG9ydCBuZXN0ZWQgZWxlbWVudHMuIFRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHRocm93IGFuCi0gICAgICAgICAqIGV4Y2VwdGlvbgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBOYW1lc3BhY2UgVVJJLgotICAgICAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lICh3aXRob3V0IHByZWZpeCkuCi0gICAgICAgICAqIEBwYXJhbSBxdWFsaWZpZWROYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSAod2l0aCBwcmVmaXgpCi0gICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIGF0dGFjaGVkIHRvIHRoZSBlbGVtZW50LiAKLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiBhbHdheXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIGEgdGFzawotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCI8aW5jbHVkZT4gZG9lcyBub3Qgc3VwcG9ydCBuZXN0ZWQgZWxlbWVudHMiLCBnZXRMb2NhdG9yKCkpOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFRhcmdldEhhbmRsZXIgcHJvY2VzcyB0aGUgVGFyZ2V0IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBUYXJnZXRIYW5kbGVyIGV4dGVuZHMgRWxlbWVudEhhbmRsZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRhcmdldCBiZWluZyBjb25maWd1cmVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBUYXJnZXQgdGFyZ2V0OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIFRhcmdldCBoYW5kbGVyLiBFdmVudCBlbGVtZW50IGluIGEgdGFyZ2V0IGlzIAotICAgICAgICAgKiBjb25zaWRlcmVkIHRvIGJlIGEgdGFzawotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0geG1sUmVhZGVyIHRoZSBYTUwgcGFyc2VyIGJlaW5nIHVzZWQgdG8gcGFyc2UgdGhlIHRhcmdldCBlbGVtZW50LgotICAgICAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZWxlbWVudCBoYW5kbGVyLgotICAgICAgICAgKiBAcGFyYW0gbG9jYXRvciB0aGUgU0FYIGxvY2F0b3Igb2JqZWN0IHVzZWQgdG8gYXNzb2NpYXRlIGVsZW1lbnRzIHdpdGggc291cmNlCi0gICAgICAgICAqICAgICAgICBsb2NhdGlvbnMuCi0gICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgb2YgdGhlIHRhcmdldAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRhcmdldEhhbmRsZXIoWE1MUmVhZGVyIHhtbFJlYWRlciwgQ29udGVudEhhbmRsZXIgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdG9yIGxvY2F0b3IsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKHhtbFJlYWRlciwgcGFyZW50LCBsb2NhdG9yKTsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBkZXBlbmRzID0gbnVsbDsKLSAgICAgICAgICAgIE1hcCBhc3BlY3RzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJuYW1lIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygiZGVwZW5kcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZHMgPSBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5pbmRleE9mKCI6IikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcG90ZW50aWFsIGFzcGVjdCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy5wdXQoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJUaGUgYXR0cmlidXRlICciICsgYXR0cmlidXRlTmFtZSArICInIGlzIG5vdCAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIGJ5IHRoZSA8dGFyZ2V0PiBlbGVtZW50IiwgZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJUYXJnZXRzIG11c3QgaGF2ZSBhIG5hbWUgYXR0cmlidXRlIiwgbG9jYXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXJnZXQgPSBuZXcgVGFyZ2V0KGdldExvY2F0aW9uKGxvY2F0b3IpLCB0YXJnZXROYW1lKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRBc3BlY3RzKGFzcGVjdHMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGVwZW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGVwZW5kcywgIiwiKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVwZW5kZW5jeSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUHJvY2VzcyBhbiBlbGVtZW50IHdpdGhpbiB0aGlzIHRhcmdldC4gQWxsIGVsZW1lbnRzIHdpdGhpbiB0aGUgdGFyZ2V0IGFyZSAKLSAgICAgICAgICogdHJlYXRlZCBhcyB0YXNrcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgTmFtZXNwYWNlIFVSSS4KLSAgICAgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLgotICAgICAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgKHdpdGggcHJlZml4KQotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudC4gCi0gICAgICAgICAqCi0gICAgICAgICAqIEB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwYXJzaW5nIHByb2JsZW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIGEgdGFzawotICAgICAgICAgICAgVGFza0VsZW1lbnRIYW5kbGVyIHRhc2tIYW5kbGVyIAotICAgICAgICAgICAgICAgID0gbmV3IFRhc2tFbGVtZW50SGFuZGxlcihnZXRYTUxSZWFkZXIoKSwgdGhpcywgZ2V0TG9jYXRvcigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLCBxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgIHRhcmdldC5hZGRUYXNrKHRhc2tIYW5kbGVyLmdldFRhc2tFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSB0YXJnZXQgcGFyc2VkIGJ5IHRoaXMgaGFuZGxlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgVGFyZ2V0IG1vZGVsIG9iamVjdCBwYXJzZWQgYnkgdGhpcyBoYW5kbGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRhcmdldCBnZXRUYXJnZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBUYXNrRWxlbWVudEhhbmRsZXIgcGFyc2VzIHRoZSB0YXNrIGVsZW1lbnRzIG9mIGEgYnVpbGQKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFRhc2tFbGVtZW50SGFuZGxlciBleHRlbmRzIEVsZW1lbnRIYW5kbGVyICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGFzayBlbGVtZW50IGJlaW5nIHBhcnNlZCBieSB0aGlzIGhhbmRsZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFRhc2tFbGVtZW50IHRhc2tFbGVtZW50OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIHRhc2sgZWxlbWVudCBoYW5kbGVyIHRvIHBhcnNlIGEgdGFzayBlbGVtZW50Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB4bWxSZWFkZXIgdGhlIFhNTCBwYXJzZXIgYmVpbmcgdXNlZCB0byBwYXJzZSB0aGUgdGFzayBlbGVtZW50LgotICAgICAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZWxlbWVudCBoYW5kbGVyLgotICAgICAgICAgKiBAcGFyYW0gbG9jYXRvciB0aGUgU0FYIGxvY2F0b3Igb2JqZWN0IHVzZWQgdG8gYXNzb2NpYXRlIGVsZW1lbnRzIHdpdGggc291cmNlCi0gICAgICAgICAqICAgICAgICBsb2NhdGlvbnMuCi0gICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgb2YgdGhlIHRhc2sgZWxlbWVudAotICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFRhZ05hbWUgdGhlIG5hbWUgb2YgdGhlIHRhc2sgZWxlbWVudC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUYXNrRWxlbWVudEhhbmRsZXIoWE1MUmVhZGVyIHhtbFJlYWRlciwgQ29udGVudEhhbmRsZXIgcGFyZW50LCBMb2NhdG9yIGxvY2F0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBTdHJpbmcgZWxlbWVudFRhZ05hbWUpIHsKLSAgICAgICAgICAgIHN1cGVyKHhtbFJlYWRlciwgcGFyZW50LCBsb2NhdG9yKTsgICAgIAotICAgICAgICAgICAgdGFza0VsZW1lbnQgCi0gICAgICAgICAgICAgICAgPSBuZXcgVGFza0VsZW1lbnQoZ2V0TG9jYXRpb24obG9jYXRvciksIGVsZW1lbnRUYWdOYW1lKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIE1hcCBhc3BlY3RzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuaW5kZXhPZigiOiIpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBvdGVudGlhbCBhc3BlY3QgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIGFzcGVjdHMucHV0KGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhc2tFbGVtZW50LmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFza0VsZW1lbnQuc2V0QXNwZWN0cyhhc3BlY3RzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBQcm9jZXNzIGEgbmVzdGVkIGVsZW1lbnQgb2YgdGhpcyB0YXNrIGVsZW1lbnQuIEFsbCBuZXN0ZWQgZWxlbWVudHMKLSAgICAgICAgICogb2YgYSB0YXNrRWxlbWVudCBhcmUgdGhlbXNlbHZlcyB0YXNrRWxlbWVudHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIE5hbWVzcGFjZSBVUkkuCi0gICAgICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUgKHdpdGhvdXQgcHJlZml4KS4KLSAgICAgICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUgVGhlIHF1YWxpZmllZCBuYW1lICh3aXRoIHByZWZpeCkKLSAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGF0dHJpYnV0ZXMgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQuIAotICAgICAgICAgKgotICAgICAgICAgKiBAdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcGFyc2luZyBwcm9ibGVtLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxdWFsaWZpZWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgLy8gZXZlcnl0aGluZyB3aXRoaW4gYSB0YXNrIGVsZW1lbnQgaXMgYWxzbyBhIHRhc2sgZWxlbWVudAotICAgICAgICAgICAgVGFza0VsZW1lbnRIYW5kbGVyIG5lc3RlZEhhbmRsZXIgCi0gICAgICAgICAgICAgICAgPSBuZXcgVGFza0VsZW1lbnRIYW5kbGVyKGdldFhNTFJlYWRlcigpLCB0aGlzLCBnZXRMb2NhdG9yKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsIHF1YWxpZmllZE5hbWUpOwotICAgICAgICAgICAgdGFza0VsZW1lbnQuYWRkVGFza0VsZW1lbnQobmVzdGVkSGFuZGxlci5nZXRUYXNrRWxlbWVudCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhc2tFbGVtZW50LmFkZFRleHQobmV3IFN0cmluZyhidWYsIHN0YXJ0LCBlbmQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHRhc2sgZWxlbWVudCBiZWluZyBwYXJzZWQgYnkgdGhpcyBoYW5kbGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBUYXNrRWxlbWVudCBiZWluZyBwYXJzZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVGFza0VsZW1lbnQgZ2V0VGFza0VsZW1lbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFza0VsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBOb1Byb2plY3RSZWFkRXhjZXB0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIHByb2plY3QKLSAgICAgKiB3YXMgbm90IHJlYWQgZnJvbSB0aGUgcGFydGljdWxhciBzb3VyY2UuIFRoaXMgd2lsbCBoYXBwZW4KLSAgICAgKiBpZiB0aGUgc291cmNlIGlzIGVtcHR5LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgTm9Qcm9qZWN0UmVhZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvQnVpbGRMb2dnZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9mcm9udGVuZC9CdWlsZExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTY1NGM4Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9mcm9udGVuZC9CdWlsZExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5mcm9udGVuZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgYnkgQW50IHRvIGxvZyB0aGUgYnVpbGQgb3V0cHV0LiAKLSAqCi0gKiBBIGJ1aWxkIGxvZ2dlciBpcyBhIGJ1aWxkIGxpc3RlbmVyIHdoaWNoIGhhcyB0aGUgJ3JpZ2h0JyB0byBzZW5kIG91dHB1dCB0byB0aGUKLSAqIGFudCBsb2csIHdoaWNoIGlzIHVzdWFsbHkgU3lzdGVtLm91dCB1bmxlcyByZWRpcmVjdGVkIGJ5IHRoZSAtbG9nZmlsZSBvcHRpb24uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnVpbGRMb2dnZXIgZXh0ZW5kcyBCdWlsZExpc3RlbmVyIHsKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1zZ091dHB1dExldmVsIHRoaXMgbG9nZ2VyIGlzIHRvIHJlc3BvbmQgdG8uCi0gICAgICoKLSAgICAgKiBPbmx5IG1lc3NhZ2VzIHdpdGggYSBtZXNzYWdlIGxldmVsIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIGxldmVsIGFyZSAKLSAgICAgKiBvdXRwdXQgdG8gdGhlIGxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZXZlbCB0aGUgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhpcyBsb2dnZXIgaXMgdG8gc2VuZCBpdHMgb3V0cHV0LgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IHN0cmVhbSBmb3IgdGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcmludFN0cmVhbShQcmludFN0cmVhbSBvdXRwdXQpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGlzIGxvZ2dlciBpcyB0byBzZW5kIGVycm9yIG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGVyciB0aGUgZXJyb3Igc3RyZWFtIGZvciB0aGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gZXJyKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9mcm9udGVuZC9Db21tYW5kbGluZS5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL0NvbW1hbmRsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWU4YTguLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL0NvbW1hbmRsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmFudC5mcm9udGVuZDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS54bWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLmNvbmZpZy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUubW9kZWwuKjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjb21tYW5kIGxpbmUgZnJvbnQgZW5kIHRvIGVuZC4gSXQgZHJpdmVzIHRoZSBjb3JlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8gCi1wdWJsaWMgY2xhc3MgQ29tbWFuZGxpbmUgewotICAgIC8qKiBUaGUgZGVmYXVsdCBidWlsZCBmaWxlIG5hbWUgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JVSUxEX0ZJTEVOQU1FID0gImJ1aWxkLmFudCI7Ci0KLSAgICAvKiogU3RyZWFtIHRoYXQgd2UgYXJlIHVzaW5nIGZvciBsb2dnaW5nICovCi0gICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQgPSBTeXN0ZW0ub3V0OwotCi0gICAgLyoqIFN0cmVhbSB0aGF0IHdlIGFyZSB1c2luZyBmb3IgbG9nZ2luZyBlcnJvciBtZXNzYWdlcyAqLwotICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKLQotICAgIC8qKiBOYW1lcyBvZiBjbGFzc2VzIHRvIGFkZCBhcyBsaXN0ZW5lcnMgdG8gcHJvamVjdCAqLwotICAgIHByaXZhdGUgTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCi0gICAgLyoqIFRoZSBsaXN0IG9mIHRhcmdldHMgdG8gYmUgZXZhbHVhdGVkIGluIHRoaXMgaW52b2NhdGlvbiAqLwotICAgIHByaXZhdGUgTGlzdCB0YXJnZXRzID0gbmV3IEFycmF5TGlzdCg0KTsKLQotICAgIC8qKiBPdXIgY3VycmVudCBtZXNzYWdlIG91dHB1dCBzdGF0dXMuIEZvbGxvd3MgUHJvamVjdC5NU0dfWFhYICovCi0gICAgcHJpdmF0ZSBpbnQgbWVzc2FnZU91dHB1dExldmVsID0gQnVpbGRFdmVudC5NU0dfVkVSQk9TRTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIGJ1aWxkIGZpbGUgdG8gcnVuLiBCeSBkZWZhdWx0IGl0IGlzIGEgZmlsZTogdHlwZSBVUkwKLSAgICAgKiBidXQgb3RoZXIgVVJMIHByb3RvY29scyBjYW4gYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFVSTCBidWlsZEZpbGVVUkw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIEFudCBsb2dnZXIgY2xhc3MuIFRoZXJlIG1heSBiZSBvbmx5IG9uZSBsb2dnZXIuIEl0IHdpbGwgaGF2ZSB0aGUKLSAgICAgKiByaWdodCB0byB1c2UgdGhlICdvdXQnIFByaW50U3RyZWFtLiBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnRzIHRoZSBCdWlsZExvZ2dlcgotICAgICAqIGludGVyZmFjZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvZ2dlckNsYXNzbmFtZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnQoU3RyaW5nW10gYXJncykgewotICAgICAgICAvLyBjcmVhdGUgYSBjb21tYW5kIGxpbmUgYW5kIHVzZSBpdCB0byBydW4gYW50Ci0gICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRsaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgICAgIGNvbW1hbmRsaW5lLnJ1bkFudChhcmdzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcnVuQW50KFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgRXhlY3V0aW9uRnJhbWUgbWFpbkZyYW1lID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlQXJndW1lbnRzKGFyZ3MpOwotICAgICAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJvamVjdC5nZXRUYXJnZXRzKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFRhcmdldCB0YXJnZXQgPSAoVGFyZ2V0KWkubmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgbGlicmFyeSBjb21wb25lbnRzIAotICAgICAgICAgICAgQW50TGlicmFyeVtdIGxpYnJhcmllcyA9IENvbXBvbmVudE1hbmFnZXIuZ2V0Q29tcG9uZW50cygpOwotCi0gICAgICAgICAgICBtYWluRnJhbWUgPSBuZXcgRXhlY3V0aW9uRnJhbWUocHJvamVjdCwgbGlicmFyaWVzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gV2UgaXRlcmF0ZSB0aHJvdWdoIGFsbCBub2RlcyBvZiBhbGwgcHJvamVjdHMgYW5kIG1ha2Ugc3VyZSBldmVyeSBub2RlIGlzIE9LCi0gICAgICAgICAgICBNYXAgc3RhdGUgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgU3RhY2sgdmlzaXRpbmcgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgICAgIExpc3QgZGVwZW5kZW5jeU9yZGVyID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgICAgICAgICAgbWFpbkZyYW1lLmNoZWNrVGFyZ2V0cyhkZXBlbmRlbmN5T3JkZXIsIHN0YXRlLCB2aXNpdGluZyk7Ci0gICAgICAgICAgICBhZGRCdWlsZExpc3RlbmVycyhtYWluRnJhbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBlLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbiAhPSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUm9vdCBjYXVzZTogIiArIGNhdXNlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogIiArIGNhdXNlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFpbkZyYW1lLnJ1bkJ1aWxkKHRhcmdldHMpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRCdWlsZExpc3RlbmVycyhFeGVjdXRpb25GcmFtZSBmcmFtZSkgCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBBZGQgdGhlIGRlZmF1bHQgbGlzdGVuZXIKLSAgICAgICAgZnJhbWUuYWRkQnVpbGRMaXN0ZW5lcihjcmVhdGVMb2dnZXIoKSk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgICAgIChCdWlsZExpc3RlbmVyKSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBmcmFtZS5hZGRCdWlsZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgbGlzdGVuZXIgIiArIGNsYXNzTmFtZSwgZXhjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyB0aGUgZGVmYXVsdCBidWlsZCBsb2dnZXIgZm9yIHNlbmRpbmcgYnVpbGQgZXZlbnRzIHRvIHRoZSBhbnQgbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgQnVpbGRMb2dnZXIgY3JlYXRlTG9nZ2VyKCkgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1aWxkTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0gICAgICAgIGlmIChsb2dnZXJDbGFzc25hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsb2dnZXIgPSAoQnVpbGRMb2dnZXIpKENsYXNzLmZvck5hbWUobG9nZ2VyQ2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIHNwZWNpZmllZCBsb2dnZXIgY2xhc3MgIiArIGxvZ2dlckNsYXNzbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBCdWlsZExvZ2dlciBpbnRlcmZhY2UiKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgbG9nZ2VyICIgKyBsb2dnZXJDbGFzc25hbWUsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgc3BlY2lmaWVkIGxvZ2dlciBjbGFzcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXJDbGFzc25hbWUgKyAiIDogIiArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdFeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBsb2dnZXIgIiArIGxvZ2dlckNsYXNzbmFtZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nZ2VyLnNldE1lc3NhZ2VPdXRwdXRMZXZlbChtZXNzYWdlT3V0cHV0TGV2ZWwpOwotICAgICAgICBsb2dnZXIuc2V0T3V0cHV0UHJpbnRTdHJlYW0ob3V0KTsKLSAgICAgICAgbG9nZ2VyLnNldEVycm9yUHJpbnRTdHJlYW0oZXJyKTsKLQotICAgICAgICByZXR1cm4gbG9nZ2VyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBDb25maWdFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBhcmcgPSBhcmdzW2ldOwotCi0gICAgICAgICAgICBpZiAoYXJnLmVxdWFscygiLWJ1aWxkZmlsZSIpIHx8IGFyZy5lcXVhbHMoIi1maWxlIikgfHwgYXJnLmVxdWFscygiLWYiKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBhcmdzW2krMV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiOiIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJmaWxlOiIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gdXJpLmluZGV4T2YoJyMnKTsgaW5kZXggIT0gLTE7IGluZGV4ID0gdXJpLmluZGV4T2YoJyMnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIiUyMyIgKyB1cmkuc3Vic3RyaW5nKGluZGV4KzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRGaWxlVVJMID0gbmV3IFVSTCh1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY29udmVydCBhbnkgaGFzaCBjaGFyYWN0ZXJzIHRvIHRoZWlyIFVSTCBlc2NhcGUuCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZEZpbGVVUkwgPSBuZXcgVVJMKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJCdWlsZGZpbGUgaXMgbm90IHZhbGlkOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJCdWlsZCBmaWxlIGlzIG5vdCB2YWxpZCIsIGUpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiWW91IG11c3Qgc3BlY2lmeSBhIGJ1aWxkZmlsZSB3aGVuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHRoZSAtYnVpbGRmaWxlIGFyZ3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhcmcuZXF1YWxzKCItbG9nZmlsZSIpIHx8IGFyZy5lcXVhbHMoIi1sIikpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGxvZ0ZpbGUgPSBuZXcgRmlsZShhcmdzW2krMV0pOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IG91dDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3Qgd3JpdGUgb24gdGhlIHNwZWNpZmllZCBsb2cgZmlsZS4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFrZSBzdXJlIHRoZSBwYXRoIGV4aXN0cyBhbmQgeW91IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiWW91IG11c3Qgc3BlY2lmeSBhIGxvZyBmaWxlIHdoZW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgdGhlIC1sb2cgYXJndW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1saXN0ZW5lciIpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChhcmdzW2krMV0pOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIllvdSBtdXN0IHNwZWNpZnkgYSBjbGFzc25hbWUgd2hlbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyB0aGUgLWxpc3RlbmVyIGFyZ3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgZWxzZSBpZiAoYXJnLmVxdWFscygiLWxvZ2dlciIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlckNsYXNzbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiT25seSBvbmUgbG9nZ2VyIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyQ2xhc3NuYW1lID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBhaW9vYmUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgdGhlIC1sb2dnZXIgYXJndW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGFyZ3MgdG8gcmVjb2duaXplIQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBhcmd1bWVudDogIiArIGFyZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIG5vIG90aGVyIGFyZywgaXQgbXVzdCBiZSBhIHRhcmdldAotICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkKGFyZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChidWlsZEZpbGVVUkwgPT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBkZWZhdWx0QnVpbGRGaWxlID0gbmV3IEZpbGUoREVGQVVMVF9CVUlMRF9GSUxFTkFNRSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1aWxkRmlsZVVSTCA9IGRlZmF1bHRCdWlsZEZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQnVpbGRmaWxlIGlzIG5vdCB2YWxpZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXhjZXB0aW9uKCJCdWlsZCBmaWxlIGlzIG5vdCB2YWxpZCIsIGUpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFByb2plY3QgZ2V0UHJvamVjdCgpIHRocm93cyBDb25maWdFeGNlcHRpb24gewotICAgICAgICBYTUxQcm9qZWN0UGFyc2VyIHBhcnNlciA9IG5ldyBYTUxQcm9qZWN0UGFyc2VyKCk7Ci0gICAgICAgIFByb2plY3QgcHJvamVjdCA9IHBhcnNlci5wYXJzZUJ1aWxkRmlsZShidWlsZEZpbGVVUkwpOyAKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7ICAgICAgIAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL0RlZmF1bHRMb2dnZXIuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9mcm9udGVuZC9EZWZhdWx0TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWI5Y2MuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL0RlZmF1bHRMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmZyb250ZW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYW50LmNvcmUuZXhlY3V0aW9uLio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqICBXcml0ZXMgYnVpbGQgZXZlbnQgdG8gYSBQcmludFN0cmVhbS4gQ3VycmVudGx5LCBpdAotICogIG9ubHkgd3JpdGVzIHdoaWNoIHRhcmdldHMgYXJlIGJlaW5nIGV4ZWN1dGVkLCBhbmQKLSAqICBhbnkgbWVzc2FnZXMgdGhhdCBnZXQgbG9nZ2VkLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdExvZ2dlciBpbXBsZW1lbnRzIEJ1aWxkTG9nZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgTEVGVF9DT0xVTU5fU0laRSA9IDEyOwotCi0gICAgcHJvdGVjdGVkIFByaW50U3RyZWFtIG91dDsKLSAgICBwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZXJyOwotICAgIHByb3RlY3RlZCBpbnQgbXNnT3V0cHV0TGV2ZWwgPSBCdWlsZEV2ZW50Lk1TR19FUlI7Ci0gICAgcHJpdmF0ZSBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGVtYWNzTW9kZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBtc2dPdXRwdXRMZXZlbCB0aGlzIGxvZ2dlciBpcyB0byByZXNwb25kIHRvLgotICAgICAqCi0gICAgICogT25seSBtZXNzYWdlcyB3aXRoIGEgbWVzc2FnZSBsZXZlbCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBsZXZlbCBhcmUgCi0gICAgICogb3V0cHV0IHRvIHRoZSBsb2cuCi0gICAgICogPFA+Ci0gICAgICogQ29uc3RhbnRzIGZvciB0aGUgbWVzc2FnZSBsZXZlbHMgYXJlIGluIFByb2plY3QuamF2YS4gVGhlIG9yZGVyIG9mCi0gICAgICogdGhlIGxldmVscywgZnJvbSBsZWFzdCB0byBtb3N0IHZlcmJvc2UsIGlzIE1TR19FUlIsIE1TR19XQVJOLAotICAgICAqIE1TR19JTkZPLCBNU0dfVkVSQk9TRSwgTVNHX0RFQlVHLgotICAgICAqCi0gICAgICogVGhlIGRlZmF1bHQgbWVzc2FnZSBsZXZlbCBmb3IgRGVmYXVsdExvZ2dlciBpcyBQcm9qZWN0Lk1TR19FUlIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGV2ZWwgdGhlIGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZU91dHB1dExldmVsKGludCBsZXZlbCkgewotICAgICAgICB0aGlzLm1zZ091dHB1dExldmVsID0gbGV2ZWw7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoaXMgbG9nZ2VyIGlzIHRvIHNlbmQgaXRzIG91dHB1dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCBzdHJlYW0gZm9yIHRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0UHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMub3V0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGlzIGxvZ2dlciBpcyB0byBzZW5kIGVycm9yIG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGVyciB0aGUgZXJyb3Igc3RyZWFtIGZvciB0aGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gZXJyKSB7Ci0gICAgICAgIHRoaXMuZXJyID0gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIGxvZ2dlciB0byBwcm9kdWNlIGVtYWNzIChhbmQgb3RoZXIgZWRpdG9yKSBmcmllbmRseSBvdXRwdXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW1hY3NNb2RlIHRydWUgaWYgb3V0cHV0IGlzIHRvIGJlIHVuYWRvcm5lZCBzbyB0aGF0IGVtYWNzIGFuZCBvdGhlcgotICAgICAqIGVkaXRvcnMgY2FuIHBhcnNlIGZpbGVzIG5hbWVzLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKSB7Ci0gICAgICAgIHRoaXMuZW1hY3NNb2RlID0gZW1hY3NNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcG9ydEV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFudEV4Y2VwdGlvbikgewotICAgICAgICAgICAgQW50RXhjZXB0aW9uIGUgPSAoQW50RXhjZXB0aW9uKXQ7Ci0gICAgICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uICE9IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT04pIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQobG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJSb290IGNhdXNlOiAiICsgY2F1c2UudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShlcnIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NCdWlsZEV2ZW50KEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3dpdGNoIChldmVudC5nZXRFdmVudFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBCdWlsZEV2ZW50LkJVSUxEX1NUQVJURUQ6Ci0gICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJ1aWxkRXZlbnQuQlVJTERfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZXZlbnQuZ2V0Q2F1c2UoKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGNhdXNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4obFNlcCArICJCVUlMRCBTVUNDRVNTRlVMIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIucHJpbnRsbihsU2VwICsgIkJVSUxEIEZBSUxFRCIgKyBsU2VwKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJlcG9ydEV4Y2VwdGlvbihjYXVzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihsU2VwICsgIlRvdGFsIHRpbWU6ICIgKyBmb3JtYXRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJ1aWxkRXZlbnQuVEFSR0VUX1NUQVJURUQ6Ci0gICAgICAgICAgICAgICAgaWYgKEJ1aWxkRXZlbnQuTVNHX0lORk8gPD0gbXNnT3V0cHV0TGV2ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgVGFyZ2V0IHRhcmdldCA9IChUYXJnZXQpZXZlbnQuZ2V0QnVpbGRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGxTZXAgKyB0YXJnZXQuZ2V0TmFtZSgpICsgIjoiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJ1aWxkRXZlbnQuVEFSR0VUX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCdWlsZEV2ZW50LlRBU0tfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQnVpbGRFdmVudC5UQVNLX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCdWlsZEV2ZW50Lk1FU1NBR0U6Ci0gICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gbG9nVG8gPSBldmVudC5nZXRQcmlvcml0eSgpID09IEJ1aWxkRXZlbnQuTVNHX0VSUiA/IGVyciA6IG91dDsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBtZXNzYWdlcyBiYXNlZCBvbiBwcmlvcml0eQotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRQcmlvcml0eSgpIDw9IG1zZ091dHB1dExldmVsKSB7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIG5hbWUgb2YgdGhlIHRhc2sgaWYgd2UncmUgaW4gb25lCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBidWlsZEVsZW1lbnQgPSBldmVudC5nZXRCdWlsZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUYXNrRWxlbWVudCB0YXNrRWxlbWVudCA9IChUYXNrRWxlbWVudClidWlsZEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRhc2tFbGVtZW50LmdldFR5cGUoKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtYWNzTW9kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiWyIgKyBuYW1lICsgIl0gIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChMRUZUX0NPTFVNTl9TSVpFIC0gbXNnLmxlbmd0aCgpKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1RvLnByaW50KCIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1RvLnByaW50KG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFByaW50IHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIGxvZ1RvLnByaW50bG4oZXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGVyci5wcmludGxuKCJVbnJlY29nbml6ZWQgZXZlbnQgdHlwZSA9ICIgKyBldmVudC5nZXRFdmVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9ICAgICAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXRUaW1lKGxvbmcgbWlsbGlzKSB7Ci0gICAgICAgIGxvbmcgc2Vjb25kcyA9IG1pbGxpcyAvIDEwMDA7Ci0gICAgICAgIGxvbmcgbWludXRlcyA9IHNlY29uZHMgLyA2MDsKLQotCi0gICAgICAgIGlmIChtaW51dGVzID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcobWludXRlcykgKyAiIG1pbnV0ZSIKLSAgICAgICAgICAgICAgICArIChtaW51dGVzID09IDEgPyAiICIgOiAicyAiKQotICAgICAgICAgICAgICAgICsgTG9uZy50b1N0cmluZyhzZWNvbmRzJTYwKSArICIgc2Vjb25kIgotICAgICAgICAgICAgICAgICsgKHNlY29uZHMlNjAgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHNlY29uZHMpICsgIiBzZWNvbmQiCi0gICAgICAgICAgICAgICAgKyAoc2Vjb25kcyU2MCA9PSAxID8gIiIgOiAicyIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9mcm9udGVuZC9FbWJlZFRlc3QuamF2YSBiL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9mcm9udGVuZC9FbWJlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmMDAxOC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvRW1iZWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmZyb250ZW5kOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS54bWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLmNvbmZpZy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgRXhlY3V0aW9uRnJhbWUgY2xhc3MKLSAqIHN0YW5kYWxvbmUgdG8gZXhlY3V0ZSB0YXNrcwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIEVtYmVkVGVzdCB7Ci0gICAgCi19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL211dGFudC9zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9mcm9udGVuZC9MYXVuY2hlci5qYXZhIGIvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL0xhdW5jaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYzAyNDguLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL0xhdW5jaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYW50LmZyb250ZW5kOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hbnQuY29yZS5zdXBwb3J0Lio7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY29tbWFuZCBsaW5lIGZyb250IGVuZCB0byBlbmQuIEl0IGRyaXZlcyB0aGUgY29yZQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIExhdW5jaGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gZmluZCB0aGUgcGFyc2VyIGphcnMgYW5kIG1ha3JlIHN1cmUgd2UgYXJlIGdvaW5nIHRvIHVzZQotICAgICAgICAvLyB0aG9zZSBpbiBwcmVmZXJlbmNlIHRvIGFueXRoaW5nIGVsc2UgdGhhdCBtYXkgYmUgbHlpbmcgYWJvdXQgaW4gdGhlCi0gICAgICAgIC8vIHVzZXIncyBjbGFzc3BhdGgKLSAgICAgICAgQW50Q2xhc3NMb2FkZXIgY29yZUNsYXNzTG9hZGVyID0gQW50TG9jYXRvci5nZXRDb3JlQ2xhc3NMb2FkZXIoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgVVJMIGZyb250RW5kVVJMID0gQW50TG9jYXRvci5nZXRDbGFzc0xvY2F0aW9uVVJMKExhdW5jaGVyLmNsYXNzKTsKLSAgICAgICAgY29yZUNsYXNzTG9hZGVyLmFkZFVSTChmcm9udEVuZFVSTCk7Ci0gICAgICAgIAotICAgICAgICBDbGFzcyBjb21tYW5kTGluZUNsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5hbnQuZnJvbnRlbmQuQ29tbWFuZGxpbmUiLCB0cnVlLCBjb3JlQ2xhc3NMb2FkZXIpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgQ2xhc3NbXSBwYXJhbSA9IHtDbGFzcy5mb3JOYW1lKCJbTGphdmEubGFuZy5TdHJpbmc7Iil9OwotICAgICAgICBDbGFzcyB0YXJnZXQgPSBudWxsOwotICAgICAgICBmaW5hbCBNZXRob2Qgc3RhcnRNZXRob2QgPSBjb21tYW5kTGluZUNsYXNzLmdldE1ldGhvZCgic3RhcnQiLCBwYXJhbSk7Ci0gICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50ID0ge2FyZ3N9OwotICAgICAgICBzdGFydE1ldGhvZC5pbnZva2UobnVsbCwgYXJndW1lbnQpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL1JlbW90ZUxhdW5jaGVyLmphdmEgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvUmVtb3RlTGF1bmNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjZWE1YS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvUmVtb3RlTGF1bmNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5hbnQuZnJvbnRlbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFudC5jb3JlLnN1cHBvcnQuKjsKLQotLyoqCi0gKiBDb21tYW5kIGxpbmUgdG8gcnVuIEFudCBjb3JlIGZyb20gYSByZW1vdGUgc2VydmVyCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8gCi1wdWJsaWMgY2xhc3MgUmVtb3RlTGF1bmNoZXIgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBhbnRIb21lID0gYXJnc1swXTsKLSAgICAgICAgU3RyaW5nIHBhcnNlckhvbWUgPSBhcmdzWzFdOwotICAgICAgICAKLSAgICAgICAgVVJMW10gcmVtb3RlQ29yZSA9IG5ldyBVUkxbM107Ci0gICAgICAgIHJlbW90ZUNvcmVbMF0gPSBuZXcgVVJMKGFudEhvbWUgKyAiL2xpYi9jb3JlLmphciIpOwotICAgICAgICByZW1vdGVDb3JlWzFdID0gbmV3IFVSTChhbnRIb21lICsgIi9saWIvZnJvbnRlbmQuamFyIik7Ci0gICAgICAgIHJlbW90ZUNvcmVbMl0gPSBuZXcgVVJMKHBhcnNlckhvbWUpOwotICAgICAgICBBbnRDbGFzc0xvYWRlciBjb3JlQ2xhc3NMb2FkZXIgPSBuZXcgQW50Q2xhc3NMb2FkZXIocmVtb3RlQ29yZSk7Ci0KLSAgICAgICAgU3RyaW5nW10gcmVhbEFyZ3MgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoIC0gMl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgMiwgcmVhbEFyZ3MsIDAsIHJlYWxBcmdzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiTG9hZGluZyByZW1vdGUgQW50IC4uLiAiKTsgICAgICAgIAotICAgICAgICBDbGFzcyBsYXVuY2hlciA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuYW50LmZyb250ZW5kLkNvbW1hbmRsaW5lIiwgdHJ1ZSwgY29yZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENsYXNzW10gcGFyYW0gPSB7IENsYXNzLmZvck5hbWUoIltMamF2YS5sYW5nLlN0cmluZzsiKSB9OwotICAgICAgICBDbGFzcyB0YXJnZXQgPSBudWxsOwotICAgICAgICBmaW5hbCBNZXRob2Qgc3RhcnRNZXRob2QgPSBsYXVuY2hlci5nZXRNZXRob2QoInN0YXJ0IiwgcGFyYW0pOwotICAgICAgICBmaW5hbCBPYmplY3RbXSBhcmd1bWVudCA9IHtyZWFsQXJnc307Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSIpOyAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgcmVtb3RlIEFudCIpOyAgICAgICAgCi0gICAgICAgIHN0YXJ0TWV0aG9kLmludm9rZShudWxsLCBhcmd1bWVudCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvZWdnbWFuaWZlc3QubWYgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvZWdnbWFuaWZlc3QubWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDAxYzIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL2VnZ21hbmlmZXN0Lm1mCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IEFudCAyLjBhbHBoYQotTWFpbi1DbGFzczogb3JnLmFwYWNoZS5hbnQuZnJvbnRlbmQuUmVtb3RlTGF1bmNoZXIKLUNsYXNzLVBhdGg6IGNvcmUuamFyCi1TZWFsZWQ6IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvbWFuaWZlc3QubWYgYi9wcm9wb3NhbC9tdXRhbnQvc3JjL21haW4vb3JnL2FwYWNoZS9hbnQvZnJvbnRlbmQvbWFuaWZlc3QubWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZmI3ODAuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXV0YW50L3NyYy9tYWluL29yZy9hcGFjaGUvYW50L2Zyb250ZW5kL21hbmlmZXN0Lm1mCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IEFudCAyLjBhbHBoYQotTWFpbi1DbGFzczogb3JnLmFwYWNoZS5hbnQuZnJvbnRlbmQuTGF1bmNoZXIKLUNsYXNzLVBhdGg6IGNvcmUuamFyCi1TZWFsZWQ6IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi8uY3ZzaWdub3JlIGIvcHJvcG9zYWwvbXlybWlkb24vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZiZjM2MC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0uYW50LnByb3BlcnRpZXMKLWRvY3MKLXByai5lbAotdGVzdAotZW1hY3MtanByai5lbAotZGlzdAotYnVpbGQKLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vV0FSTklORyBiL3Byb3Bvc2FsL215cm1pZG9uL1dBUk5JTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDQ4YjEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vV0FSTklORworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBXIEEgUiBOIEkgTiBHICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgQWxsIHVzZXIgYWNjZXNzaWJsZSBwb2ludHMgaW4gdGhpcyBzb2Z0d2FyZSBwYWNrYWdlIGFyZSB0byBiZSBjb25zaWRlcmVkCi0gICJhbHBoYSIuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGV2ZWxvcGVyIHRlYW0gaXMgbm90IGludmVzdGluZyBfYW55XyBlZmZvcnQKLSAgaW4gcHJvdmlkaW5nIGJhY2sgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGFscGhhIHJlbGVhc2VzLgotICAKLSAgVGhpcyBzb2Z0d2FyZSB3aWxsIGNvbnRpbnVlIHRvIGJlIHJlbGVhc2VkIGFzICJhbHBoYSIgdW50aWwgYm90aCBjb2RlLCAKLSAgc2NoZW1hcyBhbmQgQVBJcyB3aWxsIGJlIGNvbnNpZGVyZWQgc3RhYmxlLgotICAKLSAgVW50aWwgdGhlbiwgdGhlcmUgd2lsbCBiZSBubyB3YXJyYW50eSB0aGF0IG5ld2VyIHZlcnNpb25zIHdpbGwgbWFpbnRhaW4gYmFjawotICBjb21wYXRpYmlsaXR5IGV2ZW4gaW4gdGhlIG1vc3Qgc2ltcGxlIGNhc2VzLgotICAKLSAgT24gdGhlIG90aGVyIGhhbmQsIG9uY2UgImJldGEiIHN0YXR1cyBpcyByZWFjaGVkLCBiYWNrIGluY29tcGF0aWJsZSBjaGFuZ2VzCi0gIHdpbGwgYmUgbWFkZSBvbmx5IGlmIGFic29sdXRlbHkgbmVjZXNzYXJ5IHRvIHJlYWNoICJmaW5hbCIgc3RhdHVzLgotICAKLSAgVGhlIEFudCBkZXZlbG9wbWVudCB0ZWFtIHVuZGVyc3RhbmRzIHRoZSBpbXBvcnRhbmNlIG9mIHJlbGlhYmxlCi0gIHNvZnR3YXJlIGFzIHdlbGwgYXMgdGhlIGltcG9ydGFuY2Ugb2YgcHJvdGVjdGluZyB1c2VyIGludmVzdGltZW50cyBieSB0aGUKLSAgY3JlYXRpb24gb2YgYSBzb2xpZCBkZXZlbG9wbWVudCBwbGF0Zm9ybSB0aGF0IGRvZXNuJ3QgY2hhbmdlLgotCi0gIE9uIHRoZSBvdGhlciBoYW5kLCBiZWluZyB0aGUgQW50IHByb2plY3QgYSBwaW9uZWVyIGluIG1hbnkgZmllbGRzLCB0aGlzCi0gIGNhbm5vdCBiZSBndWFyYW50ZWVkIGJlZm9yZSBhIGZpbmFsIHN0YXR1cyBpcyByZWFjaGVkIGZvciB0aGUgc29mdHdhcmUuCi0gIAotICBVbnRpbCB0aGVuLCBubyBlZmZvcnQgd2lsbCBiZSBwcm92aWRlZCB0byBndWFyYW50ZWUgYmFjayBjb21wYXRpYmlsaXR5LgotICAKLSAgWW91IGhhdmUgYmVlbiB3YXJuZWQuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBXIEEgUiBOIEkgTiBHICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL2J1aWxkLnNoIGIvcHJvcG9zYWwvbXlybWlkb24vYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZjFmZTIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vYnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIS9iaW4vc2gKLQotZWNobwotZWNobyAiTXlybWlkb24gQnVpbGQgU3lzdGVtIgotZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotCi1leHBvcnQgTVlSTUlET05fSE9NRT10b29scwotCi1jaG1vZCB1K3ggJE1ZUk1JRE9OX0hPTUUvYmluL2FudFJ1bgotY2htb2QgdSt4ICRNWVJNSURPTl9IT01FL2Jpbi9hbnQKLQotZXhwb3J0IEFOVF9IT01FPQotZXhwb3J0IENMQVNTUEFUSD1saWIvY3JpbXNvbi5qYXI6bGliL2pheHAuamFyCi0KLSRNWVJNSURPTl9IT01FL2Jpbi9hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5Ob0Jhbm5lckxvZ2dlciAtZW1hY3MgJEAKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL2J1aWxkLnhtbCBiL3Byb3Bvc2FsL215cm1pZG9uL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjNDg3ZS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gQW50IGJ1aWxkIGZpbGUKLQotQXV0aG9yczoKLSBQZXRlciBEb25hbGQgPGRvbmFsZHBAYXBhY2hlLm9yZz4KLQotTGVnYWw6Ci0gIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi0gIDwhLS0KLSAgICBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgd2l0aG91dCBlZGl0aW5nIHRoaXMgZmlsZQotICAgIChhbmQgd2l0aG91dCB0eXBpbmcgLUQgZWFjaCB0aW1lIGhlIGNvbXBpbGVzIGl0KQotICAtLT4KLSAgPHByb3BlcnR5IGZpbGU9Ii5hbnQucHJvcGVydGllcyIvPgotICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9Ly5hbnQucHJvcGVydGllcyIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJuYW1lIiB2YWx1ZT0iYW50Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJOYW1lIiB2YWx1ZT0iQW50Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iMC4wMS1teXJtaWRvbiIvPgotICA8cHJvcGVydHkgbmFtZT0ieWVhciIgdmFsdWU9IjIwMDAiLz4KLQotICA8IS0tIAotICAgIHRoZXNlIGFyZSBoZXJlIG9ubHkgZm9yIHRob3NlIHdobyB1c2UgamlrZXMgY29tcGlsZXIuIEZvciBvdGhlciAKLSAgICBkZXZlbG9wZXJzIHRoaXMgcGFydCBtYWtlcyBubyBkaWZmZXJlbmNlLgotICAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyLmVtYWNzIiB2YWx1ZT0ib24iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzIiB2YWx1ZT0idHJ1ZSIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIucGVkYW50aWMiIHZhbHVlPSJ0cnVlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlci5kZXBlbmQiIHZhbHVlPSJ0cnVlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlci5mdWxsZGVwZW5kIiB2YWx1ZT0idHJ1ZSIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJkZWJ1ZyIgdmFsdWU9Im9uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJvcHRpbWl6ZSIgdmFsdWU9Im9mZiIvPgotICA8cHJvcGVydHkgbmFtZT0iZGVwcmVjYXRpb24iIHZhbHVlPSJvbiIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZCIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2xpYiIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuc3JjIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3NyYyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5iYXNlIiB2YWx1ZT0ic3JjIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJtYW5pZmVzdC5kaXIiIHZhbHVlPSIke3NyYy5iYXNlfS9tYW5pZmVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YS5kaXIiIHZhbHVlPSIke3NyYy5iYXNlfS9qYXZhIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzY3JpcHQuZGlyIiB2YWx1ZT0iJHtzcmMuYmFzZX0vc2NyaXB0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIiB2YWx1ZT0ibGliIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QubmFtZSIgdmFsdWU9IiR7TmFtZX0tJHt2ZXJzaW9ufSIvPgotICA8cHJvcGVydHkgbmFtZT0iZGlzdC5kaXIiIHZhbHVlPSJkaXN0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmJpbiIgdmFsdWU9IiR7ZGlzdC5kaXJ9L2JpbiIvPgotICA8cHJvcGVydHkgbmFtZT0iZGlzdC5saWIiIHZhbHVlPSIke2Rpc3QuZGlyfS9saWIiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QuZXh0IiB2YWx1ZT0iJHtkaXN0LmRpcn0vZXh0Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImNvbnN0YW50cy5maWxlIiB2YWx1ZT0ib3JnL2FwYWNoZS9teXJtaWRvbi9Db25zdGFudHMuamF2YSIvPgotCi0gIDxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgIDwvZmlsZXNldD4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZC5jbGFzc2VzfSIgLz4KLSAgPC9wYXRoPgotCi0gIDwhLS0gTWFpbiB0YXJnZXQgLS0+Ci0gIDx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0iZGlzdCIgLz4KLSAKLSAgPCEtLSBDb21waWxlcyB0aGUgc291cmNlIGNvZGUgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSI+Ci0KLSAgICA8dHN0YW1wLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnNyY30iLz4KLSAgICA8Y29weSBmaWxlPSIke2phdmEuZGlyfS8ke2NvbnN0YW50cy5maWxlfSIgdG9maWxlPSIke2J1aWxkLnNyY30vJHtjb25zdGFudHMuZmlsZX0iLz4KLSAgICA8cmVwbGFjZSBmaWxlPSIke2J1aWxkLnNyY30vJHtjb25zdGFudHMuZmlsZX0iIHRva2VuPSJAQFZFUlNJT05AQCIgdmFsdWU9IiR7dmVyc2lvbn0iIC8+Ci0gICAgPHJlcGxhY2UgZmlsZT0iJHtidWlsZC5zcmN9LyR7Y29uc3RhbnRzLmZpbGV9IiB0b2tlbj0iQEBEQVRFQEAiIHZhbHVlPSIke1RPREFZfSIgLz4KLQotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke2phdmEuZGlyfSIKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgotICAgICAgICAgICBvcHRpbWl6ZT0iJHtvcHRpbWl6ZX0iCi0gICAgICAgICAgIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSI+Ci0gICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InByb2plY3QuY2xhc3MucGF0aCIvPiAgICAgICAgCi0gICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYW50L2d1aS8qKiIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2NvbnN0YW50cy5maWxlfSIvPgotICAgICAgICA8c3JjIHBhdGg9IiR7YnVpbGQuc3JjfSIgLz4KLSAgICA8L2phdmFjPgotCi0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gQ3JlYXRlcyB0aGUgamFycyBmaWxlIC0tPgotICA8dGFyZ2V0IG5hbWU9ImphcnMiIGRlcGVuZHM9ImNvbXBpbGUiPgotCi0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0KLSAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQubGlifS9hbnQuamFyIiAKLSAgICAgICAgIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIAotICAgICAgICAgbWFuaWZlc3Q9IiR7bWFuaWZlc3QuZGlyfS9hbnQtbWFuaWZlc3QubWYiPgotICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9teXJtaWRvbi9sYXVuY2hlci8qIiAvPgotICAgIDwvamFyPgotCi0gICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmxpYn0vbXlybWlkb24uamFyIiAKLSAgICAgICAgIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIAotICAgICAgICAgbWFuaWZlc3Q9IiR7bWFuaWZlc3QuZGlyfS9teXJtaWRvbi1tYW5pZmVzdC5tZiI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlLyoqIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9teXJtaWRvbi9sYXVuY2hlci8qIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9teXJtaWRvbi9saWJzLyoiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2FudC8qKiIgLz4KLQotICAgICAgPHppcGZpbGVzZXQgZGlyPSIke21hbmlmZXN0LmRpcn0iIGZ1bGxwYXRoPSJNRVRBLUlORi9hbnQtcm9sZXMueG1sIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iYnVpbHRpbi1hbnQtcm9sZXMueG1sIi8+Ci0gICAgICA8L3ppcGZpbGVzZXQ+Ci0KLSAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHttYW5pZmVzdC5kaXJ9IiBmdWxscGF0aD0iTUVUQS1JTkYvYW50LWRlc2NyaXB0b3IueG1sIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iYnVpbHRpbi1hbnQtZGVzY3JpcHRvci54bWwiLz4KLSAgICAgIDwvemlwZmlsZXNldD4KLQotICAgIDwvamFyPgotCi0gICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmxpYn0vY29yZS5hdGwiIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9hbnQvbW9kdWxlcy8qKiIgLz4KLSAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlLyoqIiAvPgotICAgICAgPHppcGZpbGVzZXQgZGlyPSIke21hbmlmZXN0LmRpcn0iIGZ1bGxwYXRoPSJNRVRBLUlORi9hbnQtZGVzY3JpcHRvci54bWwiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb3JlLWFudC1kZXNjcmlwdG9yLnhtbCIvPgotICAgICAgPC96aXBmaWxlc2V0PgotICAgIDwvamFyPgotCi0gICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmxpYn0vc2VsZnRlc3QuYXRsIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbXlybWlkb24vbGlicy9zZWxmdGVzdC8qKiIgLz4KLSAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHttYW5pZmVzdC5kaXJ9IiBmdWxscGF0aD0iTUVUQS1JTkYvYW50LWRlc2NyaXB0b3IueG1sIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ic2VsZnRlc3QtYW50LWRlc2NyaXB0b3IueG1sIi8+Ci0gICAgICA8L3ppcGZpbGVzZXQ+Ci0gICAgPC9qYXI+Ci0KLSAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQubGlifS9ydW50aW1lLmF0bCIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvcnVudGltZS8qKiIvPgotICAgICAgPHppcGZpbGVzZXQgZGlyPSIke21hbmlmZXN0LmRpcn0iIGZ1bGxwYXRoPSJNRVRBLUlORi9hbnQtZGVzY3JpcHRvci54bWwiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lLWFudC1kZXNjcmlwdG9yLnhtbCIvPgotICAgICAgPC96aXBmaWxlc2V0PgotICAgIDwvamFyPgotCi0gICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmxpYn0vYW50MS5hdGwiIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2FudDEvKioiLz4KLSAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHttYW5pZmVzdC5kaXJ9IiBmdWxscGF0aD0iTUVUQS1JTkYvYW50LWRlc2NyaXB0b3IueG1sIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iYW50MS1hbnQtZGVzY3JpcHRvci54bWwiLz4KLSAgICAgIDwvemlwZmlsZXNldD4KLSAgICA8L2phcj4KLQotICA8L3RhcmdldD4KLQotICA8IS0tIENyZWF0ZXMgdGhlIGRpc3RyaWJ1dGlvbiAtLT4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJqYXJzIj4KLQotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5iaW59Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtkaXN0LmxpYn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZXh0fSIvPgotCi0gICAgPGNvcHkgZmlsZT0idG9vbHMvbGliL2FudC5qYXIiIHRvZmlsZT0iJHtkaXN0LmxpYn0vYW50MS1jb21wYXQuamFyIiAvPgotCi0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5saWJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWJ9Ij4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ic2VsZnRlc3QuYXRsIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotCi0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5leHR9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ic2VsZnRlc3QuYXRsIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotCi0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5saWJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSIvPgotICAgIDwvY29weT4KLQotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuYmlufSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c2NyaXB0LmRpcn0iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8Y2htb2QgZGlyPSIke2Rpc3QuZGlyfSIgcGVybT0iZ28tcnd4IiAvPgotICAgIDxjaG1vZCBmaWxlPSIke2Rpc3QuYmlufS9hbnQiIHBlcm09InUreCIvPgotICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtkaXN0LmJpbn0iIGNyPSJhZGQiIGluY2x1ZGVzPSIqKi8qLmJhdCIgLz4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5iaW59IiBjcj0icmVtb3ZlIiBpbmNsdWRlcz0iKiovKi5zaCIgLz4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5iaW59IiBjcj0icmVtb3ZlIiBpbmNsdWRlcz0iYW50IiAvPgotCi0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gQ2xlYW5zIHVwIGJ1aWxkIGFuZCBkaXN0cmlidXRpb24gZGlyZWN0b3JpZXMgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmRpcn0iLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKiovKn4iIGRlZmF1bHRleGNsdWRlcz0ibm8iLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL2xpYi9hdmFsb24tZXhjYWxpYnVyLmphciBiL3Byb3Bvc2FsL215cm1pZG9uL2xpYi9hdmFsb24tZXhjYWxpYnVyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljM2FmNi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9saWIvYXZhbG9uLWV4Y2FsaWJ1ci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9saWIvYXZhbG9uLWZyYW1ld29yay5qYXIgYi9wcm9wb3NhbC9teXJtaWRvbi9saWIvYXZhbG9uLWZyYW1ld29yay5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzg4ZTUuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vbGliL2F2YWxvbi1mcmFtZXdvcmsuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vbGliL2xvZ2tpdC5qYXIgYi9wcm9wb3NhbC9teXJtaWRvbi9saWIvbG9na2l0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlNDNkMS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9saWIvbG9na2l0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL2xpYi94YWxhbi5qYXIgYi9wcm9wb3NhbC9teXJtaWRvbi9saWIveGFsYW4uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJhNWMyLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL2xpYi94YWxhbi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL0NvbnN0YW50cy5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExNmYwYi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uOwotCi0vKioKLSAqIEFic3RyYWN0IGludGVyZmFjZSB0byBob2xkIGNvbnN0YW50cy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uc3RhbnRzCi17Ci0gICAgLy9Db25zdGFudHMgdG8gaW5kaWNhdGUgdGhlIGJ1aWxkIG9mIE15cm1pZG9uCi0gICAgU3RyaW5nICBCVUlMRF9EQVRFICAgICAgICAgPSAiQEBEQVRFQEAiOwotICAgIFN0cmluZyAgQlVJTERfVkVSU0lPTiAgICAgID0gIkBAVkVSU0lPTkBAIjsKLQotICAgIFN0cmluZyAgQlVJTERfREVTQ1JJUFRJT04gID0gIk15cm1pZG9uICIgKyBCVUlMRF9WRVJTSU9OICsgIiBjb21waWxlZCBvbiAiICsgQlVJTERfREFURTsKLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vYXBpL0Fic3RyYWN0VGFzay5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hcGkvQWJzdHJhY3RUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDM3ZmYuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hcGkvQWJzdHJhY3RUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uYXBpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0dWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dnYWJsZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IFRhc2sgd3JpdGVycyBzaG91bGQgZXh0ZW5kIHRvIHByb3ZpZGUgY3VzdG9tIHRhc2tzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYXNrCi0gICAgZXh0ZW5kcyBBYnN0cmFjdExvZ2dhYmxlCi0gICAgaW1wbGVtZW50cyBUYXNrLCBDb250ZXh0dWFsaXphYmxlLCBJbml0aWFsaXphYmxlLCBEaXNwb3NhYmxlCi17Ci0gICAgLy8vVmFyaWFibGUgdG8gaG9sZCBjb250ZXh0IGZvciB1c2UgYnkgc3ViLWNsYXNzZXMKLSAgICBwcml2YXRlIFRhc2tDb250ZXh0ICAgICAgICAgICAgbV9jb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgY29udGV4dCBmcm9tIGNvbnRhaW5lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udGV4dHVhbGl6ZSggZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIG1fY29udGV4dCA9IChUYXNrQ29udGV4dCljb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGV4ZWN1dGUoKSBtZXRob2QgYW5kIGNoZWNrcyBhbnkgcHJlY29uZGl0aW9ucy4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGFzay4gCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHBlcmZvcm0gYWN0dWFsIHdvcmsgYXNzb2NpYXRlZCB3aXRoIHRhc2suCi0gICAgICogSXQgaXMgY2FsbGVkIGFmdGVyIFRhc2sgaGFzIGJlZW4gQ29uZmlndXJlZCBhbmQgSW5pdGlhbGl6ZWQgYW5kIGJlZm9yZQotICAgICAqIGJlaWcgRGlzcG9zZWQgKElmIHRhc2sgaW1wbGVtZW50cyBhcHByb3ByaWF0ZSBpbnRlcmZhY2VzKS4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgZXhlY3V0ZSgpIG1ldGhvZC4KLSAgICAgKiBVc2UgdGhpcyB0byBjbGVhbiB1cCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0YXNrLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3ViLWNsYXNzIHRvIHJldHJpZXZlIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZXh0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFRhc2tDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29udGV4dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FwaS9EZWZhdWx0VGFza0NvbnRleHQuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vYXBpL0RlZmF1bHRUYXNrQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmM0ZDdiLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vYXBpL0RlZmF1bHRUYXNrQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5hcGk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5leGNhbGlidXIuaW8uRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnByb3BlcnR5LlByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5wcm9wZXJ0eS5Qcm9wZXJ0eVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5EZWZhdWx0Q29udGV4dDsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFRhc2tDb250ZXh0LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFRhc2tDb250ZXh0Ci0gICAgZXh0ZW5kcyBEZWZhdWx0Q29udGV4dAotICAgIGltcGxlbWVudHMgVGFza0NvbnRleHQKLXsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGV4dCB3aXRoIG5vIHBhcmVudCBjb250ZXh0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdFRhc2tDb250ZXh0KCBmaW5hbCBNYXAgY29udGV4dERhdGEgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIGNvbnRleHREYXRhICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIENvbnRleHQgd2l0aCBubyBwYXJlbnQgY29udGV4dHMuCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRUYXNrQ29udGV4dCgpCi0gICAgewotICAgICAgICB0aGlzKCAoVGFza0NvbnRleHQpbnVsbCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0VGFza0NvbnRleHQoIGZpbmFsIFRhc2tDb250ZXh0IHBhcmVudCApCi0gICAgewotICAgICAgICBzdXBlciggcGFyZW50ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgSmF2YVZlcnNpb24gcnVubmluZyB1bmRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgSlZNCi0gICAgICovCi0gICAgcHVibGljIEphdmFWZXJzaW9uIGdldEphdmFWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHRyeSB7IHJldHVybiAoSmF2YVZlcnNpb24pZ2V0KCBKQVZBX1ZFUlNJT04gKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgQ29udGV4dEV4Y2VwdGlvbiBjZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJObyBKYXZhVmVyc2lvbiBpbiBDb250ZXh0IiApOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBOYW1lIG9mIHRhc2tsZXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHRyeSB7IHJldHVybiAoU3RyaW5nKWdldCggTkFNRSApOyB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBDb250ZXh0RXhjZXB0aW9uIGNlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIk5vIE5hbWUgaW4gQ29udGV4dCIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIGJhc2UgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYmFzZSBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRCYXNlRGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHRyeSB7IHJldHVybiAoRmlsZSlnZXQoIEJBU0VfRElSRUNUT1JZICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIENvbnRleHRFeGNlcHRpb24gY2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiTm8gQmFzZSBEaXJlY3RvcnkgaW4gQ29udGV4dCIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc29sdmUgZmlsZW5hbWUuCi0gICAgICogVGhpcyBpbnZvbHZlcyByZXNvbHZpbmcgaXQgYWdhaW5zdCBiYXNlRGlyZWN0b3J5IGFuZAotICAgICAqIHJlbW92aW5nIC4uLyBhbmQgLi8gcmVmZXJlbmNlcy4gSXQgYWxzbyBtZWFucyBmb3JtYXR0aW5nCi0gICAgICogaXQgYXBwcm9wcmlhdGVseSBmb3IgdGhlIHBhcnRpY3VsYXIgT1MgKGllIGRpZmZlcmVudCBPUyBoYXZlCi0gICAgICogZGlmZmVyZW50IHZvbHVtZXMsIGZpbGUgY29udmVudGlvbnMgZXRjKQotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byByZXNvbHZlCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZmlsZW5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSByZXNvbHZlRmlsZSggZmluYWwgU3RyaW5nIGZpbGVuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGaWxlVXRpbC5yZXNvbHZlRmlsZSggZ2V0QmFzZURpcmVjdG9yeSgpLCBmaWxlbmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHByb3BlcnR5IGZvciBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICB0cnkgeyByZXR1cm4gZ2V0KCBuYW1lICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIENvbnRleHRFeGNlcHRpb24gY2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBwcm9wZXJ0eSB2YWx1ZSBpbiBjdXJyZW50IGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUsIENVUlJFTlQgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgcHJvcGVydHkgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUsIGZpbmFsIFNjb3BlRW51bSBzY29wZSApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGVja1Byb3BlcnR5VmFsaWQoIG5hbWUsIHZhbHVlICk7Ci0KLSAgICAgICAgaWYoIENVUlJFTlQgPT0gc2NvcGUgKSBwdXQoIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgIGVsc2UgaWYoIFBBUkVOVCA9PSBzY29wZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBudWxsID09IGdldFBhcmVudCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIkNhbid0IHNldCBhIHByb3BlcnR5IHdpdGggcGFyZW50IHNjb3BlIHdoZW4gY29udGV4dCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgbm8gcGFyZW50IiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoVGFza0NvbnRleHQpZ2V0UGFyZW50KCkpLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIFRPUF9MRVZFTCA9PSBzY29wZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlZmF1bHRUYXNrQ29udGV4dCBjb250ZXh0ID0gdGhpczsKLQotICAgICAgICAgICAgd2hpbGUoIG51bGwgIT0gY29udGV4dC5nZXRQYXJlbnQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IChEZWZhdWx0VGFza0NvbnRleHQpY29udGV4dC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29udGV4dC5wdXQoIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiVW5rbm93biBwcm9wZXJ0eSBzY29wZSEgKCIgKyBzY29wZSArICIpIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZSBzdXJlIHByb3BlcnR5IGlzIHZhbGlkIGlmIGl0IGlzIG9uZSBvZiB0aGUgIm1hZ2ljIiBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHByb2VwcnR5Ci0gICAgICogQGV4Y2VwdGlvbiBUYXNrRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUHJvcGVydHlWYWxpZCggZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggQkFTRV9ESVJFQ1RPUlkuZXF1YWxzKCBuYW1lICkgJiYgISggdmFsdWUgaW5zdGFuY2VvZiBGaWxlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIlByb3BlcnR5ICIgKyBCQVNFX0RJUkVDVE9SWSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtdXN0IGhhdmUgYSB2YWx1ZSBvZiB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuY2xhc3MuZ2V0TmFtZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTkFNRS5lcXVhbHMoIG5hbWUgKSAmJiAhKCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJQcm9wZXJ0eSAiICsgTkFNRSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtdXN0IGhhdmUgYSB2YWx1ZSBvZiB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcy5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBKQVZBX1ZFUlNJT04uZXF1YWxzKCBuYW1lICkgJiYgISggdmFsdWUgaW5zdGFuY2VvZiBKYXZhVmVyc2lvbiApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJQcm9wZXJ0eSAiICsgSkFWQV9WRVJTSU9OICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG11c3QgaGF2ZSBhIHZhbHVlIG9mIHR5cGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YVZlcnNpb24uY2xhc3MuZ2V0TmFtZSgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FwaS9KYXZhVmVyc2lvbi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hcGkvSmF2YVZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0N2IxOC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FwaS9KYXZhVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5WYWx1ZWRFbnVtOwotCi0vKioKLSAqIFR5cGUgc2FmZSB3cmFwcGVyIGNsYXNzIGZvciBKYXZhIFZlcnNpb24gZW51bXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhVmVyc2lvbgotICAgIGV4dGVuZHMgVmFsdWVkRW51bQotewotICAgIC8vc3RhbmRhcmQgZW51bXMgZm9yIHZlcnNpb24gb2YgSlZNCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBKYXZhVmVyc2lvbiAgSkFWQTFfMCAgPSBuZXcgSmF2YVZlcnNpb24oICJKYXZhIDEuMCIsIDEwMCApOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgSmF2YVZlcnNpb24gIEpBVkExXzEgID0gbmV3IEphdmFWZXJzaW9uKCAiSmF2YSAxLjEiLCAxMTAgKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIEphdmFWZXJzaW9uICBKQVZBMV8yICA9IG5ldyBKYXZhVmVyc2lvbiggIkphdmEgMS4yIiwgMTIwICk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBKYXZhVmVyc2lvbiAgSkFWQTFfMyAgPSBuZXcgSmF2YVZlcnNpb24oICJKYXZhIDEuMyIsIDEzMCApOwotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyBubyBpbnN0YW5jZSBleGNlcHQgaGVyZSBjYW4gYmUgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBqYXZhIHZlcnNpb24gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmVyc2lvbiAqIDEwMAotICAgICAqLwotICAgIHByaXZhdGUgSmF2YVZlcnNpb24oIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgdmFsdWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUsIHZhbHVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hcGkvVGFzay5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hcGkvVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2M2NjE1Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vYXBpL1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5hcGk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGFza3MgaW1wbGVtZW50IHRvIGJlIGV4ZWN1dGVkIGluIE15cm1pZG9uIHJ1bnRpbWUuCi0gKiAKLSAqIEluc3RhbmNlcyBjYW4gYWxzbyBpbXBsZW1lbnQgdGhlIEF2YWxvbiBsaWZlY3ljbGUgbWV0aG9kcyAKLSAqIExvZ2dhYmxlLCBDb250ZXh0dWFsaXphYmxlLCBDb21wb3NhYmxlLCBJbml0aWFsaXphYmxlIGFuZCBEaXNwb3NhYmxlLgotICogRWFjaCBvZiB0aGVzZSBsaWZlY3ljbGUgc3RhZ2VzIHdpbGwgYmUgZXhlY3V0ZWQgYXQgYXBwcm9wcmlhdGUgdGltZS4KLSAqCi0gKiBUYXNrcyBjYW4gYWxzbyBjaG9vc2UgdG8gaW1wbGVtZW50IENvbmZpZ3VyYWJsZSBpZiB0aGV5IHdpc2ggdG8gZGlyZWN0bHkKLSAqIHJlY2VpdmUgdGhlIENvbmZpZ3VyYXRpb24gZGF0YSByZXByZXNlbnRpbmcgdGhlIHRhc2suIElmIHRoaXMgaW50ZXJmYWNlIGlzCi0gKiBub3QgaW1wbGVtZW50ZWQgdGhlbiB0aGUgZW5naW5lIHdpbGwgYmUgcmVzcG9uc2JpbCBmb3IgbWFwcGluZyBjb25maWd1cmF0aW9uCi0gKiB0byB0YXNrIG9iamVjdC4KLSAqCi0gKiBUaGUgQ29tcG9uZW50cyBwYXNzZWQgaW4gdmlhIENvbXBvbmVudE1hbmFnZXIgYXJlIGRldGVybWluZWQgYnkgY29udGFpbmVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sKLXsKLSAgICBTdHJpbmcgUk9MRSA9ICJvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrIjsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGFzay4gCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHBlcmZvcm0gYWN0dWFsIHdvcmsgYXNzb2NpYXRlZCB3aXRoIHRhc2suCi0gICAgICogSXQgaXMgY2FsbGVkIGFmdGVyIFRhc2sgaGFzIGJlZW4gQ29uZmlndXJlZCBhbmQgSW5pdGlhbGl6ZWQgYW5kIGJlZm9yZQotICAgICAqIGJlaW5nIERpc3Bvc2VkIChJZiB0YXNrIGltcGxlbWVudHMgYXBwcm9wcmlhdGUgaW50ZXJmYWNlcykuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFRhc2tFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FwaS9UYXNrQ29udGV4dC5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hcGkvVGFza0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4MDg2MS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FwaS9UYXNrQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5hcGk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLkVudW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIHRoZSA8ZW0+Q29udGV4dDwvZW0+IGluIHdoaWNoIFRhc2sgaXMgZXhlY3V0ZWQuCi0gKiBMaWtlIG90aGVyIENvbXBvbmVudCBBUElzIHRoZSBUYXNrQ29udGV4dCByZXByZXNlbnRzIHRoZSBjb21tdW5pY2F0aW9uCi0gKiBwYXRoIGJldHdlZW4gdGhlIGNvbnRhaW5lciBhbmQgdGhlIFRhc2suCi0gKiBVbmxpa2Ugb3RoZXIgQVBJcyB0aGUgTG9nZ2luZyBpcyBwcm92aWRlZCB0aHJvdWdoIGFub3RoZXIgaW50ZXJmYWNlIChMb2dnYWJsZSkKLSAqIGFzIGlzIGFjY2VzcyB0byBQZWVyIGNvbXBvbmVudHMgKHZpYSBDb21wb3NhYmxlKS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrQ29udGV4dAotICAgIGV4dGVuZHMgQ29udGV4dAotewotICAgIC8vdGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdoZW4gc2V0dGluZyBwcm9wZXJ0aWVzIHRvIGluZGljYXRlIHRoZSBzY29wZSBhdAotICAgIC8vd2hpY2ggcHJvcGVydGllcyBhcmUgc2V0Ci0gICAgU2NvcGVFbnVtICAgICAgIENVUlJFTlQgICAgICAgICAgICA9IG5ldyBTY29wZUVudW0oICJDdXJyZW50IiApOwotICAgIFNjb3BlRW51bSAgICAgICBQQVJFTlQgICAgICAgICAgICAgPSBuZXcgU2NvcGVFbnVtKCAiUGFyZW50IiApOwotICAgIFNjb3BlRW51bSAgICAgICBUT1BfTEVWRUwgICAgICAgICAgPSBuZXcgU2NvcGVFbnVtKCAiVG9wTGV2ZWwiICk7Ci0KLSAgICAvL3RoZXNlIGFyZSB0aGUgbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGV2ZXJ5IFRhc2tDb250ZXh0IG11c3QgY29udGFpbgotICAgIFN0cmluZyAgICAgICAgICBKQVZBX1ZFUlNJT04gICAgICAgPSAibXlybWlkb24uamF2YS52ZXJzaW9uIjsKLSAgICBTdHJpbmcgICAgICAgICAgQkFTRV9ESVJFQ1RPUlkgICAgID0gIm15cm1pZG9uLmJhc2UuZGlyZWN0b3J5IjsKLSAgICBTdHJpbmcgICAgICAgICAgTkFNRSAgICAgICAgICAgICAgID0gIm15cm1pZG9uLnRhc2submFtZSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBKYXZhVmVyc2lvbiBydW5uaW5nIHVuZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiBKVk0KLSAgICAgKi8KLSAgICBKYXZhVmVyc2lvbiBnZXRKYXZhVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgTmFtZSBvZiB0YXNrbGV0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZQotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBiYXNlIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGJhc2UgZGlyZWN0b3J5Ci0gICAgICovCi0gICAgRmlsZSBnZXRCYXNlRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIGZpbGVuYW1lLgotICAgICAqIFRoaXMgaW52b2x2ZXMgcmVzb2x2aW5nIGl0IGFnYWluc3QgYmFzZURpcmVjdG9yeSBhbmQKLSAgICAgKiByZW1vdmluZyAuLi8gYW5kIC4vIHJlZmVyZW5jZXMuIEl0IGFsc28gbWVhbnMgZm9ybWF0dGluZwotICAgICAqIGl0IGFwcHJvcHJpYXRlbHkgZm9yIHRoZSBwYXJ0aWN1bGFyIE9TIChpZSBkaWZmZXJlbnQgT1MgaGF2ZQotICAgICAqIGRpZmZlcmVudCB2b2x1bWVzLCBmaWxlIGNvbnZlbnRpb25zIGV0YykKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gcmVzb2x2ZQotICAgICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGZpbGUKLSAgICAgKi8KLSAgICBGaWxlIHJlc29sdmVGaWxlKCBTdHJpbmcgZmlsZW5hbWUgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHByb3BlcnR5IGZvciBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eQotICAgICAqLwotICAgIE9iamVjdCBnZXRQcm9wZXJ0eSggU3RyaW5nIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIFNldCBwcm9wZXJ0eSB2YWx1ZSBpbiBjdXJyZW50IGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgcHJvcGVydHkKLSAgICAgKi8KLSAgICB2b2lkIHNldFByb3BlcnR5KCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgcHJvcGVydHkgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIGF0IHdoaWNoIHRvIHNldCBwcm9wZXJ0eQotICAgICAqLwotICAgIHZvaWQgc2V0UHJvcGVydHkoIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIFNjb3BlRW51bSBzY29wZSApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQ2hpbGQgQ29udGV4dC4KLSAgICAgKiBUaGlzIGFsbG93cyBzZXBhcmF0ZSBoaWVyYXJjaGx5IGNvbnRleHRzIHRvIGJlIGVhc2lseSBjb25zdHJ1Y3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHN1Yi1jb250ZXh0Ci0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBUYXNrQ29udGV4dAotICAgICAqIEBleGNlcHRpb24gVGFza0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICAvL1Rhc2tDb250ZXh0IGNyZWF0ZVN1YkNvbnRleHQoIFN0cmluZyBuYW1lICkKLSAgICAvL3Rocm93cyBUYXNrRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2FmZSB3cmFwcGVyIGNsYXNzIGZvciBTY29wZSBlbnVtcy4KLSAgICAgKi8KLSAgICBmaW5hbCBjbGFzcyBTY29wZUVudW0KLSAgICAgICAgZXh0ZW5kcyBFbnVtCi0gICAgewotICAgICAgICBTY29wZUVudW0oIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hcGkvVGFza0V4Y2VwdGlvbi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hcGkvVGFza0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUxMDhkLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vYXBpL1Rhc2tFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5hcGk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuQ2FzY2FkaW5nRXhjZXB0aW9uOwotCi0vKioKLSAqIFRhc2tFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBwcm9ibGVtIHdpdGggdGFza3MgZXRjLgotICogSXQgaXMgY2FzY2FkaW5nIHNvIHRoYXQgZnVydGhlciBlbWJlZGRlZCBpbmZvcm1hdGlvbiBjYW4gYmUgY29udGFpbmVkLgotICogaWUgVGFza0V4Y2VwdGlvbiB3YXMgY2F1c2VkIGJ5IElPRXhjZXB0aW9uIGV0Yy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tFeGNlcHRpb24KLSAgICBleHRlbmRzIENhc2NhZGluZ0V4Y2VwdGlvbgotewotICAgIC8qKgotICAgICAqIEJhc2ljIGNvbnN0cnVjdG9yIHdpdGggYSBtZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBUYXNrRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSApCi0gICAgewotICAgICAgICB0aGlzKCBtZXNzYWdlLCBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBidWlsZHMgY2FzY2FkZSBzbyB0aGF0IG90aGVyIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0YWluZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQotICAgICAqIEBwYXJhbSB0aHJvd2FibGUgdGhlIHRocm93YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBUYXNrRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gICAgewotICAgICAgICBzdXBlciggbWVzc2FnZSwgdGhyb3dhYmxlICk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FzcGVjdHMvQWJzdHJhY3RBc3BlY3RIYW5kbGVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FzcGVjdHMvQWJzdHJhY3RBc3BlY3RIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTM0YTcuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hc3BlY3RzL0Fic3RyYWN0QXNwZWN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5hc3BlY3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci0KLS8qKgotICogQXNwZWN0SGFuZGxlciBpcyB0aGUgaW50ZXJmYWNlIHRocm91Z2ggd2hpY2ggYXNwZWN0cyBhcmUgaGFuZGxlZC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBc3BlY3RIYW5kbGVyCi0gICAgaW1wbGVtZW50cyBBc3BlY3RIYW5kbGVyCi17Ci0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJzICAgICAgIG1fYXNwZWN0UGFyYW1ldGVyczsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25bXSAgbV9hc3BlY3RFbGVtZW50czsKLQotICAgIHByaXZhdGUgVGFzayAgICAgICAgICAgICBtX3Rhc2s7Ci0gICAgcHJpdmF0ZSBMb2dnZXIgICAgICAgICAgIG1fbG9nZ2VyOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiAgICBtX3Rhc2tNb2RlbDsKLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uIHByZUNyZWF0ZSggZmluYWwgQ29uZmlndXJhdGlvbiB0YXNrTW9kZWwgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHRhc2tNb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhc3BlY3RTZXR0aW5ncyggZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzLCBmaW5hbCBDb25maWd1cmF0aW9uW10gZWxlbWVudHMgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV9hc3BlY3RQYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICAgICAgbV9hc3BlY3RFbGVtZW50cyA9IGVsZW1lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvc3RDcmVhdGUoIGZpbmFsIFRhc2sgdGFzayApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtX3Rhc2sgPSB0YXNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZUxvZ2dhYmxlKCBmaW5hbCBMb2dnZXIgbG9nZ2VyICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1fbG9nZ2VyID0gbG9nZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZUNvbmZpZ3VyZSggZmluYWwgQ29uZmlndXJhdGlvbiB0YXNrTW9kZWwgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV90YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlRXhlY3V0ZSgpCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcnJvciggZmluYWwgVGFza0V4Y2VwdGlvbiB0ZSApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXNldCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgbV9hc3BlY3RQYXJhbWV0ZXJzID0gbnVsbDsKLSAgICAgICAgbV9hc3BlY3RFbGVtZW50cyA9IG51bGw7Ci0gICAgICAgIG1fdGFzayA9IG51bGw7Ci0gICAgICAgIG1fbG9nZ2VyID0gbnVsbDsKLSAgICAgICAgbV90YXNrTW9kZWwgPSBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBDb25maWd1cmF0aW9uIGdldFRhc2tNb2RlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV90YXNrTW9kZWw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFRhc2sgZ2V0VGFzaygpCi0gICAgewotICAgICAgICByZXR1cm4gbV90YXNrOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgZ2V0TG9nZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2xvZ2dlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29uZmlndXJhdGlvbltdIGdldEFzcGVjdEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2FzcGVjdEVsZW1lbnRzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBQYXJhbWV0ZXJzIGdldEFzcGVjdFBhcmFtZXRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYXNwZWN0UGFyYW1ldGVyczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FzcGVjdHMvQXNwZWN0SGFuZGxlci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9hc3BlY3RzL0FzcGVjdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhYzZkMS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FzcGVjdHMvQXNwZWN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmFzcGVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBc3BlY3RIYW5kbGVyIGlzIHRoZSBpbnRlcmZhY2UgdGhyb3VnaCB3aGljaCBhc3BlY3RzIGFyZSBoYW5kbGVkLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNwZWN0SGFuZGxlcgotewotICAgIFN0cmluZyBST0xFID0gIm9yZy5hcGFjaGUubXlybWlkb24uYXNwZWN0cy5Bc3BlY3RIYW5kbGVyIjsKLQotICAgIENvbmZpZ3VyYXRpb24gcHJlQ3JlYXRlKCBDb25maWd1cmF0aW9uIHRhc2tNb2RlbCApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhc3BlY3RTZXR0aW5ncyggUGFyYW1ldGVycyBwYXJhbWV0ZXJzLCBDb25maWd1cmF0aW9uW10gY2hpbGRyZW4gKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgcG9zdENyZWF0ZSggVGFzayB0YXNrICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb247Ci0KLSAgICB2b2lkIHByZUxvZ2dhYmxlKCBMb2dnZXIgbG9nZ2VyICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb247Ci0KLSAgICB2b2lkIHByZUNvbmZpZ3VyZSggQ29uZmlndXJhdGlvbiB0YXNrTW9kZWwgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgcHJlRXhlY3V0ZSgpCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uOwotCi0gICAgdm9pZCBwcmVEZXN0cm95KCkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb247Ci0KLSAgICBib29sZWFuIGVycm9yKCBUYXNrRXhjZXB0aW9uIHRlICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2FzcGVjdHMvTm9vcEFzcGVjdEhhbmRsZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vYXNwZWN0cy9Ob29wQXNwZWN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2EzNTI1Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vYXNwZWN0cy9Ob29wQXNwZWN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmFzcGVjdHM7Ci0KLS8qKgotICogQSBOb29wIGFzcGVjdCBoYW5kbGVyIHRoYXQgZG9lcyBub3RoaW5nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTm9vcEFzcGVjdEhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0QXNwZWN0SGFuZGxlcgotewotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2FzcGVjdC9Bc3BlY3RNYW5hZ2VyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvYXNwZWN0L0FzcGVjdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwNmZmZC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvYXNwZWN0L0FzcGVjdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmFzcGVjdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXNwZWN0cy5Bc3BlY3RIYW5kbGVyOwotCi0vKioKLSAqIE1hbmFnZSBhbmQgcHJvcG9nYXRlIEFzcGVjdHMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNwZWN0TWFuYWdlcgotICAgIGV4dGVuZHMgQ29tcG9uZW50LCBBc3BlY3RIYW5kbGVyCi17Ci0gICAgU3RyaW5nIFJPTEUgPSAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmFzcGVjdC5Bc3BlY3RNYW5hZ2VyIjsKLQotICAgIFN0cmluZ1tdIGdldE5hbWVzKCk7Ci0KLSAgICB2b2lkIGRpc3BhdGNoQXNwZWN0U2V0dGluZ3MoIFN0cmluZyBuYW1lLCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsIENvbmZpZ3VyYXRpb25bXSBlbGVtZW50cyApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZGRBc3BlY3RIYW5kbGVyKCBTdHJpbmcgbmFtZSwgQXNwZWN0SGFuZGxlciBoYW5kbGVyICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb247Ci0KLSAgICB2b2lkIHJlbW92ZUFzcGVjdEhhbmRsZXIoIFN0cmluZyBuYW1lLCBBc3BlY3RIYW5kbGVyIGhhbmRsZXIgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9hc3BlY3QvRGVmYXVsdEFzcGVjdE1hbmFnZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9hc3BlY3QvRGVmYXVsdEFzcGVjdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5NGRjNS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvYXNwZWN0L0RlZmF1bHRBc3BlY3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuYXNwZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hc3BlY3RzLkFzcGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hc3BlY3RzLk5vb3BBc3BlY3RIYW5kbGVyOwotCi0vKioKLSAqIE1hbmFnZSBhbmQgcHJvcG9nYXRlIEFzcGVjdHMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QXNwZWN0TWFuYWdlcgotICAgIGltcGxlbWVudHMgQXNwZWN0TWFuYWdlciwgSW5pdGlhbGl6YWJsZQotewotICAgIHByaXZhdGUgSGFzaE1hcCAgICAgICAgICBtX2FzcGVjdE1hcCAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgQXNwZWN0SGFuZGxlcltdICBtX2FzcGVjdHMgICAgPSBuZXcgQXNwZWN0SGFuZGxlclsgMCBdOwotICAgIHByaXZhdGUgU3RyaW5nW10gICAgICAgICBtX25hbWVzICAgICAgPSBuZXcgU3RyaW5nWyAwIF07Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8vVUdMWSBIQUNLISEhIQotICAgICAgICBhZGRBc3BlY3RIYW5kbGVyKCAiYW50IiwgbmV3IE5vb3BBc3BlY3RIYW5kbGVyKCkgKTsKLSAgICAgICAgYWRkQXNwZWN0SGFuZGxlciggImRvYyIsIG5ldyBOb29wQXNwZWN0SGFuZGxlcigpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEFzcGVjdEhhbmRsZXIoIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBBc3BlY3RIYW5kbGVyIGhhbmRsZXIgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV9hc3BlY3RNYXAucHV0KCBuYW1lLCBoYW5kbGVyICk7Ci0gICAgICAgIHJlYnVpbGRBcnJheXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQXNwZWN0SGFuZGxlciggZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEFzcGVjdEhhbmRsZXIgaGFuZGxlciApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBBc3BlY3RIYW5kbGVyIGVudHJ5ID0gKEFzcGVjdEhhbmRsZXIpbV9hc3BlY3RNYXAucmVtb3ZlKCBuYW1lICk7Ci0gICAgICAgIGlmKCBudWxsID09IGVudHJ5ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJObyBzdWNoIGFzcGVjdCB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIiciICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZWJ1aWxkQXJyYXlzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYnVpbGRBcnJheXMoKQotICAgIHsKLSAgICAgICAgbV9hc3BlY3RzID0gKEFzcGVjdEhhbmRsZXJbXSltX2FzcGVjdE1hcC52YWx1ZXMoKS50b0FycmF5KCBtX2FzcGVjdHMgKTsKLSAgICAgICAgbV9uYW1lcyA9IChTdHJpbmdbXSltX2FzcGVjdE1hcC5rZXlTZXQoKS50b0FycmF5KCBtX25hbWVzICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25hbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQXNwZWN0U2V0dGluZ3MoIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uW10gZWxlbWVudHMgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNwZWN0SGFuZGxlciBoYW5kbGVyID0gKEFzcGVjdEhhbmRsZXIpbV9hc3BlY3RNYXAuZ2V0KCBuYW1lICk7Ci0gICAgICAgIGlmKCBudWxsID09IGhhbmRsZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIk5vIHN1Y2ggYXNwZWN0IHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZXIuYXNwZWN0U2V0dGluZ3MoIHBhcmFtZXRlcnMsIGVsZW1lbnRzICk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb24gcHJlQ3JlYXRlKCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBtb2RlbCA9IGNvbmZpZ3VyYXRpb247Ci0KLSAgICAgICAgZmluYWwgQXNwZWN0SGFuZGxlcltdIGFzcGVjdHMgPSBtX2FzcGVjdHM7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXNwZWN0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGVsID0gYXNwZWN0c1sgaSBdLnByZUNyZWF0ZSggbW9kZWwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhc3BlY3RTZXR0aW5ncyggZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzLCBmaW5hbCBDb25maWd1cmF0aW9uW10gZWxlbWVudHMgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAiQ2FuIG5vdCBwcm92aWRlIFNldHRpbmdzIHRvIEFzcGVjdE1hbmFnZXIiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9zdENyZWF0ZSggZmluYWwgVGFzayB0YXNrICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzcGVjdEhhbmRsZXJbXSBhc3BlY3RzID0gbV9hc3BlY3RzOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGFzcGVjdHMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3BlY3RzWyBpIF0ucG9zdENyZWF0ZSggdGFzayApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlTG9nZ2FibGUoIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNwZWN0SGFuZGxlcltdIGFzcGVjdHMgPSBtX2FzcGVjdHM7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXNwZWN0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzcGVjdHNbIGkgXS5wcmVMb2dnYWJsZSggbG9nZ2VyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVDb25maWd1cmUoIGZpbmFsIENvbmZpZ3VyYXRpb24gdGFza01vZGVsICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzcGVjdEhhbmRsZXJbXSBhc3BlY3RzID0gbV9hc3BlY3RzOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGFzcGVjdHMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3BlY3RzWyBpIF0ucHJlQ29uZmlndXJlKCB0YXNrTW9kZWwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNwZWN0SGFuZGxlcltdIGFzcGVjdHMgPSBtX2FzcGVjdHM7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXNwZWN0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzcGVjdHNbIGkgXS5wcmVFeGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzcGVjdEhhbmRsZXJbXSBhc3BlY3RzID0gbV9hc3BlY3RzOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGFzcGVjdHMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3BlY3RzWyBpIF0ucHJlRGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXJyb3IoIGZpbmFsIFRhc2tFeGNlcHRpb24gdGUgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNwZWN0SGFuZGxlcltdIGFzcGVjdHMgPSBtX2FzcGVjdHM7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXNwZWN0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0cnVlID09IGFzcGVjdHNbIGkgXS5lcnJvciggdGUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2J1aWxkZXIvQVRJUHJvamVjdEJ1aWxkZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9idWlsZGVyL0FUSVByb2plY3RCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGM3YmMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2J1aWxkZXIvQVRJUHJvamVjdEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uU0FYQ29uZmlndXJhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gY29uc3RydWN0IHByb2plY3QgZnJvbSBhIGJ1aWxkIGZpbGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBVElQcm9qZWN0QnVpbGRlcgotICAgIGV4dGVuZHMgRGVmYXVsdFByb2plY3RCdWlsZGVyCi0gICAgaW1wbGVtZW50cyBQYXJhbWV0ZXJpemFibGUKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQU1fRVhDRVBUSU9OID0gCi0gICAgICAgICJNYWxmb3JtZWQgUEk6IGV4cGVjdGVkIDw/eHNsLXBhcmFtIG5hbWU9XCJmb29cIiB2YWx1ZT1cImJhclwiPz4iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFNU19FWENFUFRJT04gPSAKLSAgICAgICAgIk1hbGZvcm1lZCBQSTogZXhwZWN0ZWQgPD94c2wtcGFyYW1zIGxvY2F0aW9uPVwibXlwYXJhbXMucHJvcGVydGllc1wiPz4iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX0VYQ0VQVElPTiA9IAotICAgICAgICAiTWFsZm9ybWVkIFBJOiBleHBlY3RlZCA8P3hzbC1wYXJhbXMgaHJlZj1cIm15c3R5bGVzaGVldC54c2xcIj8+IjsKLQotICAgIHByaXZhdGUgUGFyYW1ldGVycyAgICAgbV9wYXJhbWV0ZXJzOwotICAgIHByaXZhdGUgVVJMICAgICAgICAgICAgbV9zeXN0ZW1JRDsKLQotICAgIHB1YmxpYyB2b2lkIHBhcmFtZXRlcml6ZSggZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzICkKLSAgICB7Ci0gICAgICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyggZmluYWwgVVJMIHNvdXJjZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNBWENvbmZpZ3VyYXRpb25IYW5kbGVyIGhhbmRsZXIgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICBmaW5hbCBYTUxSZWFkZXIgcmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKLSAgICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlciggaGFuZGxlciApOwotCi0gICAgICAgIGZpbmFsIFJlYWN0b3JQSUhhbmRsZXIgcmVhY3RvckhhbmRsZXIgPSBuZXcgUmVhY3RvclBJSGFuZGxlcigpOwotICAgICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoIHJlYWN0b3JIYW5kbGVyICk7Ci0KLSAgICAgICAgdHJ5IHsgcmVhZGVyLnBhcnNlKCBzb3VyY2VJRC50b1N0cmluZygpICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFN0b3BQYXJzaW5nRXhjZXB0aW9uIHNwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vSWdub3JlIG1lCi0gICAgICAgIH0KLQotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG51bGw7Ci0KLSAgICAgICAgZmluYWwgaW50IHNpemUgPSByZWFjdG9ySGFuZGxlci5nZXRQSUNvdW50KCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldCA9IHJlYWN0b3JIYW5kbGVyLmdldFRhcmdldCggaSApOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSByZWFjdG9ySGFuZGxlci5nZXREYXRhKCBpICk7Ci0KLSAgICAgICAgICAgIGlmKCB0YXJnZXQuZXF1YWxzKCAieHNsLXBhcmFtIiApICkgaGFuZGxlUGFyYW1ldGVyKCBkYXRhICk7Ci0gICAgICAgICAgICBlbHNlIGlmKCB0YXJnZXQuZXF1YWxzKCAieHNsLXBhcmFtcyIgKSApIGhhbmRsZVBhcmFtZXRlcnMoIGRhdGEsIHNvdXJjZUlEICk7Ci0gICAgICAgICAgICBlbHNlIGlmKCB0YXJnZXQuZXF1YWxzKCAieHNsLXN0eWxlc2hlZXQiICkgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggbnVsbCAhPSB0cmFuc2Zvcm1lciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCAiQnVpbGQgZmlsZSBjYW4gbm90IGNvbnRhaW4gIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHdvIHhzbC1zdHlsZXNoZWV0IFBJcyIgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHlsZXNoZWV0ID0gZ2V0U3R5bGVzaGVldCggZGF0YSwgc291cmNlSUQgKTsKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoIG5ldyBTdHJlYW1Tb3VyY2UoIHN0eWxlc2hlZXQgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gdHJhbnNmb3JtZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoIGhhbmRsZXIgKTsKLSAgICAgICAgICAgIHJlYWRlci5wYXJzZSggc291cmNlSUQudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbmFtZXMgPSBtX3BhcmFtZXRlcnMuZ2V0TmFtZXMoKTsKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbmFtZXNbIGkgXTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBtX3BhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCBuYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBTQVhSZXN1bHQgcmVzdWx0ID0gbmV3IFNBWFJlc3VsdCggaGFuZGxlciApOwotICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKCBuZXcgU3RyZWFtU291cmNlKCBzb3VyY2VJRC50b1N0cmluZygpICksIHJlc3VsdCApOwotICAgICAgICAgICAgLy90cmFuc2Zvcm1lci50cmFuc2Zvcm0oIG5ldyBTdHJlYW1Tb3VyY2UoIHNvdXJjZUlELnRvU3RyaW5nKCkgKSwgCi0gICAgICAgICAgICAvL25ldyBTdHJlYW1SZXN1bHQoIFN5c3RlbS5vdXQgKSApOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGFyYW1ldGVyKCBmaW5hbCBTdHJpbmcgZGF0YSApCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IGRhdGEuaW5kZXhPZiggJ1wiJyApOwotICAgICAgICBpZiggLTEgPT0gaW5kZXggKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCBQQVJBTV9FWENFUFRJT04gKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGV4ID0gZGF0YS5pbmRleE9mKCAnXCInLCBpbmRleCArIDEgKTsKLSAgICAgICAgaWYoIC0xID09IGluZGV4ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbiggUEFSQU1fRVhDRVBUSU9OICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NwbGl0IGJldHdlZW4gdHdvICJhdHRyaWJ1dGVzIiBvY2N1cnMgb24gaW5kZXgKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbmFtZSA9IHBhcnNlQXR0cmlidXRlKCBkYXRhLnN1YnN0cmluZyggMCwgaW5kZXggKyAxICkgKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gdmFsdWUgPSBwYXJzZUF0dHJpYnV0ZSggZGF0YS5zdWJzdHJpbmcoIGluZGV4ICsgMSApLnRyaW0oKSApOwotICAgICAgICAKLSAgICAgICAgaWYoICFuYW1lWyAwIF0uZXF1YWxzKCAibmFtZSIgKSB8fCAhdmFsdWVbIDAgXS5lcXVhbHMoICJ2YWx1ZSIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIFBBUkFNX0VYQ0VQVElPTiApOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9wYXJhbWV0ZXJzLnNldFBhcmFtZXRlciggbmFtZVsgMSBdLCB2YWx1ZVsgMSBdICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhcmFtZXRlcnMoIGZpbmFsIFN0cmluZyBkYXRhLCBmaW5hbCBVUkwgYmFzZVNvdXJjZSApCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhcmFtcyA9IHBhcnNlQXR0cmlidXRlKCBkYXRhICk7Ci0gICAgICAgIGlmKCAhcGFyYW1zWyAwIF0uZXF1YWxzKCAibG9jYXRpb24iICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCBQQVJBTVNfRVhDRVBUSU9OICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKCBiYXNlU291cmNlLCBwYXJhbXNbIDEgXSApOwotICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQgPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKCBpbnB1dCApOwotICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gUGFyYW1ldGVycy5mcm9tUHJvcGVydGllcyggcHJvcGVydGllcyApOwotICAgICAgICAgICAgbV9wYXJhbWV0ZXJzLm1lcmdlKCBwYXJhbWV0ZXJzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbiggIkVycm9yIGxvYWRpbmcgcGFyYW1ldGVyczogIiArIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFN0eWxlc2hlZXQoIGZpbmFsIFN0cmluZyBkYXRhLCBmaW5hbCBVUkwgYmFzZVNvdXJjZSApCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHN0eWxlc2hlZXQgPSBwYXJzZUF0dHJpYnV0ZSggZGF0YSApOwotICAgICAgICBpZiggIXN0eWxlc2hlZXRbIDAgXS5lcXVhbHMoICJocmVmIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbiggU1RZTEVfRVhDRVBUSU9OICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IFVSTCggYmFzZVNvdXJjZSwgc3R5bGVzaGVldFsgMSBdICkudG9TdHJpbmcoKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCAiRXJyb3IgbG9jYXRpbmcgc3R5bGVzaGVldCAnIiArIHN0eWxlc2hlZXRbIDEgXSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgZHVlIHRvICIgKyBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHBhcnNlQXR0cmlidXRlKCBmaW5hbCBTdHJpbmcgZGF0YSApCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vbmFtZT0idmFsdWUiCi0gICAgICAgIGludCBpbmRleCA9IGRhdGEuaW5kZXhPZiggJz0nICk7Ci0gICAgICAgIGlmKCAtMSA9PSBpbmRleCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oICJFeHBlY3RpbmcgYW4gYXR0cmlidXRlIGJ1dCByZWNlaXZlZCAnIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArICInIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBkYXRhLmxlbmd0aCgpOwotICAgICAgICBpZiggJ1wiJyAhPSBkYXRhLmNoYXJBdCggaW5kZXggKyAxICkgfHwgCi0gICAgICAgICAgICAnXCInICE9IGRhdGEuY2hhckF0KCBzaXplIC0gMSApIHx8Ci0gICAgICAgICAgICBzaXplIC0gMSA9PSBpbmRleCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oICJFeHBlY3RpbmcgdGhlIHZhbHVlIG9mIGF0dHJpYnV0ZSAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1YnN0cmluZyggMCwgaW5kZXggKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvIGJlIGVuY2xvc2VkIGluIHF1b3RlcyIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1sgMiBdOwotICAgICAgICByZXN1bHRbIDAgXSA9IGRhdGEuc3Vic3RyaW5nKCAwLCBpbmRleCApOwotICAgICAgICByZXN1bHRbIDEgXSA9IGRhdGEuc3Vic3RyaW5nKCBpbmRleCArIDIsIHNpemUgLSAxICk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvYnVpbGRlci9EZWZhdWx0UHJvamVjdEJ1aWxkZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9idWlsZGVyL0RlZmF1bHRQcm9qZWN0QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDY0YjEwLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9idWlsZGVyL0RlZmF1bHRQcm9qZWN0QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuRXhjZXB0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uU0FYQ29uZmlndXJhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ2dhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMubW9kZWwuRGVmYXVsdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLm1vZGVsLlR5cGVMaWI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLm1vZGVsLlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLm1vZGVsLlRhcmdldDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gY29uc3RydWN0IHByb2plY3QgZnJvbSBhIGJ1aWxkIGZpbGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvamVjdEJ1aWxkZXIKLSAgICBleHRlbmRzIEFic3RyYWN0TG9nZ2FibGUKLSAgICBpbXBsZW1lbnRzIFByb2plY3RCdWlsZGVyCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50ICAgIFBST0pFQ1RfUkVGRVJFTkNFUyAgPSAwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCAgICBMSUJSQVJZX0lNUE9SVFMgICAgID0gMTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgICAgSU1QTElDSVRfVEFTS1MgICAgICA9IDI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50ICAgIFRBUkdFVFMgICAgICAgICAgICAgPSAzOwotCi0gICAgLyoqCi0gICAgICogYnVpbGQgYSBwcm9qZWN0IGZyb20gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZQotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFByb2plY3QKLSAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0IGJ1aWxkKCBmaW5hbCBTdHJpbmcgc291cmNlICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoIHNvdXJjZSApOwotICAgICAgICByZXR1cm4gYnVpbGQoIGZpbGUsIG5ldyBIYXNoTWFwKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb2plY3QgYnVpbGQoIGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgSGFzaE1hcCBwcm9qZWN0cyApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFVSTCBzeXN0ZW1JRCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgZmluYWwgUHJvamVjdCByZXN1bHQgPSAoUHJvamVjdClwcm9qZWN0cy5nZXQoIHN5c3RlbUlELnRvU3RyaW5nKCkgKTsKLSAgICAgICAgaWYoIG51bGwgIT0gcmVzdWx0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFNBWENvbmZpZ3VyYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgU0FYQ29uZmlndXJhdGlvbkhhbmRsZXIoKTsKLQotICAgICAgICBwcm9jZXNzKCBzeXN0ZW1JRCwgaGFuZGxlciApOwotCi0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIGZpbmFsIERlZmF1bHRQcm9qZWN0IHByb2plY3QgPSBidWlsZFByb2plY3QoIGZpbGUsIGNvbmZpZ3VyYXRpb24gKTsKLQotICAgICAgICBwcm9qZWN0cy5wdXQoIHN5c3RlbUlELnRvU3RyaW5nKCksIHByb2plY3QgKTsKLQotICAgICAgICAvL2J1aWxkIHVzaW5nIGFsbCB0b3AtbGV2ZWwgYXR0cmlidXRlcwotICAgICAgICBidWlsZFRvcExldmVsUHJvamVjdCggcHJvamVjdCwgY29uZmlndXJhdGlvbiwgcHJvamVjdHMgKTsKLQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKCBmaW5hbCBVUkwgc3lzdGVtSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNBWENvbmZpZ3VyYXRpb25IYW5kbGVyIGhhbmRsZXIgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICBmaW5hbCBYTUxSZWFkZXIgcGFyc2VyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICBwYXJzZXIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCBmYWxzZSApOwotICAgICAgICBwYXJzZXIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgZmFsc2UgKTsKLSAgICAgICAgLy9wYXJzZXIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKLQotICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoIGhhbmRsZXIgKTsKLSAgICAgICAgcGFyc2VyLnNldEVycm9ySGFuZGxlciggaGFuZGxlciApOwotICAgICAgICBwYXJzZXIucGFyc2UoIHN5c3RlbUlELnRvU3RyaW5nKCkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBidWlsZCBwcm9qZWN0IGZyb20gY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIGZyb20gd2hpY2ggY29uZmlndXJhdGlvbiB3YXMgbG9hZGVkCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gbG9hZGVkCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBQcm9qZWN0Ci0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAZXhjZXB0aW9uIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvamVjdCBidWlsZFByb2plY3QoIGZpbmFsIEZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoICFjb25maWd1cmF0aW9uLmdldE5hbWUoKS5lcXVhbHMoICJwcm9qZWN0IiApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIlByb2plY3QgZmlsZSBtdXN0IGJlIGVuY2xvc2VkIGluIHByb2plY3QgZWxlbWVudCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZ2V0IHByb2plY3QtbGV2ZWwgYXR0cmlidXRlcwotICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZURpcmVjdG9yeU5hbWUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSggImJhc2VkaXIiICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZWZhdWx0VGFyZ2V0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoICJkZWZhdWx0IiApOwotICAgICAgICAvL2ZpbmFsIFN0cmluZyBuYW1lID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOwotCi0gICAgICAgIC8vZGV0ZXJtaW5lIGJhc2UgZGlyZWN0b3J5IGZvciBwcm9qZWN0Ci0gICAgICAgIGZpbmFsIEZpbGUgYmFzZURpcmVjdG9yeSA9Ci0gICAgICAgICAgICAobmV3IEZpbGUoIGZpbGUuZ2V0UGFyZW50RmlsZSgpLCBiYXNlRGlyZWN0b3J5TmFtZSApKS5nZXRBYnNvbHV0ZUZpbGUoKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIlByb2plY3QgIiArIGZpbGUgKyAiIGJhc2UgZGlyZWN0b3J5OiAiICsgYmFzZURpcmVjdG9yeSApOwotCi0gICAgICAgIC8vY3JlYXRlIHByb2plY3QgYW5kIC4uLgotICAgICAgICBmaW5hbCBEZWZhdWx0UHJvamVjdCBwcm9qZWN0ID0gbmV3IERlZmF1bHRQcm9qZWN0KCk7Ci0gICAgICAgIHByb2plY3Quc2V0RGVmYXVsdFRhcmdldE5hbWUoIGRlZmF1bHRUYXJnZXQgKTsKLSAgICAgICAgcHJvamVjdC5zZXRCYXNlRGlyZWN0b3J5KCBiYXNlRGlyZWN0b3J5ICk7Ci0gICAgICAgIC8vcHJvamVjdC5zZXROYW1lKCBuYW1lICk7Ci0KLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIGFsbCB0b3AgbGV2ZWwgZWxlbWVudHMgaW4gY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIENvbmZpZ3VyYXRpb24KLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRUb3BMZXZlbFByb2plY3QoIGZpbmFsIERlZmF1bHRQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSGFzaE1hcCBwcm9qZWN0cyApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCBpbXBsaWNpdFRhc2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uW10gY2hpbGRyZW4gPSBjb25maWd1cmF0aW9uLmdldENoaWxkcmVuKCk7Ci0KLSAgICAgICAgaW50IHN0YXRlID0gUFJPSkVDVF9SRUZFUkVOQ0VTOwotCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGVsZW1lbnQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQotICAgICAgICAgICAgaWYoIFBST0pFQ1RfUkVGRVJFTkNFUyA9PSBzdGF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIG5hbWUuZXF1YWxzKCAicHJvamVjdHJlZiIgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWlsZFByb2plY3RSZWYoIHByb2plY3QsIGVsZW1lbnQsIHByb2plY3RzICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IExJQlJBUllfSU1QT1JUUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBMSUJSQVJZX0lNUE9SVFMgPT0gc3RhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBuYW1lLmVxdWFscyggImltcG9ydCIgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWlsZFR5cGVMaWIoIHByb2plY3QsIGVsZW1lbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU1QTElDSVRfVEFTS1M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggSU1QTElDSVRfVEFTS1MgPT0gc3RhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGFueSBpbXBsaWNpdCB0YXNrcyBoZXJlCi0gICAgICAgICAgICAgICAgaWYoICFuYW1lLmVxdWFscyggInRhcmdldCIgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFRhc2tMaXN0LmFkZCggZWxlbWVudCApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBUQVJHRVRTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIG5hbWUuZXF1YWxzKCAidGFyZ2V0IiApICkgYnVpbGRUYXJnZXQoIHByb2plY3QsIGVsZW1lbnQgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiVW5rbm93biB0b3AtbGV2ZWwgZWxlbWVudCAiICsgbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhdCAiICsgZWxlbWVudC5nZXRMb2NhdGlvbigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiBFeHBlY3RpbmcgdGFyZ2V0IiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbltdIGltcGxpY2l0VGFza3MgPQotICAgICAgICAgICAgKENvbmZpZ3VyYXRpb25bXSlpbXBsaWNpdFRhc2tMaXN0LnRvQXJyYXkoIG5ldyBDb25maWd1cmF0aW9uWyAwIF0gKTsKLQotICAgICAgICBmaW5hbCBUYXJnZXQgaW1wbGljaXRUYXJnZXQgPSBuZXcgVGFyZ2V0KCBudWxsLCBpbXBsaWNpdFRhc2tzLCBudWxsICk7Ci0gICAgICAgIHByb2plY3Quc2V0SW1wbGljaXRUYXJnZXQoIGltcGxpY2l0VGFyZ2V0ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkUHJvamVjdFJlZiggZmluYWwgRGVmYXVsdFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSGFzaE1hcCBwcm9qZWN0cyApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoICJuYW1lIiwgbnVsbCApOwotICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSggImxvY2F0aW9uIiwgbnVsbCApOwotCi0gICAgICAgIGlmKCBudWxsID09IG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiTWFsZm9ybWVkIHByb2plY3RyZWYgd2l0aG91dCBhIG5hbWUgYXR0cmlidXRlIGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRMb2NhdGlvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggIXZhbGlkTmFtZSggbmFtZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIlByb2plY3RyZWYgd2l0aCBhbiBpbnZhbGlkIG5hbWUgYXR0cmlidXRlIGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRMb2NhdGlvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbnVsbCA9PSBsb2NhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJNYWxmb3JtZWQgcHJvamVjdHJlZiB3aXRob3V0IGEgbG9jYXRpb24gYXR0cmlidXRlIGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRMb2NhdGlvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VEaXJlY3RvcnkgPSBwcm9qZWN0LmdldEJhc2VEaXJlY3RvcnkoKTsKLQotICAgICAgICAvL1RPRE86IHN0YW5kYXJkaXplIGFuZCBtaWdyYXRlIHRvIEF2YWxvbi1FeGNhbGlidXIuaW8KLSAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoIGJhc2VEaXJlY3RvcnksIGxvY2F0aW9uICk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHN5c3RlbUlEID0gZmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIFByb2plY3Qgb3RoZXIgPSAoUHJvamVjdClwcm9qZWN0cy5nZXQoIHN5c3RlbUlEICk7Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gb3RoZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdGhlciA9IGJ1aWxkKCBmaWxlLCBwcm9qZWN0cyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvamVjdC5hZGRQcm9qZWN0KCBuYW1lLCBvdGhlciApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZFR5cGVMaWIoIGZpbmFsIERlZmF1bHRQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBlbGVtZW50ICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxpYnJhcnkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSggImxpYnJhcnkiLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoICJuYW1lIiwgbnVsbCApOwotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAidHlwZSIsIG51bGwgKTsKLQotICAgICAgICBpZiggbnVsbCA9PSBsaWJyYXJ5ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIk1hbGZvcm1lZCBpbXBvcnQgd2l0aG91dCBhIGxpYnJhcnkgYXR0cmlidXRlIGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRMb2NhdGlvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbnVsbCA9PSBuYW1lIHx8IG51bGwgPT0gdHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBudWxsICE9IG5hbWUgfHwgbnVsbCAhPSB0eXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiTWFsZm9ybWVkIGltcG9ydCBhdCAiICsgZWxlbWVudC5nZXRMb2NhdGlvbigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiBJZiBuYW1lIG9yIHR5cGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgYm90aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyBtdXN0IGJlIHNwZWNpZmllZC4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9qZWN0LmFkZFR5cGVMaWIoIG5ldyBUeXBlTGliKCBsaWJyYXJ5LCB0eXBlLCBuYW1lICkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZCBhIHRhcmdldCBmcm9tIGNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSB0YXNrIHRoZSBDb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkVGFyZ2V0KCBmaW5hbCBEZWZhdWx0UHJvamVjdCBwcm9qZWN0LCBmaW5hbCBDb25maWd1cmF0aW9uIHRhcmdldCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSggIm5hbWUiLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZXBlbmRzID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSggImRlcGVuZHMiLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZkNvbmRpdGlvbiA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoICJpZiIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHVubGVzc0NvbmRpdGlvbiA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoICJ1bmxlc3MiLCBudWxsICk7Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJEaXNjb3ZlcmVkIHVuLW5hbWVkIHRhcmdldCBhdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRMb2NhdGlvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggIXZhbGlkTmFtZSggbmFtZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIlRhcmdldCB3aXRoIGFuIGludmFsaWQgbmFtZSBhdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRMb2NhdGlvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIlBhcnNpbmcgdGFyZ2V0OiAiICsgbmFtZSApOwotCi0gICAgICAgIGlmKCBudWxsICE9IGlmQ29uZGl0aW9uICYmIG51bGwgIT0gdW5sZXNzQ29uZGl0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIkRpc2NvdmVyZWQgaW52YWxpZCB0YXJnZXQgdGhhdCBoYXMgYm90aCBhIGlmIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmxlc3MgY29uZGl0aW9uIGF0ICIgKyB0YXJnZXQuZ2V0TG9jYXRpb24oKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29uZGl0aW9uIGNvbmRpdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgaWYoIG51bGwgIT0gaWZDb25kaXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIlRhcmdldCBpZiBjb25kaXRpb246ICIgKyBpZkNvbmRpdGlvbiApOwotICAgICAgICAgICAgY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbiggdHJ1ZSwgaWZDb25kaXRpb24gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBudWxsICE9IHVubGVzc0NvbmRpdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiVGFyZ2V0IHVubGVzcyBjb25kaXRpb246ICIgKyB1bmxlc3NDb25kaXRpb24gKTsKLSAgICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oIGZhbHNlLCB1bmxlc3NDb25kaXRpb24gKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGRlcGVuZGVuY2llcyA9IG51bGw7Ci0KLSAgICAgICAgLy9hcHBseSBkZXBlbmRzIGF0dHJpYnV0ZQotICAgICAgICBpZiggbnVsbCAhPSBkZXBlbmRzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZWxlbWVudHMgPSBFeGNlcHRpb25VdGlsLnNwbGl0U3RyaW5nKCBkZXBlbmRzLCAiLCIgKTsKLSAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdCBkZXBlbmRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlcGVuZGVuY3kgPSBlbGVtZW50c1sgaSBdLnRyaW0oKTsKLQotICAgICAgICAgICAgICAgIGlmKCAwID09IGRlcGVuZGVuY3kubGVuZ3RoKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIkRpc2NvdmVyZWQgZW1wdHkgZGVwZW5kZW5jeSBpbiB0YXJnZXQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXROYW1lKCkgKyAiIGF0ICIgKyB0YXJnZXQuZ2V0TG9jYXRpb24oKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiVGFyZ2V0IGRlcGVuZGVuY3k6ICIgKyBkZXBlbmRlbmN5ICk7Ci0gICAgICAgICAgICAgICAgZGVwZW5kc0xpc3QuYWRkKCBkZXBlbmRlbmN5ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IChTdHJpbmdbXSlkZXBlbmRzTGlzdC50b0FycmF5KCBuZXcgU3RyaW5nWyAwIF0gKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFRhcmdldCBkZWZhdWx0VGFyZ2V0ID0KLSAgICAgICAgICAgIG5ldyBUYXJnZXQoIGNvbmRpdGlvbiwgdGFyZ2V0LmdldENoaWxkcmVuKCksIGRlcGVuZGVuY2llcyApOwotCi0gICAgICAgIC8vYWRkIHRhcmdldCB0byBwcm9qZWN0Ci0gICAgICAgIHByb2plY3QuYWRkVGFyZ2V0KCBuYW1lLCBkZWZhdWx0VGFyZ2V0ICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWROYW1lKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBpZiggLTEgIT0gbmFtZS5pbmRleE9mKCAiLT4iICkgKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGVsc2UgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2J1aWxkZXIvUHJvamVjdEJ1aWxkZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9idWlsZGVyL1Byb2plY3RCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTY3NTEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2J1aWxkZXIvUHJvamVjdEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMubW9kZWwuUHJvamVjdDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgY29tcG9uZW50cyB0aGF0IGJ1aWxkIHByb2plY3RzIGZyb20gc291cmNlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9qZWN0QnVpbGRlcgotICAgIGV4dGVuZHMgQ29tcG9uZW50Ci17Ci0gICAgU3RyaW5nIFJPTEUgPSAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmJ1aWxkZXIuUHJvamVjdEJ1aWxkZXIiOwotCi0gICAgLyoqCi0gICAgICogYnVpbGQgYSBwcm9qZWN0IGZyb20gc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlCi0gICAgICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgUHJvamVjdAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQGV4Y2VwdGlvbiBBbnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgUHJvamVjdCBidWlsZCggU3RyaW5nIHNvdXJjZSApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvYnVpbGRlci9SZWFjdG9yUElIYW5kbGVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvYnVpbGRlci9SZWFjdG9yUElIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NWI1MjQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2J1aWxkZXIvUmVhY3RvclBJSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuYnVpbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBIYW5kbGVyIHRoYXQgcmVhY3RzIHRvIFBJcyBiZWZvcmUgZmlyc3QgZWxlbWVudC4KLSAqIEhhdmUgdG8gZG8gaXQgdGhpcyB3YXkgYXMgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgKnNhZmUqIHdheQotICogb2YgcmVkaXJlY3RpbmcgY29udGVudCBoYW5kbGVycyBhdCBydW50aW1lIHdoaWxlIHVzaW5nIHRyYW5zZm9ybWVycy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFJlYWN0b3JQSUhhbmRsZXIKLSAgICBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi17Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgICAgbV90YXJnZXRzICAgID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgQXJyYXlMaXN0ICAgIG1fZGF0YSAgICAgICA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UElDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV90YXJnZXRzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCggZmluYWwgaW50IGluZGV4ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKW1fdGFyZ2V0cy5nZXQoIGluZGV4ICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREYXRhKCBmaW5hbCBpbnQgaW5kZXggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpbV9kYXRhLmdldCggaW5kZXggKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oIGZpbmFsIFN0cmluZyB0YXJnZXQsIGZpbmFsIFN0cmluZyBkYXRhICkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV90YXJnZXRzLmFkZCggdGFyZ2V0ICk7Ci0gICAgICAgIG1fZGF0YS5hZGQoIGRhdGEgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KCBmaW5hbCBTdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMgYXR0cyApCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vV29ya2Fyb3VuZCB0byBzdG9wIFNBWCBwaXBlbGluZQotICAgICAgICB0aHJvdyBuZXcgU3RvcFBhcnNpbmdFeGNlcHRpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvYnVpbGRlci9TdG9wUGFyc2luZ0V4Y2VwdGlvbi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2J1aWxkZXIvU3RvcFBhcnNpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxYmI4Zi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvYnVpbGRlci9TdG9wUGFyc2luZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuYnVpbGRlcjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBEdW1teSBleGNlcHRpb24gdG8gc3RvcCBwYXJzaW5nICJzYWZlbHkiLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1jbGFzcyBTdG9wUGFyc2luZ0V4Y2VwdGlvbgotICAgIGV4dGVuZHMgU0FYRXhjZXB0aW9uCi17Ci0gICAgcHVibGljIFN0b3BQYXJzaW5nRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCAiIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9jb25maWd1cmVyL0NvbmZpZ3VyZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9jb25maWd1cmVyL0NvbmZpZ3VyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxY2I4ZC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvY29uZmlndXJlci9Db25maWd1cmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb25maWd1cmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci0KLS8qKgotICogQ2xhc3MgdXNlZCB0byBjb25maWd1cmUgdGFza3MuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uZmlndXJlcgotICAgIGV4dGVuZHMgQ29tcG9uZW50Ci17Ci0gICAgU3RyaW5nIFJPTEUgPSAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmNvbmZpZ3VyZXIuQ29uZmlndXJlciI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgYW4gb2JqZWN0IGJhc2VkIG9uIGEgY29uZmlndXJhdGlvbiBpbiBhIHBhcnRpY3VsYXIgY29udGV4dC4KLSAgICAgKiBUaGlzIGNvbmZpZ3VyaW5nIGNhbiBiZSBkb25lIGluIGRpZmZlcmVudCB3YXlzIGZvciBkaWZmZXJlbnQKLSAgICAgKiBjb25maWd1cmVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIENvbnRleHQKLSAgICAgKiBAZXhjZXB0aW9uIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgdm9pZCBjb25maWd1cmUoIE9iamVjdCBvYmplY3QsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgbmFtZWQgYXR0cmlidXRlIG9mIG9iamVjdCBpbiBhIHBhcnRpY3VsYXIgY29udGV4dC4KLSAgICAgKiBUaGlzIGNvbmZpZ3VyaW5nIGNhbiBiZSBkb25lIGluIGRpZmZlcmVudCB3YXlzIGZvciBkaWZmZXJlbnQKLSAgICAgKiBjb25maWd1cmVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYXR0cmlidXRlIHZhbHVlCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIENvbnRleHQKLSAgICAgKiBAZXhjZXB0aW9uIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgdm9pZCBjb25maWd1cmUoIE9iamVjdCBvYmplY3QsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2NvbmZpZ3VyZXIvRGVmYXVsdENvbmZpZ3VyZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9jb25maWd1cmVyL0RlZmF1bHRDb25maWd1cmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTU3ZGMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2NvbmZpZ3VyZXIvRGVmYXVsdENvbmZpZ3VyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb25maWd1cmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnByb3BlcnR5LlByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5wcm9wZXJ0eS5Qcm9wZXJ0eVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ2dhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb252ZXJ0ZXIuTWFzdGVyQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyLkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5Db252ZXJ0ZXJFeGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgdXNlZCB0byBjb25maWd1cmUgdGFza3MuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29uZmlndXJlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dnYWJsZQotICAgIGltcGxlbWVudHMgQ29uZmlndXJlciwgQ29tcG9zYWJsZSwgTG9nZ2FibGUKLXsKLSAgICAvLy9Db21waWxlIHRpbWUgY29uc3RhbnQgdG8gdHVybiBvbiBleHRyZW1lIGRlYnVnZ2luZwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gICBERUJVRyAgICAgICAgID0gZmFsc2U7Ci0KLSAgICAvKgotICAgICAqIFRPRE86IFNob3VsZCByZXNlcnZlZCBuYW1lcyBiZSAiY29uZmlndXJhYmxlIiA/Ci0gICAgICovCi0KLSAgICAvLy9BdHRyaWJ1dGUgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgIFJFU0VSVkVEX0FUVFJJQlVURVNbXSA9Ci0gICAgewotICAgICAgICAibG9nZ2VyIgotICAgIH07Ci0KLSAgICAvLy9FbGVtZW50IG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nICBSRVNFUlZFRF9FTEVNRU5UU1tdID0KLSAgICB7Ci0gICAgICAgICJjb250ZW50IgotICAgIH07Ci0KLSAgICAvLy9Db252ZXJ0ZXIgdG8gdXNlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdmFsdWVzCi0gICAgcHJpdmF0ZSBNYXN0ZXJDb252ZXJ0ZXIgICAgICAgIG1fY29udmVydGVyOwotCi0gICAgcHVibGljIHZvaWQgY29tcG9zZSggZmluYWwgQ29tcG9uZW50TWFuYWdlciBjb21wb25lbnRNYW5hZ2VyICkKLSAgICAgICAgdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV9jb252ZXJ0ZXIgPSAoTWFzdGVyQ29udmVydGVyKWNvbXBvbmVudE1hbmFnZXIubG9va3VwKCBNYXN0ZXJDb252ZXJ0ZXIuUk9MRSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSBhIHRhc2sgYmFzZWQgb24gYSBjb25maWd1cmF0aW9uIGluIGEgcGFydGljdWxhciBjb250ZXh0LgotICAgICAqIFRoaXMgY29uZmlndXJpbmcgY2FuIGJlIGRvbmUgaW4gZGlmZmVyZW50IHdheXMgZm9yIGRpZmZlcmVudAotICAgICAqIGNvbmZpZ3VyZXJzLgotICAgICAqIFRoaXMgb25lIGRvZXMgaXQgYnkgZmlyc3QgY2hlY2tpbmcgaWYgb2JqZWN0IGltcGxlbWVudHMgQ29uZmlndXJhYmxlCi0gICAgICogYW5kIGlmIGl0IGRvZXMgd2lsbCBwYXNzIHRoZSB0YXNrIHRoZSBjb25maWd1cmF0aW9uIC0gZWxzZSBpdCB3aWxsIHVzZQotICAgICAqIG1hcHBpbmcgcnVsZXMgdG8gbWFwIGNvbmZpZ3VyYXRpb24gdG8gdHlwZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIENvbnRleHQKLSAgICAgKiBAZXhjZXB0aW9uIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKCBmaW5hbCBPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCBERUJVRyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiQ29uZmlndXJpbmcgIiArIG9iamVjdCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG9iamVjdCBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBERUJVRyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJDb25maWd1cmluZyBvYmplY3QgdmlhIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UiICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICgoQ29uZmlndXJhYmxlKW9iamVjdCkuY29uZmlndXJlKCBjb25maWd1cmF0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggREVCVUcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiQ29uZmlndXJpbmcgb2JqZWN0IHZpYSBDb25maWd1cmFibGUgcmVmbGVjdGlvbiIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gYXR0cmlidXRlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlTmFtZXMoKTsKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzWyBpIF07Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBERUJVRyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkNvbmZpZ3VyaW5nIGF0dHJpYnV0ZSBuYW1lPSIgKyBuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdmFsdWU9IiArIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uZmlndXJlQXR0cmlidXRlKCBvYmplY3QsIG5hbWUsIHZhbHVlLCBjb250ZXh0ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb25bXSBjaGlsZHJlbiA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGRyZW4oKTsKLQotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0KLSAgICAgICAgICAgICAgICBpZiggREVCVUcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJDb25maWd1cmluZyBzdWJlbGVtZW50IG5hbWU9IiArIGNoaWxkLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUVsZW1lbnQoIG9iamVjdCwgY2hpbGQsIGNvbnRleHQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnQgPSBjb25maWd1cmF0aW9uLmdldFZhbHVlKCBudWxsICk7Ci0KLSAgICAgICAgICAgIGlmKCBudWxsICE9IGNvbnRlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhY29udGVudC50cmltKCkuZXF1YWxzKCAiIiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBERUJVRyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiQ29uZmlndXJpbmcgY29udGVudCAiICsgY29udGVudCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlQ29udGVudCggb2JqZWN0LCBjb250ZW50LCBjb250ZXh0ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIG5hbWVkIGF0dHJpYnV0ZSBvZiBvYmplY3QgaW4gYSBwYXJ0aWN1bGFyIGNvbnRleHQuCi0gICAgICogVGhpcyBjb25maWd1cmluZyBjYW4gYmUgZG9uZSBpbiBkaWZmZXJlbnQgd2F5cyBmb3IgZGlmZmVyZW50Ci0gICAgICogY29uZmlndXJlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpYnV0ZSB2YWx1ZQotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBDb250ZXh0Ci0gICAgICogQGV4Y2VwdGlvbiBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZSggZmluYWwgT2JqZWN0IG9iamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNvbmZpZ3VyZUF0dHJpYnV0ZSggb2JqZWN0LCBuYW1lLCB2YWx1ZSwgY29udGV4dCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyeSB0byBjb25maWd1cmUgY29udGVudCBvZiBhbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gY29udGVudCB0aGUgY29udGVudCB2YWx1ZSB0byBiZSBzZXQKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgQ29udGV4dAotICAgICAqIEBleGNlcHRpb24gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlQ29udGVudCggZmluYWwgT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXRWYWx1ZSggb2JqZWN0LCAiYWRkQ29udGVudCIsIGNvbnRlbnQsIGNvbnRleHQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlQXR0cmlidXRlKCBmaW5hbCBPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgKQotICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBSRVNFUlZFRF9BVFRSSUJVVEVTLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIFJFU0VSVkVEX0FUVFJJQlVURVNbIGkgXS5lcXVhbHMoIG5hbWUgKSApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiQ2FuIG5vdCBzcGVjaWZ5IHJlc2VydmVkIGF0dHJpYnV0ZSAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lID0gZ2V0TWV0aG9kTmFtZUZvciggbmFtZSApOwotICAgICAgICBzZXRWYWx1ZSggb2JqZWN0LCBtZXRob2ROYW1lLCB2YWx1ZSwgY29udGV4dCApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZSggZmluYWwgT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIE9NRkcgdGhlIHJlc3Qgb2YgdGhpcyBpcyBzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb28KLSAgICAgICAgLy8gc2xvdy4gTmVlZCB0byBjYWNoZSByZXN1bHRzIHBlciBjbGFzcyBldGMuCi0KLSAgICAgICAgZmluYWwgQ2xhc3MgY2xhenogPSBvYmplY3QuZ2V0Q2xhc3MoKTsKLSAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZHNbXSA9IGdldE1ldGhvZHNGb3IoIGNsYXp6LCBtZXRob2ROYW1lICk7Ci0KLSAgICAgICAgaWYoIDAgPT0gbWV0aG9kcy5sZW5ndGggKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggIlVuYWJsZSB0byBzZXQgYXR0cmlidXRlIHZpYSAiICsgbWV0aG9kTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkdWUgdG8gbm90IGZpbmRpbmcgYW55IGFwcHJvcHJpYXRlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3NvciBtZXRob2QiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRWYWx1ZSggb2JqZWN0LCB2YWx1ZSwgY29udGV4dCwgbWV0aG9kcyApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZSggZmluYWwgT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2RzW10gKQotICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3RWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlVdGlsLnJlc29sdmVQcm9wZXJ0eSggdmFsdWUsIGNvbnRleHQsIGZhbHNlICk7Ci0KLSAgICAgICAgICAgIHNldFZhbHVlKCBvYmplY3QsIG9iamVjdFZhbHVlLCBtZXRob2RzLCBjb250ZXh0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFByb3BlcnR5RXhjZXB0aW9uIHBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oICJFcnJvciByZXNvbHZpbmcgcHJvcGVydHkgIiArIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWUoIGZpbmFsIE9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIENsYXNzIHNvdXJjZUNsYXNzID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZSA9IHNvdXJjZUNsYXNzLmdldE5hbWUoKTsKLQotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggc2V0VmFsdWUoIG9iamVjdCwgdmFsdWUsIG1ldGhvZHNbIGkgXSwgc291cmNlQ2xhc3MsIHNvdXJjZSwgY29udGV4dCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggIlVuYWJsZSB0byBzZXQgYXR0cmlidXRlIHZpYSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHNbIDAgXS5nZXROYW1lKCkgKyAiIGFzIGNvdWxkIG5vdCBjb252ZXJ0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlICsgIiB0byBhIG1hdGNoaW5nIHR5cGUiICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldFZhbHVlKCBmaW5hbCBPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIHNvdXJjZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBwYXJhbWV0ZXJUeXBlID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbIDAgXTsKLSAgICAgICAgaWYoIHBhcmFtZXRlclR5cGUuaXNQcmltaXRpdmUoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcmFtZXRlclR5cGUgPSBnZXRDb21wbGV4VHlwZUZvciggcGFyYW1ldGVyVHlwZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gbV9jb252ZXJ0ZXIuY29udmVydCggcGFyYW1ldGVyVHlwZSwgdmFsdWUsIGNvbnRleHQgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgQ29udmVydGVyRXhjZXB0aW9uIGNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIERFQlVHICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkZhaWxlZCB0byBmaW5kIGNvbnZlcnRlciAiLCBjZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oICJFcnJvciBjb252ZXJ0aW5nIGF0dHJpYnV0ZSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kLmludm9rZSggb2JqZWN0LCBuZXcgT2JqZWN0W10geyB2YWx1ZSB9ICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy9zaG91bGQgbmV2ZXIgaGFwcGVuIC4uLi4KLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiRXJyb3IgcmV0cmlldmluZyBtZXRob2RzIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3QgYWNjZXNzIHNwZWNpZmllcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiRXJyb3IgY2FsbGluZyBtZXRob2QgYXR0cmlidXRlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIGdldENvbXBsZXhUeXBlRm9yKCBmaW5hbCBDbGFzcyBjbGF6eiApCi0gICAgewotICAgICAgICBpZiggU3RyaW5nLmNsYXNzID09IGNsYXp6ICkgcmV0dXJuIFN0cmluZy5jbGFzczsKLSAgICAgICAgZWxzZSBpZiggSW50ZWdlci5UWVBFLmVxdWFscyggY2xhenogKSApIHJldHVybiBJbnRlZ2VyLmNsYXNzOwotICAgICAgICBlbHNlIGlmKCBMb25nLlRZUEUuZXF1YWxzKCBjbGF6eiApICkgcmV0dXJuIExvbmcuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYoIFNob3J0LlRZUEUuZXF1YWxzKCBjbGF6eiApICkgcmV0dXJuIFNob3J0LmNsYXNzOwotICAgICAgICBlbHNlIGlmKCBCeXRlLlRZUEUuZXF1YWxzKCBjbGF6eiApICkgcmV0dXJuIEJ5dGUuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYoIEJvb2xlYW4uVFlQRS5lcXVhbHMoIGNsYXp6ICkgKSByZXR1cm4gQm9vbGVhbi5jbGFzczsKLSAgICAgICAgZWxzZSBpZiggRmxvYXQuVFlQRS5lcXVhbHMoIGNsYXp6ICkgKSByZXR1cm4gRmxvYXQuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYoIERvdWJsZS5UWVBFLmVxdWFscyggY2xhenogKSApIHJldHVybiBEb3VibGUuY2xhc3M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkNhbiBub3QgZ2V0IGNvbXBsZXggdHlwZSBmb3Igbm9uLXByaW1pdGl2ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICIgKyBjbGF6ei5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kW10gZ2V0TWV0aG9kc0ZvciggZmluYWwgQ2xhc3MgY2xhenosIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2RzW10gPSBjbGF6ei5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QgPSBtZXRob2RzWyBpIF07Ci0gICAgICAgICAgICBpZiggbWV0aG9kTmFtZS5lcXVhbHMoIG1ldGhvZC5nZXROYW1lKCkgKSAmJgotICAgICAgICAgICAgICAgIE1ldGhvZC5QVUJMSUMgPT0gKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1ldGhvZC5QVUJMSUMpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggbWV0aG9kLmdldFJldHVyblR5cGUoKS5lcXVhbHMoIFZvaWQuVFlQRSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIHBhcmFtZXRlcnNbXSA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICBpZiggMSA9PSBwYXJhbWV0ZXJzLmxlbmd0aCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKCBtZXRob2QgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoTWV0aG9kW10pbWF0Y2hlcy50b0FycmF5KCBuZXcgTWV0aG9kWzBdICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2RbXSBnZXRDcmVhdGVNZXRob2RzRm9yKCBmaW5hbCBDbGFzcyBjbGF6eiwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZHNbXSA9IGNsYXp6LmdldE1ldGhvZHMoKTsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbIGkgXTsKLSAgICAgICAgICAgIGlmKCBtZXRob2ROYW1lLmVxdWFscyggbWV0aG9kLmdldE5hbWUoKSApICYmCi0gICAgICAgICAgICAgICAgTWV0aG9kLlBVQkxJQyA9PSAobWV0aG9kLmdldE1vZGlmaWVycygpICYgTWV0aG9kLlBVQkxJQykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmKCAhcmV0dXJuVHlwZS5lcXVhbHMoIFZvaWQuVFlQRSApICYmCi0gICAgICAgICAgICAgICAgICAgICFyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3MgcGFyYW1ldGVyc1tdID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAwID09IHBhcmFtZXRlcnMubGVuZ3RoICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQoIG1ldGhvZCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChNZXRob2RbXSltYXRjaGVzLnRvQXJyYXkoIG5ldyBNZXRob2RbMF0gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRNZXRob2ROYW1lRm9yKCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAic2V0IiArIGdldEphdmFOYW1lRm9yKCBhdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEphdmFOYW1lRm9yKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCAnLScgKTsKLSAgICAgICAgaW50IGxhc3QgPSAwOwotCi0gICAgICAgIHdoaWxlKCAtMSAhPSBpbmRleCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkID0gbmFtZS5zdWJzdHJpbmcoIGxhc3QsIGluZGV4ICkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKCB3b3JkLmNoYXJBdCggMCApICkgKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggd29yZC5zdWJzdHJpbmcoIDEsIHdvcmQubGVuZ3RoKCkgKSApOwotICAgICAgICAgICAgbGFzdCA9IGluZGV4ICsgMTsKLSAgICAgICAgICAgIGluZGV4ID0gbmFtZS5pbmRleE9mKCAnLScsIGxhc3QgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGV4ID0gbmFtZS5sZW5ndGgoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHdvcmQgPSBuYW1lLnN1YnN0cmluZyggbGFzdCwgaW5kZXggKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBzYi5hcHBlbmQoIENoYXJhY3Rlci50b1VwcGVyQ2FzZSggd29yZC5jaGFyQXQoIDAgKSApICk7Ci0gICAgICAgIHNiLmFwcGVuZCggd29yZC5zdWJzdHJpbmcoIDEsIHdvcmQubGVuZ3RoKCkgKSApOwotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVFbGVtZW50KCBmaW5hbCBPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgUkVTRVJWRURfRUxFTUVOVFMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggUkVTRVJWRURfQVRUUklCVVRFU1sgaSBdLmVxdWFscyggbmFtZSApICkgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGphdmFOYW1lID0gZ2V0SmF2YU5hbWVGb3IoIG5hbWUgKTsKLQotICAgICAgICAvLyBPTUZHIHRoZSByZXN0IG9mIHRoaXMgaXMgc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vCi0gICAgICAgIC8vIHNsb3cuIE5lZWQgdG8gY2FjaGUgcmVzdWx0cyBwZXIgY2xhc3MgZXRjLgotICAgICAgICBmaW5hbCBDbGFzcyBjbGF6eiA9IG9iamVjdC5nZXRDbGFzcygpOwotICAgICAgICBNZXRob2QgbWV0aG9kc1tdID0gZ2V0TWV0aG9kc0ZvciggY2xhenosICJhZGQiICsgamF2YU5hbWUgKTsKLQotICAgICAgICBpZiggMCAhPSBtZXRob2RzLmxlbmd0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZ3Vlc3MgaXQgaXMgZmlyc3QgbWV0aG9kID8/Pz8KLSAgICAgICAgICAgIGFkZEVsZW1lbnQoIG9iamVjdCwgbWV0aG9kc1sgMCBdLCBjb25maWd1cmF0aW9uLCBjb250ZXh0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRob2RzID0gZ2V0Q3JlYXRlTWV0aG9kc0ZvciggY2xhenosICJjcmVhdGUiICsgamF2YU5hbWUgKTsKLQotICAgICAgICAgICAgaWYoIDAgPT0gbWV0aG9kcy5sZW5ndGggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiVW5hYmxlIHRvIHNldCBhdHRyaWJ1dGUgIiArIGphdmFOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkdWUgdG8gbm90IGZpbmRpbmcgYW55IGFwcHJvcHJpYXRlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzb3IgbWV0aG9kIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2d1ZXNzIGl0IGlzIGZpcnN0IG1ldGhvZCA/Pz8/Ci0gICAgICAgICAgICBjcmVhdGVFbGVtZW50KCBvYmplY3QsIG1ldGhvZHNbIDAgXSwgY29uZmlndXJhdGlvbiwgY29udGV4dCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVsZW1lbnQoIGZpbmFsIE9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgY3JlYXRlZCA9IG1ldGhvZC5pbnZva2UoIG9iamVjdCwgbmV3IE9iamVjdFsgMCBdICk7Ci0gICAgICAgICAgICBjb25maWd1cmUoIGNyZWF0ZWQsIGNvbmZpZ3VyYXRpb24sIGNvbnRleHQgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBjZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiRXJyb3IgY3JlYXRpbmcgc3ViLWVsZW1lbnQiLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRWxlbWVudCggZmluYWwgT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgKQotICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzIGNsYXp6ID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbIDAgXTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjcmVhdGVkID0gY2xhenoubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgY29uZmlndXJlKCBjcmVhdGVkLCBjb25maWd1cmF0aW9uLCBjb250ZXh0ICk7Ci0gICAgICAgICAgICBtZXRob2QuaW52b2tlKCBvYmplY3QsIG5ldyBPYmplY3RbXSB7IGNyZWF0ZWQgfSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGNlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oICJFcnJvciBjcmVhdGluZyBzdWItZWxlbWVudCIsIGUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9jb252ZXJ0ZXIvQ29udmVydGVyUmVnaXN0cnkuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9jb252ZXJ0ZXIvQ29udmVydGVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmYmM2MS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvY29udmVydGVyL0NvbnZlcnRlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHJlZ2lzdHJ5IGZvciBDb252ZXJ0ZXJJbmZvcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb252ZXJ0ZXJSZWdpc3RyeQotICAgIGV4dGVuZHMgQ29tcG9uZW50Ci17Ci0gICAgU3RyaW5nIFJPTEUgPSAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmNvbnZlcnRlci5Db252ZXJ0ZXJSZWdpc3RyeSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBuYW1lIG9mIENvbnZlcnRlckluZm8gdGhhdCBkZXNjcmliZXMgY29udmVydGVyIHRoYXQgY29udmVydHMKLSAgICAgKiBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBjbGFzc25hbWUKLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uIGNsYXNzbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzTmFtZSBvZiBjb252ZXJ0ZXIgb3IgbnVsbCBpZiBub25lIGF2YWlsYWJsZQotICAgICAqLwotICAgIFN0cmluZyBnZXRDb252ZXJ0ZXJOYW1lKCBTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb24gKTsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgY29udmVydGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBjbGFzc05hbWUgb2YgY29udmVydGVyCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGNsYXNzbmFtZQotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gY2xhc3NuYW1lCi0gICAgICovCi0gICAgdm9pZCByZWdpc3RlckNvbnZlcnRlciggU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uICk7Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvY29udmVydGVyL0RlZmF1bHRDb252ZXJ0ZXJSZWdpc3RyeS5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2NvbnZlcnRlci9EZWZhdWx0Q29udmVydGVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkMGRlZi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvY29udmVydGVyL0RlZmF1bHRDb252ZXJ0ZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29udmVydGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBDb252ZXJ0ZXIgcmVnaXN0cnkuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29udmVydGVyUmVnaXN0cnkKLSAgICBpbXBsZW1lbnRzIENvbnZlcnRlclJlZ2lzdHJ5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwICAgICAgbV9tYXBwaW5nICAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJOYW1lKCBmaW5hbCBTdHJpbmcgc291cmNlLCBmaW5hbCBTdHJpbmcgZGVzdGluYXRpb24gKQotICAgIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcCBtYXAgPSAoSGFzaE1hcCltX21hcHBpbmcuZ2V0KCBzb3VyY2UgKTsKLSAgICAgICAgaWYoIG51bGwgPT0gbWFwICkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKW1hcC5nZXQoIGRlc3RpbmF0aW9uICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDb252ZXJ0ZXIoIGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uICkKLSAgICB7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gKEhhc2hNYXApbV9tYXBwaW5nLmdldCggc291cmNlICk7Ci0gICAgICAgIGlmKCBudWxsID09IG1hcCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBtX21hcHBpbmcucHV0KCBzb3VyY2UsIG1hcCApOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFwLnB1dCggZGVzdGluYXRpb24sIGNsYXNzTmFtZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9jb252ZXJ0ZXIvRGVmYXVsdE1hc3RlckNvbnZlcnRlci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2NvbnZlcnRlci9EZWZhdWx0TWFzdGVyQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NTc5NjguLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2NvbnZlcnRlci9EZWZhdWx0TWFzdGVyQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29udmVydGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dnYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29udmVydGVyLk1hc3RlckNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5UeXBlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyLkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5Db252ZXJ0ZXJFeGNlcHRpb247Ci0KLS8qKgotICogQ29udmVydGVyIGVuZ2luZSB0byBoYW5kbGUgY29udmVydGluZyBiZXR3ZWVuIHR5cGVzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1hc3RlckNvbnZlcnRlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dnYWJsZQotICAgIGltcGxlbWVudHMgTWFzdGVyQ29udmVydGVyLCBDb21wb3NhYmxlCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRyAgICAgICAgICAgICAgICA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBDb252ZXJ0ZXJSZWdpc3RyeSAgICBtX3JlZ2lzdHJ5OwotICAgIHByaXZhdGUgVHlwZUZhY3RvcnkgICAgICAgICAgbV9mYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgcmVsZXZlbnQgc2VydmljZXMgbmVlZGVkIHRvIGRlcGxveS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb25lbnRNYW5hZ2VyIHRoZSBDb21wb25lbnRNYW5hZ2VyCi0gICAgICogQGV4Y2VwdGlvbiBDb21wb25lbnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29tcG9zZSggZmluYWwgQ29tcG9uZW50TWFuYWdlciBjb21wb25lbnRNYW5hZ2VyICkKLSAgICAgICAgdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV9yZWdpc3RyeSA9IChDb252ZXJ0ZXJSZWdpc3RyeSljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggQ29udmVydGVyUmVnaXN0cnkuUk9MRSApOwotCi0gICAgICAgIGZpbmFsIFR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyID0gKFR5cGVNYW5hZ2VyKWNvbXBvbmVudE1hbmFnZXIubG9va3VwKCBUeXBlTWFuYWdlci5ST0xFICk7Ci0gICAgICAgIHRyeSB7IG1fZmFjdG9yeSA9IHR5cGVNYW5hZ2VyLmdldEZhY3RvcnkoIENvbnZlcnRlci5ST0xFICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFR5cGVFeGNlcHRpb24gdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcG9uZW50RXhjZXB0aW9uKCAiVW5hYmxlIHRvIHJldHJpZXZlIGZhY3RvcnkgZnJvbSBUeXBlTWFuYWdlciIsIHRlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IG9iamVjdCB0byBkZXN0aW5hdGlvbiB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiB0eXBlCi0gICAgICogQHBhcmFtIG9yaWdpbmFsIHRoZSBvcmlnaW5hbCBvYmplY3QKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBpbiB3aGljaCB0byBjb252ZXJ0Ci0gICAgICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdAotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY29udmVydCggQ2xhc3MgZGVzdGluYXRpb24sIGZpbmFsIE9iamVjdCBvcmlnaW5hbCwgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQ2xhc3Mgb3JpZ2luYWxDbGFzcyA9IG9yaWdpbmFsLmdldENsYXNzKCk7Ci0KLSAgICAgICAgaWYoIGRlc3RpbmF0aW9uLmlzQXNzaWduYWJsZUZyb20oIG9yaWdpbmFsQ2xhc3MgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBERUJVRyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiTG9va2luZyBmb3IgY29udmVydGVyIGZyb20gIiArIG9yaWdpbmFsQ2xhc3MuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvICIgKyBkZXN0aW5hdGlvbi5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vVE9ETzogU3RhcnQgc2VhcmNoaW5nIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmb3IgY29udmVydGVyCi0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbV9yZWdpc3RyeS5nZXRDb252ZXJ0ZXJOYW1lKCBvcmlnaW5hbENsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmdldE5hbWUoKSApOwotCi0gICAgICAgIGlmKCBudWxsID09IG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKCAiVW5hYmxlIHRvIGZpbmQgY29udmVydGVyIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQ2xhc3MuZ2V0TmFtZSgpICsgIiB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmdldE5hbWUoKSArICIgY29udmVyc2lvbiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1RPRE86IFN0YXJ0IGNhY2hpbmcgY29udmVydGVycyBpbnN0ZWFkIG9mIHJlcGVhdGVkbHkgaW5zdGFudGlhdGluZyBlbS4KLSAgICAgICAgICAgIGZpbmFsIENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoQ29udmVydGVyKW1fZmFjdG9yeS5jcmVhdGUoIG5hbWUgKTsKLQotCi0gICAgICAgICAgICBpZiggREVCVUcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiRm91bmQgQ29udmVydGVyOiAiICsgY29udmVydGVyICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydCggZGVzdGluYXRpb24sIG9yaWdpbmFsLCBjb250ZXh0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFR5cGVFeGNlcHRpb24gdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKCAiQmFkbHkgY29uZmlndXJlZCBUeXBlTWFuYWdlciBtaXNzaW5nICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnZlcnRlciBkZWZpbml0aW9uIiwgdGUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9jb252ZXJ0ZXIvTWFzdGVyQ29udmVydGVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvY29udmVydGVyL01hc3RlckNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmNmOWMwLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9jb252ZXJ0ZXIvTWFzdGVyQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5Db252ZXJ0ZXI7Ci0KLS8qKgotICogTWFzdGVyIENvbnZlcnRlciB0byBoYW5kbGUgY29udmVydGluZyBiZXR3ZWVuIHR5cGVzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hc3RlckNvbnZlcnRlcgotICAgIGV4dGVuZHMgQ29tcG9uZW50LCBDb252ZXJ0ZXIKLXsKLSAgICBTdHJpbmcgUk9MRSA9ICJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29udmVydGVyLk1hc3RlckNvbnZlcnRlciI7Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZGVwbG95ZXIvRGVmYXVsdERlcGxveWVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZGVwbG95ZXIvRGVmYXVsdERlcGxveWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MmRlMTUuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2RlcGxveWVyL0RlZmF1bHREZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmRlcGxveWVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uU0FYQ29uZmlndXJhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ2dhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmNvbnZlcnRlci5Db252ZXJ0ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5EZWZhdWx0VHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnJvbGUuUm9sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQ29udmVydGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZXBsb3lzIGEgLnRzayBmaWxlIGludG8gYSByZWdpc3RyeS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHREZXBsb3llcgotICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dnYWJsZQotICAgIGltcGxlbWVudHMgRGVwbG95ZXIsIEluaXRpYWxpemFibGUsIENvbXBvc2FibGUKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9ERVNDUklQVE9SID0gIk1FVEEtSU5GL2FudC10eXBlcy54bWwiOwotCi0gICAgcHJpdmF0ZSBDb252ZXJ0ZXJSZWdpc3RyeSAgICAgICAgICAgIG1fY29udmVydGVyUmVnaXN0cnk7Ci0gICAgcHJpdmF0ZSBUeXBlTWFuYWdlciAgICAgICAgICAgICAgICAgIG1fdHlwZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBSb2xlTWFuYWdlciAgICAgICAgICAgICAgICAgIG1fcm9sZU1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSByZWxldmVudCBzZXJ2aWNlcyBuZWVkZWQgdG8gZGVwbG95LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvbmVudE1hbmFnZXIgdGhlIENvbXBvbmVudE1hbmFnZXIKLSAgICAgKiBAZXhjZXB0aW9uIENvbXBvbmVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb21wb3NlKCBmaW5hbCBDb21wb25lbnRNYW5hZ2VyIGNvbXBvbmVudE1hbmFnZXIgKQotICAgICAgICB0aHJvd3MgQ29tcG9uZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBtX2NvbnZlcnRlclJlZ2lzdHJ5ID0gKENvbnZlcnRlclJlZ2lzdHJ5KWNvbXBvbmVudE1hbmFnZXIubG9va3VwKCBDb252ZXJ0ZXJSZWdpc3RyeS5ST0xFICk7Ci0gICAgICAgIG1fdHlwZU1hbmFnZXIgPSAoVHlwZU1hbmFnZXIpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIFR5cGVNYW5hZ2VyLlJPTEUgKTsKLSAgICAgICAgbV9yb2xlTWFuYWdlciA9IChSb2xlTWFuYWdlciljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggUm9sZU1hbmFnZXIuUk9MRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICBmaW5hbCBYTUxSZWFkZXIgcGFyc2VyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICAvL3BhcnNlci5zZXRGZWF0dXJlKCAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgU0FYQ29uZmlndXJhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBTQVhDb25maWd1cmF0aW9uSGFuZGxlcigpOwotICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoIGhhbmRsZXIgKTsKLSAgICAgICAgcGFyc2VyLnNldEVycm9ySGFuZGxlciggaGFuZGxlciApOwotCi0gICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICBmaW5hbCBEZWZhdWx0VHlwZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEZWZhdWx0VHlwZUZhY3RvcnkoIGNsYXNzTG9hZGVyICk7Ci0KLSAgICAgICAgZmluYWwgRW51bWVyYXRpb24gZW51bSA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlcyggRGVwbG95bWVudC5ERVNDUklQVE9SX05BTUUgKTsKLSAgICAgICAgd2hpbGUoIGVudW0uaGFzTW9yZUVsZW1lbnRzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBVUkwgdXJsID0gKFVSTCllbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoIHVybC50b1N0cmluZygpICk7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggImRlcGxveWluZyAiICsgdXJsICk7Ci0gICAgICAgICAgICBkZXBsb3lGcm9tRGVzY3JpcHRvciggaGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCksIGNsYXNzTG9hZGVyLCB1cmwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlcGxveSggZmluYWwgRmlsZSBmaWxlICkKLSAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLmluZm8oICJEZXBsb3lpbmcgQW50TGliIGZpbGUgKCIgKyBmaWxlICsgIikiICk7Ci0KLSAgICAgICAgY2hlY2tGaWxlKCBmaWxlICk7Ci0KLSAgICAgICAgZmluYWwgRGVwbG95bWVudCBkZXBsb3ltZW50ID0gbmV3IERlcGxveW1lbnQoIGZpbGUgKTsKLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yID0gZGVwbG95bWVudC5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGZpbmFsIFVSTFtdIHVybHMgPSBuZXcgVVJMW10geyBkZXBsb3ltZW50LmdldFVSTCgpIH07Ci0gICAgICAgIGZpbmFsIFVSTENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gCi0gICAgICAgICAgICBuZXcgVVJMQ2xhc3NMb2FkZXIoIHVybHMsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZGVwbG95RnJvbURlc2NyaXB0b3IoIGRlc2NyaXB0b3IsIGNsYXNzTG9hZGVyLCBkZXBsb3ltZW50LmdldFVSTCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIERlcGxveW1lbnRFeGNlcHRpb24gZGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBkZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbiggIkVycm9yIGRlcGxveWluZyBsaWJyYXJ5IiwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVwbG95Q29udmVydGVyKCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRmlsZSBmaWxlICkKLSAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNoZWNrRmlsZSggZmlsZSApOwotCi0gICAgICAgIGZpbmFsIERlcGxveW1lbnQgZGVwbG95bWVudCA9IG5ldyBEZXBsb3ltZW50KCBmaWxlICk7Ci0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciA9IGRlcGxveW1lbnQuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICBmaW5hbCBEZWZhdWx0VHlwZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEZWZhdWx0VHlwZUZhY3RvcnkoIGRlcGxveW1lbnQuZ2V0VVJMKCkgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbltdIGNvbnZlcnRlcnMgPQotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZ2V0Q2hpbGQoICJjb252ZXJ0ZXJzIiApLmdldENoaWxkcmVuKCAiY29udmVydGVyIiApOwotCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNvbnZlcnRlcnMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBjb252ZXJ0ZXJzWyBpIF0uZ2V0QXR0cmlidXRlKCAiY2xhc3NuYW1lIiApLmVxdWFscyggbmFtZSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbnZlcnRlciggY29udmVydGVyc1sgaSBdLCBmYWN0b3J5ICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBjZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCAiTWFsZm9ybWVkIHRhc2tkZWZzLnhtbCIsIGNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oICJGYWlsZWQgdG8gZGVwbG95ICIgKyBuYW1lLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lUeXBlKCBmaW5hbCBTdHJpbmcgcm9sZSwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEZpbGUgZmlsZSApCi0gICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGVja0ZpbGUoIGZpbGUgKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgc2hvcnRoYW5kID0gZ2V0TmFtZUZvclJvbGUoIHJvbGUgKTsKLSAgICAgICAgZmluYWwgRGVwbG95bWVudCBkZXBsb3ltZW50ID0gbmV3IERlcGxveW1lbnQoIGZpbGUgKTsKLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yID0gZGVwbG95bWVudC5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGZpbmFsIERlZmF1bHRUeXBlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERlZmF1bHRUeXBlRmFjdG9yeSggZGVwbG95bWVudC5nZXRVUkwoKSApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uW10gZGF0YXR5cGVzID0KLSAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldENoaWxkKCAidHlwZXMiICkuZ2V0Q2hpbGRyZW4oIHNob3J0aGFuZCApOwotCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGRhdGF0eXBlcy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGRhdGF0eXBlc1sgaSBdLmdldEF0dHJpYnV0ZSggIm5hbWUiICkuZXF1YWxzKCBuYW1lICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSggcm9sZSwgZGF0YXR5cGVzWyBpIF0sIGZhY3RvcnkgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGNlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oICJNYWxmb3JtZWQgdGFza2RlZnMueG1sIiwgY2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbiggIkZhaWxlZCB0byBkZXBsb3kgIiArIG5hbWUsIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXBsb3lGcm9tRGVzY3JpcHRvciggZmluYWwgQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkwgdXJsICkKLSAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24sIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vSGF2ZSB0byBrZWVwIGEgbmV3IGZhY3RvcnkgcGVyIHJvbGUKLSAgICAgICAgICAgIC8vVG8gYXZvaWQgbmFtZSBjbGFzaGVzIChpZSBhIGRhdGF0eXBlIGFuZCB0YXNrIHdpdGggc2FtZSBuYW1lKQotICAgICAgICAgICAgZmluYWwgSGFzaE1hcCBmYWN0b3J5cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb25bXSB0eXBlcyA9IGRlc2NyaXB0b3IuZ2V0Q2hpbGQoICJ0eXBlcyIgKS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSB0eXBlc1sgaSBdLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcm9sZSA9IGdldFJvbGVGb3JOYW1lKCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRGVmYXVsdFR5cGVGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCByb2xlLCBjbGFzc0xvYWRlciwgZmFjdG9yeXMgKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKCByb2xlLCB0eXBlc1sgaSBdLCBmYWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIERlZmF1bHRUeXBlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERlZmF1bHRUeXBlRmFjdG9yeSggY2xhc3NMb2FkZXIgKTsKLSAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb25bXSBjb252ZXJ0ZXJzID0gZGVzY3JpcHRvci5nZXRDaGlsZCggImNvbnZlcnRlcnMiICkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY29udmVydGVycy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBjb252ZXJ0ZXJzWyBpIF0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGhhbmRsZUNvbnZlcnRlciggY29udmVydGVyc1sgaSBdLCBmYWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIERlcGxveW1lbnRFeGNlcHRpb24gZGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBkZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbiggIkVycm9yIGRlcGxveWluZyBsaWJyYXJ5IGZyb20gIiArIHVybCwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEZWZhdWx0VHlwZUZhY3RvcnkgZ2V0RmFjdG9yeSggZmluYWwgU3RyaW5nIHJvbGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIYXNoTWFwIGZhY3RvcnlzICkKLSAgICB7Ci0gICAgICAgIERlZmF1bHRUeXBlRmFjdG9yeSBmYWN0b3J5ID0gKERlZmF1bHRUeXBlRmFjdG9yeSlmYWN0b3J5cy5nZXQoIHJvbGUgKTsKLQotICAgICAgICBpZiggbnVsbCA9PSBmYWN0b3J5ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBEZWZhdWx0VHlwZUZhY3RvcnkoIGNsYXNzTG9hZGVyICk7Ci0gICAgICAgICAgICBmYWN0b3J5cy5wdXQoIHJvbGUsIGZhY3RvcnkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWN0b3J5OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5hbWVGb3JSb2xlKCBmaW5hbCBTdHJpbmcgcm9sZSApCi0gICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IG1fcm9sZU1hbmFnZXIuZ2V0TmFtZUZvclJvbGUoIHJvbGUgKTsKLQotICAgICAgICBpZiggbnVsbCA9PSBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oICJSb2xlTWFuYWdlciBkb2VzIG5vdCBrbm93IG5hbWUgZm9yIHJvbGUgIiArIHJvbGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFJvbGVGb3JOYW1lKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcm9sZSA9IG1fcm9sZU1hbmFnZXIuZ2V0Um9sZUZvck5hbWUoIG5hbWUgKTsKLQotICAgICAgICBpZiggbnVsbCA9PSByb2xlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oICJSb2xlTWFuYWdlciBkb2VzIG5vdCBrbm93IHJvbGUgZm9yIG5hbWUgIiArIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByb2xlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZpbGUoIGZpbmFsIEZpbGUgZmlsZSApCi0gICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggIWZpbGUuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbiggIkNvdWxkIG5vdCBmaW5kIGFwcGxpY2F0aW9uIGFyY2hpdmUgYXQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCAiQ291bGQgbm90IGZpbmQgYXBwbGljYXRpb24gYXJjaGl2ZSBhdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlICsgIiBhcyBpdCBpcyBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29udmVydGVyKCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbnZlcnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZWZhdWx0VHlwZUZhY3RvcnkgZmFjdG9yeSApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gY29udmVydGVyLmdldEF0dHJpYnV0ZSggImNsYXNzbmFtZSIgKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZSA9IGNvbnZlcnRlci5nZXRBdHRyaWJ1dGUoICJzb3VyY2UiICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZXN0aW5hdGlvbiA9IGNvbnZlcnRlci5nZXRBdHRyaWJ1dGUoICJkZXN0aW5hdGlvbiIgKTsKLQotICAgICAgICBtX2NvbnZlcnRlclJlZ2lzdHJ5LnJlZ2lzdGVyQ29udmVydGVyKCBuYW1lLCBzb3VyY2UsIGRlc3RpbmF0aW9uICk7Ci0KLSAgICAgICAgZmFjdG9yeS5hZGROYW1lQ2xhc3NNYXBwaW5nKCBuYW1lLCBuYW1lICk7Ci0gICAgICAgIG1fdHlwZU1hbmFnZXIucmVnaXN0ZXJUeXBlKCBDb252ZXJ0ZXIuUk9MRSwgbmFtZSwgZmFjdG9yeSApOwotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiUmVnaXN0ZXJlZCBjb252ZXJ0ZXIgIiArIG5hbWUgKyAiIHRoYXQgY29udmVydHMgZnJvbSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSArICIgdG8gIiArIGRlc3RpbmF0aW9uICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVR5cGUoIGZpbmFsIFN0cmluZyByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlZmF1bHRUeXBlRmFjdG9yeSBmYWN0b3J5ICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSB0eXBlLmdldEF0dHJpYnV0ZSggIm5hbWUiICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEF0dHJpYnV0ZSggImNsYXNzbmFtZSIgKTsKLQotICAgICAgICBmYWN0b3J5LmFkZE5hbWVDbGFzc01hcHBpbmcoIG5hbWUsIGNsYXNzTmFtZSApOwotICAgICAgICBtX3R5cGVNYW5hZ2VyLnJlZ2lzdGVyVHlwZSggcm9sZSwgbmFtZSwgZmFjdG9yeSApOwotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiUmVnaXN0ZXJlZCAiICsgcm9sZSArICIvIiArIG5hbWUgKyAiIGFzICIgKyBjbGFzc05hbWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZGVwbG95ZXIvRGVwbG95ZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9kZXBsb3llci9EZXBsb3llci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzRlODc4Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9kZXBsb3llci9EZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZGVwbG95ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZXBsb3lzIGEgLnRzayBmaWxlIGludG8gYSByZWdpc3RyeS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZXBsb3llcgotICAgIGV4dGVuZHMgQ29tcG9uZW50Ci17Ci0gICAgU3RyaW5nIFJPTEUgPSAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmRlcGxveWVyLkRlcGxveWVyIjsKLQotICAgIC8qKgotICAgICAqIERlcGxveSBhIGxpYnJhcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBkZXBsb3ltZW50Ci0gICAgICogQGV4Y2VwdGlvbiBEZXBsb3ltZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHZvaWQgZGVwbG95KCBGaWxlIGZpbGUgKQotICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbjsKLQotICAgIHZvaWQgZGVwbG95Q29udmVydGVyKCBTdHJpbmcgbmFtZSwgRmlsZSBmaWxlICkKLSAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb247Ci0KLSAgICB2b2lkIGRlcGxveVR5cGUoIFN0cmluZyByb2xlLCBTdHJpbmcgbmFtZSwgRmlsZSBmaWxlICkKLSAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZGVwbG95ZXIvRGVwbG95bWVudC5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2RlcGxveWVyL0RlcGxveW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllMWNkOS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZGVwbG95ZXIvRGVwbG95bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZGVwbG95ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLlNBWENvbmZpZ3VyYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZXBsb3lzIGEgLnRzayBmaWxlIGludG8gYSByZWdpc3RyeS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIERlcGxveW1lbnQKLXsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgIERFU0NSSVBUT1JfTkFNRSAgICAgPSAiTUVUQS1JTkYvYW50LWRlc2NyaXB0b3IueG1sIjsKLQotICAgIHByaXZhdGUgRmlsZSAgICAgICAgICAgIG1fZmlsZTsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiAgIG1fZGVzY3JpcHRvcjsKLQotICAgIHB1YmxpYyBEZXBsb3ltZW50KCBmaW5hbCBGaWxlIGZpbGUgKQotICAgIHsKLSAgICAgICAgbV9maWxlID0gZmlsZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0RGVzY3JpcHRvcigpCi0gICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggbnVsbCA9PSBtX2Rlc2NyaXB0b3IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2Rlc2NyaXB0b3IgPSBidWlsZERlc2NyaXB0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtX2Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRVUkwoKQotICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIG1fZmlsZS5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkwoKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgSU9FeGNlcHRpb24gaW9lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oICJVbmFibGUgdG8gZm9ybSB1cmwiLCBpb2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBidWlsZERlc2NyaXB0b3IoKQotICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN5c3RlbUlEID0gImphcjoiICsgZ2V0VVJMKCkgKyAiIS8iICsgREVTQ1JJUFRPUl9OQU1FOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBmaW5hbCBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4UGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIFhNTFJlYWRlciBwYXJzZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgICAgICAvL3BhcnNlci5zZXRGZWF0dXJlKCAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIGZhbHNlICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFNBWENvbmZpZ3VyYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgU0FYQ29uZmlndXJhdGlvbkhhbmRsZXIoKTsKLSAgICAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlciggaGFuZGxlciApOwotICAgICAgICAgICAgcGFyc2VyLnNldEVycm9ySGFuZGxlciggaGFuZGxlciApOwotCi0gICAgICAgICAgICBwYXJzZXIucGFyc2UoIHN5c3RlbUlEICk7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFNBWEV4Y2VwdGlvbiBzZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCAiTWFsZm9ybWVkIGNvbmZpZ3VyYXRpb24gZGF0YSIsIHNlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oICJFcnJvciBjb25maWd1cmluZyBwYXJzZXIiLCBwY2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgSU9FeGNlcHRpb24gaW9lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oICJFcnJvciByZWFkaW5nIGNvbmZpZ3VyYXRpb24iLCBpb2UgKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2RlcGxveWVyL0RlcGxveW1lbnRFeGNlcHRpb24uamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9kZXBsb3llci9EZXBsb3ltZW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODgxZjguLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2RlcGxveWVyL0RlcGxveW1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmRlcGxveWVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLkNhc2NhZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBFeGNlcHRpb24gdG8gaW5kaWNhdGUgZXJyb3IgZGVwbG95aW5nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVwbG95bWVudEV4Y2VwdGlvbgotICAgIGV4dGVuZHMgQ2FzY2FkaW5nRXhjZXB0aW9uCi17Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPkRlcGxveW1lbnRFeGNlcHRpb248L2NvZGU+IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVwbG95bWVudEV4Y2VwdGlvbiggZmluYWwgU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgICAgdGhpcyggbWVzc2FnZSwgbnVsbCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5EZXBsb3ltZW50RXhjZXB0aW9uPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIHRocm93YWJsZSB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIERlcGxveW1lbnRFeGNlcHRpb24oIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlLCB0aHJvd2FibGUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZW1iZWRkb3IvRGVmYXVsdEVtYmVkZG9yLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZW1iZWRkb3IvRGVmYXVsdEVtYmVkZG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGVjMDQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2VtYmVkZG9yL0RlZmF1bHRFbWJlZGRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmVtYmVkZG9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5leGNhbGlidXIuaW8uRXh0ZW5zaW9uRmlsZUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5leGNhbGlidXIuaW8uRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuRGVmYXVsdENvbXBvbmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ2dhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcml6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLkphdmFWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5hc3BlY3QuQXNwZWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuYnVpbGRlci5Qcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29uZmlndXJlci5Db25maWd1cmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb252ZXJ0ZXIuQ29udmVydGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmNvbnZlcnRlci5NYXN0ZXJDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmRlcGxveWVyLkRlcGxveWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5kZXBsb3llci5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5leGVjdXRvci5FeGVjdXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMud29ya3NwYWNlLldvcmtzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMubW9kZWwuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMucm9sZS5Sb2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5UeXBlTWFuYWdlcjsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEVtYmVkZG9yLgotICogSW5zdGFudGlhdGUgdGhpcyB0byBlbWJlZCBpbnNpZGUgb3RoZXIgYXBwbGljYXRpb25zLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVtYmVkZG9yCi0gICAgZXh0ZW5kcyBBYnN0cmFjdExvZ2dhYmxlCi0gICAgaW1wbGVtZW50cyBFbWJlZGRvcgotewotICAgIHByaXZhdGUgRGVwbG95ZXIgICAgICAgICAgICAgICAgIG1fZGVwbG95ZXI7Ci0gICAgcHJpdmF0ZSBSb2xlTWFuYWdlciAgICAgICAgICAgICAgbV9yb2xlTWFuYWdlcjsKLQotICAgIHByaXZhdGUgQXNwZWN0TWFuYWdlciAgICAgICAgICAgIG1fYXNwZWN0TWFuYWdlcjsKLSAgICBwcml2YXRlIFR5cGVNYW5hZ2VyICAgICAgICAgICAgICBtX3R5cGVNYW5hZ2VyOwotICAgIHByaXZhdGUgTWFzdGVyQ29udmVydGVyICAgICAgICAgIG1fY29udmVydGVyOwotICAgIHByaXZhdGUgQ29udmVydGVyUmVnaXN0cnkgICAgICAgIG1fY29udmVydGVyUmVnaXN0cnk7Ci0KLSAgICBwcml2YXRlIEV4ZWN1dG9yICAgICAgICAgICAgICAgICBtX2V4ZWN1dG9yOwotICAgIHByaXZhdGUgQ29uZmlndXJlciAgICAgICAgICAgICAgIG1fY29uZmlndXJlcjsKLQotICAgIHByaXZhdGUgRGVmYXVsdENvbXBvbmVudE1hbmFnZXIgIG1fY29tcG9uZW50TWFuYWdlcjsKLSAgICBwcml2YXRlIFBhcmFtZXRlcnMgICAgICAgICAgICAgICBtX3BhcmFtZXRlcnM7Ci0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJzICAgICAgICAgICAgICAgbV9kZWZhdWx0czsKLQotICAgIHByaXZhdGUgRmlsZSAgICAgICAgICAgICAgICAgICAgIG1faG9tZURpcjsKLSAgICBwcml2YXRlIEZpbGUgICAgICAgICAgICAgICAgICAgICBtX2JpbkRpcjsKLSAgICBwcml2YXRlIEZpbGUgICAgICAgICAgICAgICAgICAgICBtX2xpYkRpcjsKLSAgICBwcml2YXRlIEZpbGUgICAgICAgICAgICAgICAgICAgICBtX3Rhc2tMaWJEaXI7Ci0KLSAgICAvKioKLSAgICAgKiBTZXR1cCBiYXNpYyBwcm9wZXJ0aWVzIG9mIGVuZ2luZS4KLSAgICAgKiBDYWxsZWQgYmVmb3JlIGluaXQoKSBhbmQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbHRlcm5hdGUgY29tcG9uZW50cyBpbiBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcmFtZXRlcml6ZSggZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzICkKLSAgICB7Ci0gICAgICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2plY3QgY3JlYXRlUHJvamVjdCggZmluYWwgU3RyaW5nIGxvY2F0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIG51bGwgPT0gdHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGUgPSBndWVzc1R5cGVGb3IoIGxvY2F0aW9uICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBQcm9qZWN0QnVpbGRlciBidWlsZGVyID0gZ2V0UHJvamVjdEJ1aWxkZXIoIHR5cGUsIHBhcmFtZXRlcnMgKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoIGxvY2F0aW9uICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ3Vlc3NUeXBlRm9yKCBmaW5hbCBTdHJpbmcgbG9jYXRpb24gKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZpbGVVdGlsLmdldEV4dGVuc2lvbiggbG9jYXRpb24gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb2plY3RCdWlsZGVyIGdldFByb2plY3RCdWlsZGVyKCBmaW5hbCBTdHJpbmcgdHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBmaW5hbCBUeXBlRmFjdG9yeSBmYWN0b3J5ID0gbV90eXBlTWFuYWdlci5nZXRGYWN0b3J5KCBQcm9qZWN0QnVpbGRlci5ST0xFICk7Ci0gICAgICAgIGZpbmFsIFByb2plY3RCdWlsZGVyIGJ1aWxkZXIgPSAoUHJvamVjdEJ1aWxkZXIpZmFjdG9yeS5jcmVhdGUoIHR5cGUgKTsKLQotICAgICAgICBzZXR1cExvZ2dlciggYnVpbGRlciApOwotCi0gICAgICAgIGlmKCBidWlsZGVyIGluc3RhbmNlb2YgQ29tcG9zYWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoQ29tcG9zYWJsZSlidWlsZGVyKS5jb21wb3NlKCBtX2NvbXBvbmVudE1hbmFnZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBidWlsZGVyIGluc3RhbmNlb2YgUGFyYW1ldGVyaXphYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgKChQYXJhbWV0ZXJpemFibGUpYnVpbGRlcikucGFyYW1ldGVyaXplKCBwYXJhbWV0ZXJzICk7Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgICAgIGlmKCBidWlsZGVyIGluc3RhbmNlb2YgSW5pdGlhbGl6YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoSW5pdGlhbGl6YWJsZSlidWlsZGVyKS5pbml0aWFsaXplKCk7Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBXb3Jrc3BhY2UgY3JlYXRlV29ya3NwYWNlKCBmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgY29tcG9uZW50ID0gZ2V0UGFyYW1ldGVyKCBXb3Jrc3BhY2UuUk9MRSApOwotICAgICAgICBmaW5hbCBXb3Jrc3BhY2Ugd29ya3NwYWNlID0gCi0gICAgICAgICAgICAoV29ya3NwYWNlKWNyZWF0ZUNvbXBvbmVudCggY29tcG9uZW50LCBXb3Jrc3BhY2UuY2xhc3MgKTsKLQotICAgICAgICBzZXR1cExvZ2dlciggd29ya3NwYWNlICk7Ci0KLQotICAgICAgICBpZiggd29ya3NwYWNlIGluc3RhbmNlb2YgQ29tcG9zYWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoQ29tcG9zYWJsZSl3b3Jrc3BhY2UpLmNvbXBvc2UoIG1fY29tcG9uZW50TWFuYWdlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHdvcmtzcGFjZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoUGFyYW1ldGVyaXphYmxlKXdvcmtzcGFjZSkucGFyYW1ldGVyaXplKCBwYXJhbWV0ZXJzICk7Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgICAgIGlmKCB3b3Jrc3BhY2UgaW5zdGFuY2VvZiBJbml0aWFsaXphYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgKChJbml0aWFsaXphYmxlKXdvcmtzcGFjZSkuaW5pdGlhbGl6ZSgpOwotICAgICAgICB9ICAgICAgICAKLQotICAgICAgICByZXR1cm4gd29ya3NwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvL3NldHVwIGRlZmF1bHQgcHJvcGVydGllcwotICAgICAgICBtX2RlZmF1bHRzID0gY3JlYXRlRGVmYXVsdFBhcmFtZXRlcnMoKTsKLQotICAgICAgICAvL2NyZWF0ZSBhbGwgdGhlIGNvbXBvbmVudHMKLSAgICAgICAgY3JlYXRlQ29tcG9uZW50cygpOwotCi0gICAgICAgIC8vc2V0dXAgdGhlIGNvbXBvbmVudCBtYW5hZ2VyCi0gICAgICAgIG1fY29tcG9uZW50TWFuYWdlciA9IGNyZWF0ZUNvbXBvbmVudE1hbmFnZXIoKTsKLQotICAgICAgICBzZXR1cENvbXBvbmVudHMoKTsKLQotICAgICAgICBzZXR1cEZpbGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFeHRlbnNpb25GaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBFeHRlbnNpb25GaWxlRmlsdGVyKCAiLmF0bCIgKTsKLSAgICAgICAgZGVwbG95RnJvbURpcmVjdG9yeSggbV9kZXBsb3llciwgbV90YXNrTGliRGlyLCBmaWx0ZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkKLSAgICB7Ci0gICAgICAgIC8vVW5kZXBsb3kgYWxsIHRoZSB0YXNrcyBieSBraWxsaW5nIEV4ZWN1dGlvbkZyYW1lPz8/Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcG9zZSBlbmdpbmUuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICAgIG1fYXNwZWN0TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIG1fcm9sZU1hbmFnZXIgPSBudWxsOwotICAgICAgICBtX2NvbnZlcnRlclJlZ2lzdHJ5ID0gbnVsbDsKLSAgICAgICAgbV9jb252ZXJ0ZXIgPSBudWxsOwotICAgICAgICBtX2V4ZWN1dG9yID0gbnVsbDsKLSAgICAgICAgbV9kZXBsb3llciA9IG51bGw7Ci0gICAgICAgIG1fY29uZmlndXJlciA9IG51bGw7Ci0gICAgICAgIG1fY29tcG9uZW50TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIG1fcGFyYW1ldGVycyA9IG51bGw7Ci0gICAgICAgIG1fZGVmYXVsdHMgPSBudWxsOwotICAgICAgICBtX2hvbWVEaXIgPSBudWxsOwotICAgICAgICBtX2JpbkRpciA9IG51bGw7Ci0gICAgICAgIG1fbGliRGlyID0gbnVsbDsKLSAgICAgICAgbV90YXNrTGliRGlyID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgZGVmYXVsdCBwcm9wZXJ0aWVzIHdoaWNoIGluY2x1ZGVzIGRlZmF1bHQgbmFtZXMgb2YgYWxsIGNvbXBvbmVudHMuCi0gICAgICogT3ZlcmlkZSB0aGlzIGluIHN1Yi1jbGFzc2VzIHRvIGNoYW5nZSB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBQYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJzIGNyZWF0ZURlZmF1bHRQYXJhbWV0ZXJzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFBhcmFtZXRlcnMgZGVmYXVsdHMgPSBuZXcgUGFyYW1ldGVycygpOwotCi0gICAgICAgIC8vY3JlYXRlIGFsbCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBmaWxlcy9kaXJlY3RvcmllcwotICAgICAgICBkZWZhdWx0cy5zZXRQYXJhbWV0ZXIoICJteXJtaWRvbi5iaW4ucGF0aCIsICJiaW4iICk7Ci0gICAgICAgIGRlZmF1bHRzLnNldFBhcmFtZXRlciggIm15cm1pZG9uLmxpYi5wYXRoIiwgImxpYiIgKTsKLQotICAgICAgICAvL2NyZWF0ZSBhbGwgdGhlIGRlZmF1bHQgcHJvcGVydGllcyBmb3IgY29tcG9uZW50cwotICAgICAgICBkZWZhdWx0cy5zZXRQYXJhbWV0ZXIoIEFzcGVjdE1hbmFnZXIuUk9MRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmFzcGVjdC5EZWZhdWx0QXNwZWN0TWFuYWdlciIgKTsKLSAgICAgICAgZGVmYXVsdHMuc2V0UGFyYW1ldGVyKCBSb2xlTWFuYWdlci5ST0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMucm9sZS5EZWZhdWx0Um9sZU1hbmFnZXIiICk7Ci0gICAgICAgIGRlZmF1bHRzLnNldFBhcmFtZXRlciggTWFzdGVyQ29udmVydGVyLlJPTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb252ZXJ0ZXIuRGVmYXVsdE1hc3RlckNvbnZlcnRlciIgKTsKLSAgICAgICAgZGVmYXVsdHMuc2V0UGFyYW1ldGVyKCBDb252ZXJ0ZXJSZWdpc3RyeS5ST0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29udmVydGVyLkRlZmF1bHRDb252ZXJ0ZXJSZWdpc3RyeSIgKTsKLSAgICAgICAgZGVmYXVsdHMuc2V0UGFyYW1ldGVyKCBUeXBlTWFuYWdlci5ST0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5EZWZhdWx0VHlwZU1hbmFnZXIiICk7Ci0gICAgICAgIGRlZmF1bHRzLnNldFBhcmFtZXRlciggRXhlY3V0b3IuUk9MRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZXhlY3V0b3IuRGVmYXVsdEV4ZWN1dG9yIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIm9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5leGVjdXRvci5QcmludGluZ0V4ZWN1dG9yIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZXhlY3V0b3IuQXNwZWN0QXdhcmVFeGVjdXRvciIgKTsKLSAgICAgICAgZGVmYXVsdHMuc2V0UGFyYW1ldGVyKCBXb3Jrc3BhY2UuUk9MRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLndvcmtzcGFjZS5EZWZhdWx0V29ya3NwYWNlIiApOwotICAgICAgICBkZWZhdWx0cy5zZXRQYXJhbWV0ZXIoIERlcGxveWVyLlJPTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5kZXBsb3llci5EZWZhdWx0RGVwbG95ZXIiICk7Ci0gICAgICAgIGRlZmF1bHRzLnNldFBhcmFtZXRlciggQ29uZmlndXJlci5ST0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29uZmlndXJlci5EZWZhdWx0Q29uZmlndXJlciIgKTsKLQotICAgICAgICByZXR1cm4gZGVmYXVsdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQ29tcG9uZW50TWFuYWdlciBjb250YWluaW5nIGFsbCBjb21wb25lbnRzIGluIGVuZ2luZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudE1hbmFnZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIERlZmF1bHRDb21wb25lbnRNYW5hZ2VyIGNyZWF0ZUNvbXBvbmVudE1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgZmluYWwgRGVmYXVsdENvbXBvbmVudE1hbmFnZXIgY29tcG9uZW50TWFuYWdlciA9IG5ldyBEZWZhdWx0Q29tcG9uZW50TWFuYWdlcigpOwotCi0gICAgICAgIGNvbXBvbmVudE1hbmFnZXIucHV0KCBNYXN0ZXJDb252ZXJ0ZXIuUk9MRSwgbV9jb252ZXJ0ZXIgKTsKLQotICAgICAgICAvL0ZvbGxvd2luZyBjb21wb25lbnRzIHJlcXVpcmVkIHdoZW4gTXlybWlkb24gaXMgdXNlZCBhcyBidWlsZCB0b29sCi0gICAgICAgIGNvbXBvbmVudE1hbmFnZXIucHV0KCBFbWJlZGRvci5ST0xFLCB0aGlzICk7Ci0KLSAgICAgICAgLy9Gb2xsb3dpbmcgY29tcG9uZW50cyByZXF1aXJlZCB3aGVuIE15cm1pZG9uIGFsbG93cyB1c2VyIGRlcGxveW1lbnQgb2YgdGFza3MgZXRhbC4KLSAgICAgICAgY29tcG9uZW50TWFuYWdlci5wdXQoIFJvbGVNYW5hZ2VyLlJPTEUsIG1fcm9sZU1hbmFnZXIgKTsKLSAgICAgICAgY29tcG9uZW50TWFuYWdlci5wdXQoIERlcGxveWVyLlJPTEUsIG1fZGVwbG95ZXIgKTsKLQotICAgICAgICAvL0ZvbGxvd2luZyBjb21wb25lbnRzIHVzZWQgd2hlbiB3YW50IHRvIHR5cGVzIChpZSB0YXNrcy9tYXBwZXJzIGV0YykKLSAgICAgICAgY29tcG9uZW50TWFuYWdlci5wdXQoIFR5cGVNYW5hZ2VyLlJPTEUsIG1fdHlwZU1hbmFnZXIgKTsKLSAgICAgICAgY29tcG9uZW50TWFuYWdlci5wdXQoIENvbnZlcnRlclJlZ2lzdHJ5LlJPTEUsIG1fY29udmVydGVyUmVnaXN0cnkgKTsKLQotICAgICAgICBjb21wb25lbnRNYW5hZ2VyLnB1dCggQXNwZWN0TWFuYWdlci5ST0xFLCBtX2FzcGVjdE1hbmFnZXIgKTsKLQotICAgICAgICAvL0ZvbGxvd2luZyBjb21wb25lbnRzIHJlcXVpcmVkIHdoZW4gYWxsb3dpbmcgQ29udGFpbmVyIHRhc2tzCi0gICAgICAgIGNvbXBvbmVudE1hbmFnZXIucHV0KCBDb25maWd1cmVyLlJPTEUsIG1fY29uZmlndXJlciApOwotICAgICAgICBjb21wb25lbnRNYW5hZ2VyLnB1dCggRXhlY3V0b3IuUk9MRSwgbV9leGVjdXRvciApOwotCi0gICAgICAgIHJldHVybiBjb21wb25lbnRNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbGwgcmVxdWlyZWQgY29tcG9uZW50cy4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb21wb25lbnRzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudCA9IG51bGw7Ci0KLSAgICAgICAgY29tcG9uZW50ID0gZ2V0UGFyYW1ldGVyKCBDb252ZXJ0ZXJSZWdpc3RyeS5ST0xFICk7Ci0gICAgICAgIG1fY29udmVydGVyUmVnaXN0cnkgPSAoQ29udmVydGVyUmVnaXN0cnkpY3JlYXRlQ29tcG9uZW50KCBjb21wb25lbnQsIENvbnZlcnRlclJlZ2lzdHJ5LmNsYXNzICk7Ci0KLSAgICAgICAgY29tcG9uZW50ID0gZ2V0UGFyYW1ldGVyKCBNYXN0ZXJDb252ZXJ0ZXIuUk9MRSApOwotICAgICAgICBtX2NvbnZlcnRlciA9IChNYXN0ZXJDb252ZXJ0ZXIpY3JlYXRlQ29tcG9uZW50KCBjb21wb25lbnQsIE1hc3RlckNvbnZlcnRlci5jbGFzcyApOwotCi0gICAgICAgIGNvbXBvbmVudCA9IGdldFBhcmFtZXRlciggQ29uZmlndXJlci5ST0xFICk7Ci0gICAgICAgIG1fY29uZmlndXJlciA9IChDb25maWd1cmVyKWNyZWF0ZUNvbXBvbmVudCggY29tcG9uZW50LCBDb25maWd1cmVyLmNsYXNzICk7Ci0KLSAgICAgICAgY29tcG9uZW50ID0gZ2V0UGFyYW1ldGVyKCBUeXBlTWFuYWdlci5ST0xFICk7Ci0gICAgICAgIG1fdHlwZU1hbmFnZXIgPSAoVHlwZU1hbmFnZXIpY3JlYXRlQ29tcG9uZW50KCBjb21wb25lbnQsIFR5cGVNYW5hZ2VyLmNsYXNzICk7Ci0KLSAgICAgICAgY29tcG9uZW50ID0gZ2V0UGFyYW1ldGVyKCBSb2xlTWFuYWdlci5ST0xFICk7Ci0gICAgICAgIG1fcm9sZU1hbmFnZXIgPSAoUm9sZU1hbmFnZXIpY3JlYXRlQ29tcG9uZW50KCBjb21wb25lbnQsIFJvbGVNYW5hZ2VyLmNsYXNzICk7Ci0KLSAgICAgICAgY29tcG9uZW50ID0gZ2V0UGFyYW1ldGVyKCBBc3BlY3RNYW5hZ2VyLlJPTEUgKTsKLSAgICAgICAgbV9hc3BlY3RNYW5hZ2VyID0gKEFzcGVjdE1hbmFnZXIpY3JlYXRlQ29tcG9uZW50KCBjb21wb25lbnQsIEFzcGVjdE1hbmFnZXIuY2xhc3MgKTsKLQotICAgICAgICBjb21wb25lbnQgPSBnZXRQYXJhbWV0ZXIoIERlcGxveWVyLlJPTEUgKTsKLSAgICAgICAgbV9kZXBsb3llciA9IChEZXBsb3llciljcmVhdGVDb21wb25lbnQoIGNvbXBvbmVudCwgRGVwbG95ZXIuY2xhc3MgKTsKLQotICAgICAgICBjb21wb25lbnQgPSBnZXRQYXJhbWV0ZXIoIEV4ZWN1dG9yLlJPTEUgKTsKLSAgICAgICAgbV9leGVjdXRvciA9IChFeGVjdXRvciljcmVhdGVDb21wb25lbnQoIGNvbXBvbmVudCwgRXhlY3V0b3IuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR1cCBhbGwgdGhlIGNvbXBvbmVudHMuIChpciBydW4gYWxsIHJlcXVpcmVkIGxpZmVjeWNsZSBtZXRob2RzKS4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cENvbXBvbmVudHMoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXR1cENvbXBvbmVudCggbV9yb2xlTWFuYWdlciApOwotICAgICAgICBzZXR1cENvbXBvbmVudCggbV9hc3BlY3RNYW5hZ2VyICk7Ci0gICAgICAgIHNldHVwQ29tcG9uZW50KCBtX2NvbnZlcnRlclJlZ2lzdHJ5ICk7Ci0gICAgICAgIHNldHVwQ29tcG9uZW50KCBtX2NvbnZlcnRlciApOwotICAgICAgICBzZXR1cENvbXBvbmVudCggbV9leGVjdXRvciApOwotICAgICAgICBzZXR1cENvbXBvbmVudCggbV9kZXBsb3llciApOwotICAgICAgICBzZXR1cENvbXBvbmVudCggbV9jb25maWd1cmVyICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dXAgYW4gaW5kaXZpZHVhbCBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQKLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBDb21wb25lbnQoIGZpbmFsIENvbXBvbmVudCBjb21wb25lbnQgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXR1cExvZ2dlciggY29tcG9uZW50ICk7Ci0KLSAgICAgICAgaWYoIGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbXBvc2FibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKENvbXBvc2FibGUpY29tcG9uZW50KS5jb21wb3NlKCBtX2NvbXBvbmVudE1hbmFnZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBjb21wb25lbnQgaW5zdGFuY2VvZiBJbml0aWFsaXphYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgKChJbml0aWFsaXphYmxlKWNvbXBvbmVudCkuaW5pdGlhbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dXAgYWxsIHRoZSBmaWxlcyBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cEZpbGVzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGZpbGVwYXRoID0gbnVsbDsKLQotICAgICAgICBmaWxlcGF0aCA9IGdldFBhcmFtZXRlciggIm15cm1pZG9uLmhvbWUiICk7Ci0gICAgICAgIG1faG9tZURpciA9IChuZXcgRmlsZSggZmlsZXBhdGggKSkuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0gICAgICAgIGNoZWNrRGlyZWN0b3J5KCBtX2hvbWVEaXIsICJob21lIiApOwotCi0gICAgICAgIGZpbGVwYXRoID0gZ2V0UGFyYW1ldGVyKCAibXlybWlkb24uYmluLnBhdGgiICk7Ci0gICAgICAgIG1fYmluRGlyID0gcmVzb2x2ZURpcmVjdG9yeSggZmlsZXBhdGgsICJiaW4tZGlyIiApOwotCi0gICAgICAgIGZpbGVwYXRoID0gZ2V0UGFyYW1ldGVyKCAibXlybWlkb24ubGliLnBhdGgiICk7Ci0gICAgICAgIG1fdGFza0xpYkRpciA9IHJlc29sdmVEaXJlY3RvcnkoIGZpbGVwYXRoLCAidGFzay1saWItZGlyIiApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHZhbHVlIG9mIG5hbWVkIHByb3BlcnR5LgotICAgICAqIEZpcnN0IGFjY2VzcyBwYXNzZWQgaW4gcHJvcGVydGllcyBhbmQgdGhlbiB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eSBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW1ldGVyKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBtX3BhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCBuYW1lLCBudWxsICk7Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gdmFsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG1fZGVmYXVsdHMuZ2V0UGFyYW1ldGVyKCBuYW1lLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZSBhIGRpcmVjdG9yeSByZWxhdGl2ZSB0byBhbm90aGVyIGJhc2UgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGRpciB0aGUgYmFzZSBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcmVsYXRpdmUgZGlyZWN0b3J5Ci0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBGaWxlCi0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHJlc29sdmVEaXJlY3RvcnkoIGZpbmFsIFN0cmluZyBkaXIsIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gRmlsZVV0aWwucmVzb2x2ZUZpbGUoIG1faG9tZURpciwgZGlyICk7Ci0gICAgICAgIGNoZWNrRGlyZWN0b3J5KCBmaWxlLCBuYW1lICk7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmeSBmaWxlIGlzIGEgZGlyZWN0b3J5IGVsc2UgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIEZpbGUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBmaWxlIHR5cGUgKHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGlyZWN0b3J5KCBmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoICFmaWxlLmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggbmFtZSArICIgKCIgKyBmaWxlICsgIikgZG9lcyBub3QgZXhpc3QiICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggIWZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIG5hbWUgKyAiICgiICsgZmlsZSArICIpIGlzIG5vdCBhIGRpcmVjdG9yeSIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgY3VycmVudCBKVk0gdmVyc2lvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgSlZNIHZlcnNpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEphdmFWZXJzaW9uIGdldEphdmFWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIEphdmFWZXJzaW9uIHZlcnNpb24gPSBKYXZhVmVyc2lvbi5KQVZBMV8wOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCAiamF2YS5sYW5nLlZvaWQiICk7Ci0gICAgICAgICAgICB2ZXJzaW9uID0gSmF2YVZlcnNpb24uSkFWQTFfMTsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoICJqYXZhLmxhbmcuVGhyZWFkTG9jYWwiICk7Ci0gICAgICAgICAgICB2ZXJzaW9uID0gSmF2YVZlcnNpb24uSkFWQTFfMjsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoICJqYXZhLmxhbmcuU3RyaWN0TWF0aCIgKTsKLSAgICAgICAgICAgIHZlcnNpb24gPSBKYXZhVmVyc2lvbi5KQVZBMV8zOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUgKSB7fQotCi0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbXBvbmVudCB0aGF0IGltcGxlbWVudHMgYW4gaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIGNsYXp6IHRoZSBuYW1lIG9mIGludGVyZmFjZS90eXBlCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBvYmplY3QKLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVDb21wb25lbnQoIGZpbmFsIFN0cmluZyBjb21wb25lbnQsIGZpbmFsIENsYXNzIGNsYXp6ICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3QgPSBDbGFzcy5mb3JOYW1lKCBjb21wb25lbnQgKS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBpZiggIWNsYXp6LmlzSW5zdGFuY2UoIG9iamVjdCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiT2JqZWN0ICIgKyBjb21wb25lbnQgKyAiIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJOb24tcHVibGljIGNvbnN0cnVjdG9yIGZvciAiICsgY2xhenogKyAiICIgKyBjb21wb25lbnQgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJFcnJvciBpbnN0YW50aWF0aW5nIGNsYXNzIGZvciAiICsgY2xhenogKyAiICIgKyBjb21wb25lbnQgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIkNvdWxkIG5vdCBmaW5kIHRoZSBjbGFzcyBmb3IgIiArIGNsYXp6ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBjb21wb25lbnQgKyAiKSIgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlcGxveUZyb21EaXJlY3RvcnkoIGZpbmFsIERlcGxveWVyIGRlcGxveWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGRpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZW5hbWVGaWx0ZXIgZmlsdGVyICkKLSAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGVbXSBmaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoIGZpbHRlciApOwotCi0gICAgICAgIGlmKCBudWxsICE9IGZpbGVzICkKLSAgICAgICAgewotICAgICAgICAgICAgZGVwbG95RmlsZXMoIGRlcGxveWVyLCBmaWxlcyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlcGxveUZpbGVzKCBmaW5hbCBEZXBsb3llciBkZXBsb3llciwgZmluYWwgRmlsZVtdIGZpbGVzICkKLSAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlc1sgaSBdLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgaW50IGluZGV4ID0gZmlsZW5hbWUubGFzdEluZGV4T2YoICcuJyApOwotICAgICAgICAgICAgaWYoIC0xID09IGluZGV4ICkgaW5kZXggPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoIDAsIGluZGV4ICk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IGZpbGVzWyBpIF0uZ2V0Q2Fub25pY2FsRmlsZSgpOwotICAgICAgICAgICAgICAgIGRlcGxveWVyLmRlcGxveSggZmlsZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIGZpbmFsIERlcGxveW1lbnRFeGNlcHRpb24gZGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IGRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbiggIlVuYWJsZSB0byByZXRyaWV2ZSBmaWxlbmFtZSBmb3IgZmlsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNbIGkgXSwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2VtYmVkZG9yL0VtYmVkZG9yLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZW1iZWRkb3IvRW1iZWRkb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0NGFkZS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZW1iZWRkb3IvRW1iZWRkb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmVtYmVkZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuSW5pdGlhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuU3RhcnRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5tb2RlbC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy53b3Jrc3BhY2UuV29ya3NwYWNlOwotCi0vKioKLSAqIEludGVyZmFjZSB0aHJvdWdoIHdoaWNoIHlvdSBlbWJlZCBNeXJtaWRvbiBpbnRvIGFwcGxpY2F0aW9ucy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRvcgotICAgIGV4dGVuZHMgQ29tcG9uZW50LCBQYXJhbWV0ZXJpemFibGUsIEluaXRpYWxpemFibGUsIFN0YXJ0YWJsZSwgRGlzcG9zYWJsZQotewotICAgIFN0cmluZyBST0xFID0gIm9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5lbWJlZGRvci5FbWJlZGRvciI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBQcm9qZWN0Ci0gICAgICovCi0gICAgUHJvamVjdCBjcmVhdGVQcm9qZWN0KCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyB0eXBlLCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV29ya3NwYWNlIGZvciBhIHBhcnRpY3VsYXIgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWZpbmVzIHRoZSBkZWZpbmVzIGluIHdvcmtzcGFjZQotICAgICAqIEByZXR1cm4gdGhlIFdvcmtzcGFjZQotICAgICAqLwotICAgIFdvcmtzcGFjZSBjcmVhdGVXb3Jrc3BhY2UoIFBhcmFtZXRlcnMgcGFyYW1ldGVycyApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZXhlY3V0b3IvQXNwZWN0QXdhcmVFeGVjdXRvci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2V4ZWN1dG9yL0FzcGVjdEF3YXJlRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZGRlMy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZXhlY3V0b3IvQXNwZWN0QXdhcmVFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmV4ZWN1dG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hc3BlY3RzLkFzcGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmFzcGVjdC5Bc3BlY3RNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQXNwZWN0QXdhcmVFeGVjdXRvcgotICAgIGV4dGVuZHMgRGVmYXVsdEV4ZWN1dG9yCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGFyYW1ldGVycyAgICAgICBFTVBUWV9QQVJBTUVURVJTOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIENvbmZpZ3VyYXRpb25bXSAgRU1QVFlfRUxFTUVOVFMgICAgICAgPSBuZXcgQ29uZmlndXJhdGlvblsgMCBdOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBFTVBUWV9QQVJBTUVURVJTID0gbmV3IFBhcmFtZXRlcnMoKTsKLSAgICAgICAgRU1QVFlfUEFSQU1FVEVSUy5tYWtlUmVhZE9ubHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFzcGVjdE1hbmFnZXIgICAgICAgIG1fYXNwZWN0TWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHJlbGV2ZW50IHNlcnZpY2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvbmVudE1hbmFnZXIgdGhlIENvbXBvbmVudE1hbmFnZXIKLSAgICAgKiBAZXhjZXB0aW9uIENvbXBvbmVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb21wb3NlKCBmaW5hbCBDb21wb25lbnRNYW5hZ2VyIGNvbXBvbmVudE1hbmFnZXIgKQotICAgICAgICB0aHJvd3MgQ29tcG9uZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5jb21wb3NlKCBjb21wb25lbnRNYW5hZ2VyICk7Ci0KLSAgICAgICAgbV9hc3BlY3RNYW5hZ2VyID0gKEFzcGVjdE1hbmFnZXIpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIEFzcGVjdE1hbmFnZXIuUk9MRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIENvbmZpZ3VyYXRpb24gdGFza01vZGVsLCBmaW5hbCBFeGVjdXRpb25GcmFtZSBmcmFtZSApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZXhlY3V0ZVRhc2soIHRhc2tNb2RlbCwgZnJhbWUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgVGFza0V4Y2VwdGlvbiB0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmYWxzZSA9PSBnZXRBc3BlY3RNYW5hZ2VyKCkuZXJyb3IoIHRlICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IHRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUYXNrKCBDb25maWd1cmF0aW9uIHRhc2tNb2RlbCwgZmluYWwgRXhlY3V0aW9uRnJhbWUgZnJhbWUgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGFza01vZGVsID0gZ2V0QXNwZWN0TWFuYWdlcigpLnByZUNyZWF0ZSggdGFza01vZGVsICk7Ci0gICAgICAgIHRhc2tNb2RlbCA9IHByZXBhcmVBc3BlY3RzKCB0YXNrTW9kZWwgKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIlByZS1DcmVhdGUiICk7Ci0gICAgICAgIGZpbmFsIFRhc2sgdGFzayA9IGNyZWF0ZVRhc2soIHRhc2tNb2RlbC5nZXROYW1lKCksIGZyYW1lICk7Ci0gICAgICAgIGdldEFzcGVjdE1hbmFnZXIoKS5wb3N0Q3JlYXRlKCB0YXNrICk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJQcmUtTG9nZ2FibGUiICk7Ci0gICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBmcmFtZS5nZXRMb2dnZXIoKTsKLSAgICAgICAgZ2V0QXNwZWN0TWFuYWdlcigpLnByZUxvZ2dhYmxlKCBsb2dnZXIgKTsKLSAgICAgICAgZG9Mb2dnYWJsZSggdGFzaywgdGFza01vZGVsLCBsb2dnZXIgKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkNvbnRleHR1YWxpemluZyIgKTsKLSAgICAgICAgZG9Db250ZXh0dWFsaXplKCB0YXNrLCB0YXNrTW9kZWwsIGZyYW1lLmdldENvbnRleHQoKSApOwotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiQ29tcG9zaW5nIiApOwotICAgICAgICBkb0NvbXBvc2UoIHRhc2ssIHRhc2tNb2RlbCwgZnJhbWUuZ2V0Q29tcG9uZW50TWFuYWdlcigpICk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJDb25maWd1cmluZyIgKTsKLSAgICAgICAgZ2V0QXNwZWN0TWFuYWdlcigpLnByZUNvbmZpZ3VyZSggdGFza01vZGVsICk7Ci0gICAgICAgIGRvQ29uZmlndXJlKCB0YXNrLCB0YXNrTW9kZWwsIGZyYW1lLmdldENvbnRleHQoKSApOwotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiSW5pdGlhbGl6aW5nIiApOwotICAgICAgICBkb0luaXRpYWxpemUoIHRhc2ssIHRhc2tNb2RlbCApOwotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiRXhlY3V0aW5nIiApOwotICAgICAgICBnZXRBc3BlY3RNYW5hZ2VyKCkucHJlRXhlY3V0ZSgpOwotICAgICAgICBkb0V4ZWN1dGUoIHRhc2tNb2RlbCwgdGFzayApOwotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiRGlzcG9zaW5nIiApOwotICAgICAgICBnZXRBc3BlY3RNYW5hZ2VyKCkucHJlRGVzdHJveSgpOwotICAgICAgICBkb0Rpc3Bvc2UoIHRhc2ssIHRhc2tNb2RlbCApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSggZmluYWwgQ29uZmlndXJhdGlvbiB0YXNrTW9kZWwsIGZpbmFsIFRhc2sgdGFzayApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0YXNrLmV4ZWN1dGUoKTsKLSAgICB9Ci0KLSAgICAvL1RPRE86IEV4dHJhY3QgYW5kIGNsZWFuIHRhc2tNb2RlbCBoZXJlLgotICAgIC8vR2V0IGFsbCBwYXJhbWV0ZXJzIGZyb20gbW9kZWwgYW5kIHByb3ZpZGUgdG8gYXBwcm9wcmlhdGUgYXNwZWN0LgotICAgIC8vYXNwZWN0KCBmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsIGZpbmFsIENvbmZpZ3VyYXRpb25bXSBlbGVtZW50cyApCi0gICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIHByZXBhcmVBc3BlY3RzKCBmaW5hbCBDb25maWd1cmF0aW9uIHRhc2tNb2RlbCApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBEZWZhdWx0Q29uZmlndXJhdGlvbiBuZXdUYXNrTW9kZWwgPSAKLSAgICAgICAgICAgIG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbiggdGFza01vZGVsLmdldE5hbWUoKSwgdGFza01vZGVsLmdldExvY2F0aW9uKCkgKTsKLSAgICAgICAgZmluYWwgSGFzaE1hcCBwYXJhbWV0ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmaW5hbCBIYXNoTWFwIGVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKCB0YXNrTW9kZWwsIG5ld1Rhc2tNb2RlbCwgcGFyYW1ldGVyTWFwICk7Ci0gICAgICAgIHByb2Nlc3NFbGVtZW50cyggdGFza01vZGVsLCBuZXdUYXNrTW9kZWwsIGVsZW1lbnRNYXAgKTsKLQotICAgICAgICBkaXNwYXRjaEFzcGVjdHNTZXR0aW5ncyggcGFyYW1ldGVyTWFwLCBlbGVtZW50TWFwICk7Ci0gICAgICAgIGNoZWNrRm9yVW51c2VkU2V0dGluZ3MoIHBhcmFtZXRlck1hcCwgZWxlbWVudE1hcCApOwotCi0gICAgICAgIHJldHVybiBuZXdUYXNrTW9kZWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGRpc3BhdGNoQXNwZWN0c1NldHRpbmdzKCBmaW5hbCBIYXNoTWFwIHBhcmFtZXRlck1hcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIYXNoTWFwIGVsZW1lbnRNYXAgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbmFtZXMgPSBnZXRBc3BlY3RNYW5hZ2VyKCkuZ2V0TmFtZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3QgZWxlbWVudExpc3QgPSAoQXJyYXlMaXN0KWVsZW1lbnRNYXAucmVtb3ZlKCBuYW1lc1sgaSBdICk7Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IChQYXJhbWV0ZXJzKXBhcmFtZXRlck1hcC5yZW1vdmUoIG5hbWVzWyBpIF0gKTsKLSAgICAgICAgICAgIGlmKCBudWxsID09IHBhcmFtZXRlcnMgKSBwYXJhbWV0ZXJzID0gRU1QVFlfUEFSQU1FVEVSUzsKLQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbltdIGVsZW1lbnRzID0gbnVsbDsKLSAgICAgICAgICAgIGlmKCBudWxsID09IGVsZW1lbnRMaXN0ICkgZWxlbWVudHMgPSBFTVBUWV9FTEVNRU5UUzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50cyA9IChDb25maWd1cmF0aW9uW10pZWxlbWVudExpc3QudG9BcnJheSggRU1QVFlfRUxFTUVOVFMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGlzcGF0Y2goIG5hbWVzWyBpIF0sIHBhcmFtZXRlcnMsIGVsZW1lbnRzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgY2hlY2tGb3JVbnVzZWRTZXR0aW5ncyggZmluYWwgSGFzaE1hcCBwYXJhbWV0ZXJNYXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIYXNoTWFwIGVsZW1lbnRNYXAgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIDAgIT0gcGFyYW1ldGVyTWFwLnNpemUoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVzcGFjZXMgPSAKLSAgICAgICAgICAgICAgICAoU3RyaW5nW10pcGFyYW1ldGVyTWFwLmtleVNldCgpLnRvQXJyYXkoIG5ldyBTdHJpbmdbIDAgXSApOwotCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzWyBpIF07Ci0gICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gKFBhcmFtZXRlcnMpcGFyYW1ldGVyTWFwLmdldCggbmFtZXNwYWNlICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gKEFycmF5TGlzdCllbGVtZW50TWFwLnJlbW92ZSggbmFtZXNwYWNlICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbltdIGVsZW1lbnRzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggbnVsbCA9PSBlbGVtZW50TGlzdCApIGVsZW1lbnRzID0gRU1QVFlfRUxFTUVOVFM7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgPSAoQ29uZmlndXJhdGlvbltdKWVsZW1lbnRMaXN0LnRvQXJyYXkoIEVNUFRZX0VMRU1FTlRTICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHVudXNlZFNldHRpbmcoIG5hbWVzcGFjZSwgcGFyYW1ldGVycywgZWxlbWVudHMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAwICE9IGVsZW1lbnRNYXAuc2l6ZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbmFtZXNwYWNlcyA9IAotICAgICAgICAgICAgICAgIChTdHJpbmdbXSllbGVtZW50TWFwLmtleVNldCgpLnRvQXJyYXkoIG5ldyBTdHJpbmdbIDAgXSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzWyBpIF07Ci0gICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gKEFycmF5TGlzdCllbGVtZW50TWFwLnJlbW92ZSggbmFtZXNwYWNlICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbltdIGVsZW1lbnRzID0gCi0gICAgICAgICAgICAgICAgICAgIChDb25maWd1cmF0aW9uW10pZWxlbWVudExpc3QudG9BcnJheSggRU1QVFlfRUxFTUVOVFMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB1bnVzZWRTZXR0aW5nKCBuYW1lc3BhY2UsIEVNUFRZX1BBUkFNRVRFUlMsIGVsZW1lbnRzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW51c2VkU2V0dGluZyggZmluYWwgU3RyaW5nIG5hbWVzcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1ldGVycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb25bXSBlbGVtZW50cyApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIlVudXNlZCBhc3BlY3Qgc2V0dGluZ3MgZm9yIG5hbWVzcGFjZSAiICsgbmFtZXNwYWNlICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKHBhcmFtZXRlckNvdW50PSIgKyBwYXJhbWV0ZXJzLmdldE5hbWVzKCkubGVuZ3RoICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGVsZW1lbnRDb3VudD0iICsgZWxlbWVudHMubGVuZ3RoICsgIikiICk7IAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaCggZmluYWwgU3RyaW5nIG5hbWVzcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbltdIGVsZW1lbnRzICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldEFzcGVjdE1hbmFnZXIoKS5kaXNwYXRjaEFzcGVjdFNldHRpbmdzKCBuYW1lc3BhY2UsIHBhcmFtZXRlcnMsIGVsZW1lbnRzICk7Ci0KLSAgICAgICAgaWYoIGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkRpc3BhdGNoaW5nIEFzcGVjdCBTZXR0aW5ncyB0bzogIiArIG5hbWVzcGFjZSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcGFyYW1ldGVyQ291bnQ9IiArIHBhcmFtZXRlcnMuZ2V0TmFtZXMoKS5sZW5ndGggKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGVsZW1lbnRDb3VudD0iICsgZWxlbWVudHMubGVuZ3RoICk7IAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NFbGVtZW50cyggZmluYWwgQ29uZmlndXJhdGlvbiB0YXNrTW9kZWwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlZmF1bHRDb25maWd1cmF0aW9uIG5ld1Rhc2tNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIYXNoTWFwIG1hcCApCi0gICAgewotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uW10gZWxlbWVudHMgPSB0YXNrTW9kZWwuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZWxlbWVudHNbIGkgXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoICc6JyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggLTEgPT0gaW5kZXggKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdUYXNrTW9kZWwuYWRkQ2hpbGQoIGVsZW1lbnRzWyBpIF0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlID0gbmFtZS5zdWJzdHJpbmcoIDAsIGluZGV4ICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSA9IG5hbWUuc3Vic3RyaW5nKCBpbmRleCArIDEgKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3QgZWxlbWVudFNldCA9IGdldEVsZW1lbnRzKCBuYW1lc3BhY2UsIG1hcCApOwotICAgICAgICAgICAgICAgIGVsZW1lbnRTZXQuYWRkKCBlbGVtZW50c1sgaSBdICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZXMoIGZpbmFsIENvbmZpZ3VyYXRpb24gdGFza01vZGVsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlZmF1bHRDb25maWd1cmF0aW9uIG5ld1Rhc2tNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEhhc2hNYXAgbWFwICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSB0YXNrTW9kZWwuZ2V0QXR0cmlidXRlTmFtZXMoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSB0YXNrTW9kZWwuZ2V0QXR0cmlidXRlKCBuYW1lLCBudWxsICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZiggJzonICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAtMSA9PSBpbmRleCApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld1Rhc2tNb2RlbC5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWVzcGFjZSA9IG5hbWUuc3Vic3RyaW5nKCAwLCBpbmRleCApOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSBuYW1lLnN1YnN0cmluZyggaW5kZXggKyAxICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyggbmFtZXNwYWNlLCBtYXAgKTsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFBhcmFtZXRlciggbG9jYWxOYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgZ2V0RWxlbWVudHMoIGZpbmFsIFN0cmluZyBuYW1lc3BhY2UsIGZpbmFsIEhhc2hNYXAgbWFwICkKLSAgICB7Ci0gICAgICAgIEFycmF5TGlzdCBlbGVtZW50cyA9IChBcnJheUxpc3QpbWFwLmdldCggbmFtZXNwYWNlICk7Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gZWxlbWVudHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG1hcC5wdXQoIG5hbWVzcGFjZSwgZWxlbWVudHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycyggZmluYWwgU3RyaW5nIG5hbWVzcGFjZSwgZmluYWwgSGFzaE1hcCBtYXAgKQotICAgIHsKLSAgICAgICAgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gKFBhcmFtZXRlcnMpbWFwLmdldCggbmFtZXNwYWNlICk7Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gcGFyYW1ldGVycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgUGFyYW1ldGVycygpOwotICAgICAgICAgICAgbWFwLnB1dCggbmFtZXNwYWNlLCBwYXJhbWV0ZXJzICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgQXNwZWN0TWFuYWdlciBnZXRBc3BlY3RNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2FzcGVjdE1hbmFnZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2V4ZWN1dG9yL0RlZmF1bHRFeGVjdXRpb25GcmFtZS5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2V4ZWN1dG9yL0RlZmF1bHRFeGVjdXRpb25GcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU5MzljLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9leGVjdXRvci9EZWZhdWx0RXhlY3V0aW9uRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmV4ZWN1dG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkRlZmF1bHRDb21wb25lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuYXNwZWN0LkFzcGVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmJ1aWxkZXIuUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmNvbmZpZ3VyZXIuQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29udmVydGVyLkNvbnZlcnRlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb252ZXJ0ZXIuTWFzdGVyQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5kZXBsb3llci5EZXBsb3llcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZXhlY3V0b3IuRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnJvbGUuUm9sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZU1hbmFnZXI7Ci0KLS8qKgotICogRnJhbWVzIGluIHdoaWNoIHRhc2tzIGFyZSBleGVjdXRlZC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRFeGVjdXRpb25GcmFtZQotICAgIGltcGxlbWVudHMgRXhlY3V0aW9uRnJhbWUsIExvZ2dhYmxlLCBDb250ZXh0dWFsaXphYmxlLCBDb21wb3NhYmxlCi17Ci0gICAgcHJpdmF0ZSBUeXBlTWFuYWdlciAgICAgICAgICAgICAgbV90eXBlTWFuYWdlcjsKLQotICAgIHByaXZhdGUgTG9nZ2VyICAgICAgICAgICAgICAgICAgIG1fbG9nZ2VyOwotICAgIHByaXZhdGUgVGFza0NvbnRleHQgICAgICAgICAgICAgIG1fY29udGV4dDsKLSAgICBwcml2YXRlIENvbXBvbmVudE1hbmFnZXIgICAgICAgICBtX2NvbXBvbmVudE1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2dnZXIoIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgIHsKLSAgICAgICAgbV9sb2dnZXIgPSBsb2dnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29udGV4dHVhbGl6ZSggZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIG1fY29udGV4dCA9IChUYXNrQ29udGV4dCljb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHJlbGV2ZW50IHNlcnZpY2VzIG5lZWRlZCB0byBkZXBsb3kuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50TWFuYWdlciB0aGUgQ29tcG9uZW50TWFuYWdlcgotICAgICAqIEBleGNlcHRpb24gQ29tcG9uZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoIGZpbmFsIENvbXBvbmVudE1hbmFnZXIgY29tcG9uZW50TWFuYWdlciApCi0gICAgICAgIHRocm93cyBDb21wb25lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1fY29tcG9uZW50TWFuYWdlciA9IGNvbXBvbmVudE1hbmFnZXI7Ci0KLSAgICAgICAgbV90eXBlTWFuYWdlciA9IChUeXBlTWFuYWdlciljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggVHlwZU1hbmFnZXIuUk9MRSApOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlTWFuYWdlciBnZXRUeXBlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbV90eXBlTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9sb2dnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFRhc2tDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcG9uZW50TWFuYWdlciBnZXRDb21wb25lbnRNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvbXBvbmVudE1hbmFnZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2V4ZWN1dG9yL0RlZmF1bHRFeGVjdXRvci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2V4ZWN1dG9yL0RlZmF1bHRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTIyYTMwLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9leGVjdXRvci9EZWZhdWx0RXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5leGVjdXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5Jbml0aWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5EZWZhdWx0Q29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ2dhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb25maWd1cmVyLkNvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5UeXBlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRFeGVjdXRvcgotICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dnYWJsZQotICAgIGltcGxlbWVudHMgRXhlY3V0b3IsIENvbXBvc2FibGUKLXsKLSAgICBwcml2YXRlIENvbmZpZ3VyZXIgICAgICAgICAgIG1fY29uZmlndXJlcjsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHJlbGV2ZW50IHNlcnZpY2VzIG5lZWRlZCB0byBkZXBsb3kuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50TWFuYWdlciB0aGUgQ29tcG9uZW50TWFuYWdlcgotICAgICAqIEBleGNlcHRpb24gQ29tcG9uZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoIGZpbmFsIENvbXBvbmVudE1hbmFnZXIgY29tcG9uZW50TWFuYWdlciApCi0gICAgICAgIHRocm93cyBDb21wb25lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1fY29uZmlndXJlciA9IChDb25maWd1cmVyKWNvbXBvbmVudE1hbmFnZXIubG9va3VwKCBDb25maWd1cmVyLlJPTEUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBDb25maWd1cmF0aW9uIHRhc2tNb2RlbCwgZmluYWwgRXhlY3V0aW9uRnJhbWUgZnJhbWUgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJDcmVhdGluZyIgKTsKLSAgICAgICAgZmluYWwgVGFzayB0YXNrID0gY3JlYXRlVGFzayggdGFza01vZGVsLmdldE5hbWUoKSwgZnJhbWUgKTsKLSAgICAgICAgZG9Mb2dnYWJsZSggdGFzaywgdGFza01vZGVsLCBmcmFtZS5nZXRMb2dnZXIoKSApOwotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiQ29udGV4dHVhbGl6aW5nIiApOwotICAgICAgICBkb0NvbnRleHR1YWxpemUoIHRhc2ssIHRhc2tNb2RlbCwgZnJhbWUuZ2V0Q29udGV4dCgpICk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJDb21wb3NpbmciICk7Ci0gICAgICAgIGRvQ29tcG9zZSggdGFzaywgdGFza01vZGVsLCBmcmFtZS5nZXRDb21wb25lbnRNYW5hZ2VyKCkgKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkNvbmZpZ3VyaW5nIiApOwotICAgICAgICBkb0NvbmZpZ3VyZSggdGFzaywgdGFza01vZGVsLCBmcmFtZS5nZXRDb250ZXh0KCkgKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkluaXRpYWxpemluZyIgKTsKLSAgICAgICAgZG9Jbml0aWFsaXplKCB0YXNrLCB0YXNrTW9kZWwgKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIlJ1bm5pbmciICk7Ci0KLSAgICAgICAgdGFzay5leGVjdXRlKCk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJEaXNwb3NpbmciICk7Ci0gICAgICAgIGRvRGlzcG9zZSggdGFzaywgdGFza01vZGVsICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFRhc2sgY3JlYXRlVGFzayggZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEV4ZWN1dGlvbkZyYW1lIGZyYW1lICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBUeXBlRmFjdG9yeSBmYWN0b3J5ID0gZnJhbWUuZ2V0VHlwZU1hbmFnZXIoKS5nZXRGYWN0b3J5KCBUYXNrLlJPTEUgKTsKLSAgICAgICAgICAgIHJldHVybiAoVGFzaylmYWN0b3J5LmNyZWF0ZSggbmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBUeXBlRXhjZXB0aW9uIHRlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJVbmFibGUgdG8gY3JlYXRlIHRhc2sgIiArIG5hbWUsIHRlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb0NvbmZpZ3VyZSggZmluYWwgVGFzayB0YXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIHRhc2tNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGFza0NvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgeyBtX2NvbmZpZ3VyZXIuY29uZmlndXJlKCB0YXNrLCB0YXNrTW9kZWwsIGNvbnRleHQgKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiRXJyb3IgY29uZmlndXJpbmcgdGFzayAiICsgIHRhc2tNb2RlbC5nZXROYW1lKCkgKyAiIGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tNb2RlbC5nZXRMb2NhdGlvbigpICsgIihSZWFzb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZS5nZXRNZXNzYWdlKCkgKyAiKSIsIHRocm93YWJsZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9Db21wb3NlKCBmaW5hbCBUYXNrIHRhc2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiB0YXNrTW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnRNYW5hZ2VyIGNvbXBvbmVudE1hbmFnZXIgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIHRhc2sgaW5zdGFuY2VvZiBDb21wb3NhYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsgKChDb21wb3NhYmxlKXRhc2spLmNvbXBvc2UoIGNvbXBvbmVudE1hbmFnZXIgKTsgfQotICAgICAgICAgICAgY2F0Y2goIGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiRXJyb3IgY29tcG9zaW5nIHRhc2sgIiArICB0YXNrTW9kZWwuZ2V0TmFtZSgpICsgIiBhdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza01vZGVsLmdldExvY2F0aW9uKCkgKyAiKFJlYXNvbjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZS5nZXRNZXNzYWdlKCkgKyAiKSIsIHRocm93YWJsZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9Db250ZXh0dWFsaXplKCBmaW5hbCBUYXNrIHRhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIHRhc2tNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRhc2tDb250ZXh0IGNvbnRleHQgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0YXNrIGluc3RhbmNlb2YgQ29udGV4dHVhbGl6YWJsZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChDb250ZXh0dWFsaXphYmxlKXRhc2spLmNvbnRleHR1YWxpemUoIGNvbnRleHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiRXJyb3IgY29udGV4dHVhbGl6aW5nIHRhc2sgIiArICB0YXNrTW9kZWwuZ2V0TmFtZSgpICsgIiBhdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrTW9kZWwuZ2V0TG9jYXRpb24oKSArICIoUmVhc29uOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpICsgIikiLCB0aHJvd2FibGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRvRGlzcG9zZSggZmluYWwgVGFzayB0YXNrLCBmaW5hbCBDb25maWd1cmF0aW9uIHRhc2tNb2RlbCApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggdGFzayBpbnN0YW5jZW9mIERpc3Bvc2FibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgeyAoKERpc3Bvc2FibGUpdGFzaykuZGlzcG9zZSgpOyB9Ci0gICAgICAgICAgICBjYXRjaCggZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJFcnJvciBkaXNwb3NpbmcgdGFzayAiICsgIHRhc2tNb2RlbC5nZXROYW1lKCkgKyAiIGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrTW9kZWwuZ2V0TG9jYXRpb24oKSArICIoUmVhc29uOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSArICIpIiwgdGhyb3dhYmxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb0xvZ2dhYmxlKCBmaW5hbCBUYXNrIHRhc2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gdGFza01vZGVsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCB0YXNrIGluc3RhbmNlb2YgTG9nZ2FibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgeyAoKExvZ2dhYmxlKXRhc2spLnNldExvZ2dlciggbG9nZ2VyICk7IH0KLSAgICAgICAgICAgIGNhdGNoKCBmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIkVycm9yIHNldHRpbmcgbG9nZ2VyIGZvciB0YXNrICIgKyAgdGFza01vZGVsLmdldE5hbWUoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGF0ICIgKyB0YXNrTW9kZWwuZ2V0TG9jYXRpb24oKSArICIoUmVhc29uOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSArICIpIiwgdGhyb3dhYmxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb0luaXRpYWxpemUoIGZpbmFsIFRhc2sgdGFzaywgZmluYWwgQ29uZmlndXJhdGlvbiB0YXNrTW9kZWwgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIHRhc2sgaW5zdGFuY2VvZiBJbml0aWFsaXphYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsgKChJbml0aWFsaXphYmxlKXRhc2spLmluaXRpYWxpemUoKTsgfQotICAgICAgICAgICAgY2F0Y2goIGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiRXJyb3IgaW5pdGlhbGl6aW5nIHRhc2sgIiArICB0YXNrTW9kZWwuZ2V0TmFtZSgpICsgIiBhdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza01vZGVsLmdldExvY2F0aW9uKCkgKyAiKFJlYXNvbjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZS5nZXRNZXNzYWdlKCkgKyAiKSIsIHRocm93YWJsZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2V4ZWN1dG9yL0V4ZWN1dGlvbkZyYW1lLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZXhlY3V0b3IvRXhlY3V0aW9uRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmMzU0Yy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZXhlY3V0b3IvRXhlY3V0aW9uRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmV4ZWN1dG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5UeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrQ29udGV4dDsKLQotLyoqCi0gKiBGcmFtZXMgaW4gd2hpY2ggdGFza3MgYXJlIGV4ZWN1dGVkLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4ZWN1dGlvbkZyYW1lCi17Ci0gICAgVHlwZU1hbmFnZXIgZ2V0VHlwZU1hbmFnZXIoKTsKLSAgICBMb2dnZXIgZ2V0TG9nZ2VyKCk7Ci0gICAgVGFza0NvbnRleHQgZ2V0Q29udGV4dCgpOwotICAgIENvbXBvbmVudE1hbmFnZXIgZ2V0Q29tcG9uZW50TWFuYWdlcigpOwotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2V4ZWN1dG9yL0V4ZWN1dG9yLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZXhlY3V0b3IvRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxZGNmOS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZXhlY3V0b3IvRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmV4ZWN1dG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotIAotLyoqCi0gKiBFbmdpbmUgaW50ZWZhY2UgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHRhc2tsZXQgZW5naW5lcy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhlY3V0b3IKLSAgICBleHRlbmRzIENvbXBvbmVudAotewotICAgIFN0cmluZyBST0xFID0gIm9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5leGVjdXRvci5FeGVjdXRvciI7Ci0KLSAgICAvKioKLSAgICAgKiBleGVjdXRlIGEgdGFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXNrIHRoZSBjb25maWdydWF0aW9uIGRhdGEgZm9yIHRhc2sKLSAgICAgKiBAZXhjZXB0aW9uIFRhc2tFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgdm9pZCBleGVjdXRlKCBDb25maWd1cmF0aW9uIHRhc2ssIEV4ZWN1dGlvbkZyYW1lIGZyYW1lICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZXhlY3V0b3IvUHJpbnRpbmdFeGVjdXRvci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL2V4ZWN1dG9yL1ByaW50aW5nRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhNjhhYS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvZXhlY3V0b3IvUHJpbnRpbmdFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZXhlY3V0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFByaW50aW5nRXhlY3V0b3IKLSAgICBleHRlbmRzIEFzcGVjdEF3YXJlRXhlY3V0b3IKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoIGZpbmFsIENvbmZpZ3VyYXRpb24gdGFza01vZGVsLCBmaW5hbCBUYXNrIHRhc2sgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBwcmludENvbmZpZ3VyYXRpb24oIHRhc2tNb2RlbCwgMCwgc2IgKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggc2IudG9TdHJpbmcoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZ3VyYXRpb24oIGZpbmFsIENvbmZpZ3VyYXRpb24gdGFza01vZGVsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGV2ZWwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiApCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGxldmVsOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICcgJyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzYi5hcHBlbmQoICc8JyApOwotICAgICAgICBzYi5hcHBlbmQoIHRhc2tNb2RlbC5nZXROYW1lKCkgKTsKLQotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVzID0gdGFza01vZGVsLmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IG5hbWVzWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSB0YXNrTW9kZWwuZ2V0QXR0cmlidXRlKCBuYW1lLCBudWxsICk7Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggJyAnICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIG5hbWUgKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggIj1cIiIgKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggdmFsdWUgKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggJ1wiJyApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbltdIGNoaWxkcmVuID0gdGFza01vZGVsLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGlmKCAwID09IGNoaWxkcmVuLmxlbmd0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCggIi8+XG4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICI+XG4iICk7Ci0KLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50Q29uZmlndXJhdGlvbiggY2hpbGRyZW5bIGkgXSwgbGV2ZWwgKyAxLCBzYiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGxldmVsOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJyAnICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggIjwvIiApOwotICAgICAgICAgICAgc2IuYXBwZW5kKCB0YXNrTW9kZWwuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICI+XG4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvbW9kZWwvRGVmYXVsdFByb2plY3QuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9tb2RlbC9EZWZhdWx0UHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VjMTMyLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9tb2RlbC9EZWZhdWx0UHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBEZWZhdWx0IHByb2plY3QgaW1wbGVtZW50YXRpb24uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvamVjdAotICAgIGltcGxlbWVudHMgUHJvamVjdAotewotICAgIC8vL1RoZSBpbXBvcnRzCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgbV9pbXBvcnRzICAgICAgICAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvLy9UaGUgcHJvamVjdHMgcmVmZmVycmVkIHRvIGJ5IHRoaXMgcHJvamVjdAotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcCAgIG1fcHJvamVjdHMgICAgICAgID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8vL1RoZSB0YXJnZXRzIGNvbnRhaW5lZCBieSB0aGlzIHByb2plY3QKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXAgICBtX3RhcmdldHMgICAgICAgICA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvLy9UaGUgaW1wbGljaXQgdGFyZ2V0IChub3QgcHJlc2VudCBpbiBtX3RhcmdldHMpCi0gICAgcHJpdmF0ZSBUYXJnZXQgICAgICAgICAgbV9pbXBsaWNpdFRhcmdldDsKLQotICAgIC8vL1RoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHRhcmdldAotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgIG1fZGVmYXVsdFRhcmdldDsKLQotICAgIC8vL1RoZSBiYXNlIGRpcmVjdG9yeSBvZiBwcm9qZWN0Ci0gICAgcHJpdmF0ZSBGaWxlICAgICAgICAgICAgbV9iYXNlRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbXBvcnRzIGZvciBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW1wb3J0cwotICAgICAqLwotICAgIHB1YmxpYyBUeXBlTGliW10gZ2V0VHlwZUxpYnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUeXBlTGliW10pbV9pbXBvcnRzLnRvQXJyYXkoIG5ldyBUeXBlTGliWyAwIF0gKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmFtZXMgb2YgcHJvamVjdHMgcmVmZXJyZWQgdG8gYnkgdGhpcyBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvamVjdE5hbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pbV9wcm9qZWN0cy5rZXlTZXQoKS50b0FycmF5KCBuZXcgU3RyaW5nWyAwIF0gKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBwcm9qZWN0IHJlZmZlcmVkIHRvIGJ5IHRoaXMgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9qZWN0IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBQcm9qZWN0IG9yIG51bGwgaWYgbm9uZSBieSB0aGF0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gKFByb2plY3QpbV9wcm9qZWN0cy5nZXQoIG5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBiYXNlIGRpcmVjdG9yeSBvZiBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdHMgYmFzZSBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgRmlsZSBnZXRCYXNlRGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2Jhc2VEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgaW1wbGljaXQgdGFyZ2V0LgotICAgICAqIFRoZSBpbXBsaWNpdCB0YXJnZXQgY29udGFpbnMgYWxsIHRoZSB0b3AgbGV2ZWwgdGFza3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBUYXJnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgVGFyZ2V0IGdldEltcGxpY2l0VGFyZ2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2ltcGxpY2l0VGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBJbXBsaWNpdFRhcmdldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIGltcGxpY2l0IHRhcmdldAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEltcGxpY2l0VGFyZ2V0KCBmaW5hbCBUYXJnZXQgdGFyZ2V0ICkKLSAgICB7Ci0gICAgICAgIG1faW1wbGljaXRUYXJnZXQgPSB0YXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYSB0YXJnZXQgYnkgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRhcmdldAotICAgICAqIEByZXR1cm4gdGhlIFRhcmdldCBvciBudWxsIGlmIG5vIHRhcmdldCBleGlzdHMgd2l0aCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFRhcmdldCBnZXRUYXJnZXQoIGZpbmFsIFN0cmluZyB0YXJnZXROYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVGFyZ2V0KW1fdGFyZ2V0cy5nZXQoIHRhcmdldE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmFtZSBvZiBkZWZhdWx0IHRhcmdldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldERlZmF1bHRUYXJnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2RlZmF1bHRUYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgbmFtZXMgb2YgYWxsIHRhcmdldHMgaW4gcHJvamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgdGFyZ2V0IG5hbWVzCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldFRhcmdldE5hbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pbV90YXJnZXRzLmtleVNldCgpLnRvQXJyYXkoIG5ldyBTdHJpbmdbIDAgXSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBEZWZhdWx0VGFyZ2V0TmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWZhdWx0VGFyZ2V0IHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVmYXVsdFRhcmdldE5hbWUoIGZpbmFsIFN0cmluZyBkZWZhdWx0VGFyZ2V0ICkKLSAgICB7Ci0gICAgICAgIG1fZGVmYXVsdFRhcmdldCA9IGRlZmF1bHRUYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYmFzZSBkaXJlY3Rvcnkgb2YgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3RzIGJhc2UgZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0QmFzZURpcmVjdG9yeSggZmluYWwgRmlsZSBiYXNlRGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIG1fYmFzZURpcmVjdG9yeSA9IGJhc2VEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkVHlwZUxpYiggZmluYWwgVHlwZUxpYiB0eXBlTGliICkKLSAgICB7Ci0gICAgICAgIG1faW1wb3J0cy5hZGQoIHR5cGVMaWIgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSB0YXJnZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0YXJnZXQKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBUYXJnZXQKLSAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0YXJnZXQgYWxyZWFkeSBleGlzdHMgd2l0aCBzYW1lIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRUYXJnZXQoIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBUYXJnZXQgdGFyZ2V0ICkKLSAgICB7Ci0gICAgICAgIGlmKCBudWxsICE9IG1fdGFyZ2V0cy5nZXQoIG5hbWUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJDYW4gbm90IGhhdmUgdHdvIHRhcmdldHMgaW4gYSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIHdpdGggdGhlIG5hbWUgIiArIG5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fdGFyZ2V0cy5wdXQoIG5hbWUsIHRhcmdldCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcHJvamVjdCByZWZlcmVuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0YXJnZXQKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgUHJvamVjdAotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHByb2plY3QgYWxyZWFkeSBleGlzdHMgd2l0aCBzYW1lIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRQcm9qZWN0KCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIGlmKCBudWxsICE9IG1fcHJvamVjdHMuZ2V0KCBuYW1lICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQ2FuIG5vdCBoYXZlIHR3byBwcm9qZWN0cyByZWZlcmVuY2VkIGluIGEgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSB3aXRoIHRoZSBuYW1lICIgKyBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3Byb2plY3RzLnB1dCggbmFtZSwgcHJvamVjdCApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL21vZGVsL1Byb2plY3QuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9tb2RlbC9Qcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4Y2EzZTcuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL21vZGVsL1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotCi0vKioKLSAqIEFic3RyYWN0aW9uIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCBwcm9qZWN0cy4KLSAqIEltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIHRvIHN0cnVjdHVyZSBpdCBhbnl3YXkgdGhleSBjaG9vc2UuCi0gKgotICogVE9ETzogRGV0ZXJtaW5lIGlmIHByb2plY3RzIHNob3VsZCBjYXJyeSB0aGVpciBvd24gbmFtZS4gQnJlYWtzIElPQyBidXQKLSAqIENhbiBiZSB1c2VmdWwgYXMgcHJvamVjdCBmaWxlcyBlbWJlZCBvd24gbmFtZSAob3Igc2hvdWxkIHRoYXQgYmUgZGVzY3JpcHRpb24pLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3QKLSAgICBleHRlbmRzIENvbXBvbmVudAotewotICAgIFN0cmluZyBST0xFID0gIm9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5tb2RlbC5Qcm9qZWN0IjsKLQotICAgIC8vIHRoZSBuYW1lIG9mIGN1cnJlbnRseSBleGVjdXRpbmcgcHJvamVjdAotICAgIFN0cmluZyBQUk9KRUNUICAgICAgICAgID0gIm15cm1pZG9uLnByb2plY3QubmFtZSI7Ci0KLSAgICAvLyB0aGUgbmFtZSBvZiBjdXJyZW50bHkgZXhlY3V0aW5nIHByb2plY3QKLSAgICAvL1N0cmluZyBQUk9KRUNUX0ZJTEUgICAgID0gIm15cm1pZG9uLnByb2plY3QuZmlsZSI7Ci0KLSAgICAvLyB0aGUgbmFtZSBvZiBjdXJyZW50bHkgZXhlY3V0aW5nIHRhcmdldAotICAgIC8vU3RyaW5nIFRBUkdFVCAgICAgICAgICAgPSAibXlybWlkb24udGFyZ2V0Lm5hbWUiOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbXBvcnRzIGZvciBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW1wb3J0cwotICAgICAqLwotICAgIFR5cGVMaWJbXSBnZXRUeXBlTGlicygpOwotCi0gICAgLyoqCi0gICAgICogR2V0IG5hbWVzIG9mIHByb2plY3RzIHJlZmVycmVkIHRvIGJ5IHRoaXMgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWVzCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0UHJvamVjdE5hbWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBwcm9qZWN0IHJlZmZlcmVkIHRvIGJ5IHRoaXMgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9qZWN0IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBQcm9qZWN0IG9yIG51bGwgaWYgbm9uZSBieSB0aGF0IG5hbWUKLSAgICAgKi8KLSAgICBQcm9qZWN0IGdldFByb2plY3QoIFN0cmluZyBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmFtZSBvZiBkZWZhdWx0IHRhcmdldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWUKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIGltcGxpY2l0IHRhcmdldC4KLSAgICAgKiBUaGUgaW1wbGljaXQgdGFyZ2V0IGlzIHRvcCBsZXZlbCB0YXNrcy4KLSAgICAgKiBDdXJyZW50bHkgcmVzdHJpY3RlZCB0byBwcm9wZXJ0eSB0YXNrcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFRhcmdldAotICAgICAqLwotICAgIFRhcmdldCBnZXRJbXBsaWNpdFRhcmdldCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYSB0YXJnZXQgYnkgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRhcmdldAotICAgICAqIEByZXR1cm4gdGhlIFRhcmdldCBvciBudWxsIGlmIG5vIHRhcmdldCBleGlzdHMgd2l0aCBuYW1lCi0gICAgICovCi0gICAgVGFyZ2V0IGdldFRhcmdldCggU3RyaW5nIG5hbWUgKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG5hbWVzIG9mIGFsbCB0YXJnZXRzIGluIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvciBvZiBwcm9qZWN0IG5hbWVzCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0VGFyZ2V0TmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIGJhc2UgZGlyZWN0b3J5IG9mIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0cyBiYXNlIGRpcmVjdG9yeQotICAgICAqLwotICAgIEZpbGUgZ2V0QmFzZURpcmVjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL21vZGVsL1RhcmdldC5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL21vZGVsL1RhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTg4ZmQyLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy9tb2RlbC9UYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrLkNvbmRpdGlvbjsKLQotLyoqCi0gKiBUYXJnZXRzIGluIGJ1aWxkIGZpbGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXQKLXsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCAgIG1fZGVwZW5kZW5jaWVzICAgICA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCAgIG1fdGFza3MgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIENvbmRpdGlvbiAgIG1fY29uZGl0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGFraW5nIGNvbmRpdGlvbiBmb3IgdGFyZ2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uCi0gICAgICovCi0gICAgcHVibGljIFRhcmdldCggZmluYWwgQ29uZGl0aW9uIGNvbmRpdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbltdIHRhc2tzLCAKLSAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBkZXBlbmRlbmNpZXMgKQotICAgIHsKLSAgICAgICAgbV9jb25kaXRpb24gPSBjb25kaXRpb247Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fdGFza3MuYWRkKCB0YXNrc1sgaSBdICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbnVsbCAhPSBkZXBlbmRlbmNpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9kZXBlbmRlbmNpZXMuYWRkKCBkZXBlbmRlbmNpZXNbIGkgXSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGNvbmRpdGlvbiB1bmRlciB3aGljaCB0YXJnZXQgaXMgZXhlY3V0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25kaXRpb24gZm9yIHRhcmdldCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIENvbmRpdGlvbiBnZXRDb25kaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29uZGl0aW9uOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXQgZGVwZW5kZW5jaWVzIG9mIHRhcmdldAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGVwZW5kZW5jeSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldERlcGVuZGVuY2llcygpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKW1fZGVwZW5kZW5jaWVzLnRvQXJyYXkoIG5ldyBTdHJpbmdbIDAgXSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0YXNrcyBpbiB0YXJnZXQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIENvbmZpZ3VyYXRpb25bXSBnZXRUYXNrcygpCi0gICAgewotICAgICAgICByZXR1cm4gKENvbmZpZ3VyYXRpb25bXSltX3Rhc2tzLnRvQXJyYXkoIG5ldyBDb25maWd1cmF0aW9uWyAwIF0gKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvbW9kZWwvVHlwZUxpYi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL21vZGVsL1R5cGVMaWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0MTBhMy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvbW9kZWwvVHlwZUxpYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMubW9kZWw7Ci0KLS8qKgotICogSW1wb3J0cyBpbiBhIGJ1aWxkIGZpbGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlTGliCi17Ci0gICAgLy9OYW1lIG9mIGxpYnJhcnkgKHRoaXMgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQpCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgICAgbV9saWJyYXJ5OwotCi0gICAgLy9EbyB3ZSBuZWVkIHRoaXM/PwotICAgIC8vcHJpdmF0ZSBmaW5hbCBTdHJpbmcgICAgbV9uYW1lc3BhY2U7Ci0KLSAgICAvL1RoZSByb2xlIG9mIG9iamVjdCB0byBiZSBpbXBvcnRlZAotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nICAgIG1fcm9sZTsKLQotICAgIC8vVGhlIG5hbWUgb2YgdHlwZSBpbnN0YW5jZQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nICAgIG1fbmFtZTsKLQotICAgIHB1YmxpYyBUeXBlTGliKCBmaW5hbCBTdHJpbmcgbGlicmFyeSApCi0gICAgewotICAgICAgICB0aGlzKCBsaWJyYXJ5LCBudWxsLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVMaWIoIGZpbmFsIFN0cmluZyBsaWJyYXJ5LCBmaW5hbCBTdHJpbmcgcm9sZSwgZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgbV9saWJyYXJ5ID0gbGlicmFyeTsKLSAgICAgICAgbV9yb2xlID0gcm9sZTsKLSAgICAgICAgbV9uYW1lID0gbmFtZTsKLSAgICAgICAKLSAgICAgICAgLy9JZiBvbmx5IG9uZSBvZiBuYW1lIG9yIHR5cGUgaXMgbnVsbCwgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIGlmKCBudWxsID09IG1fcm9sZSB8fCBudWxsID09IG1fbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBudWxsICE9IG1fcm9sZSB8fCBudWxsICE9IG1fbmFtZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkNhbiBub3QgaGF2ZSBhbiBpbXBvcnQgdGhhdCBzcGVjaWZpZXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgb25lIG9mOyBuYW1lIG9yIHJvbGUiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgcm9sZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcm9sZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Um9sZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9yb2xlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBuYW1lIG9mIGltcG9ydGVkIAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9uYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBuYW1lIG9mIGxpYnJhcnkgCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsaWJyYXJ5IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldExpYnJhcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbGlicmFyeTsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3JvbGUvRGVmYXVsdFJvbGVNYW5hZ2VyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvcm9sZS9EZWZhdWx0Um9sZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwYzM5MS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvcm9sZS9EZWZhdWx0Um9sZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCAgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMucm9sZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLlNBWENvbmZpZ3VyYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIG1hbmFnZSByb2xlcyBhbmQgbWFwcGluZyB0byBuYW1lcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqIEB2ZXJzaW9uIENWUyAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJvbGVNYW5hZ2VyCi0gICAgaW1wbGVtZW50cyBSb2xlTWFuYWdlciwgSW5pdGlhbGl6YWJsZQotewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBST0xFX0RFU0NSSVBUT1IgPSAiTUVUQS1JTkYvYW50LXJvbGVzLnhtbCI7Ci0KLSAgICAvKiogUGFyZW50IDxjb2RlPlJvbGVNYW5hZ2VyPC9jb2RlPiBmb3IgbmVzdGVkIHJlc29sdXRpb24gKi8KLSAgICBwcml2YXRlIGZpbmFsIFJvbGVNYW5hZ2VyICBtX3BhcmVudDsKLQotICAgIC8qKiBNYXAgZm9yIG5hbWUgdG8gcm9sZSBtYXBwaW5nICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwICAgICAgbV9uYW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKiogTWFwIGZvciByb2xlIHRvIG5hbWUgbWFwcGluZyAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcCAgICAgIG1fcm9sZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogIGNvbnN0cnVjdG9yLS10aGlzIFJvbGVNYW5hZ2VyIGhhcyBubyBwYXJlbnQuCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRSb2xlTWFuYWdlcigpCi0gICAgewotICAgICAgICB0aGlzKCBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWx0ZXJuYXRlIGNvbnN0cnVjdG9yLS10aGlzIFJvbGVNYW5hZ2VyIGhhcyB0aGUgc3BlY2lmaWVkCi0gICAgICogcGFyZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IDxjb2RlPlJvbGVNYW5hZ2VyPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdFJvbGVNYW5hZ2VyKCBmaW5hbCBSb2xlTWFuYWdlciBwYXJlbnQgKQotICAgIHsKLSAgICAgICAgbV9wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5pdGlhbGl6ZSB0aGUgUm9sZU1hbmFnZXIuCi0gICAgICogVGhpcyBpbnZvbHZlcyByZWFkaW5nIGFsbCBSb2xlIGRlc2NyaXB0b3JzIGluIGNvbW1vbiBjbGFzc2xvYWRlci4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICBmaW5hbCBYTUxSZWFkZXIgcGFyc2VyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICAvL3BhcnNlci5zZXRGZWF0dXJlKCAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgU0FYQ29uZmlndXJhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBTQVhDb25maWd1cmF0aW9uSGFuZGxlcigpOwotICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoIGhhbmRsZXIgKTsKLSAgICAgICAgcGFyc2VyLnNldEVycm9ySGFuZGxlciggaGFuZGxlciApOwotCi0gICAgICAgIGZpbmFsIEVudW1lcmF0aW9uIGVudW0gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VzKCBST0xFX0RFU0NSSVBUT1IgKTsKLSAgICAgICAgd2hpbGUoIGVudW0uaGFzTW9yZUVsZW1lbnRzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBVUkwgdXJsID0gKFVSTCllbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoIHVybC50b1N0cmluZygpICk7Ci0gICAgICAgICAgICBoYW5kbGVEZXNjcmlwdG9yKCBoYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIFJvbGVNYW5hZ2VyIGJhc2VkIG9uIGNvbnRlbnRzIG9mIHNpbmdsZSBkZXNjcmlwdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IKLSAgICAgKiBAZXhjZXB0aW9uIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2NyaXB0b3IoIGZpbmFsIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uW10gdHlwZXMgPSBkZXNjcmlwdG9yLmdldENoaWxkcmVuKCAicm9sZSIgKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gdHlwZXNbIGkgXS5nZXRBdHRyaWJ1dGUoICJzaG9ydGhhbmQiICk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcm9sZSA9IHR5cGVzWyBpIF0uZ2V0QXR0cmlidXRlKCAibmFtZSIgKTsKLSAgICAgICAgICAgIGFkZE5hbWVSb2xlTWFwcGluZyggbmFtZSwgcm9sZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBSb2xlIG5hbWUgYmFzZWQgb24gc2hvcnRoYW5kIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgc2hvcnRoYW5kIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSByb2xlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlRm9yTmFtZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJvbGUgPSAoU3RyaW5nKW1fbmFtZXMuZ2V0KCBuYW1lICk7Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gcm9sZSAmJiBudWxsICE9IG1fcGFyZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fcGFyZW50LmdldFJvbGVGb3JOYW1lKCBuYW1lICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcm9sZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIG5hbWUgYmFzZWQgb24gcm9sZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlCi0gICAgICogQHJldHVybiB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUZvclJvbGUoIGZpbmFsIFN0cmluZyByb2xlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gKFN0cmluZyltX3JvbGVzLmdldCggcm9sZSApOwotCi0gICAgICAgIGlmKCBudWxsID09IG5hbWUgJiYgbnVsbCAhPSBtX3BhcmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX3BhcmVudC5nZXROYW1lRm9yUm9sZSggbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbWFwcGluZyBiZXR3ZWVuIG5hbWUgYW5kIHJvbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBzaG9ydGhhbmQgbmFtZQotICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW4gbmFtZSBpcyBhbHJlYWR5IG1hcHBlZCB0byBhIGRpZmZlcmVudCByb2xlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZVJvbGVNYXBwaW5nKCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHJvbGUgKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgb2xkUm9sZSA9IChTdHJpbmcpbV9uYW1lcy5nZXQoIG5hbWUgKTsKLSAgICAgICAgaWYoIG51bGwgIT0gb2xkUm9sZSAmJiBvbGRSb2xlLmVxdWFscyggcm9sZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgYWxyZWFkeSBtYXBwZWQgdG8gYW5vdGhlciByb2xlICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFJvbGUgKyAiKSIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBvbGROYW1lID0gKFN0cmluZyltX3JvbGVzLmdldCggcm9sZSApOwotICAgICAgICBpZiggbnVsbCAhPSBvbGROYW1lICYmIG9sZE5hbWUuZXF1YWxzKCBuYW1lICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiUm9sZSBhbHJlYWR5IG1hcHBlZCB0byBhbm90aGVyIG5hbWUgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTmFtZSArICIpIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9uYW1lcy5wdXQoIG5hbWUsIHJvbGUgKTsKLSAgICAgICAgbV9yb2xlcy5wdXQoIHJvbGUsIG5hbWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvcm9sZS9Sb2xlTWFuYWdlci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3JvbGUvUm9sZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjMWE1ZC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvcm9sZS9Sb2xlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnJvbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gbWFuYWdlIHJvbGVzIGFuZCBtYXBwaW5nIHRvIHNob3J0aGFuZCBuYW1lcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpibG9yaXRzY2hAYXBhY2hlLm9yZyI+QmVyaW4gTG9yaXRzY2g8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyaWNhcmRvQGFwYWNoZSxvcmciPlJpY2FyZG8gUm9jaGE8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpnaWFjb21vQGFwYWNoZSxvcmciPkdpYWNvbW8gUGF0aTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICogQHZlcnNpb24gQ1ZTICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZU1hbmFnZXIKLSAgICBleHRlbmRzIENvbXBvbmVudAotewotICAgIFN0cmluZyBST0xFID0gIm9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5kZXBsb3llci5Sb2xlTWFuYWdlciI7Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIFJvbGUgbmFtZSBiYXNlZCBvbiBzaG9ydGhhbmQgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaG9ydGhhbmROYW1lIHRoZSBzaG9ydGhhbmQgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIHJvbGUKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Um9sZUZvck5hbWUoIFN0cmluZyBuYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIG5hbWUgYmFzZWQgb24gcm9sZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlCi0gICAgICogQHJldHVybiB0aGUgbmFtZQotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lRm9yUm9sZSggU3RyaW5nIHJvbGUgKTsKLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy90eXBlL0RlZmF1bHRUeXBlRmFjdG9yeS5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3R5cGUvRGVmYXVsdFR5cGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTNjOGEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3R5cGUvRGVmYXVsdFR5cGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLQotLyoqCi0gKiBDcmVhdGUgYSB0eXBlIGluc3RhbmNlIGJhc2VkIG9uIG5hbWUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKiBAdmVyc2lvbiBDVlMgJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRUeXBlRmFjdG9yeQotICAgIGltcGxlbWVudHMgVHlwZUZhY3RvcnkKLXsKLSAgICAvLy9BIE1hcCBvZiBzaG9ydG5hbWVzIHRvIGNsYXNzbmFtZXMKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXAgICAgICAgIG1fY2xhc3NOYW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvLy9BIGxpc3Qgb2YgVVJMcyBmcm9tIHdoaWNoIGNsYXNzTG9hZGVyIGlzIGNvbnN0cnVjdGVkCi0gICAgcHJpdmF0ZSBmaW5hbCBVUkxbXSAgICAgICAgICBtX3VybHM7Ci0KLSAgICAvLy9UaGUgcGFyZW50IGNsYXNzTG9hZGVyIChpZiBhbnkpCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlciAgICBtX3BhcmVudDsKLQotICAgIC8vL1RoZSBwYXJlbnQgY2xhc3NMb2FkZXIgKGlmIGFueSkKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyICAgICAgICAgIG1fY2xhc3NMb2FkZXI7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFR5cGVGYWN0b3J5KCBmaW5hbCBVUkwgdXJsICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIG5ldyBVUkxbXSB7IHVybCB9ICk7Ci0gICAgfQotCi0gICAgcHVibGljIERlZmF1bHRUeXBlRmFjdG9yeSggZmluYWwgVVJMW10gdXJscyApCi0gICAgewotICAgICAgICB0aGlzKCB1cmxzLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpICk7Ci0gICAgfQotCi0gICAgcHVibGljIERlZmF1bHRUeXBlRmFjdG9yeSggZmluYWwgVVJMW10gdXJscywgZmluYWwgQ2xhc3NMb2FkZXIgcGFyZW50ICkKLSAgICB7Ci0gICAgICAgIG1fdXJscyA9IHVybHM7Ci0gICAgICAgIG1fcGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBEZWZhdWx0VHlwZUZhY3RvcnkoIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIG51bGwsIG51bGwgKTsKLSAgICAgICAgbV9jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVDbGFzc01hcHBpbmcoIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lICkKLSAgICB7Ci0gICAgICAgIG1fY2xhc3NOYW1lcy5wdXQoIG5hbWUsIGNsYXNzTmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHR5cGUgaW5zdGFuY2Ugd2l0aCBhcHByb3ByaWF0ZSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGluc3RhbmNlCi0gICAgICogQGV4Y2VwdGlvbiBUeXBlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgICAgIHRocm93cyBUeXBlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKCBuYW1lICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyggY2xhc3NOYW1lICkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUV4Y2VwdGlvbiggIlVuYWJsZSB0byBpbnN0YW50aWF0ZSAnIiArIG5hbWUgKyAiJyIsIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldENsYXNzTmFtZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgICAgICB0aHJvd3MgVHlwZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpbV9jbGFzc05hbWVzLmdldCggbmFtZSApOwotCi0gICAgICAgIGlmKCBudWxsID09IGNsYXNzTmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXhjZXB0aW9uKCAiTWFsY29uZmlndXJlZCBmYWN0b3J5LCBubyBjbGFzbmFtZSBmb3IgJyIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgIiciICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpCi0gICAgewotICAgICAgICBpZiggbnVsbCA9PSBtX2NsYXNzTG9hZGVyICkKLSAgICAgICAgewotICAgICAgICAgICAgbV9jbGFzc0xvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlciggbV91cmxzLCBtX3BhcmVudCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbV9jbGFzc0xvYWRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvdHlwZS9EZWZhdWx0VHlwZU1hbmFnZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy90eXBlL0RlZmF1bHRUeXBlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2EzMGY5Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy90eXBlL0RlZmF1bHRUeXBlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHRoYXQgaXMgdXNlZCB0byBtYW5hZ2UgdHlwZXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VHlwZU1hbmFnZXIKLSAgICBpbXBsZW1lbnRzIFR5cGVNYW5hZ2VyCi17Ci0gICAgLy8vUGFyZW50IHR5cGUgbWFuYWdlciB0byBpbmhlcml0IHZhbHVlcyBmcm9tLgotICAgIHByaXZhdGUgZmluYWwgRGVmYXVsdFR5cGVNYW5hZ2VyICBtX3BhcmVudDsKLQotICAgIC8vL01hcHMgcm9sZSB0byBNdWx0aVNvdXJjZVR5cGVGYWN0b3J5LgotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcCAgICAgICAgICAgICBtX3JvbGVNYXAgICAgICA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFR5cGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHRoaXMoIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFR5cGVNYW5hZ2VyKCBmaW5hbCBEZWZhdWx0VHlwZU1hbmFnZXIgcGFyZW50ICkKLSAgICB7Ci0gICAgICAgIG1fcGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVHlwZSggZmluYWwgU3RyaW5nIHJvbGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNob3J0aGFuZE5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZUZhY3RvcnkgZmFjdG9yeSApIAotICAgICAgICB0aHJvd3MgVHlwZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgTXVsdGlTb3VyY2VUeXBlRmFjdG9yeSBtc0ZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KCByb2xlICk7Ci0gICAgICAgIG1zRmFjdG9yeS5yZWdpc3Rlciggc2hvcnRoYW5kTmFtZSwgZmFjdG9yeSApOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRmFjdG9yeSBnZXRGYWN0b3J5KCBmaW5hbCBTdHJpbmcgcm9sZSApCi0gICAgICAgIHRocm93cyBUeXBlRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRmFjdG9yeSggcm9sZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlTWFuYWdlciBjcmVhdGVDaGlsZFR5cGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFR5cGVNYW5hZ2VyKCB0aGlzICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIE11bHRpU291cmNlVHlwZUZhY3RvcnkgbG9va3VwRmFjdG9yeSggZmluYWwgU3RyaW5nIHJvbGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNdWx0aVNvdXJjZVR5cGVGYWN0b3J5KW1fcm9sZU1hcC5nZXQoIHJvbGUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBmYWN0b3J5IG9mIGFwcHJvcHJpYXRlIHJvbGUuCi0gICAgICogQ3JlYXRlIGEgRmFjdG9yeSBpZiBub25lIGV4aXN0cyB3aXRoIHNhbWUgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlIG5hbWUobXVzdCBiZSBuYW1lIG9mIHdvcmsgaW50ZXJmYWNlKQotICAgICAqIEByZXR1cm4gdGhlIEZhY3RvcnkgZm9yIGludGVyZmFjZQotICAgICAqIEBleGNlcHRpb24gVHlwZUV4Y2VwdGlvbiByb2xlIGRvZXMgbm90IHNwZWNpZnkgYWNjZXNzaWJsZSB3b3JrIGludGVyZmFjZSAKLSAgICAgKi8KLSAgICBwcml2YXRlIE11bHRpU291cmNlVHlwZUZhY3RvcnkgY3JlYXRlRmFjdG9yeSggZmluYWwgU3RyaW5nIHJvbGUgKQotICAgICAgICB0aHJvd3MgVHlwZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTXVsdGlTb3VyY2VUeXBlRmFjdG9yeSBmYWN0b3J5ID0gKE11bHRpU291cmNlVHlwZUZhY3RvcnkpbV9yb2xlTWFwLmdldCggcm9sZSApOwotICAgICAgICBpZiggbnVsbCAhPSBmYWN0b3J5ICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWN0b3J5OwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTXVsdGlTb3VyY2VUeXBlRmFjdG9yeSBwYXJlbnRGYWN0b3J5ID0gZ2V0UGFyZW50VHlwZWRGYWN0b3J5KCByb2xlICk7ICAgICAgIAotICAgICAgICBpZiggbnVsbCAhPSBwYXJlbnRGYWN0b3J5ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBNdWx0aVNvdXJjZVR5cGVGYWN0b3J5KCBwYXJlbnRGYWN0b3J5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy9JZiB3ZSBoYXZlbid0IGdvdCBmYWN0b3J5IHRyeSB0byBjcmVhdGUgYSBuZXcgb25lCi0gICAgICAgIGlmKCBudWxsID09IGZhY3RvcnkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL1RPRE86IFNob3VsZCB3ZSB1c2UgQ29udGV4dENsYXNzTG9hZGVyIGhlcmUgPz8/IE9yIHBlcmhhcHMgdHJ5IHRoYXQgb24gZmFpbHVyZT8/Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCByb2xlICk7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBNdWx0aVNvdXJjZVR5cGVGYWN0b3J5KCBjbGF6eiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUV4Y2VwdGlvbiggIlJvbGUgJyIgKyByb2xlICsgIicgZG9lcyBub3Qgc3BlY2lmeSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzc2libGUgd29yayBpbnRlcmZhY2UiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgICAgIG1fcm9sZU1hcC5wdXQoIHJvbGUsIGZhY3RvcnkgKTsKLQotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE11bHRpU291cmNlVHlwZUZhY3RvcnkgZ2V0UGFyZW50VHlwZWRGYWN0b3J5KCBmaW5hbCBTdHJpbmcgcm9sZSApCi0gICAgewotICAgICAgICBpZiggbnVsbCAhPSBtX3BhcmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX3BhcmVudC5sb29rdXBGYWN0b3J5KCByb2xlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvdHlwZS9NdWx0aVNvdXJjZVR5cGVGYWN0b3J5LmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvdHlwZS9NdWx0aVNvdXJjZVR5cGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2MxMjcuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3R5cGUvTXVsdGlTb3VyY2VUeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIFRoaXMgZmFjdG9yeSBhY3RzIGFzIGEgcHJveHkgdG8gc2V0IG9mIG9iamVjdCBmYWN0b3J5cy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpU291cmNlVHlwZUZhY3RvcnkKLSAgICBpbXBsZW1lbnRzIFR5cGVGYWN0b3J5ICAgICAgICAgICAgICAgCi17Ci0gICAgLy8vUGFyZW50IFNlbGVjdG9yCi0gICAgcHJpdmF0ZSBmaW5hbCBNdWx0aVNvdXJjZVR5cGVGYWN0b3J5ICBtX3BhcmVudDsKLQotICAgIC8vL01hcCBvZiBuYW1lLT5mYWN0b3J5IGxpc3QKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXAgICAgICAgICAgICAgICAgIG1fZmFjdG9yeXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy8vVHlwZSBleHBlY3RlZCB0byBiZSBjcmVhdGVkIGZyb20gZmFjdG9yeXMKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzICAgICAgICAgICAgICAgICAgIG1fdHlwZTsKLQotICAgIHB1YmxpYyBNdWx0aVNvdXJjZVR5cGVGYWN0b3J5KCBmaW5hbCBDbGFzcyB0eXBlICkKLSAgICB7Ci0gICAgICAgIG1fdHlwZSA9IHR5cGU7Ci0gICAgICAgIG1fcGFyZW50ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXVsdGlTb3VyY2VUeXBlRmFjdG9yeSggZmluYWwgTXVsdGlTb3VyY2VUeXBlRmFjdG9yeSBwYXJlbnQgKQotICAgIHsKLSAgICAgICAgbV90eXBlID0gcGFyZW50LmdldFR5cGUoKTsKLSAgICAgICAgbV9wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgdGhlIENvbXBvbmVudFNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgVHlwZUZhY3RvcnkgZmFjdG9yeSApCi0gICAgewotICAgICAgICBtX2ZhY3RvcnlzLnB1dCggbmFtZSwgZmFjdG9yeSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHR5cGUgaW5zdGFuY2UgYmFzZWQgb24gbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBpbnN0YW5jZQotICAgICAqIEBleGNlcHRpb24gVHlwZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgICAgICB0aHJvd3MgVHlwZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVHlwZUZhY3RvcnkgZmFjdG9yeSA9IGdldFR5cGVGYWN0b3J5KCBuYW1lICk7Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gZmFjdG9yeSAmJiBudWxsICE9IG1fcGFyZW50ICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBtX3BhcmVudC5nZXRUeXBlRmFjdG9yeSggbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gZmFjdG9yeSApIAotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUV4Y2VwdGlvbiggIkZhaWxlZCB0byBsb2NhdGUgZmFjdG9yeSBmb3IgJyIgKyBuYW1lICsgIiciICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqZWN0ID0gZmFjdG9yeS5jcmVhdGUoIG5hbWUgKTsKLQotICAgICAgICAgICAgaWYoICFtX3R5cGUuaXNJbnN0YW5jZSggb2JqZWN0ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXhjZXB0aW9uKCAiT2JqZWN0ICciICsgbmFtZSArICInIGlzIG5vdCBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3QgVHlwZSAoIiArIG1fdHlwZS5nZXROYW1lKCkgKyAiKSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHR5cGUgbWFuYWdlZCBieSBzZWxlY3Rvci4KLSAgICAgKiBVc2VkIGJ5IG90aGVyIGluc3RhbmNlcyBvZiBUeXBlZENvbXBvbmVudFNlbGVjdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBjbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzcyBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3R5cGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFR5cGVGYWN0b3J5IGdldFR5cGVGYWN0b3J5KCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gKFR5cGVGYWN0b3J5KW1fZmFjdG9yeXMuZ2V0KCBuYW1lICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3R5cGUvVHlwZUV4Y2VwdGlvbi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3R5cGUvVHlwZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTEwYmU5Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy90eXBlL1R5cGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuQ2FzY2FkaW5nRXhjZXB0aW9uOwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBwcm9ibGVtIHdpdGggdHlwZSBpbnN0YW50aWF0aW5nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZUV4Y2VwdGlvbgotICAgIGV4dGVuZHMgQ2FzY2FkaW5nRXhjZXB0aW9uCi17Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPlR5cGVFeGNlcHRpb248L2NvZGU+IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZUV4Y2VwdGlvbiggZmluYWwgU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgICAgdGhpcyggbWVzc2FnZSwgbnVsbCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5UeXBlRXhjZXB0aW9uPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIHRocm93YWJsZSB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFR5cGVFeGNlcHRpb24oIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlLCB0aHJvd2FibGUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvdHlwZS9UeXBlRmFjdG9yeS5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3R5cGUvVHlwZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4OGFiMS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvdHlwZS9UeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZTsKLQotLyoqCi0gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb24gbmFtZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqIEB2ZXJzaW9uIENWUyAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVGYWN0b3J5Ci17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdHlwZSBpbnN0YW5jZSBiYXNlZCBvbiBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIGluc3RhbmNlCi0gICAgICogQGV4Y2VwdGlvbiBUeXBlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIE9iamVjdCBjcmVhdGUoIFN0cmluZyBuYW1lICkKLSAgICAgICAgdGhyb3dzIFR5cGVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvdHlwZS9UeXBlTWFuYWdlci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3R5cGUvVHlwZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiYTZlYi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvdHlwZS9UeXBlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgdGhhdCBpcyB1c2VkIHRvIG1hbmFnZSB0eXBlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlTWFuYWdlcgotICAgIGV4dGVuZHMgQ29tcG9uZW50Ci17Ci0gICAgU3RyaW5nIFJPTEUgPSAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZU1hbmFnZXIiOwotCi0gICAgdm9pZCByZWdpc3RlclR5cGUoIFN0cmluZyByb2xlLCBTdHJpbmcgc2hvcnRoYW5kTmFtZSwgVHlwZUZhY3RvcnkgZmFjdG9yeSApCi0gICAgICAgIHRocm93cyBUeXBlRXhjZXB0aW9uOwotCi0gICAgVHlwZUZhY3RvcnkgZ2V0RmFjdG9yeSggU3RyaW5nIHJvbGUgKQotICAgICAgICB0aHJvd3MgVHlwZUV4Y2VwdGlvbjsKLQotICAgIFR5cGVNYW5hZ2VyIGNyZWF0ZUNoaWxkVHlwZU1hbmFnZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy93b3Jrc3BhY2UvRGVmYXVsdFdvcmtzcGFjZS5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3dvcmtzcGFjZS9EZWZhdWx0V29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDU5MDEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3dvcmtzcGFjZS9EZWZhdWx0V29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMud29ya3NwYWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuRGVmYXVsdENvbXBvbmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nZ2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcml6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nLkhpZXJhcmNoeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cuTG9nVGFyZ2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLkRlZmF1bHRUYXNrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5kZXBsb3llci5EZWZhdWx0RGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmRlcGxveWVyLkRlcGxveWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5kZXBsb3llci5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5leGVjdXRvci5EZWZhdWx0RXhlY3V0aW9uRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmV4ZWN1dG9yLkV4ZWN1dGlvbkZyYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5leGVjdXRvci5FeGVjdXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMubW9kZWwuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMubW9kZWwuVGFyZ2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5tb2RlbC5UeXBlTGliOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmxpc3RlbmVycy5Qcm9qZWN0TGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBXb3Jrc3BhY2UuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0V29ya3NwYWNlCi0gICAgZXh0ZW5kcyBBYnN0cmFjdExvZ2dhYmxlCi0gICAgaW1wbGVtZW50cyBXb3Jrc3BhY2UsIENvbXBvc2FibGUsIFBhcmFtZXRlcml6YWJsZSwgSW5pdGlhbGl6YWJsZQotewotICAgIHByaXZhdGUgRXhlY3V0b3IgICAgICAgICAgICAgICAgIG1fZXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBQcm9qZWN0TGlzdGVuZXJTdXBwb3J0ICAgbV9saXN0ZW5lclN1cHBvcnQgICA9IG5ldyBQcm9qZWN0TGlzdGVuZXJTdXBwb3J0KCk7Ci0gICAgcHJpdmF0ZSBDb21wb25lbnRNYW5hZ2VyICAgICAgICAgbV9jb21wb25lbnRNYW5hZ2VyOwotICAgIHByaXZhdGUgUGFyYW1ldGVycyAgICAgICAgICAgICAgIG1fcGFyYW1ldGVyczsKLSAgICBwcml2YXRlIFRhc2tDb250ZXh0ICAgICAgICAgICAgICBtX2Jhc2VDb250ZXh0OwotICAgIHByaXZhdGUgSGFzaE1hcCAgICAgICAgICAgICAgICAgIG1fZW50cnlzICAgICAgICAgICAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgVHlwZU1hbmFnZXIgICAgICAgICAgICAgIG1fdHlwZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBIaWVyYXJjaHkgICAgICAgICAgICAgICAgbV9oaWVyYXJjaHk7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICAgbV9wcm9qZWN0SUQ7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBsaXN0ZW5lciB0byBwcm9qZWN0IGV2ZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9qZWN0TGlzdGVuZXIoIGZpbmFsIFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBtX2xpc3RlbmVyU3VwcG9ydC5hZGRQcm9qZWN0TGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSBwcm9qZWN0IGV2ZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9qZWN0TGlzdGVuZXIoIGZpbmFsIFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBtX2xpc3RlbmVyU3VwcG9ydC5yZW1vdmVQcm9qZWN0TGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgcmVsZXZlbnQgc2VydmljZXMgbmVlZGVkIGZvciBlbmdpbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50TWFuYWdlciB0aGUgQ29tcG9uZW50TWFuYWdlcgotICAgICAqIEBleGNlcHRpb24gQ29tcG9uZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoIGZpbmFsIENvbXBvbmVudE1hbmFnZXIgY29tcG9uZW50TWFuYWdlciApCi0gICAgICAgIHRocm93cyBDb21wb25lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1fY29tcG9uZW50TWFuYWdlciA9IGNvbXBvbmVudE1hbmFnZXI7Ci0gICAgICAgIG1fdHlwZU1hbmFnZXIgPSAoVHlwZU1hbmFnZXIpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIFR5cGVNYW5hZ2VyLlJPTEUgKTsKLSAgICAgICAgbV9leGVjdXRvciA9IChFeGVjdXRvciljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggRXhlY3V0b3IuUk9MRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcmFtZXRlcml6ZSggZmluYWwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzICkKLSAgICAgICAgdGhyb3dzIFBhcmFtZXRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV9iYXNlQ29udGV4dCA9IGNyZWF0ZUJhc2VDb250ZXh0KCk7Ci0KLSAgICAgICAgbV9oaWVyYXJjaHkgPSBuZXcgSGllcmFyY2h5KCk7Ci0KLSAgICAgICAgZmluYWwgTG9nVGFyZ2V0IHRhcmdldCA9IG5ldyBMb2dUYXJnZXRUb0xpc3RlbmVyQWRhcHRlciggbV9saXN0ZW5lclN1cHBvcnQgKTsKLSAgICAgICAgbV9oaWVyYXJjaHkuc2V0RGVmYXVsdExvZ1RhcmdldCggdGFyZ2V0ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIHRhcmdldCBpbiBhIHBhcnRpY3VsYXIgcHJvamVjdC4KLSAgICAgKiBFeGVjdXRlIGluIHRoZSBwcm9qZWN0IGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgUHJvamVjdAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIG5hbWUgb2YgdGhlIHRhcmdldAotICAgICAqIEBleGNlcHRpb24gVGFza0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlUHJvamVjdCggZmluYWwgUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBTdHJpbmcgdGFyZ2V0ICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFByb2plY3RFbnRyeSBlbnRyeSA9IGdldFByb2plY3RFbnRyeSggcHJvamVjdCApOwotCi0gICAgICAgIG1fbGlzdGVuZXJTdXBwb3J0LnByb2plY3RTdGFydGVkKCk7Ci0KLSAgICAgICAgZXhlY3V0ZVRhcmdldCggIjxpbml0PiIsIHByb2plY3QuZ2V0SW1wbGljaXRUYXJnZXQoKSwgZW50cnkuZ2V0RnJhbWUoKSApOwotCi0gICAgICAgIGV4ZWN1dGUoIHByb2plY3QsIHRhcmdldCwgZW50cnkgKTsKLQotICAgICAgICBtX2xpc3RlbmVyU3VwcG9ydC5wcm9qZWN0RmluaXNoZWQoKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgVGFza0NvbnRleHQgY3JlYXRlQmFzZUNvbnRleHQoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgVGFza0NvbnRleHQgY29udGV4dCA9IG5ldyBEZWZhdWx0VGFza0NvbnRleHQoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lcyA9IG1fcGFyYW1ldGVycy5nZXROYW1lcygpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gbV9wYXJhbWV0ZXJzLmdldFBhcmFtZXRlciggbmFtZXNbIGkgXSwgbnVsbCApOwotICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eSggbmFtZXNbIGkgXSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQWRkIHN5c3RlbSBwcm9wZXJ0aWVzIHNvIHRoYXQgdGhleSBvdmVyaWRlIHVzZXItZGVmaW5lZCBwcm9wZXJ0aWVzCi0gICAgICAgIGFkZFRvQ29udGV4dCggY29udGV4dCwgU3lzdGVtLmdldFByb3BlcnRpZXMoKSApOwotCi0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZSBmaW5kVHlwZUxpYiggZmluYWwgU3RyaW5nIGxpYnJhcnlOYW1lICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vVE9ETzogSW4gZnV0dXJlIHRoaXMgd2lsbCBiZSBleHBhbmRlZCB0byBhbGxvdwotICAgICAgICAvL3VzZXJzIHRvIHNwZWNpZnkgc2VhcmNoIHBhdGggb3IgYXV0b21hZ2ljYWxseSAKLSAgICAgICAgLy9hZGQgZW50cmllcyB0byBsaWIgcGF0aCAobGlrZSB1c2VyIHNwZWNpZmljIG9yIAotICAgICAgICAvL3dvcmtzcGFjZSBzcGVjaWZpYykKLSAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBsaWJyYXJ5TmFtZS5yZXBsYWNlKCAnLycsIEZpbGUuc2VwYXJhdG9yQ2hhciApICsgIi5hdGwiOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBob21lID0gU3lzdGVtLmdldFByb3BlcnR5KCAibXlybWlkb24uaG9tZSIgKTsKLSAgICAgICAgZmluYWwgRmlsZSBob21lRGlyID0gbmV3IEZpbGUoIGhvbWUgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiZXh0IiApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgRmlsZSBsaWJyYXJ5ID0gbmV3IEZpbGUoIGhvbWVEaXIsIG5hbWUgKTsKLQotICAgICAgICBpZiggbGlicmFyeS5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhbGlicmFyeS5jYW5SZWFkKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiVW5hYmxlIHRvIHJlYWQgbGlicmFyeSBhdCAiICsgbGlicmFyeSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBsaWJyYXJ5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJVbmFibGUgdG8gbG9jYXRlIFR5cGUgTGlicmFyeSAiICsgbGlicmFyeU5hbWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVwbG95VHlwZUxpYiggZmluYWwgRGVwbG95ZXIgZGVwbG95ZXIsIGZpbmFsIFByb2plY3QgcHJvamVjdCApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBUeXBlTGliW10gdHlwZUxpYnMgPSBwcm9qZWN0LmdldFR5cGVMaWJzKCk7Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0eXBlTGlicy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFR5cGVMaWIgdHlwZUxpYiA9IHR5cGVMaWJzWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBmaW5kVHlwZUxpYiggdHlwZUxpYi5nZXRMaWJyYXJ5KCkgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIG51bGwgPT0gdHlwZUxpYi5nZXRSb2xlKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVwbG95ZXIuZGVwbG95KCBmaWxlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGxveWVyLmRlcGxveVR5cGUoIHR5cGVMaWIuZ2V0Um9sZSgpLCB0eXBlTGliLmdldE5hbWUoKSwgZmlsZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBmaW5hbCBEZXBsb3ltZW50RXhjZXB0aW9uIGRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIkVycm9yIGRlcGxveWluZyB0eXBlIGxpYnJhcnkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVMaWIgKyAiIGF0ICIgKyBmaWxlLCBkZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFeGVjdXRpb25GcmFtZSBjcmVhdGVFeGVjdXRpb25GcmFtZSggZmluYWwgUHJvamVjdCBwcm9qZWN0ICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFRhc2tDb250ZXh0IGNvbnRleHQgPSBuZXcgRGVmYXVsdFRhc2tDb250ZXh0KCBtX2Jhc2VDb250ZXh0ICk7Ci0gICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoIFRhc2tDb250ZXh0LkJBU0VfRElSRUNUT1JZLCBwcm9qZWN0LmdldEJhc2VEaXJlY3RvcnkoKSApOwotCi0gICAgICAgIC8vQ3JlYXRlIHBlciBmcmFtZSBDb21wb25lbnRNYW5hZ2VyCi0gICAgICAgIGZpbmFsIERlZmF1bHRDb21wb25lbnRNYW5hZ2VyIGNvbXBvbmVudE1hbmFnZXIgPQotICAgICAgICAgICAgbmV3IERlZmF1bHRDb21wb25lbnRNYW5hZ2VyKCBtX2NvbXBvbmVudE1hbmFnZXIgKTsKLQotICAgICAgICAvL0FkZCBpbiBjaGlsZCB0eXBlIG1hbmFnZXIgc28gZWFjaCBmcmFtZSBjYW4gcmVnaXN0ZXIgZGlmZmVyZW50Ci0gICAgICAgIC8vc2V0cyBvZiB0YXNrcyBldGMKLSAgICAgICAgZmluYWwgVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIgPSBtX3R5cGVNYW5hZ2VyLmNyZWF0ZUNoaWxkVHlwZU1hbmFnZXIoKTsKLSAgICAgICAgY29tcG9uZW50TWFuYWdlci5wdXQoIFR5cGVNYW5hZ2VyLlJPTEUsIHR5cGVNYW5hZ2VyICk7Ci0KLSAgICAgICAgLy9XZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBkZXBsb3llciBzbyB0aGF0IGl0IGRlcGxveXMKLSAgICAgICAgLy90byBwcm9qZWN0IHNwZWNpZmljIFR5cGVNYW5hZ2VyCi0gICAgICAgIGZpbmFsIERlZmF1bHREZXBsb3llciBkZXBsb3llciA9IG5ldyBEZWZhdWx0RGVwbG95ZXIoKTsKLSAgICAgICAgZGVwbG95ZXIuc2V0TG9nZ2VyKCBnZXRMb2dnZXIoKSApOwotCi0gICAgICAgIHRyeSB7IGRlcGxveWVyLmNvbXBvc2UoIGNvbXBvbmVudE1hbmFnZXIgKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgQ29tcG9uZW50RXhjZXB0aW9uIGNlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJFcnJvciBjb25maWd1cmluZyBkZXBsb3llciIsIGNlICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0hBQ0s6IERpZG4ndCBjYWxsIGluaXRpYWxpemUgYmVjYXVzZSBEZXBsb3llciBjb250YWluZWQgaW4gRW1iZWRkb3IKLSAgICAgICAgLy8gQWxyZWFkeSBpbml0aWFsaXplZCBhbmQgdGhpcyB3b3VsZCBiZSByZWR1ZW5kZW50Ci0gICAgICAgIC8vZGVwbG95ZXIuaW5pdGlhbGl6ZSgpOwotCi0gICAgICAgIGNvbXBvbmVudE1hbmFnZXIucHV0KCBEZXBsb3llci5ST0xFLCBkZXBsb3llciApOwotCi0gICAgICAgIGRlcGxveVR5cGVMaWIoIGRlcGxveWVyLCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgLy9XZSBuZWVkIHRvIHBsYWNlIHByb2plY3RzIGFuZCBQcm9qZWN0TWFuYWdlcgotICAgICAgICAvL2luIENvbXBvbmVudE1hbmFnZXIgc28gYXMgdG8gc3VwcG9ydCBwcm9qZWN0LWxvY2FsIGNhbGwoKQotICAgICAgICBjb21wb25lbnRNYW5hZ2VyLnB1dCggV29ya3NwYWNlLlJPTEUsIHRoaXMgKTsKLSAgICAgICAgY29tcG9uZW50TWFuYWdlci5wdXQoIFByb2plY3QuUk9MRSwgcHJvamVjdCApOwotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVzID0gcHJvamVjdC5nZXRQcm9qZWN0TmFtZXMoKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbmFtZXNbIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIFByb2plY3Qgb3RoZXIgPSBwcm9qZWN0LmdldFByb2plY3QoIG5hbWUgKTsKLSAgICAgICAgICAgIGNvbXBvbmVudE1hbmFnZXIucHV0KCBQcm9qZWN0LlJPTEUgKyAiLyIgKyBuYW1lLCBvdGhlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRGVmYXVsdEV4ZWN1dGlvbkZyYW1lIGZyYW1lID0gbmV3IERlZmF1bHRFeGVjdXRpb25GcmFtZSgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbV9oaWVyYXJjaHkuZ2V0TG9nZ2VyRm9yKCAicHJvamVjdCIgKyBtX3Byb2plY3RJRCApOwotICAgICAgICAgICAgbV9wcm9qZWN0SUQrKzsKLQotICAgICAgICAgICAgZnJhbWUuc2V0TG9nZ2VyKCBsb2dnZXIgKTsKLSAgICAgICAgICAgIGZyYW1lLmNvbnRleHR1YWxpemUoIGNvbnRleHQgKTsKLSAgICAgICAgICAgIGZyYW1lLmNvbXBvc2UoIGNvbXBvbmVudE1hbmFnZXIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIkVycm9yIHNldHRpbmcgdXAgRXhlY3V0aW9uRnJhbWUiLCBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZnJhbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9qZWN0RW50cnkgZ2V0UHJvamVjdEVudHJ5KCBmaW5hbCBQcm9qZWN0IHByb2plY3QgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUHJvamVjdEVudHJ5IGVudHJ5ID0gKFByb2plY3RFbnRyeSltX2VudHJ5cy5nZXQoIHByb2plY3QgKTsKLQotICAgICAgICBpZiggbnVsbCA9PSBlbnRyeSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dGlvbkZyYW1lIGZyYW1lID0gY3JlYXRlRXhlY3V0aW9uRnJhbWUoIHByb2plY3QgKTsKLSAgICAgICAgICAgIGVudHJ5ID0gbmV3IFByb2plY3RFbnRyeSggcHJvamVjdCwgZnJhbWUgKTsKLSAgICAgICAgICAgIG1fZW50cnlzLnB1dCggcHJvamVjdCwgZW50cnkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbnRyeTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb2plY3QgZ2V0UHJvamVjdCggZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFByb2plY3QgcHJvamVjdCApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBQcm9qZWN0IG90aGVyID0gcHJvamVjdC5nZXRQcm9qZWN0KCBuYW1lICk7Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gb3RoZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1RPRE86IEZpeCB0aGlzIHNvIGxvY2F0aW9uIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIlByb2plY3QgJyIgKyBuYW1lICsgIicgbm90IGZvdW5kLiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvdGhlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGV4ZWN1dGUgYSB0YXJnZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgUHJvamVjdAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIG5hbWUgb2YgdGhlIHRhcmdldAotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGRvbmUgdGhlIGxpc3Qgb2YgdGFyZ2V0cyBhbHJlYWR5IGV4ZWN1dGVkIGluIGN1cnJlbnQgcnVuCi0gICAgICogQGV4Y2VwdGlvbiBUYXNrRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlKCBmaW5hbCBQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YXJnZXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0RW50cnkgZW50cnkgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gdGFyZ2V0TmFtZS5pbmRleE9mKCAiLT4iICk7Ci0gICAgICAgIGlmKCAtMSAhPSBpbmRleCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gdGFyZ2V0TmFtZS5zdWJzdHJpbmcoIDAsIGluZGV4ICk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3RoZXJUYXJnZXROYW1lID0gdGFyZ2V0TmFtZS5zdWJzdHJpbmcoIGluZGV4ICsgMiApOwotCi0gICAgICAgICAgICBmaW5hbCBQcm9qZWN0IG90aGVyUHJvamVjdCA9IGdldFByb2plY3QoIG5hbWUsIHByb2plY3QgKTsKLSAgICAgICAgICAgIGZpbmFsIFByb2plY3RFbnRyeSBvdGhlckVudHJ5ID0gZ2V0UHJvamVjdEVudHJ5KCBvdGhlclByb2plY3QgKTsKLQotICAgICAgICAgICAgLy9FeGVjdXRlIHRhcmdldCBpbiByZWZlcmVuY2VkIHByb2plY3QKLSAgICAgICAgICAgIGV4ZWN1dGUoIG90aGVyUHJvamVjdCwgb3RoZXJUYXJnZXROYW1lLCBvdGhlckVudHJ5ICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBUYXJnZXQgdGFyZ2V0ID0gcHJvamVjdC5nZXRUYXJnZXQoIHRhcmdldE5hbWUgKTsKLSAgICAgICAgaWYoIG51bGwgPT0gdGFyZ2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJVbmFibGUgdG8gZmluZCB0YXJnZXQgIiArIHRhcmdldE5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vYWRkIHRhcmdldCB0byBsaXN0IG9mIHRhcmdldHMgZXhlY3V0ZWQKLSAgICAgICAgZW50cnkuY29tcGxldGVUYXJnZXQoIHRhcmdldE5hbWUgKTsKLQotICAgICAgICAvL2V4ZWN1dGUgYWxsIGRlcGVuZGVuY2llcwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBkZXBlbmRlbmNpZXMgPSB0YXJnZXQuZ2V0RGVwZW5kZW5jaWVzKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICFlbnRyeS5pc1RhcmdldENvbXBsZXRlZCggZGVwZW5kZW5jaWVzWyBpIF0gKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZSggcHJvamVjdCwgZGVwZW5kZW5jaWVzWyBpIF0sIGVudHJ5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL25vdGlmeSBsaXN0ZW5lcnMKLSAgICAgICAgbV9saXN0ZW5lclN1cHBvcnQudGFyZ2V0U3RhcnRlZCggdGFyZ2V0TmFtZSApOwotCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoIHRhcmdldE5hbWUsIHRhcmdldCwgZW50cnkuZ2V0RnJhbWUoKSApOwotCi0gICAgICAgIC8vbm90aWZ5IGxpc3RlbmVycwotICAgICAgICBtX2xpc3RlbmVyU3VwcG9ydC50YXJnZXRGaW5pc2hlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0byBleGVjdXRlIGEgcGFydGljdWxhciB0YXJnZXQgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZSB0aGUgbmFtZSBvZiB0YXJnZXQKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBpbiB3aGljaCB0byBleGVjdXRlCi0gICAgICogQGV4Y2VwdGlvbiBUYXNrRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVGFyZ2V0KCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGFyZ2V0IHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhlY3V0aW9uRnJhbWUgZnJhbWUgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy9jaGVjayB0aGUgY29uZGl0aW9uIGFzc29jaWF0ZWQgd2l0aCB0YXJnZXQuCi0gICAgICAgIC8vaWYgaXQgaXMgbm90IHNhdGlzZmllZCB0aGVuIHNraXAgdGFyZ2V0Ci0gICAgICAgIGZpbmFsIENvbmRpdGlvbiBjb25kaXRpb24gPSB0YXJnZXQuZ2V0Q29uZGl0aW9uKCk7Ci0gICAgICAgIGlmKCBudWxsICE9IGNvbmRpdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmYWxzZSA9PSBjb25kaXRpb24uZXZhbHVhdGUoIGZyYW1lLmdldENvbnRleHQoKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiU2tpcHBpbmcgdGFyZ2V0ICIgKyBuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYXMgaXQgZG9lcyBub3Qgc2F0aXNmeSBjb25kaXRpb24iICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggZmluYWwgQ29udGV4dEV4Y2VwdGlvbiBjZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJFcnJvciBldmFsdWF0aW5nIENvbmRpdGlvbiBmb3IgdGFyZ2V0ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgY2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiRXhlY3V0aW5nIHRhcmdldCAiICsgbmFtZSApOwotCi0gICAgICAgIC8vZnJhbWUuZ2V0Q29udGV4dCgpLnNldFByb3BlcnR5KCBQcm9qZWN0LlRBUkdFVCwgdGFyZ2V0ICk7Ci0KLSAgICAgICAgLy9leGVjdXRlIGFsbCB0YXNrcyBhc3NjaWF0ZWQgd2l0aCB0YXJnZXQKLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbltdIHRhc2tzID0gdGFyZ2V0LmdldFRhc2tzKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBleGVjdXRlVGFzayggdGFza3NbIGkgXSwgZnJhbWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSB0YXNrLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2sgZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0Ci0gICAgICogQGV4Y2VwdGlvbiBUYXNrRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVGFzayggZmluYWwgQ29uZmlndXJhdGlvbiB0YXNrLCBmaW5hbCBFeGVjdXRpb25GcmFtZSBmcmFtZSApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHRhc2suZ2V0TmFtZSgpOwotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkV4ZWN1dGluZyB0YXNrICIgKyBuYW1lICk7Ci0KLSAgICAgICAgLy9pcyBzZXR0aW5nIG5hbWUgZXZlbiBuZWNlc3NhcnkgPz8/Ci0gICAgICAgIGZyYW1lLmdldENvbnRleHQoKS5zZXRQcm9wZXJ0eSggVGFza0NvbnRleHQuTkFNRSwgbmFtZSApOwotCi0gICAgICAgIC8vbm90aWZ5IGxpc3RlbmVycwotICAgICAgICBtX2xpc3RlbmVyU3VwcG9ydC50YXNrU3RhcnRlZCggbmFtZSApOwotCi0gICAgICAgIC8vcnVuIHRhc2sKLSAgICAgICAgbV9leGVjdXRvci5leGVjdXRlKCB0YXNrLCBmcmFtZSApOwotCi0gICAgICAgIC8vbm90aWZ5IGxpc3RlbmVycyB0YXNrIGhhcyBlbmRlZAotICAgICAgICBtX2xpc3RlbmVyU3VwcG9ydC50YXNrRmluaXNoZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGFkZCB2YWx1ZXMgdG8gYSBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dAotICAgICAqIEBwYXJhbSBtYXAgdGhlIG1hcCBvZiBuYW1lcy0+dmFsdWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvQ29udGV4dCggZmluYWwgVGFza0NvbnRleHQgY29udGV4dCwgZmluYWwgTWFwIG1hcCApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBJdGVyYXRvciBrZXlzID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUoIGtleXMuaGFzTmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBtYXAuZ2V0KCBrZXkgKTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoIGtleSwgdmFsdWUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy93b3Jrc3BhY2UvTG9nVGFyZ2V0VG9MaXN0ZW5lckFkYXB0ZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy93b3Jrc3BhY2UvTG9nVGFyZ2V0VG9MaXN0ZW5lckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllYWYxZi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvd29ya3NwYWNlL0xvZ1RhcmdldFRvTGlzdGVuZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy53b3Jrc3BhY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZy5Mb2dFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZy5Mb2dUYXJnZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5saXN0ZW5lcnMuUHJvamVjdExpc3RlbmVyOwotCi0vKioKLSAqIEFkYXB0ZXIgYmV0d2VlbiBBdmFsb24gTG9nS2l0IGFuZCBQcm9qZWN0IGxpc3RlbmVyIGludGVyZmFjZXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb2dUYXJnZXRUb0xpc3RlbmVyQWRhcHRlcgotICAgIGltcGxlbWVudHMgTG9nVGFyZ2V0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0TGlzdGVuZXIgICAgbV9saXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRha2luZyBsaXN0ZW5lciB0byBjb252ZXJ0IHRvLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBQcm9qZWN0TGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9nVGFyZ2V0VG9MaXN0ZW5lckFkYXB0ZXIoIGZpbmFsIFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBtX2xpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhIGxvZyBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRXZlbnQoIGZpbmFsIExvZ0V2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIGlmKCBudWxsID09IGV2ZW50LmdldFRocm93YWJsZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgbV9saXN0ZW5lci5sb2coIGV2ZW50LmdldE1lc3NhZ2UoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbV9saXN0ZW5lci5sb2coIGV2ZW50LmdldE1lc3NhZ2UoKSwgZXZlbnQuZ2V0VGhyb3dhYmxlKCkgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy93b3Jrc3BhY2UvUHJvamVjdEVudHJ5LmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvd29ya3NwYWNlL1Byb2plY3RFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDVjNzFmLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy93b3Jrc3BhY2UvUHJvamVjdEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy53b3Jrc3BhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5leGVjdXRvci5FeGVjdXRpb25GcmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMubW9kZWwuUHJvamVjdDsKLQotLyoqCi0gKiBUaGlzIGNvbnRhaW5zIGRldGFpc2wgZm9yIGVhY2ggcHJvamVjdCB0aGF0IGlzIG1hbmFnZWQgYnkgUHJvamVjdE1hbmFnZXIuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0RW50cnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIFByb2plY3QgICAgICAgICBtX3Byb2plY3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRpb25GcmFtZSAgbV9mcmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCAgICAgICBtX3RhcmdldHNDb21wbGV0ZWQgICA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBQcm9qZWN0RW50cnkoIGZpbmFsIFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeGVjdXRpb25GcmFtZSBmcmFtZSApCi0gICAgewotICAgICAgICBtX3Byb2plY3QgPSBwcm9qZWN0OwotICAgICAgICBtX2ZyYW1lID0gZnJhbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wcm9qZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBFeGVjdXRpb25GcmFtZSBnZXRGcmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9mcmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RhcmdldENvbXBsZXRlZCggZmluYWwgU3RyaW5nIHRhcmdldCApCi0gICAgewotICAgICAgICByZXR1cm4gbV90YXJnZXRzQ29tcGxldGVkLmNvbnRhaW5zKCB0YXJnZXQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZVRhcmdldCggZmluYWwgU3RyaW5nIHRhcmdldCApCi0gICAgewotICAgICAgICBtX3RhcmdldHNDb21wbGV0ZWQuYWRkKCB0YXJnZXQgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbXBvbmVudHMvd29ya3NwYWNlL1Byb2plY3RMaXN0ZW5lclN1cHBvcnQuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy93b3Jrc3BhY2UvUHJvamVjdExpc3RlbmVyU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODg0MTY0Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy93b3Jrc3BhY2UvUHJvamVjdExpc3RlbmVyU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLndvcmtzcGFjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24ubGlzdGVuZXJzLlByb2plY3RMaXN0ZW5lcjsKLQotLyoqCi0gKiBTdXBwb3J0IGZvciB0aGUgcHJvamVjdCBsaXN0ZW5lciBldmVudCBkaXNwYXRjaGluZy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RMaXN0ZW5lclN1cHBvcnQKLSAgICBpbXBsZW1lbnRzIFByb2plY3RMaXN0ZW5lcgotewotICAgIHByaXZhdGUgUHJvamVjdExpc3RlbmVyW10gICBtX2xpc3RlbmVycyA9IG5ldyBQcm9qZWN0TGlzdGVuZXJbIDAgXTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBleHRyYSBwcm9qZWN0IGxpc3RlbmVyIHRoYXQgd2FudHMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgbGlzdGVuZXIgZXZlbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb2plY3RMaXN0ZW5lciggZmluYWwgUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFByb2plY3RMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBQcm9qZWN0TGlzdGVuZXJbIG1fbGlzdGVuZXJzLmxlbmd0aCArIDEgXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSggbV9saXN0ZW5lcnMsIDAsIGxpc3RlbmVycywgMCwgbV9saXN0ZW5lcnMubGVuZ3RoICk7Ci0gICAgICAgIGxpc3RlbmVyc1sgbV9saXN0ZW5lcnMubGVuZ3RoIF0gPSBsaXN0ZW5lcjsKLSAgICAgICAgbV9saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgcHJvamVjdCBsaXN0ZW5lciB0aGF0IHdhbnRzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGxpc3RlbmVyIGV2ZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9qZWN0TGlzdGVuZXIoIGZpbmFsIFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBpbnQgZm91bmQgPSAtMTsKLQotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1fbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGxpc3RlbmVyID09IG1fbGlzdGVuZXJzWyBpIF0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvdW5kID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAtMSA9PSBmb3VuZCApIHJldHVybjsKLQotICAgICAgICBmaW5hbCBQcm9qZWN0TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgUHJvamVjdExpc3RlbmVyWyBtX2xpc3RlbmVycy5sZW5ndGggLSAxIF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIG1fbGlzdGVuZXJzLCAwLCBsaXN0ZW5lcnMsIDAsIGZvdW5kICk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbV9saXN0ZW5lcnMubGVuZ3RoIC0gZm91bmQgLSAxOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBtX2xpc3RlbmVycywgZm91bmQsIGxpc3RlbmVycywgZm91bmQgKyAxLCBjb3VudCApOwotCi0gICAgICAgIG1fbGlzdGVuZXJzID0gbGlzdGVuZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcmUgYSBwcm9qZWN0U3RhcnRlZCBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0U3RhcnRlZCgpCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1fbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbV9saXN0ZW5lcnNbIGkgXS5wcm9qZWN0U3RhcnRlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyZSBhIHByb2plY3RGaW5pc2hlZCBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0RmluaXNoZWQoKQotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBtX2xpc3RlbmVycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fbGlzdGVuZXJzWyBpIF0ucHJvamVjdEZpbmlzaGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJlIGEgdGFyZ2V0U3RhcnRlZCBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXROYW1lIHRoZSBuYW1lIG9mIHRhcmdldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoIFN0cmluZyB0YXJnZXROYW1lICkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbV9saXN0ZW5lcnMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2xpc3RlbmVyc1sgaSBdLnRhcmdldFN0YXJ0ZWQoIHRhcmdldE5hbWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcmUgYSB0YXJnZXRGaW5pc2hlZCBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZCgpCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1fbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbV9saXN0ZW5lcnNbIGkgXS50YXJnZXRGaW5pc2hlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyZSBhIHRhcmdldFN0YXJ0ZWQgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZSB0aGUgbmFtZSBvZiB0YXJnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZCggU3RyaW5nIHRhc2tOYW1lICkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbV9saXN0ZW5lcnMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2xpc3RlbmVyc1sgaSBdLnRhc2tTdGFydGVkKCB0YXNrTmFtZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyZSBhIHRhc2tGaW5pc2hlZCBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoKQotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBtX2xpc3RlbmVycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fbGlzdGVuZXJzWyBpIF0udGFza0ZpbmlzaGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJlIGEgbG9nIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGxvZyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9nKCBTdHJpbmcgbWVzc2FnZSApCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1fbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbV9saXN0ZW5lcnNbIGkgXS5sb2coIG1lc3NhZ2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcmUgYSBsb2cgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9nIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIHRoZSB0aHJvd2FibGUgdG8gYmUgbG9nZ2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9nKCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1fbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbV9saXN0ZW5lcnNbIGkgXS5sb2coIG1lc3NhZ2UsIHRocm93YWJsZSApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3dvcmtzcGFjZS9Xb3Jrc3BhY2UuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29tcG9uZW50cy93b3Jrc3BhY2UvV29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWU2MDQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb21wb25lbnRzL3dvcmtzcGFjZS9Xb3Jrc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLndvcmtzcGFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMubW9kZWwuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmxpc3RlbmVycy5Qcm9qZWN0TGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYWJzdHJhY3Rpb24gdGhyb3VnaCB3aGljaCBQcm9qZWN0cyBhcmUgbWFuYWdlZCBhbmQgZXhlY3V0ZWQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya3NwYWNlCi0gICAgZXh0ZW5kcyBDb21wb25lbnQKLXsKLSAgICBTdHJpbmcgUk9MRSA9ICJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMud29ya3NwYWNlLldvcmtzcGFjZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBsaXN0ZW5lciB0byBwcm9qZWN0IGV2ZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICB2b2lkIGFkZFByb2plY3RMaXN0ZW5lciggUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmcm9tIHByb2plY3QgZXZlbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlUHJvamVjdExpc3RlbmVyKCBQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSB0YXJnZXQgaW4gYSBwYXJ0aWN1bGFyIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgUHJvamVjdAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIG5hbWUgb2YgdGhlIHRhcmdldAotICAgICAqIEBwYXJhbSBkZWZpbmVzIHRoZSBkZWZpbmVzCi0gICAgICogQGV4Y2VwdGlvbiBUYXNrRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHZvaWQgZXhlY3V0ZVByb2plY3QoIFByb2plY3QgcHJvamVjdCwgU3RyaW5nIHRhcmdldCApCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb252ZXJ0ZXIvQWJzdHJhY3RDb252ZXJ0ZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29udmVydGVyL0Fic3RyYWN0Q29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NWU4NDcuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb252ZXJ0ZXIvQWJzdHJhY3RDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGludGVyZmFjZSBhcmUgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gZGlmZmVyZW50IHR5cGVzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb252ZXJ0ZXIKLSAgICBpbXBsZW1lbnRzIENvbnZlcnRlcgotewotICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgICAgICAgICBtX3NvdXJjZTsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzICAgICAgICAgbV9kZXN0aW5hdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBhIGNvbnZlcnRlciBiZXR3ZWVuIHR5cGVzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0eXBlCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiB0eXBlCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0Q29udmVydGVyKCBmaW5hbCBDbGFzcyBzb3VyY2UsIGZpbmFsIENsYXNzIGRlc3RpbmF0aW9uICkKLSAgICB7Ci0gICAgICAgIG1fc291cmNlID0gc291cmNlOwotICAgICAgICBtX2Rlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhbiBvYmplY3QgZnJvbSBvcmlnaW5hbCB0byBkZXN0aW5hdGlvbiB0eXBlcwotICAgICAqCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiB0eXBlCi0gICAgICogQHBhcmFtIG9yaWdpbmFsIHRoZSBvcmlnaW5hbCBPYmplY3QKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBpbiB3aGljaCB0byBjb252ZXJ0Ci0gICAgICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdAotICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY29udmVydCggZmluYWwgQ2xhc3MgZGVzdGluYXRpb24sIGZpbmFsIE9iamVjdCBvcmlnaW5hbCwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIG1fZGVzdGluYXRpb24gIT0gZGVzdGluYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gdHlwZSAiICsgZGVzdGluYXRpb24uZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IGVxdWFsIHRvICIgKyBtX2Rlc3RpbmF0aW9uICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggIW1fc291cmNlLmlzSW5zdGFuY2UoIG9yaWdpbmFsICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiT2JqZWN0ICciICsgb3JpZ2luYWwgKyAiJyBpcyBub3QgYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2Ugb2YgIiArIG1fc291cmNlLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnQoIG9yaWdpbmFsLCBjb250ZXh0ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcmlkZSB0aGlzIGluIGEgcGFydGljdWxhciBjb252ZXJ0ZXIgdG8gZG8gdGhlIGNvbnZlcnNpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWwgdGhlIG9yaWdpbmFsIE9iamVjdAotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRvIGNvbnZlcnQKLSAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0Ci0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBjb252ZXJ0KCBPYmplY3Qgb3JpZ2luYWwsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb247Ci19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29udmVydGVyL0NvbnZlcnRlci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb252ZXJ0ZXIvQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjVmZDIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9jb252ZXJ0ZXIvQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIGRpZmZlcmVudCB0eXBlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb252ZXJ0ZXIKLXsKLSAgICBTdHJpbmcgUk9MRSA9ICJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5Db252ZXJ0ZXIiOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBvcmlnaW5hbCB0byBkZXN0aW5hdGlvbiB0eXBlLgotICAgICAqIERlc3RpbmF0aW9uIGlzIHBhc3NlZCBzbyB0aGF0IG9uZSBjb252ZXJ0ZXIgY2FuIHBvdGVudGlhbGwKLSAgICAgKiBjb252ZXJ0IHRvIG11bHRpcGxlIGRpZmZlcmVudCB0eXBlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYWl0b24gdHlwZQotICAgICAqIEBwYXJhbSBvcmlnaW5hbCB0aGUgb3JpZ2luYWwgdHlwZQotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRvIGNvbnZlcnQKLSAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0Ci0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgT2JqZWN0IGNvbnZlcnQoIENsYXNzIGRlc3RpbmF0aW9uLCBPYmplY3Qgb3JpZ2luYWwsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2NvbnZlcnRlci9Db252ZXJ0ZXJFeGNlcHRpb24uamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29udmVydGVyL0NvbnZlcnRlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDI1MTk4Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vY29udmVydGVyL0NvbnZlcnRlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5DYXNjYWRpbmdFeGNlcHRpb247Ci0KLS8qKgotICogQ29udmVydGVyRXhjZXB0aW9uIHRocm93biB3aGVuIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGNvbnZlcnRpb24gZXRjLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgZXh0ZW5kcyBDYXNjYWRpbmdFeGNlcHRpb24KLXsKLSAgICAvKioKLSAgICAgKiBCYXNpYyBjb25zdHJ1Y3RvciB3aXRoIGEgbWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udmVydGVyRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSApCi0gICAgewotICAgICAgICB0aGlzKCBtZXNzYWdlLCBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBidWlsZHMgY2FzY2FkZSBzbyB0aGF0IG90aGVyIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0YWluZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQotICAgICAqIEBwYXJhbSB0aHJvd2FibGUgdGhlIHRocm93YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBDb252ZXJ0ZXJFeGNlcHRpb24oIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlLCB0aHJvd2FibGUgKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL0Fic3RyYWN0Q29udGFpbmVyVGFzay5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9mcmFtZXdvcmsvQWJzdHJhY3RDb250YWluZXJUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjBlNDguLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9mcmFtZXdvcmsvQWJzdHJhY3RDb250YWluZXJUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmZyYW1ld29yazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLkFic3RyYWN0VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyLkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmNvbmZpZ3VyZXIuQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuY29udmVydGVyLk1hc3RlckNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZXhlY3V0b3IuRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnByb3BlcnR5LlByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5wcm9wZXJ0eS5Qcm9wZXJ0eVV0aWw7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCBUYXNrIHdyaXRlcnMgc2hvdWxkIGV4dGVuZCB0byBwcm92aWRlIGN1c3RvbSB0YXNrcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGFpbmVyVGFzawotICAgIGV4dGVuZHMgQWJzdHJhY3RUYXNrCi0gICAgaW1wbGVtZW50cyBDb21wb3NhYmxlCi17Ci0gICAgLy8vRm9yIGNvbnZlcnRpbmcgb3duIGF0dHJpYnV0ZXMKLSAgICBwcml2YXRlIE1hc3RlckNvbnZlcnRlciAgICAgbV9jb252ZXJ0ZXI7Ci0KLSAgICAvLy9Gb3IgY29uZmlndXJpbmcgb3duIHN1Yi1lbGVtZW50cwotICAgIHByaXZhdGUgQ29uZmlndXJlciAgICAgICAgICBtX2NvbmZpZ3VyZXI7Ci0KLSAgICAvLy9Gb3IgZXhlY3V0aW5nIHN1Yi1lbGVtZW50cyBhcyB0YXNrcwotICAgIHByaXZhdGUgRXhlY3V0b3IgICAgICAgICAgICBtX2V4ZWN1dG9yOwotCi0gICAgcHVibGljIHZvaWQgY29tcG9zZSggZmluYWwgQ29tcG9uZW50TWFuYWdlciBjb21wb25lbnRNYW5hZ2VyICkKLSAgICAgICAgdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV9jb25maWd1cmVyID0gKENvbmZpZ3VyZXIpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIENvbmZpZ3VyZXIuUk9MRSApOwotICAgICAgICBtX2NvbnZlcnRlciA9IChNYXN0ZXJDb252ZXJ0ZXIpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIE1hc3RlckNvbnZlcnRlci5ST0xFICk7Ci0gICAgICAgIG1fZXhlY3V0b3IgPSAoRXhlY3V0b3IpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIEV4ZWN1dG9yLlJPTEUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHJlc29sdmUgYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHJlc29sdmUKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHJlc29sdmUoIGZpbmFsIFN0cmluZyB2YWx1ZSApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iamVjdCA9IAotICAgICAgICAgICAgICAgIFByb3BlcnR5VXRpbC5yZXNvbHZlUHJvcGVydHkoIHZhbHVlLCBnZXRDb250ZXh0KCksIGZhbHNlICk7Ci0KLSAgICAgICAgICAgIGlmKCBudWxsID09IG9iamVjdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oICJWYWx1ZSAoIiArIHZhbHVlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgcmVzb2x2ZWQgdG8gbnVsbCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgUHJvcGVydHlFeGNlcHRpb24gcGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggIkVycm9yIHJlc29sdmluZyB2YWx1ZTogIiArIHZhbHVlLCBwZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IGFuIG9iamVjdCB0byBhIHNwZWNpZmljIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdG8gdHlwZSB0byBjb252ZXJ0IG9iamVjdCB0bwotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBjb252ZXJ0Ci0gICAgICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdAotICAgICAqIEBleGNlcHRpb24gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGNvbnZlcnQoIGZpbmFsIENsYXNzIHRvLCBmaW5hbCBPYmplY3Qgb2JqZWN0ICkKLSAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udmVydGVyKCkuY29udmVydCggdG8sIG9iamVjdCwgZ2V0Q29udGV4dCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIENvbnZlcnRlckV4Y2VwdGlvbiBjZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiRXJyb3IgY29udmVydGluZyB2YWx1ZSIsIGNlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgYW4gb2JqZWN0IHVzaW5nIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLSAgICAgKiBAZXhjZXB0aW9uIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY29uZmlndXJlKCBmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDb25maWd1cmF0aW9uIGVsZW1lbnQgKQotICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0Q29uZmlndXJlcigpLmNvbmZpZ3VyZSggb2JqZWN0LCBlbGVtZW50LCBnZXRDb250ZXh0KCkgKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSBhbiBvYmplY3RzIGF0dHJpYnV0ZSB1c2luZyBwYXJhbWV0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIG5hbWUgdGhlIGF0dGlidXRlIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dGlidXRlIHZhbHVlCi0gICAgICogQGV4Y2VwdGlvbiBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNvbmZpZ3VyZSggZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRDb25maWd1cmVyKCkuY29uZmlndXJlKCBvYmplY3QsIG5hbWUsIHZhbHVlLCBnZXRDb250ZXh0KCkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1Yi1jbGFzcyB0byByZXRyaWV2ZSBDb25maWd1cmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29uZmlndXJlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBDb25maWd1cmVyIGdldENvbmZpZ3VyZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29uZmlndXJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1Yi1jbGFzcyB0byByZXRyaWV2ZSBDb252ZXJ0ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udmVydGVyIGdldENvbnZlcnRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9jb252ZXJ0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzdWItY2xhc3MgdG8gcmV0cmlldmUgRXhlY3V0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBleGVjdXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBFeGVjdXRvciBnZXRFeGVjdXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9leGVjdXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2ZyYW1ld29yay9BYnN0cmFjdFR5cGVEZWYuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL0Fic3RyYWN0VHlwZURlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODg1ODYxLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL0Fic3RyYWN0VHlwZURlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5mcmFtZXdvcms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuQWJzdHJhY3RUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnJvbGUuUm9sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuRGVmYXVsdFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZU1hbmFnZXI7Ci0KLS8qKgotICogQWJzdHJhY3QgdGFzayB0byBleHRlbmQgdG8gZGVmaW5lIGEgdHlwZS4KLSAqCi0gKiBUT0RPOiBNYWtlIHRoaXMgc3VwcG9ydCBjbGFzc3BhdGggc3ViLWVsZW1lbnQgaW4gZnV0dXJlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFR5cGVEZWYKLSAgICBleHRlbmRzIEFic3RyYWN0VGFzawotICAgIGltcGxlbWVudHMgQ29tcG9zYWJsZQotewotICAgIHByaXZhdGUgRmlsZSAgICAgICAgICAgICAgICBtX2xpYjsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgbV9uYW1lOwotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBtX2NsYXNzTmFtZTsKLSAgICBwcml2YXRlIFR5cGVNYW5hZ2VyICAgICAgICAgbV90eXBlTWFuYWdlcjsKLSAgICBwcml2YXRlIFJvbGVNYW5hZ2VyICAgICAgICAgbV9yb2xlTWFuYWdlcjsKLQotICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoIGZpbmFsIENvbXBvbmVudE1hbmFnZXIgY29tcG9uZW50TWFuYWdlciApCi0gICAgICAgIHRocm93cyBDb21wb25lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1fdHlwZU1hbmFnZXIgPSAoVHlwZU1hbmFnZXIpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIFR5cGVNYW5hZ2VyLlJPTEUgKTsKLSAgICAgICAgbV9yb2xlTWFuYWdlciA9IChSb2xlTWFuYWdlciljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggUm9sZU1hbmFnZXIuUk9MRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpYiggZmluYWwgRmlsZSBsaWIgKQotICAgIHsKLSAgICAgICAgLy9JbiB0aGUgZnV0dXJlIHRoaXMgd291bGQgYmUgcmVwbGFjZWQgYnkgQ2xhc3NQYXRoIHN1Yi1lbGVtZW50Ci0gICAgICAgIG1fbGliID0gbGliOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIG1fbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lICkKLSAgICB7Ci0gICAgICAgIG1fY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIG51bGwgPT0gbV9uYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJNdXN0IHNwZWNpZnkgbmFtZSBwYXJhbWV0ZXIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggbnVsbCA9PSBtX2NsYXNzTmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiTXVzdCBzcGVjaWZ5IGNsYXNzbmFtZSBwYXJhbWV0ZXIiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcm9sZSA9IG1fcm9sZU1hbmFnZXIuZ2V0Um9sZUZvck5hbWUoIHR5cGVOYW1lICk7Ci0KLSAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBjcmVhdGVDbGFzc0xvYWRlcigpOwotICAgICAgICBmaW5hbCBEZWZhdWx0VHlwZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEZWZhdWx0VHlwZUZhY3RvcnkoIGNsYXNzTG9hZGVyICk7Ci0gICAgICAgIGZhY3RvcnkuYWRkTmFtZUNsYXNzTWFwcGluZyggbV9uYW1lLCBtX2NsYXNzTmFtZSApOwotCi0gICAgICAgIHRyeSB7IG1fdHlwZU1hbmFnZXIucmVnaXN0ZXJUeXBlKCByb2xlLCBtX25hbWUsIGZhY3RvcnkgKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgVHlwZUV4Y2VwdGlvbiB0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHR5cGUiLCB0ZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGNyZWF0ZUNsYXNzTG9hZGVyKCkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vVE9ETzogTWFrZSB0aGlzIHN1cHBvcnQgY2xhc3NwYXRoIHN1Yi1lbGVtZW50IGluIGZ1dHVyZQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgVVJMIHVybCA9IG1fbGliLnRvVVJMKCk7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9Ci0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkxDbGFzc0xvYWRlciggbmV3IFVSTFtdIHsgdXJsIH0sIGNsYXNzTG9hZGVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJGYWlsZWQgdG8gYnVpbGQgY2xhc3NMb2FkZXIgZHVlIHRvOiAiICsgZSwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFR5cGVNYW5hZ2VyIGdldFR5cGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3R5cGVNYW5hZ2VyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL0NvbmRpdGlvbi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9mcmFtZXdvcmsvQ29uZGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjFjZGMuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9mcmFtZXdvcmsvQ29uZGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnByb3BlcnR5LlByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5wcm9wZXJ0eS5Qcm9wZXJ0eVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgY29uZGl0aW9uLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQ29uZGl0aW9uCi0gICAgaW1wbGVtZW50cyBDb21wb25lbnQKLXsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIG1fY29uZGl0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgbV9pc0lmQ29uZGl0aW9uOwotCi0gICAgcHVibGljIENvbmRpdGlvbiggZmluYWwgYm9vbGVhbiBpc0lmQ29uZGl0aW9uLCBmaW5hbCBTdHJpbmcgY29uZGl0aW9uICkKLSAgICB7Ci0gICAgICAgIG1faXNJZkNvbmRpdGlvbiA9IGlzSWZDb25kaXRpb247Ci0gICAgICAgIG1fY29uZGl0aW9uID0gY29uZGl0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvbmRpdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lmQ29uZGl0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2lzSWZDb25kaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoIGZpbmFsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb250ZXh0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgcmVzb2x2ZWQgPQotICAgICAgICAgICAgICAgIFByb3BlcnR5VXRpbC5yZXNvbHZlUHJvcGVydHkoIGdldENvbmRpdGlvbigpLCBjb250ZXh0LCBmYWxzZSApOwotCi0gICAgICAgICAgICBpZiggbnVsbCAhPSByZXNvbHZlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iamVjdCA9IGNvbnRleHQuZ2V0KCByZXNvbHZlZCApOwotICAgICAgICAgICAgICAgIC8vVE9ETzogRG8gbW9yZSB0aGFuIGp1c3QgY2hlY2sgZm9yIHByZXNlbmNlPz8/Pz8/Pz8/Pz8/Ci0KLSAgICAgICAgICAgICAgICAvL3RydWUgYXMgb2JqZWN0IHByZXNlbnQKLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBDb250ZXh0RXhjZXB0aW9uIGNlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFByb3BlcnR5RXhjZXB0aW9uIHBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRleHRFeGNlcHRpb24oICJFcnJvciByZXNvbHZpbmcgIiArIG1fY29uZGl0aW9uLCBwZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICFtX2lzSWZDb25kaXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSAhcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKCBpc0lmQ29uZGl0aW9uKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gImlmPSciICsgZ2V0Q29uZGl0aW9uKCkgKyAiJyI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gInVubGVzcz0nIiArIGdldENvbmRpdGlvbigpICsgIiciOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL0RhdGFUeXBlLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2ZyYW1ld29yay9EYXRhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE5YjU1Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL0RhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHRob3NlIGNsYXNzZXMgdGhhdCBjYW4gYXBwZWFyIGluc2lkZSB0aGUgYnVpbGQgZmlsZQotICogYXMgc3RhbmQgYWxvbmUgZGF0YSB0eXBlcy4gIAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFUeXBlCi17Ci0gICAgU3RyaW5nIFJPTEUgPSAib3JnLmFwYWNoZS5teXJtaWRvbi5mcmFtZXdvcmsuRGF0YVR5cGUiOwotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9mcmFtZXdvcmsvUGF0dGVybi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9mcmFtZXdvcmsvUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGFjY2Q0Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL1BhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNpYyBkYXRhIHR5cGUgZm9yIGhvbGRpbmcgcGF0dGVybnMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuCi0gICAgaW1wbGVtZW50cyBEYXRhVHlwZQotewotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgbV92YWx1ZTsKLSAgICBwcml2YXRlIENvbmRpdGlvbiAgICAgIG1fY29uZGl0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdmFsdWUgb2YgcGF0dGVybi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHBhdHRlcm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3ZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBjb25kaXRpb24gYXNzb2NpYXRlZCB3aXRoIHBhdHRlcm4gaWYgYW55LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQ29uZGl0aW9uCi0gICAgICovCi0gICAgcHVibGljIENvbmRpdGlvbiBnZXRDb25kaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29uZGl0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBtZXRob2QgZm9yIHZhbHVlIG9mIHBhdHRlcm4uCi0gICAgICogQ29uZm9ybXMgdG8gc2V0dGVyIHBhdHRlcm5zCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoIGZpbmFsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGlmIGNsYXVzZSBvbiBwYXR0ZXJuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uCi0gICAgICogQGV4Y2VwdGlvbiBUYXNrRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElmKCBmaW5hbCBTdHJpbmcgY29uZGl0aW9uICkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeUNvbmRpdGlvbk51bGwoKTsKLSAgICAgICAgbV9jb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKCB0cnVlLCBjb25kaXRpb24gKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdW5sZXNzIGNsYXVzZSBvZiBwYXR0ZXJuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgdW5sZXNzIGNsYXVzZQotICAgICAqIEBleGNlcHRpb24gVGFza0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoIGZpbmFsIFN0cmluZyBjb25kaXRpb24gKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5Q29uZGl0aW9uTnVsbCgpOwotICAgICAgICBtX2NvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oIGZhbHNlLCBjb25kaXRpb24gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiUGF0dGVyblsnIiArIG1fdmFsdWUgKyAiJywiOwotICAgICAgICBpZiggbnVsbCAhPSBtX2NvbmRpdGlvbiApIHJlc3VsdCA9IHJlc3VsdCArIG1fY29uZGl0aW9uOwotICAgICAgICByZXR1cm4gcmVzdWx0ICsgIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIG1ha2Ugc3VyZSBjb25kaXRpb24gdW5zZXQuCi0gICAgICogTWFkZSBzbyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYm90aCBpZiBhbmQgdW5sZXNzIHRvIGJlIHNldC4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gVGFza0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29uZGl0aW9uTnVsbCgpCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggbnVsbCAhPSBtX2NvbmRpdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiQ2FuIG9ubHkgc2V0IG9uZSBvZiBpZi9lbHNlIGZvciBwYXR0ZXJuIGRhdGEgdHlwZSIgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL1R5cGVJbnN0YW5jZVRhc2suamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJhbWV3b3JrL1R5cGVJbnN0YW5jZVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhMDI1Zi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2ZyYW1ld29yay9UeXBlSW5zdGFuY2VUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmZyYW1ld29yazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZU1hbmFnZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgcHJvcGVydHkgInRhc2siIHRvIGRlY2xhcmUgYSBiaW5kaW5nIG9mIGEgZGF0YXR5cGUgdG8gYSBuYW1lLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgVHlwZUluc3RhbmNlVGFzawotICAgIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJUYXNrCi0gICAgaW1wbGVtZW50cyBDb25maWd1cmFibGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgbV9pZDsKLSAgICBwcml2YXRlIE9iamVjdCAgICAgICAgICAgICAgbV92YWx1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgbV9sb2NhbFNjb3BlICAgICA9IHRydWU7Ci0gICAgcHJpdmF0ZSBUeXBlRmFjdG9yeSAgICAgICAgIG1fZmFjdG9yeTsKLQotICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoIGZpbmFsIENvbXBvbmVudE1hbmFnZXIgY29tcG9uZW50TWFuYWdlciApCi0gICAgICAgIHRocm93cyBDb21wb25lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLmNvbXBvc2UoIGNvbXBvbmVudE1hbmFnZXIgKTsKLQotICAgICAgICBmaW5hbCBUeXBlTWFuYWdlciB0eXBlTWFuYWdlciA9IChUeXBlTWFuYWdlciljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggVHlwZU1hbmFnZXIuUk9MRSApOwotICAgICAgICB0cnkgeyBtX2ZhY3RvcnkgPSB0eXBlTWFuYWdlci5nZXRGYWN0b3J5KCBEYXRhVHlwZS5ST0xFICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFR5cGVFeGNlcHRpb24gdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcG9uZW50RXhjZXB0aW9uKCAiVW5hYmxlIHRvIHJldHJpZXZlIGZhY3RvcnkgZnJvbSBUeXBlTWFuYWdlciIsIHRlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBEZWZhdWx0Q29uZmlndXJhdGlvbiBuZXdDb25maWd1cmF0aW9uID0KLSAgICAgICAgICAgIG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbiggY29uZmlndXJhdGlvbi5nZXROYW1lKCksIGNvbmZpZ3VyYXRpb24uZ2V0TG9jYXRpb24oKSApOwotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gYXR0cmlidXRlc1sgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKLQotICAgICAgICAgICAgaWYoIG5hbWUuZXF1YWxzKCAiaWQiICkgfHwgbmFtZS5lcXVhbHMoICJsb2NhbC1zY29wZSIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlKCB0aGlzLCBuYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld0NvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbltdIGNoaWxkcmVuID0gY29uZmlndXJhdGlvbi5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbi5hZGRDaGlsZCggY2hpbGRyZW5bIGkgXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBtX2ZhY3RvcnkuY3JlYXRlKCBjb25maWd1cmF0aW9uLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhdHlwZSIsIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbmZpZ3VyZSggbV92YWx1ZSwgbmV3Q29uZmlndXJhdGlvbiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgbV9pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsU2NvcGUoIGZpbmFsIGJvb2xlYW4gbG9jYWxTY29wZSApCi0gICAgewotICAgICAgICBtX2xvY2FsU2NvcGUgPSBsb2NhbFNjb3BlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIG51bGwgPT0gbV9pZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiSWQgbXVzdCBiZSBzcGVjaWZpZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbV9sb2NhbFNjb3BlICkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnNldFByb3BlcnR5KCBtX2lkLCBtX3ZhbHVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkuc2V0UHJvcGVydHkoIG1faWQsIG1fdmFsdWUsIFRhc2tDb250ZXh0LlBBUkVOVCApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9mcm9udGVuZHMvQ0xJTWFpbi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9mcm9udGVuZHMvQ0xJTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjJlNTU1Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vZnJvbnRlbmRzL0NMSU1haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24uZnJvbnRlbmRzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5jbGkuQ0xBcmdzUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5jbGkuQ0xPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmNsaS5DTE9wdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmNsaS5DTFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmlvLkV4dGVuc2lvbkZpbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLkV4Y2VwdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ2dhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cuSGllcmFyY2h5OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nLkxvZ1RhcmdldDsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cub3V0cHV0LkRlZmF1bHRPdXRwdXRMb2dUYXJnZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuRGVmYXVsdFRhc2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmJ1aWxkZXIuUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmV4ZWN1dG9yLkV4ZWN1dG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5lbWJlZGRvci5FbWJlZGRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZW1iZWRkb3IuRGVmYXVsdEVtYmVkZG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy53b3Jrc3BhY2UuV29ya3NwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5tb2RlbC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24ubGlzdGVuZXJzLlByb2plY3RMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgY2xhc3MgdG8ga2ljayB0aGUgdGlyZXMgYW5kIGxpZ2h0IHRoZSBmaXJlcy4KLSAqIFN0YXJ0cyBteXJtaWRvbiwgbG9hZHMgUHJvamVjdEJ1aWxkZXIsIGJ1aWxkcyBwcm9qZWN0IHRoZW4gdXNlcyBQcm9qZWN0TWFuYWdlcgotICogdG8gcnVuIHByb2plY3QuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDTElNYWluCi0gICAgZXh0ZW5kcyBBYnN0cmFjdExvZ2dhYmxlCi17Ci0gICAgLy9kZWZpbmVzIGZvciB0aGUgQ29tbWFuZCBMaW5lIG9wdGlvbnMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgSEVMUF9PUFQgICAgICAgICAgICAgICAgICA9ICdoJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgUVVJRVRfT1BUICAgICAgICAgICAgICAgICA9ICdxJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgVkVSQk9TRV9PUFQgICAgICAgICAgICAgICA9ICd2JzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgRklMRV9PUFQgICAgICAgICAgICAgICAgICA9ICdmJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgTE9HX0xFVkVMX09QVCAgICAgICAgICAgICA9ICdsJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgREVGSU5FX09QVCAgICAgICAgICAgICAgICA9ICdEJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgQlVJTERFUl9QQVJBTV9PUFQgICAgICAgICA9ICdCJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgVkVSU0lPTl9PUFQgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICAgICAgIExJU1RFTkVSX09QVCAgICAgICAgICAgICAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgICAgICBUQVNLTElCX0RJUl9PUFQgICAgICAgICAgID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgSU5DUkVNRU5UQUxfT1BUICAgICAgICAgICA9IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICAgICAgIEhPTUVfRElSX09QVCAgICAgICAgICAgICAgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgICAgICBEUllfUlVOX09QVCAgICAgICAgICAgICAgID0gODsKLQotICAgIC8vaW5jb21wYXRhYmxlIG9wdGlvbnMgZm9yIGluZm8gb3B0aW9ucwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdICAgICBJTkZPX09QVF9JTkNPTVBBVCAgICAgICAgID0gbmV3IGludFtdCi0gICAgewotICAgICAgICBIRUxQX09QVCwgUVVJRVRfT1BULCBWRVJCT1NFX09QVCwgRklMRV9PUFQsCi0gICAgICAgIExPR19MRVZFTF9PUFQsIFZFUlNJT05fT1BULCBMSVNURU5FUl9PUFQsCi0gICAgICAgIERFRklORV9PUFQsIERSWV9SVU5fT1BUIC8vVEFTS0xJQl9ESVJfT1BULCBIT01FX0RJUl9PUFQKLSAgICB9OwotCi0gICAgLy9pbmNvbXBhdGFibGUgb3B0aW9ucyBmb3Igb3RoZXIgbG9nZ2luZyBvcHRpb25zCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gICAgIExPR19PUFRfSU5DT01QQVQgICAgICAgICAgPSBuZXcgaW50W10KLSAgICB7Ci0gICAgICAgIFFVSUVUX09QVCwgVkVSQk9TRV9PUFQsIExPR19MRVZFTF9PUFQKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBQcm9qZWN0TGlzdGVuZXIgICAgICBtX2xpc3RlbmVyOwotCi0gICAgLy8vUGFyYW1ldGVycyBmb3IgcnVuIG9mIG15cm1pZG9uCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJzICAgICAgICAgICBtX3BhcmFtZXRlcnMgID0gbmV3IFBhcmFtZXRlcnMoKTsKLQotICAgIC8vL0xpc3Qgb2YgdGFyZ2V0cyBzdXBwbGllZCBvbiBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZQotICAgIHByaXZhdGUgQXJyYXlMaXN0ICAgICAgICAgICAgbV90YXJnZXRzICAgICA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vL0xpc3Qgb2YgdXNlciBzdXBwbGllZCBkZWZpbmVzCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJzICAgICAgICAgICBtX2RlZmluZXMgICAgID0gbmV3IFBhcmFtZXRlcnMoKTsKLQotICAgIC8vL0xpc3Qgb2YgdXNlciBzdXBwbGllZCBwYXJhbWV0ZXJzIGZvciBidWlsZGVyCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJzICAgICAgICAgICBtX2J1aWxkZXJQYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlcnMoKTsKLQotICAgIC8vL0RldGVybWluZSB3aGV0aGVyIHRhc2tzIGFyZSBhY3R1YWxseSBleGVjdXRlZAotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgbV9kcnlSdW4gICAgICA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogTWFpbiBlbnRyeSBwb2ludCBjYWxsZWQgdG8gcnVuIHN0YW5kYXJkIE15cm1pZG9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIGFyZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggZmluYWwgU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBmaW5hbCBDTElNYWluIG1haW4gPSBuZXcgQ0xJTWFpbigpOwotCi0gICAgICAgIHRyeSB7IG1haW4uZXhlY3V0ZSggYXJncyApOyB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRXJyb3I6ICIgKyBFeGNlcHRpb25VdGlsLnByaW50U3RhY2tUcmFjZSggdGhyb3dhYmxlICkgKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KCAtMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLmV4aXQoIDAgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5IHVzYWdlIHJlcG9ydC4KLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1c2FnZSggZmluYWwgQ0xPcHRpb25EZXNjcmlwdG9yW10gb3B0aW9ucyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJqYXZhICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgW29wdGlvbnNdIiApOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJcdEF2YWlsYWJsZSBvcHRpb25zOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIENMVXRpbC5kZXNjcmliZU9wdGlvbnMoIG9wdGlvbnMgKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpc2UgdGhlIG9wdGlvbnMgZm9yIGNvbW1hbmQgbGluZSBwYXJzZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDTE9wdGlvbkRlc2NyaXB0b3JbXSBjcmVhdGVDTE9wdGlvbnMoKQotICAgIHsKLSAgICAgICAgLy9UT0RPOiBsb2NhbGlzZQotICAgICAgICBmaW5hbCBDTE9wdGlvbkRlc2NyaXB0b3JbXSBvcHRpb25zID0gbmV3IENMT3B0aW9uRGVzY3JpcHRvclsgMTMgXTsKLQotICAgICAgICBvcHRpb25zWzBdID0KLSAgICAgICAgICAgIG5ldyBDTE9wdGlvbkRlc2NyaXB0b3IoICJoZWxwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT3B0aW9uRGVzY3JpcHRvci5BUkdVTUVOVF9ESVNBTExPV0VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVMUF9PUFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPX09QVF9JTkNPTVBBVCApOwotCi0gICAgICAgIG9wdGlvbnNbMV0gPQotICAgICAgICAgICAgbmV3IENMT3B0aW9uRGVzY3JpcHRvciggImZpbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPcHRpb25EZXNjcmlwdG9yLkFSR1VNRU5UX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9PUFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGJ1aWxkIGZpbGUuIiApOwotCi0gICAgICAgIG9wdGlvbnNbMl0gPQotICAgICAgICAgICAgbmV3IENMT3B0aW9uRGVzY3JpcHRvciggImxvZy1sZXZlbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9wdGlvbkRlc2NyaXB0b3IuQVJHVU1FTlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfTEVWRUxfT1BULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSB2ZXJib3NpdHkgbGV2ZWwgYXQgd2hpY2ggdG8gbG9nIG1lc3NhZ2VzLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoREVCVUd8SU5GT3xXQVJOfEVSUk9SfEZBVEFMX0VSUk9SKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfT1BUX0lOQ09NUEFUICk7Ci0KLSAgICAgICAgb3B0aW9uc1szXSA9Ci0gICAgICAgICAgICBuZXcgQ0xPcHRpb25EZXNjcmlwdG9yKCAicXVpZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPcHRpb25EZXNjcmlwdG9yLkFSR1VNRU5UX0RJU0FMTE9XRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUlFVF9PUFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXF1aXZlbGVudCB0byAtLWxvZy1sZXZlbD1GQVRBTF9FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfT1BUX0lOQ09NUEFUICk7Ci0KLSAgICAgICAgb3B0aW9uc1s0XSA9Ci0gICAgICAgICAgICBuZXcgQ0xPcHRpb25EZXNjcmlwdG9yKCAidmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9wdGlvbkRlc2NyaXB0b3IuQVJHVU1FTlRfRElTQUxMT1dFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkJPU0VfT1BULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVxdWl2ZWxlbnQgdG8gLS1sb2ctbGV2ZWw9SU5GTyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfT1BUX0lOQ09NUEFUICk7Ci0KLSAgICAgICAgb3B0aW9uc1s1XSA9Ci0gICAgICAgICAgICBuZXcgQ0xPcHRpb25EZXNjcmlwdG9yKCAibGlzdGVuZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPcHRpb25EZXNjcmlwdG9yLkFSR1VNRU5UX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVEVORVJfT1BULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBsaXN0ZW5lciBmb3IgbG9nIGV2ZW50cy4iICk7Ci0KLSAgICAgICAgb3B0aW9uc1s2XSA9Ci0gICAgICAgICAgICBuZXcgQ0xPcHRpb25EZXNjcmlwdG9yKCAidmVyc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9wdGlvbkRlc2NyaXB0b3IuQVJHVU1FTlRfRElTQUxMT1dFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlNJT05fT1BULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkgdmVyc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPX09QVF9JTkNPTVBBVCApOwotCi0gICAgICAgIG9wdGlvbnNbN10gPQotICAgICAgICAgICAgbmV3IENMT3B0aW9uRGVzY3JpcHRvciggInRhc2stbGliLWRpciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9wdGlvbkRlc2NyaXB0b3IuQVJHVU1FTlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVNLTElCX0RJUl9PUFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHRhc2sgbGliIGRpcmVjdG9yeSB0byBzY2FuIGZvciAudHNrIGZpbGVzLiIgKTsKLSAgICAgICAgb3B0aW9uc1s4XSA9Ci0gICAgICAgICAgICBuZXcgQ0xPcHRpb25EZXNjcmlwdG9yKCAiaW5jcmVtZW50YWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPcHRpb25EZXNjcmlwdG9yLkFSR1VNRU5UX0RJU0FMTE9XRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNSRU1FTlRBTF9PUFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVuIGluIGluY3JlbWVudGFsIG1vZGUiICk7Ci0gICAgICAgIG9wdGlvbnNbOV0gPQotICAgICAgICAgICAgbmV3IENMT3B0aW9uRGVzY3JpcHRvciggIm15cm1pZG9uLWhvbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPcHRpb25EZXNjcmlwdG9yLkFSR1VNRU5UX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9NRV9ESVJfT1BULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZnkgbXlybWlkb24gaG9tZSBkaXJlY3RvcnkiICk7Ci0gICAgICAgIG9wdGlvbnNbMTBdID0KLSAgICAgICAgICAgIG5ldyBDTE9wdGlvbkRlc2NyaXB0b3IoICJkZWZpbmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPcHRpb25EZXNjcmlwdG9yLkFSR1VNRU5UU19SRVFVSVJFRF8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGSU5FX09QVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZpbmUgYSB2YXJpYWJsZSAoaWUgLURmb289dmFyKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50WyAwIF0gKTsKLQotICAgICAgICBvcHRpb25zWzExXSA9Ci0gICAgICAgICAgICBuZXcgQ0xPcHRpb25EZXNjcmlwdG9yKCAiYnVpbGRlci1wYXJhbWV0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPcHRpb25EZXNjcmlwdG9yLkFSR1VNRU5UU19SRVFVSVJFRF8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVJTERFUl9QQVJBTV9PUFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVmaW5lIGEgYnVpbGRlciBwYXJhbWV0ZXIgKGllIC1CZm9vPXZhcikiICk7Ci0KLSAgICAgICAgb3B0aW9uc1sxMl0gPQotICAgICAgICAgICAgbmV3IENMT3B0aW9uRGVzY3JpcHRvciggImRyeS1ydW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPcHRpb25EZXNjcmlwdG9yLkFSR1VNRU5UX0RJU0FMTE9XRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUllfUlVOX09QVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEbyBub3QgZXhlY3V0ZSB0YXNrcyAtIGp1c3QgcHJpbnQgdGhlbSBvdXQiICk7Ci0KLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKCBmaW5hbCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIENMT3B0aW9uRGVzY3JpcHRvcltdIG9wdGlvbnMgPSBjcmVhdGVDTE9wdGlvbnMoKTsKLSAgICAgICAgZmluYWwgQ0xBcmdzUGFyc2VyIHBhcnNlciA9IG5ldyBDTEFyZ3NQYXJzZXIoIGFyZ3MsIG9wdGlvbnMgKTsKLQotICAgICAgICBpZiggbnVsbCAhPSBwYXJzZXIuZ2V0RXJyb3JTdHJpbmcoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yOiAiICsgcGFyc2VyLmdldEVycm9yU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpc3QgY2xPcHRpb25zID0gcGFyc2VyLmdldEFyZ3VtZW50cygpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGNsT3B0aW9ucy5zaXplKCk7Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBzaXplOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDTE9wdGlvbiBvcHRpb24gPSAoQ0xPcHRpb24pY2xPcHRpb25zLmdldCggaSApOwotCi0gICAgICAgICAgICBzd2l0Y2goIG9wdGlvbi5nZXRJZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgSEVMUF9PUFQ6IHVzYWdlKCBvcHRpb25zICk7IHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGNhc2UgVkVSU0lPTl9PUFQ6IFN5c3RlbS5vdXQucHJpbnRsbiggQ29uc3RhbnRzLkJVSUxEX0RFU0NSSVBUSU9OICk7IHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBIT01FX0RJUl9PUFQ6IG1fcGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoICJteXJtaWRvbi5ob21lIiwgb3B0aW9uLmdldEFyZ3VtZW50KCkgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRBU0tMSUJfRElSX09QVDoKLSAgICAgICAgICAgICAgICBtX3BhcmFtZXRlcnMuc2V0UGFyYW1ldGVyKCAibXlybWlkb24ubGliLnBhdGgiLCBvcHRpb24uZ2V0QXJndW1lbnQoKSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIExPR19MRVZFTF9PUFQ6IG1fcGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoICJsb2cubGV2ZWwiLCBvcHRpb24uZ2V0QXJndW1lbnQoKSApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVkVSQk9TRV9PUFQ6IG1fcGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoICJsb2cubGV2ZWwiLCAiSU5GTyIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFFVSUVUX09QVDogbV9wYXJhbWV0ZXJzLnNldFBhcmFtZXRlciggImxvZy5sZXZlbCIsICJFUlJPUiIgKTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSU5DUkVNRU5UQUxfT1BUOiBtX3BhcmFtZXRlcnMuc2V0UGFyYW1ldGVyKCAiaW5jcmVtZW50YWwiLCAidHJ1ZSIgKTsgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRklMRV9PUFQ6IG1fcGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoICJmaWxlbmFtZSIsIG9wdGlvbi5nZXRBcmd1bWVudCgpICk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMSVNURU5FUl9PUFQ6IG1fcGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoICJsaXN0ZW5lciIsIG9wdGlvbi5nZXRBcmd1bWVudCgpICk7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIERFRklORV9PUFQ6Ci0gICAgICAgICAgICAgICAgbV9kZWZpbmVzLnNldFBhcmFtZXRlciggb3B0aW9uLmdldEFyZ3VtZW50KCAwICksIG9wdGlvbi5nZXRBcmd1bWVudCggMSApICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQlVJTERFUl9QQVJBTV9PUFQ6Ci0gICAgICAgICAgICAgICAgbV9idWlsZGVyUGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoIG9wdGlvbi5nZXRBcmd1bWVudCggMCApLCBvcHRpb24uZ2V0QXJndW1lbnQoIDEgKSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIERSWV9SVU5fT1BUOiBtX2RyeVJ1biA9IHRydWU7IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDA6IG1fdGFyZ2V0cy5hZGQoIG9wdGlvbi5nZXRBcmd1bWVudCgpICk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwRGVmYXVsdFBhcmFtZXRlcnMoKQotICAgIHsKLSAgICAgICAgLy9TeXN0ZW0gcHJvcGVydHkgc2V0IHVwIGJ5IGxhdW5jaGVyCi0gICAgICAgIG1fcGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoICJteXJtaWRvbi5ob21lIiwgU3lzdGVtLmdldFByb3BlcnR5KCAibXlybWlkb24uaG9tZSIsICIuIiApICk7Ci0KLSAgICAgICAgbV9wYXJhbWV0ZXJzLnNldFBhcmFtZXRlciggImZpbGVuYW1lIiwgImJ1aWxkLmFudCIgKTsKLSAgICAgICAgbV9wYXJhbWV0ZXJzLnNldFBhcmFtZXRlciggImxvZy5sZXZlbCIsICJXQVJOIiApOwotICAgICAgICBtX3BhcmFtZXRlcnMuc2V0UGFyYW1ldGVyKCAibGlzdGVuZXIiLCAib3JnLmFwYWNoZS5teXJtaWRvbi5saXN0ZW5lcnMuRGVmYXVsdFByb2plY3RMaXN0ZW5lciIgKTsKLSAgICAgICAgbV9wYXJhbWV0ZXJzLnNldFBhcmFtZXRlciggImluY3JlbWVudGFsIiwgImZhbHNlIiApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlKCBmaW5hbCBTdHJpbmdbXSBhcmdzICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2V0dXBEZWZhdWx0UGFyYW1ldGVycygpOwotCi0gICAgICAgIGlmKCAhcGFyc2VDb21tYW5kTGluZU9wdGlvbnMoIGFyZ3MgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaGFuZGxlIGxvZ2dpbmcuLi4KLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ0xldmVsID0gbV9wYXJhbWV0ZXJzLmdldFBhcmFtZXRlciggImxvZy5sZXZlbCIsIG51bGwgKTsKLSAgICAgICAgc2V0TG9nZ2VyKCBjcmVhdGVMb2dnZXIoIGxvZ0xldmVsICkgKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgaG9tZSA9IG1fcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoICJteXJtaWRvbi5ob21lIiwgbnVsbCApOwotICAgICAgICBmaW5hbCBGaWxlIGhvbWVEaXIgPSAobmV3IEZpbGUoIGhvbWUgKSkuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0gICAgICAgIGlmKCAhaG9tZURpci5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIm15cm1pZG9uLWhvbWUgKCIgKyBob21lRGlyICsgIikgaXMgbm90IGEgZGlyZWN0b3J5IiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gbV9wYXJhbWV0ZXJzLmdldFBhcmFtZXRlciggImZpbGVuYW1lIiwgbnVsbCApOwotICAgICAgICBmaW5hbCBGaWxlIGJ1aWxkRmlsZSA9IChuZXcgRmlsZSggZmlsZW5hbWUgKSkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotICAgICAgICBpZiggIWJ1aWxkRmlsZS5pc0ZpbGUoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJGaWxlICIgKyBidWlsZEZpbGUgKyAiIGlzIG5vdCBhIGZpbGUgb3IgZG9lc24ndCBleGlzdCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaGFuZGxlIGxpc3RlbmVyLi4KLSAgICAgICAgZmluYWwgU3RyaW5nIGxpc3RlbmVyTmFtZSA9IG1fcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoICJsaXN0ZW5lciIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlTGlzdGVuZXIoIGxpc3RlbmVyTmFtZSApOwotCi0gICAgICAgIGdldExvZ2dlcigpLndhcm4oICJBbnQgQnVpbGQgRmlsZTogIiArIGJ1aWxkRmlsZSApOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCAiQW50IEhvbWUgRGlyZWN0b3J5OiAiICsgaG9tZURpciApOwotICAgICAgICAvL2dldExvZ2dlcigpLmluZm8oICJBbnQgQmluIERpcmVjdG9yeTogIiArIG1fYmluRGlyICk7Ci0gICAgICAgIC8vZ2V0TG9nZ2VyKCkuZGVidWcoICJBbnQgTGliIERpcmVjdG9yeTogIiArIG1fbGliRGlyICk7Ci0gICAgICAgIC8vZ2V0TG9nZ2VyKCkuZGVidWcoICJBbnQgVGFzayBMaWIgRGlyZWN0b3J5OiAiICsgbV90YXNrTGliRGlyICk7Ci0KLSAgICAgICAgaWYoIG1fZHJ5UnVuICkKLSAgICAgICAgewotICAgICAgICAgICAgbV9wYXJhbWV0ZXJzLnNldFBhcmFtZXRlciggRXhlY3V0b3IuUk9MRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmV4ZWN1dG9yLlByaW50aW5nRXhlY3V0b3IiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBFbWJlZGRvciBlbWJlZGRvciA9IG5ldyBEZWZhdWx0RW1iZWRkb3IoKTsKLSAgICAgICAgc2V0dXBMb2dnZXIoIGVtYmVkZG9yICk7Ci0gICAgICAgIGVtYmVkZG9yLnBhcmFtZXRlcml6ZSggbV9wYXJhbWV0ZXJzICk7Ci0gICAgICAgIGVtYmVkZG9yLmluaXRpYWxpemUoKTsKLSAgICAgICAgZW1iZWRkb3Iuc3RhcnQoKTsKLQotICAgICAgICAvL2NyZWF0ZSB0aGUgcHJvamVjdAotICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSAKLSAgICAgICAgICAgIGVtYmVkZG9yLmNyZWF0ZVByb2plY3QoIGJ1aWxkRmlsZS50b1N0cmluZygpLCBudWxsLCBtX2J1aWxkZXJQYXJhbWV0ZXJzICk7Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotICAgICAgICAvL2xvb3Agb3ZlciBidWlsZCBpZiB3ZSBhcmUgaW4gaW5jcmVtZW50YWwgbW9kZS4uCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gaW5jcmVtZW50YWwgPSBtX3BhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyQXNCb29sZWFuKCAiaW5jcmVtZW50YWwiLCBmYWxzZSApOwotICAgICAgICB3aGlsZSggdHJ1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vYWN0dWFsbHkgZG8gdGhlIGJ1aWxkIC4uLgotICAgICAgICAgICAgZmluYWwgV29ya3NwYWNlIHdvcmtzcGFjZSA9IGVtYmVkZG9yLmNyZWF0ZVdvcmtzcGFjZSggbV9kZWZpbmVzICk7Ci0gICAgICAgICAgICB3b3Jrc3BhY2UuYWRkUHJvamVjdExpc3RlbmVyKCBsaXN0ZW5lciApOwotCi0gICAgICAgICAgICBkb0J1aWxkKCB3b3Jrc3BhY2UsIHByb2plY3QsIG1fdGFyZ2V0cyApOwotCi0gICAgICAgICAgICBpZiggIWluY3JlbWVudGFsICkgYnJlYWs7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNvbnRpbnVlID8gKEVudGVyIG5vIHRvIHN0b3ApIiApOwotCi0gICAgICAgICAgICBpZiggbnVsbCA9PSByZWFkZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKCBTeXN0ZW0uaW4gKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCi0gICAgICAgICAgICBpZiggbGluZS5lcXVhbHNJZ25vcmVDYXNlKCAibm8iICkgKSBicmVhazsKLQotICAgICAgICB9Ci0KLSAgICAgICAgZW1iZWRkb3Iuc3RvcCgpOwotICAgICAgICBlbWJlZGRvci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWN0dWFsbHkgZG8gdGhlIGJ1aWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgdGhlIG1hbmFnZXIKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSB0YXJnZXRzIHRoZSB0YXJnZXRzIHRvIGJ1aWxkIGFzIHBhc3NlZCBieSBDTEkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9CdWlsZCggZmluYWwgV29ya3NwYWNlIHdvcmtzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3QgdGFyZ2V0cyApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgaW50IHRhcmdldENvdW50ID0gdGFyZ2V0cy5zaXplKCk7Ci0KLSAgICAgICAgICAgIC8vaWYgd2UgZGlkbid0IHNwZWNpZnkgYSB0YXJnZXQgb24gQ0xJIHRoZW4gY2hvb3NlIGRlZmF1bHQKLSAgICAgICAgICAgIGlmKCAwID09IHRhcmdldENvdW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3b3Jrc3BhY2UuZXhlY3V0ZVByb2plY3QoIHByb2plY3QsIHByb2plY3QuZ2V0RGVmYXVsdFRhcmdldE5hbWUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgdGFyZ2V0Q291bnQ7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3b3Jrc3BhY2UuZXhlY3V0ZVByb2plY3QoIHByb2plY3QsIChTdHJpbmcpdGFyZ2V0cy5nZXQoIGkgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgVGFza0V4Y2VwdGlvbiBhZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCAiQlVJTEQgRkFJTEVEIiApOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoICJSZWFzb246XG4iICsgRXhjZXB0aW9uVXRpbC5wcmludFN0YWNrVHJhY2UoIGFlLCA1LCB0cnVlICkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBMb2dnZXIgb2YgYXBwcm9wcmlhdGUgbG9nLWxldmVsLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvZ0xldmVsIHRoZSBsb2ctbGV2ZWwKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2dnZXIKLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIExvZ2dlciBjcmVhdGVMb2dnZXIoIGZpbmFsIFN0cmluZyBsb2dMZXZlbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dMZXZlbENhcGl0YWxpemVkID0gbG9nTGV2ZWwudG9VcHBlckNhc2UoKTsKLSAgICAgICAgZmluYWwgUHJpb3JpdHkgcHJpb3JpdHkgPSBQcmlvcml0eS5nZXRQcmlvcml0eUZvck5hbWUoIGxvZ0xldmVsQ2FwaXRhbGl6ZWQgKTsKLQotICAgICAgICBpZiggIXByaW9yaXR5LmdldE5hbWUoKS5lcXVhbHMoIGxvZ0xldmVsQ2FwaXRhbGl6ZWQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJVbmtub3duIGxvZyBsZXZlbCAtICIgKyBsb2dMZXZlbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IEhpZXJhcmNoeS5nZXREZWZhdWx0SGllcmFyY2h5KCkuZ2V0TG9nZ2VyRm9yKCAibXlybWlkb24iICk7Ci0KLSAgICAgICAgZmluYWwgRGVmYXVsdE91dHB1dExvZ1RhcmdldCB0YXJnZXQgPSBuZXcgRGVmYXVsdE91dHB1dExvZ1RhcmdldCgpOwotICAgICAgICB0YXJnZXQuc2V0Rm9ybWF0KCAiWyU4Ljh7Y2F0ZWdvcnl9XSAle21lc3NhZ2V9XFxuJXt0aHJvd2FibGV9IiApOwotICAgICAgICBsb2dnZXIuc2V0TG9nVGFyZ2V0cyggbmV3IExvZ1RhcmdldFtdIHsgdGFyZ2V0IH0gKTsKLQotICAgICAgICBsb2dnZXIuc2V0UHJpb3JpdHkoIHByaW9yaXR5ICk7Ci0KLSAgICAgICAgcmV0dXJuIGxvZ2dlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR1cCBwcm9qZWN0IGxpc3RlbmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBjbGFzc25hbWUgb2YgcHJvamVjdCBsaXN0ZW5lcgotICAgICAqLwotICAgIHByaXZhdGUgUHJvamVjdExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCBmaW5hbCBTdHJpbmcgbGlzdGVuZXIgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgeyByZXR1cm4gKFByb2plY3RMaXN0ZW5lcilDbGFzcy5mb3JOYW1lKCBsaXN0ZW5lciApLm5ld0luc3RhbmNlKCk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFRocm93YWJsZSB0ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIkVycm9yIGNyZWF0aW5nIHRoZSBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkdWUgdG8gIiArIEV4Y2VwdGlvblV0aWwucHJpbnRTdGFja1RyYWNlKCB0LCA1LCB0cnVlICkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIHZhbHVlcyB0byBhIGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIG1hcCB0aGUgbWFwIG9mIG5hbWVzLT52YWx1ZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9Db250ZXh0KCBmaW5hbCBUYXNrQ29udGV4dCBjb250ZXh0LCBmaW5hbCBNYXAgbWFwICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgSXRlcmF0b3Iga2V5cyA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlKCBrZXlzLmhhc05leHQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dCgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gbWFwLmdldCgga2V5ICk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5KCBrZXksIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGF1bmNoZXIvTWFpbi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9sYXVuY2hlci9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjU4YWIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9sYXVuY2hlci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxhdW5jaGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQmFzaWMgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGFsbCB0aGUgaGFja2VyeSB0byBnZXQgY2xhc3Nsb2FkZXIgdG8gd29yay4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1haW4KLXsKLSAgICAvKioKLSAgICAgKiBNYWdpYyBlbnRyeSBwb2ludC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBDTEkgYXJndW1lbnRzCi0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyB2b2lkIG1haW4oIGZpbmFsIFN0cmluZ1tdIGFyZ3MgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy9hY3R1YWxseSB0cnkgdG8gZGlzY292ZXIgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGJhc2VkIG9uIHdoZXJlCi0gICAgICAgICAgICAvLyB0aGUgbXlybWlkb24uamFyIGlzCi0gICAgICAgICAgICBmaW5hbCBGaWxlIGluc3RhbGxEaXJlY3RvcnkgPSBmaW5kSW5zdGFsbERpcigpOwotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCAibXlybWlkb24uaG9tZSIsIGluc3RhbGxEaXJlY3RvcnkudG9TdHJpbmcoKSApOwotCi0gICAgICAgICAgICAvL3NldHVwIGNsYXNzbG9hZGVyIGFwcHJvcHJpYXRlbHkgZm9yIG15cm1pZG9uIGphcgotICAgICAgICAgICAgZmluYWwgRmlsZSBsaWJEaXIgPSBuZXcgRmlsZSggaW5zdGFsbERpcmVjdG9yeSwgImxpYiIgKTsKLSAgICAgICAgICAgIGZpbmFsIFVSTFtdIHVybHMgPSBidWlsZFVSTExpc3QoIGxpYkRpciApOwotCi0gICAgICAgICAgICBmaW5hbCBVUkxDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlciggdXJscyApOwotCi0gICAgICAgICAgICAvL2xvYWQgY2xhc3MgYW5kIHJldHJpZXZlIGFwcHJvcHJpYXRlIG1haW4gbWV0aG9kLgotICAgICAgICAgICAgZmluYWwgQ2xhc3MgY2xhenogPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoICJvcmcuYXBhY2hlLm15cm1pZG9uLmZyb250ZW5kcy5DTElNYWluIiApOwotICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCggIm1haW4iLCBuZXcgQ2xhc3NbXSB7IGFyZ3MuZ2V0Q2xhc3MoKSB9ICk7Ci0KLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKCBjbGFzc0xvYWRlciApOwotCi0gICAgICAgICAgICAvL2tpY2sgdGhlIHRpcmVzIGFuZCBsaWdodCB0aGUgZmlyZXMuLi4uCi0gICAgICAgICAgICBtZXRob2QuaW52b2tlKCBudWxsLCBuZXcgT2JqZWN0W10geyBhcmdzIH0gKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvcjogIiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yOiAiICsgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMW10gYnVpbGRVUkxMaXN0KCBmaW5hbCBGaWxlIGRpciApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCB1cmxMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZpbmFsIEZpbGVbXSBjb250ZW50cyA9IGRpci5saXN0RmlsZXMoKTsKLQotICAgICAgICBpZiggbnVsbCA9PSBjb250ZW50cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJMWyAwIF07Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gY29udGVudHNbIGkgXTsKLQotICAgICAgICAgICAgaWYoICFmaWxlLmlzRmlsZSgpIHx8ICFmaWxlLmNhblJlYWQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9pZ25vcmUgbm9uLWZpbGVzIG9yIHVucmVhZGFibGUgZmlsZXMKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmKCAhbmFtZS5lbmRzV2l0aCggIi5qYXIiICkgJiYgIW5hbWUuZW5kc1dpdGgoICIuemlwIiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL0lmbm9yZSBmaWxlcyBpbiBsaWIgZGlyIHRoYXQgYXJlIG5vdCBqYXJzIG9yIHppcHMKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB1cmxMaXN0LmFkZCggZmlsZS50b1VSTCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFVSTFtdKXVybExpc3QudG9BcnJheSggbmV3IFVSTFsgMCBdICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpbmRzIHRoZSBteXJtaWRvbi5qYXIgZmlsZSBpbiB0aGUgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEZpbGUgZmluZEluc3RhbGxEaXIoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCAiamF2YS5jbGFzcy5wYXRoIiApOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aFNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggInBhdGguc2VwYXJhdG9yIiApOwotICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplciggY2xhc3NwYXRoLCBwYXRoU2VwYXJhdG9yICk7Ci0KLSAgICAgICAgd2hpbGUoIHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZWxlbWVudCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgaWYoIGVsZW1lbnQuZW5kc1dpdGgoICJhbnQuamFyIiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSAobmV3IEZpbGUoIGVsZW1lbnQgKSkuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0gICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCi0gICAgICAgICAgICAgICAgaWYoIG51bGwgIT0gZmlsZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiVW5hYmxlIHRvIGxvY2F0ZSBhbnQuamFyIGluIGNsYXNzcGF0aCIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvYW50MS9BbnQxUHJvamVjdC5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2FudDEvQW50MVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiOWUwMS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvYW50MS9BbnQxUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmFudDE7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0dWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2cuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotcHVibGljIGNsYXNzIEFudDFQcm9qZWN0Ci0gICAgZXh0ZW5kcyBQcm9qZWN0Ci0gICAgaW1wbGVtZW50cyBMb2dnYWJsZSwgQ29udGV4dHVhbGl6YWJsZQotewotICAgIHByaXZhdGUgTG9nZ2VyICAgbV9sb2dnZXI7Ci0KLSAgICAvLy9WYXJpYWJsZSB0byBob2xkIGNvbnRleHQgZm9yIHVzZSBieSBzdWItY2xhc3NlcwotICAgIHByaXZhdGUgVGFza0NvbnRleHQgICAgICAgICAgICBtX2NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2dnZXIoIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgIHsKLSAgICAgICAgbV9sb2dnZXIgPSBsb2dnZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBnZXRMb2dnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbG9nZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIGNvbnRleHQgZnJvbSBjb250YWluZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoIGZpbmFsIENvbnRleHQgY29udGV4dCApCi0gICAgewotICAgICAgICBtX2NvbnRleHQgPSAoVGFza0NvbnRleHQpY29udGV4dDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgVGFza0NvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9jb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpc2UgdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2V0SmF2YVZlcnNpb25Qcm9wZXJ0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHRyeSB7IGdldENvbnRleHQoKS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCAiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAiICsgbmFtZSArICIgdG8gIiArIHZhbHVlLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUHJvcGVydHkoIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgc2V0UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIiICsgZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5KCBuYW1lICk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VyUHJvcGVydHkoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eSggbmFtZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gIkFudDEgUHJvamVjdCI7Ci0gICAgfQotCi0gICAgcHVibGljIFRhc2sgY3JlYXRlVGFzayggZmluYWwgU3RyaW5nIHRhc2tUeXBlICkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZURhdGFUeXBlKCBmaW5hbCBTdHJpbmcgdHlwZU5hbWUgKQotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIHJlc29sdmVGaWxlKCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUgKQotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIGdldENvbnRleHQoKS5yZXNvbHZlRmlsZSggZmlsZU5hbWUgKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVCdWlsZFN0YXJ0ZWQoKSB7fQotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVCdWlsZEZpbmlzaGVkKFRocm93YWJsZSBleGNlcHRpb24pIHt9Ci0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVRhcmdldFN0YXJ0ZWQoVGFyZ2V0IHRhcmdldCkge30KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlVGFyZ2V0RmluaXNoZWQoVGFyZ2V0IHRhcmdldCwgVGhyb3dhYmxlIGV4Y2VwdGlvbikge30KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlVGFza1N0YXJ0ZWQoVGFzayB0YXNrKSB7fQotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVUYXNrRmluaXNoZWQoVGFzayB0YXNrLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7fQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVNZXNzYWdlTG9nZ2VkRXZlbnQoQnVpbGRFdmVudCBldmVudCwgU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSkKLSAgICB7Ci0gICAgICAgIG1lc3NhZ2VMb2dnZWQoIG1lc3NhZ2UsIHByaW9yaXR5ICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZU1lc3NhZ2VMb2dnZWQoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KQotICAgIHsKLSAgICAgICAgbWVzc2FnZUxvZ2dlZCggbWVzc2FnZSwgcHJpb3JpdHkgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlTWVzc2FnZUxvZ2dlZChUYXJnZXQgdGFyZ2V0LCBTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KQotICAgIHsKLSAgICAgICAgbWVzc2FnZUxvZ2dlZCggbWVzc2FnZSwgcHJpb3JpdHkgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlTWVzc2FnZUxvZ2dlZChUYXNrIHRhc2ssIFN0cmluZyBtZXNzYWdlLCBpbnQgcHJpb3JpdHkpCi0gICAgewotICAgICAgICBtZXNzYWdlTG9nZ2VkKCBtZXNzYWdlLCBwcmlvcml0eSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtZXNzYWdlTG9nZ2VkKCBTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5ICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcHJpb3JpdHkgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgTVNHX0VSUjogZ2V0TG9nZ2VyKCkuZXJyb3IoIG1lc3NhZ2UgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNHX1dBUk46IGdldExvZ2dlcigpLndhcm4oIG1lc3NhZ2UgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNHX0lORk86IGdldExvZ2dlcigpLmluZm8oIG1lc3NhZ2UgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVNHX1ZFUkJPU0U6IGdldExvZ2dlcigpLmRlYnVnKCBtZXNzYWdlICk7IGJyZWFrOwotICAgICAgICBjYXNlIE1TR19ERUJVRzogZ2V0TG9nZ2VyKCkuZGVidWcoIG1lc3NhZ2UgKTsgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCBtZXNzYWdlICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvYW50MS9BbnQxVGFza2xpYi5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2FudDEvQW50MVRhc2tsaWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiMmRiZS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvYW50MS9BbnQxVGFza2xpYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuYW50MTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5BYnN0cmFjdFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZU1hbmFnZXI7Ci0KLS8qKgotICogTWV0aG9kIHRvIHJlZ2lzdGVyIGEgdGFza2xpYi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIEFudDFUYXNrbGliCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFRhc2sKLSAgICBpbXBsZW1lbnRzIENvbXBvc2FibGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICBtX3ByZWZpeCAgPSAiIjsKLSAgICBwcml2YXRlIEZpbGUgICAgICAgICBtX2xpYjsKLSAgICBwcml2YXRlIFR5cGVNYW5hZ2VyICBtX3R5cGVNYW5hZ2VyOwotCi0gICAgcHVibGljIHZvaWQgY29tcG9zZSggZmluYWwgQ29tcG9uZW50TWFuYWdlciBjb21wb25lbnRNYW5hZ2VyICkKLSAgICAgICAgdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV90eXBlTWFuYWdlciA9IChUeXBlTWFuYWdlciljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggVHlwZU1hbmFnZXIuUk9MRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpYiggZmluYWwgRmlsZSBsaWIgKQotICAgIHsKLSAgICAgICAgbV9saWIgPSBsaWI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KCBmaW5hbCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIG1fcHJlZml4ID0gcHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIG51bGwgPT0gbV9saWIgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIk11c3Qgc3BlY2lmeSBsaWIgcGFyYW1ldGVyIiApOwotICAgICAgICB9Ci0KLQotICAgICAgICB0cnkKLSAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gICJqYXI6IiArIG1fbGliLnRvVVJMKCkgKyAKLSAgICAgICAgICAgICAgICAiIS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIjsKLSAgICAgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKCBsb2NhdGlvbiApOwotICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQgPSB1cmwub3BlblN0cmVhbSgpOwotCi0gICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHRhc2tzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIHRhc2tzLmxvYWQoIGlucHV0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIEFudDFUeXBlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEFudDFUeXBlRmFjdG9yeSggbV9saWIudG9VUkwoKSApOwotCi0gICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbiBlbnVtID0gdGFza3MucHJvcGVydHlOYW1lcygpOwotICAgICAgICAgICAgd2hpbGUoIGVudW0uaGFzTW9yZUVsZW1lbnRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdOYW1lID0gKFN0cmluZyllbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IHRhc2tzLmdldFByb3BlcnR5KCByYXdOYW1lICk7ICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbV9wcmVmaXggKyByYXdOYW1lOwotCi0gICAgICAgICAgICAgICAgZmFjdG9yeS5hZGROYW1lQ2xhc3NNYXBwaW5nKCBuYW1lLCBjbGFzc05hbWUgKTsKLSAgICAgICAgICAgICAgICBtX3R5cGVNYW5hZ2VyLnJlZ2lzdGVyVHlwZSggVGFzay5ST0xFLCBuYW1lLCBmYWN0b3J5ICk7ICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIkZhaWxlZCB0byBsb2FkIHRhc2sgZGVmaW5pdGlvbnMiLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvYW50MS9BbnQxVHlwZUZhY3RvcnkuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9hbnQxL0FudDFUeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODUzN2FlLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9hbnQxL0FudDFUeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuYW50MTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5EZWZhdWx0VHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotCi0vKioKLSAqIEZhY3RvcnkgdXNlZCB0byBjcmVhdGUgYWRhcHRvcnMgZm9yIEFudDEgdGFza3MuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBbnQxVHlwZUZhY3RvcnkKLSAgICBleHRlbmRzIERlZmF1bHRUeXBlRmFjdG9yeQotewotICAgIHB1YmxpYyBBbnQxVHlwZUZhY3RvcnkoIGZpbmFsIFVSTCB1cmwgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHVybCApOwotICAgIH0KLQotICAgIHB1YmxpYyBBbnQxVHlwZUZhY3RvcnkoIGZpbmFsIFVSTFtdIHVybHMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHVybHMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW50MVR5cGVGYWN0b3J5KCBmaW5hbCBVUkxbXSB1cmxzLCBmaW5hbCBDbGFzc0xvYWRlciBwYXJlbnQgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHVybHMsIHBhcmVudCApOwotICAgIH0KLQotICAgIHB1YmxpYyBBbnQxVHlwZUZhY3RvcnkoIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBjbGFzc0xvYWRlciApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgICAgIHRocm93cyBUeXBlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBPYmplY3Qgb2JqZWN0ID0gc3VwZXIuY3JlYXRlKCBuYW1lICk7Ci0KLSAgICAgICAgaWYoICEob2JqZWN0IGluc3RhbmNlb2YgVGFzaykgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUV4Y2VwdGlvbiggIkV4cGVjdGVkIGFuIEFudDEgdGFzayBidXQgcmVjZWl2ZWQgYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBvZiB0eXBlIDogIiArIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBUYXNrQWRhcHRlciggKFRhc2spb2JqZWN0ICk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvYW50MS9UYXNrQWRhcHRlci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2FudDEvVGFza0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxZGE2OS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvYW50MS9UYXNrQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuYW50MTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMudHlwZS5UeXBlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrLkFic3RyYWN0Q29udGFpbmVyVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotCi0vKioKLSAqIEFkYXB0ZXIgb2YgQW50MSB0YXNrcyB0byBteXJtaWRvbi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tBZGFwdGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdENvbnRhaW5lclRhc2sKLSAgICBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZQotewotICAgIHByaXZhdGUgVGFzayAgICAgICAgIG1fdGFzazsKLSAgICBwcml2YXRlIEFudDFQcm9qZWN0ICBtX3Byb2plY3QgPSBuZXcgQW50MVByb2plY3QoKTsKLQotICAgIHB1YmxpYyBUYXNrQWRhcHRlciggZmluYWwgVGFzayB0YXNrICkKLSAgICB7Ci0gICAgICAgIG1fdGFzayA9IHRhc2s7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFRhc2sgZ2V0VGFzaygpCi0gICAgewotICAgICAgICByZXR1cm4gbV90YXNrOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBBbnQxUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3Byb2plY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gKQotICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0VGFzaygpLnNldFRhc2tOYW1lKCBjb25maWd1cmF0aW9uLmdldE5hbWUoKSApOwotCi0gICAgICAgIC8vZG8gY29uZmlndXJhdGlvbgotICAgICAgICBjb25maWd1cmUoIGdldFRhc2soKSwgY29uZmlndXJhdGlvbiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXRMb2dnZXIoIGdldExvZ2dlcigpICk7Ci0gICAgICAgICAgICBnZXRQcm9qZWN0KCkuY29udGV4dHVhbGl6ZSggZ2V0Q29udGV4dCgpICk7Ci0gICAgICAgICAgICBnZXRQcm9qZWN0KCkuaW5pdCgpOwotCi0gICAgICAgICAgICBnZXRUYXNrKCkuc2V0UHJvamVjdCggZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgICAgICBnZXRUYXNrKCkuaW5pdCgpOwotICAgICAgICAgICAgZ2V0VGFzaygpLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL0VjaG8uamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL0VjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmMTM4Zi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24ubGlicy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuQWJzdHJhY3RUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZWNobyB0YXNrIHRvIGRpc3BsYXkgYSBtZXNzYWdlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRWNobyAKLSAgICBleHRlbmRzIEFic3RyYWN0VGFzawotewotICAgIHByaXZhdGUgU3RyaW5nICAgICAgbV9tZXNzYWdlOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZSggZmluYWwgU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgICAgbV9tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLndhcm4oIG1fbWVzc2FnZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL1Byb3BlcnR5LmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDM2NGM0Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5mcmFtZXdvcmsuQWJzdHJhY3RDb250YWluZXJUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrLkRhdGFUeXBlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5ICJ0YXNrIiB0byBkZWNsYXJlIGEgYmluZGluZyBvZiBhIGRhdGF0eXBlIHRvIGEgbmFtZS4KLSAqCi0gKiBUT0RPOiBEZXRlcm1pbmUgZmluYWwgZm9ybWF0IG9mIHByb3BlcnR5IHRhc2suCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eQotICAgIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJUYXNrCi0gICAgaW1wbGVtZW50cyBDb25maWd1cmFibGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgbV9uYW1lOwotICAgIHByaXZhdGUgT2JqZWN0ICAgICAgICAgICAgICBtX3ZhbHVlOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICBtX2xvY2FsU2NvcGUgICAgID0gdHJ1ZTsKLSAgICBwcml2YXRlIFR5cGVGYWN0b3J5ICAgICAgICAgbV9mYWN0b3J5OwotCi0gICAgcHVibGljIHZvaWQgY29tcG9zZSggZmluYWwgQ29tcG9uZW50TWFuYWdlciBjb21wb25lbnRNYW5hZ2VyICkKLSAgICAgICAgdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuY29tcG9zZSggY29tcG9uZW50TWFuYWdlciApOwotCi0gICAgICAgIGZpbmFsIFR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyID0gKFR5cGVNYW5hZ2VyKWNvbXBvbmVudE1hbmFnZXIubG9va3VwKCBUeXBlTWFuYWdlci5ST0xFICk7Ci0gICAgICAgIHRyeSB7IG1fZmFjdG9yeSA9IHR5cGVNYW5hZ2VyLmdldEZhY3RvcnkoIERhdGFUeXBlLlJPTEUgKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgVHlwZUV4Y2VwdGlvbiB0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb21wb25lbnRFeGNlcHRpb24oICJVbmFibGUgdG8gcmV0cmlldmUgZmFjdG9yeSBmcm9tIFR5cGVNYW5hZ2VyIiwgdGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZSggZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uICkKLSAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gYXR0cmlidXRlc1sgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyZSggdGhpcywgbmFtZSwgdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb25bXSBjaGlsZHJlbiA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIERhdGFUeXBlIHZhbHVlID0gKERhdGFUeXBlKW1fZmFjdG9yeS5jcmVhdGUoIGNoaWxkcmVuWyBpIF0uZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlKCB2YWx1ZSwgY2hpbGRyZW5bIGkgXSApOwotICAgICAgICAgICAgICAgIHNldFZhbHVlKCB2YWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggIlVuYWJsZSB0byBzZXQgZGF0YXR5cGUiLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBtX25hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKCBmaW5hbCBPYmplY3QgdmFsdWUgKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIG51bGwgIT0gbV92YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiVmFsdWUgY2FuIG5vdCBiZSBzZXQgbXVsdGlwbGUgdGltZXMiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxTY29wZSggZmluYWwgYm9vbGVhbiBsb2NhbFNjb3BlICkKLSAgICB7Ci0gICAgICAgIG1fbG9jYWxTY29wZSA9IGxvY2FsU2NvcGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggbnVsbCA9PSBtX25hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIk5hbWUgbXVzdCBiZSBzcGVjaWZpZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbnVsbCA9PSBtX3ZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJWYWx1ZSBtdXN0IGJlIHNwZWNpZmllZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBtX2xvY2FsU2NvcGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkuc2V0UHJvcGVydHkoIG1fbmFtZSwgbV92YWx1ZSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnNldFByb3BlcnR5KCBtX25hbWUsIG1fdmFsdWUsIFRhc2tDb250ZXh0LlBBUkVOVCApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9CeXRlQ29udmVydGVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb0J5dGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3MjRjYS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb0J5dGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyLkFic3RyYWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyLkNvbnZlcnRlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTdHJpbmcgdG8gYnl0ZSBjb252ZXJ0ZXIKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1RvQnl0ZUNvbnZlcnRlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RDb252ZXJ0ZXIKLXsKLSAgICBwdWJsaWMgU3RyaW5nVG9CeXRlQ29udmVydGVyKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBTdHJpbmcuY2xhc3MsIEJ5dGUuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoIGZpbmFsIE9iamVjdCBvcmlnaW5hbCwgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBCeXRlKCAoU3RyaW5nKW9yaWdpbmFsICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKCAiRXJyb3IgZm9ybWF0dGluZyBvYmplY3QiLCBuZmUgKTsKLSAgICAgICAgfQotCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb0NsYXNzQ29udmVydGVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb0NsYXNzQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQ0ZjEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9DbGFzc0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQWJzdHJhY3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQ29udmVydGVyRXhjZXB0aW9uOwotCi0vKioKLSAqIFN0cmluZyB0byBjbGFzcyBjb252ZXJ0ZXIKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1RvQ2xhc3NDb252ZXJ0ZXIKLSAgICBleHRlbmRzIEFic3RyYWN0Q29udmVydGVyCi17Ci0gICAgcHVibGljIFN0cmluZ1RvQ2xhc3NDb252ZXJ0ZXIoKQotICAgIHsKLSAgICAgICAgc3VwZXIoIFN0cmluZy5jbGFzcywgQ2xhc3MuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoIGZpbmFsIE9iamVjdCBvcmlnaW5hbCwgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy9UT0RPOiBTaG91bGQgd2UgdXNlIENvbnRleHRDbGFzc0xvYWRlciBoZXJlPz8/Ci0gICAgICAgIHRyeSB7IHJldHVybiBDbGFzcy5mb3JOYW1lKCAoU3RyaW5nKW9yaWdpbmFsICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbiggIkVycm9yIGNvbnZlcnRpbmcgdG8gY2xhc3MgdHlwZSIsIGUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9Eb3VibGVDb252ZXJ0ZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL1N0cmluZ1RvRG91YmxlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzkyZTEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9Eb3VibGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyLkFic3RyYWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyLkNvbnZlcnRlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTdHJpbmcgdG8gZG91YmxlIGNvbnZlcnRlcgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVG9Eb3VibGVDb252ZXJ0ZXIKLSAgICBleHRlbmRzIEFic3RyYWN0Q29udmVydGVyCi17Ci0gICAgcHVibGljIFN0cmluZ1RvRG91YmxlQ29udmVydGVyKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBTdHJpbmcuY2xhc3MsIERvdWJsZS5jbGFzcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY29udmVydCggZmluYWwgT2JqZWN0IG9yaWdpbmFsLCBmaW5hbCBDb250ZXh0IGNvbnRleHQgKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IERvdWJsZSggKFN0cmluZylvcmlnaW5hbCApOyB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbiggIkVycm9yIGZvcm1hdHRpbmcgb2JqZWN0IiwgbmZlICk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL1N0cmluZ1RvRmlsZUNvbnZlcnRlci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9GaWxlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkY2IzZDcuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9GaWxlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24ubGlicy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5BYnN0cmFjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5Db252ZXJ0ZXJFeGNlcHRpb247Ci0KLS8qKgotICogU3RyaW5nIHRvIGZpbGUgY29udmVydGVyCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdUb0ZpbGVDb252ZXJ0ZXIKLSAgICBleHRlbmRzIEFic3RyYWN0Q29udmVydGVyCi17Ci0gICAgcHVibGljIFN0cmluZ1RvRmlsZUNvbnZlcnRlcigpCi0gICAgewotICAgICAgICBzdXBlciggU3RyaW5nLmNsYXNzLCBGaWxlLmNsYXNzICk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjb252ZXJ0KCBmaW5hbCBPYmplY3Qgb3JpZ2luYWwsIGZpbmFsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBUYXNrQ29udGV4dCB0YXNrQ29udGV4dCA9IChUYXNrQ29udGV4dCljb250ZXh0OwotICAgICAgICAgICAgcmV0dXJuIHRhc2tDb250ZXh0LnJlc29sdmVGaWxlKCAoU3RyaW5nKW9yaWdpbmFsICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFRhc2tFeGNlcHRpb24gdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKCAiRXJyb3IgcmVzb2x2aW5nIGZpbGUgZHVyaW5nIGNvbnZlcnNpb24iLCB0ZSApOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb0Zsb2F0Q29udmVydGVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb0Zsb2F0Q29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjY4ZTguLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9GbG9hdENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQWJzdHJhY3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQ29udmVydGVyRXhjZXB0aW9uOwotCi0vKioKLSAqIFN0cmluZyB0byBmbG9hdCBjb252ZXJ0ZXIKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1RvRmxvYXRDb252ZXJ0ZXIKLSAgICBleHRlbmRzIEFic3RyYWN0Q29udmVydGVyCi17Ci0gICAgcHVibGljIFN0cmluZ1RvRmxvYXRDb252ZXJ0ZXIoKQotICAgIHsKLSAgICAgICAgc3VwZXIoIFN0cmluZy5jbGFzcywgRmxvYXQuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoIGZpbmFsIE9iamVjdCBvcmlnaW5hbCwgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBGbG9hdCggKFN0cmluZylvcmlnaW5hbCApOyB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbiggIkVycm9yIGZvcm1hdHRpbmcgb2JqZWN0IiwgbmZlICk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL1N0cmluZ1RvSW50ZWdlckNvbnZlcnRlci5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9JbnRlZ2VyQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDAyNzAuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9JbnRlZ2VyQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24ubGlicy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5BYnN0cmFjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbnZlcnRlci5Db252ZXJ0ZXJFeGNlcHRpb247Ci0KLS8qKgotICogU3RyaW5nIHRvIGludGVnZXIgY29udmVydGVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVG9JbnRlZ2VyQ29udmVydGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdENvbnZlcnRlcgotewotICAgIHB1YmxpYyBTdHJpbmdUb0ludGVnZXJDb252ZXJ0ZXIoKQotICAgIHsKLSAgICAgICAgc3VwZXIoIFN0cmluZy5jbGFzcywgSW50ZWdlci5jbGFzcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY29udmVydCggZmluYWwgT2JqZWN0IG9yaWdpbmFsLCBmaW5hbCBDb250ZXh0IGNvbnRleHQgKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEludGVnZXIoIChTdHJpbmcpb3JpZ2luYWwgKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJ0ZXJFeGNlcHRpb24oICJFcnJvciBmb3JtYXR0aW5nIG9iamVjdCIsIG5mZSApOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb0xvbmdDb252ZXJ0ZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL1N0cmluZ1RvTG9uZ0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDI0OTk0Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL1N0cmluZ1RvTG9uZ0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQWJzdHJhY3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQ29udmVydGVyRXhjZXB0aW9uOwotCi0vKioKLSAqIFN0cmluZyB0byBsb25nIGNvbnZlcnRlcgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVG9Mb25nQ29udmVydGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdENvbnZlcnRlcgotewotICAgIHB1YmxpYyBTdHJpbmdUb0xvbmdDb252ZXJ0ZXIoKQotICAgIHsKLSAgICAgICAgc3VwZXIoIFN0cmluZy5jbGFzcywgTG9uZy5jbGFzcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY29udmVydCggZmluYWwgT2JqZWN0IG9yaWdpbmFsLCBmaW5hbCBDb250ZXh0IGNvbnRleHQgKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IExvbmcoIChTdHJpbmcpb3JpZ2luYWwgKTsgfQotICAgICAgICBjYXRjaCggZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJ0ZXJFeGNlcHRpb24oICJFcnJvciBmb3JtYXR0aW5nIG9iamVjdCIsIG5mZSApOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb1Nob3J0Q29udmVydGVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvY29yZS9TdHJpbmdUb1Nob3J0Q29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YjcwNjEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9TaG9ydENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQWJzdHJhY3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQ29udmVydGVyRXhjZXB0aW9uOwotCi0vKioKLSAqIFN0cmluZyB0byBzaG9ydCBjb252ZXJ0ZXIKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1RvU2hvcnRDb252ZXJ0ZXIKLSAgICBleHRlbmRzIEFic3RyYWN0Q29udmVydGVyCi17Ci0gICAgcHVibGljIFN0cmluZ1RvU2hvcnRDb252ZXJ0ZXIoKQotICAgIHsKLSAgICAgICAgc3VwZXIoIFN0cmluZy5jbGFzcywgU2hvcnQuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoIGZpbmFsIE9iamVjdCBvcmlnaW5hbCwgZmluYWwgQ29udGV4dCBjb250ZXh0ICkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBTaG9ydCggKFN0cmluZylvcmlnaW5hbCApOyB9Ci0gICAgICAgIGNhdGNoKCBmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbiggIkVycm9yIGZvcm1hdHRpbmcgb2JqZWN0IiwgbmZlICk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9VUkxDb252ZXJ0ZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9jb3JlL1N0cmluZ1RvVVJMQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjVjYWIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL2NvcmUvU3RyaW5nVG9VUkxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQWJzdHJhY3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb252ZXJ0ZXIuQ29udmVydGVyRXhjZXB0aW9uOwotCi0vKioKLSAqIFN0cmluZyB0byB1cmwgY29udmVydGVyCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdUb1VSTENvbnZlcnRlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RDb252ZXJ0ZXIKLXsKLSAgICBwdWJsaWMgU3RyaW5nVG9VUkxDb252ZXJ0ZXIoKQotICAgIHsKLSAgICAgICAgc3VwZXIoIFN0cmluZy5jbGFzcywgVVJMLmNsYXNzICk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjb252ZXJ0KCBmaW5hbCBPYmplY3Qgb3JpZ2luYWwsIGZpbmFsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSB7IHJldHVybiBuZXcgVVJMKCAoU3RyaW5nKW9yaWdpbmFsICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKCAiRXJyb3IgZm9ybWF0dGluZyBvYmplY3QiLCBtdWUgKTsKLSAgICAgICAgfQotCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvcnVudGltZS9Db252ZXJ0ZXJEZWYuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9ydW50aW1lL0NvbnZlcnRlckRlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWIyZWU5Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9ydW50aW1lL0NvbnZlcnRlckRlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLkFic3RyYWN0VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5jb252ZXJ0ZXIuQ29udmVydGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuRGVmYXVsdFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29udmVydGVyLkNvbnZlcnRlcjsKLQotLyoqCi0gKiBUYXNrIHRvIGRlZmluZSBhIGNvbnZlcnRlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRlckRlZgotICAgIGV4dGVuZHMgQWJzdHJhY3RUYXNrCi0gICAgaW1wbGVtZW50cyBDb21wb3NhYmxlCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIG1fc291cmNlVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgbV9kZXN0aW5hdGlvblR5cGU7Ci0gICAgcHJpdmF0ZSBGaWxlICAgICAgICAgICAgICAgIG1fbGliOwotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBtX2NsYXNzbmFtZTsKLSAgICBwcml2YXRlIENvbnZlcnRlclJlZ2lzdHJ5ICAgbV9jb252ZXJ0ZXJSZWdpc3RyeTsKLSAgICBwcml2YXRlIFR5cGVNYW5hZ2VyICAgICAgICAgbV90eXBlTWFuYWdlcjsKLQotICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoIGZpbmFsIENvbXBvbmVudE1hbmFnZXIgY29tcG9uZW50TWFuYWdlciApCi0gICAgICAgIHRocm93cyBDb21wb25lbnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1fY29udmVydGVyUmVnaXN0cnkgPSAoQ29udmVydGVyUmVnaXN0cnkpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIENvbnZlcnRlclJlZ2lzdHJ5LlJPTEUgKTsKLSAgICAgICAgbV90eXBlTWFuYWdlciA9IChUeXBlTWFuYWdlciljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggVHlwZU1hbmFnZXIuUk9MRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpYiggZmluYWwgRmlsZSBsaWIgKQotICAgIHsKLSAgICAgICAgbV9saWIgPSBsaWI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKCBmaW5hbCBTdHJpbmcgY2xhc3NuYW1lICkKLSAgICB7Ci0gICAgICAgIG1fY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZVR5cGUoIGZpbmFsIFN0cmluZyBzb3VyY2VUeXBlICkKLSAgICB7Ci0gICAgICAgIG1fc291cmNlVHlwZSA9IHNvdXJjZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb25UeXBlKCBmaW5hbCBTdHJpbmcgZGVzdGluYXRpb25UeXBlICkKLSAgICB7Ci0gICAgICAgIG1fZGVzdGluYXRpb25UeXBlID0gZGVzdGluYXRpb25UeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIG51bGwgPT0gbV9jbGFzc25hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIk11c3Qgc3BlY2lmeSBjbGFzc25hbWUgcGFyYW1ldGVyIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG51bGwgPT0gbV9zb3VyY2VUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJNdXN0IHNwZWNpZnkgdGhlIHNvdXJjZS10eXBlIHBhcmFtZXRlciIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBudWxsID09IG1fZGVzdGluYXRpb25UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJNdXN0IHNwZWNpZnkgdGhlIGRlc3RpbmF0aW9uLXR5cGUgcGFyYW1ldGVyIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG51bGwgPT0gbV9saWIgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIk11c3Qgc3BlY2lmeSB0aGUgbGliIHBhcmFtZXRlciIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2NvbnZlcnRlclJlZ2lzdHJ5LnJlZ2lzdGVyQ29udmVydGVyKCBtX2NsYXNzbmFtZSwgbV9zb3VyY2VUeXBlLCBtX2Rlc3RpbmF0aW9uVHlwZSApOwotCi0gICAgICAgICAgICBmaW5hbCBVUkwgdXJsID0gbV9saWIudG9VUkwoKTsKLSAgICAgICAgICAgIGZpbmFsIERlZmF1bHRUeXBlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERlZmF1bHRUeXBlRmFjdG9yeSggbmV3IFVSTFtdIHsgdXJsIH0gKTsKLSAgICAgICAgICAgIGZhY3RvcnkuYWRkTmFtZUNsYXNzTWFwcGluZyggbV9jbGFzc25hbWUsIG1fY2xhc3NuYW1lICk7Ci0KLSAgICAgICAgICAgIG1fdHlwZU1hbmFnZXIucmVnaXN0ZXJUeXBlKCBDb252ZXJ0ZXIuUk9MRSwgbV9jbGFzc25hbWUsIGZhY3RvcnkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIkZhaWxlZCB0byByZWdpc3RlciBjb252ZXJ0ZXIgIiArIG1fY2xhc3NuYW1lLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvcnVudGltZS9GYWNpbGl0eS5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL3J1bnRpbWUvRmFjaWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjZWU2ZC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvcnVudGltZS9GYWNpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuQWJzdHJhY3RUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLmFzcGVjdC5Bc3BlY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy50eXBlLlR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5jb21wb25lbnRzLnR5cGUuVHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hc3BlY3RzLkFzcGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5mcmFtZXdvcmsuQWJzdHJhY3RDb250YWluZXJUYXNrOwotCi0vKioKLSAqIFRhc2sgdGhhdCBkZWZpbmVzTWV0aG9kIHRvIHJlZ2lzdGVyIGEgc2luZ2xlIGNvbnZlcnRlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIEZhY2lsaXR5Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdENvbnRhaW5lclRhc2sKLSAgICBpbXBsZW1lbnRzIENvbXBvc2FibGUsIENvbmZpZ3VyYWJsZSAKLXsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgbV9uYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBBc3BlY3RIYW5kbGVyICAgICAgIG1fYXNwZWN0SGFuZGxlcjsKLQotICAgIHByaXZhdGUgQXNwZWN0TWFuYWdlciAgICAgICBtX2FzcGVjdE1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBUeXBlRmFjdG9yeSAgICAgICAgIG1fZmFjdG9yeTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb21wb3NlKCBmaW5hbCBDb21wb25lbnRNYW5hZ2VyIGNvbXBvbmVudE1hbmFnZXIgKQotICAgICAgICB0aHJvd3MgQ29tcG9uZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5jb21wb3NlKCBjb21wb25lbnRNYW5hZ2VyICk7Ci0KLSAgICAgICAgbV9hc3BlY3RNYW5hZ2VyID0gKEFzcGVjdE1hbmFnZXIpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIEFzcGVjdE1hbmFnZXIuUk9MRSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIgPSAoVHlwZU1hbmFnZXIpY29tcG9uZW50TWFuYWdlci5sb29rdXAoIFR5cGVNYW5hZ2VyLlJPTEUgKTsKLSAgICAgICAgdHJ5IHsgbV9mYWN0b3J5ID0gdHlwZU1hbmFnZXIuZ2V0RmFjdG9yeSggQXNwZWN0SGFuZGxlci5ST0xFICk7IH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIFR5cGVFeGNlcHRpb24gdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcG9uZW50RXhjZXB0aW9uKCAiVW5hYmxlIHRvIHJldHJpZXZlIGZhY3RvcnkgZnJvbSBUeXBlTWFuYWdlciIsIHRlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiApCi0gICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXNbIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKCBuYW1lICk7Ci0gICAgICAgICAgICBjb25maWd1cmUoIHRoaXMsIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uW10gY2hpbGRyZW4gPSBjb25maWd1cmF0aW9uLmdldENoaWxkcmVuKCk7Ci0KLSAgICAgICAgaWYoIDEgPT0gY2hpbGRyZW4ubGVuZ3RoICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fYXNwZWN0SGFuZGxlciA9IChBc3BlY3RIYW5kbGVyKW1fZmFjdG9yeS5jcmVhdGUoIGNoaWxkcmVuWyAwIF0uZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiRmFpbGVkIHRvIGNyZWF0ZSBhc3BlY3QgaGFuZGxlciBvZiB0eXBlICciICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuWyAwIF0uZ2V0TmFtZSgpICsgIiciLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbmZpZ3VyZSggbV9hc3BlY3RIYW5kbGVyLCBjaGlsZHJlblsgMCBdICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggIkV4cGVjdGVkIG9uZSBzdWItZWxlbWVudCB0byAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZ3VyZSBmYWNpbGl0eSIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZSggZmluYWwgU3RyaW5nIG5hbWVzcGFjZSApCi0gICAgewotICAgICAgICBtX25hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCBudWxsID09IG1fbmFtZXNwYWNlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhc2tFeGNlcHRpb24oICJNdXN0IHNwZWNpZnkgbmFtZXNwYWNlIHBhcmFtZXRlciIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1fYXNwZWN0TWFuYWdlci5hZGRBc3BlY3RIYW5kbGVyKCBtX25hbWVzcGFjZSwgbV9hc3BlY3RIYW5kbGVyICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL3J1bnRpbWUvSW1wb3J0LmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvcnVudGltZS9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwOWMzNC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvcnVudGltZS9JbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLkFic3RyYWN0VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5kZXBsb3llci5EZXBsb3llcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuZGVwbG95ZXIuRGVwbG95bWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUYXNrIHRvIGltcG9ydCBhIHRhc2tsaWIuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnQKLSAgICBleHRlbmRzIEFic3RyYWN0VGFzawotICAgIGltcGxlbWVudHMgQ29tcG9zYWJsZQotewotICAgIHByaXZhdGUgRmlsZSAgICAgICAgbV9saWI7Ci0gICAgcHJpdmF0ZSBEZXBsb3llciAgICBtX2RlcGxveWVyOwotCi0gICAgcHVibGljIHZvaWQgY29tcG9zZSggZmluYWwgQ29tcG9uZW50TWFuYWdlciBjb21wb25lbnRNYW5hZ2VyICkKLSAgICAgICAgdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbV9kZXBsb3llciA9IChEZXBsb3llciljb21wb25lbnRNYW5hZ2VyLmxvb2t1cCggRGVwbG95ZXIuUk9MRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpYiggZmluYWwgRmlsZSBsaWIgKQotICAgIHsKLSAgICAgICAgbV9saWIgPSBsaWI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICAgIHRocm93cyBUYXNrRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggbnVsbCA9PSBtX2xpYiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCAiTXVzdCBzcGVjaWZ5IGxpYiBwYXJhbWV0ZXIiICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbV9kZXBsb3llci5kZXBsb3koIG1fbGliICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIGZpbmFsIERlcGxveW1lbnRFeGNlcHRpb24gZGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFza0V4Y2VwdGlvbiggIkVycm9yIGltcG9ydGluZyB0YXNrbGliIiwgZGUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9ydW50aW1lL1R5cGVEZWYuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9ydW50aW1lL1R5cGVEZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliNzQ0YS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvcnVudGltZS9UeXBlRGVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24ubGlicy5ydW50aW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmZyYW1ld29yay5BYnN0cmFjdFR5cGVEZWY7Ci0KLS8qKgotICogVGFzayB0byBkZWZpbmUgYSB0eXBlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgVHlwZURlZgotICAgIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVmCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgIG1fdHlwZTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoIGZpbmFsIFN0cmluZyB0eXBlICkKLSAgICB7Ci0gICAgICAgIG1fdHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV90eXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9zZWxmdGVzdC9Db25maWd1cmF0aW9uVGVzdC5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL3NlbGZ0ZXN0L0NvbmZpZ3VyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZTBkMGUuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL3NlbGZ0ZXN0L0NvbmZpZ3VyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24ubGlicy5zZWxmdGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuQWJzdHJhY3RUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5mcmFtZXdvcmsuQWJzdHJhY3RDb250YWluZXJUYXNrOwotCi0vKioKLSAqIFRoaXMgaXMgdG8gdGVzdCBzZWxmIGludGVycHJldGF0aW9uIG9mIGNvbmZpZ3VyYXRpb24uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVGVzdAotICAgIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJUYXNrCi0gICAgaW1wbGVtZW50cyBDb25maWd1cmFibGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgbV9tZXNzYWdlOwotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gKQotICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSggIm1lc3NhZ2UiICk7Ci0gICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3QgPSByZXNvbHZlKCBtZXNzYWdlICk7Ci0KLSAgICAgICAgaWYoIG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fbWVzc2FnZSA9IChTdHJpbmcpb2JqZWN0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbV9tZXNzYWdlID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLndhcm4oIG1fbWVzc2FnZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlicy9zZWxmdGVzdC9Db250ZW50VGVzdC5qYXZhIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL3NlbGZ0ZXN0L0NvbnRlbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYWY2OWEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL3NlbGZ0ZXN0L0NvbnRlbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQotICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRSBmaWxlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlybWlkb24ubGlicy5zZWxmdGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLkFic3RyYWN0VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5UYXNrRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdG8gdGVzdCB3aGV0aGVyIGNvbnRlbnQgaXMgYWRkZWQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50VGVzdAotICAgIGV4dGVuZHMgQWJzdHJhY3RUYXNrCi17Ci0gICAgcHVibGljIHZvaWQgYWRkQ29udGVudCggZmluYWwgSW50ZWdlciB2YWx1ZSApCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCAiSW50ZWdlciBjb250ZW50OiAiICsgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgcHVibGljIHZvaWQgYWRkQ29udGVudCggZmluYWwgU3RyaW5nIGJsYWggKQotICAgICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiU3RyaW5nIGNvbnRlbnQ6ICIgKyBibGFoICk7Ci0gICAgICB9Ci0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvc2VsZnRlc3QvUHJpbWl0aXZlVHlwZXNUZXN0LmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvc2VsZnRlc3QvUHJpbWl0aXZlVHlwZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmU1ZTIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL3NlbGZ0ZXN0L1ByaW1pdGl2ZVR5cGVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuc2VsZnRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15cm1pZG9uLmFwaS5BYnN0cmFjdFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFza0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0IGNvbnZlcnNpb24gb2YgYWxsIHRoZSBwcmltaXRpdmUgdHlwZXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVUeXBlc1Rlc3QKLSAgICBleHRlbmRzIEFic3RyYWN0VGFzawotewotICAgIHB1YmxpYyB2b2lkIHNldEludGVnZXIoIGZpbmFsIEludGVnZXIgdmFsdWUgKQotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkud2FybiggInNldEludGVnZXIoICIgKyB2YWx1ZSArICIgKTsiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW50ZWdlcjIoIGZpbmFsIGludCB2YWx1ZSApCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCAic2V0SW50ZWdlcjIoICIgKyB2YWx1ZSArICIgKTsiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2hvcnQoIGZpbmFsIFNob3J0IHZhbHVlICkKLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLndhcm4oICJzZXRTaG9ydCggIiArIHZhbHVlICsgIiApOyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydDIoIGZpbmFsIHNob3J0IHZhbHVlICkKLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLndhcm4oICJzZXRTaG9ydDIoICIgKyB2YWx1ZSArICIgKTsiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Qnl0ZSggZmluYWwgQnl0ZSB2YWx1ZSApCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCAic2V0Qnl0ZSggIiArIHZhbHVlICsgIiApOyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCeXRlMiggZmluYWwgYnl0ZSB2YWx1ZSApCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCAic2V0Qnl0ZTIoICIgKyB2YWx1ZSArICIgKTsiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9uZyggZmluYWwgTG9uZyB2YWx1ZSApCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCAic2V0TG9uZyggIiArIHZhbHVlICsgIiApOyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nMiggZmluYWwgbG9uZyB2YWx1ZSApCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCAic2V0TG9uZzIoICIgKyB2YWx1ZSArICIgKTsiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmxvYXQoIGZpbmFsIEZsb2F0IHZhbHVlICkKLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLndhcm4oICJzZXRGbG9hdCggIiArIHZhbHVlICsgIiApOyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdDIoIGZpbmFsIGZsb2F0IHZhbHVlICkKLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLndhcm4oICJzZXRGbG9hdDIoICIgKyB2YWx1ZSArICIgKTsiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlKCBmaW5hbCBEb3VibGUgdmFsdWUgKQotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkud2FybiggInNldERvdWJsZSggIiArIHZhbHVlICsgIiApOyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGUyKCBmaW5hbCBkb3VibGUgdmFsdWUgKQotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkud2FybiggInNldERvdWJsZTIoICIgKyB2YWx1ZSArICIgKTsiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKCBmaW5hbCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkud2FybiggInNldFN0cmluZyggIiArIHZhbHVlICsgIiApOyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIFRhc2tFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saWJzL3NlbGZ0ZXN0L1N1YkVsZW1lbnRUZXN0LmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvc2VsZnRlc3QvU3ViRWxlbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyYzE1NS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpYnMvc2VsZnRlc3QvU3ViRWxlbWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLnNlbGZ0ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuQWJzdHJhY3RUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubXlybWlkb24uYXBpLlRhc2tFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdCBzdWItZWxlbWVudHMgYWRkaXRpb24uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdWJFbGVtZW50VGVzdAotICAgIGV4dGVuZHMgQWJzdHJhY3RUYXNrCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCZWVwCi0gICAgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKCBmaW5hbCBTdHJpbmcgc3RyaW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBzdHJpbmcgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBCZWVwIGNyZWF0ZUNyZWF0ZUJlZXAoKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiY3JlYXRlQ3JlYXRlQmVlcCgpIiApOwotICAgICAgICByZXR1cm4gbmV3IEJlZXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBZGRCZWVwKCBmaW5hbCBCZWVwIGJlZXAgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYWRkQmVlcGVyKCIgKyBiZWVwICsgIik7IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpc3RlbmVycy9EZWZhdWx0UHJvamVjdExpc3RlbmVyLmphdmEgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpc3RlbmVycy9EZWZhdWx0UHJvamVjdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZGRjNWYuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL2phdmEvb3JnL2FwYWNoZS9teXJtaWRvbi9saXN0ZW5lcnMvRGVmYXVsdFByb2plY3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teXJtaWRvbi5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuRXhjZXB0aW9uVXRpbDsKLQotLyoqCi0gKiBEZWZhdWx0IGxpc3RlbmVyIHRoYXQgZW11bGF0ZXMgdGhlIG9sZCBhbnQgbGlzdGVuZXIgbm90aWZpY2F0aW9ucy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRQcm9qZWN0TGlzdGVuZXIKLSAgICBpbXBsZW1lbnRzIFByb2plY3RMaXN0ZW5lcgotewotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICBtX3ByZWZpeDsKLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBsaXN0ZW5lciBvZiBwcm9qZWN0U3RhcnRlZCBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0U3RhcnRlZCgpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBsaXN0ZW5lciBvZiBwcm9qZWN0RmluaXNoZWQgZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvamVjdEZpbmlzaGVkKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IGxpc3RlbmVyIG9mIHRhcmdldFN0YXJ0ZWQgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZSB0aGUgbmFtZSBvZiB0YXJnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKCBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSApCi0gICAgewotICAgICAgICBvdXRwdXQoIHRhcmdldE5hbWUgKyAiOlxuIiApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBsaXN0ZW5lciBvZiB0YXJnZXRGaW5pc2hlZCBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZCgpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBsaXN0ZW5lciBvZiB0YXNrU3RhcnRlZCBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXNrTmFtZSB0aGUgbmFtZSBvZiB0YXNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoIGZpbmFsIFN0cmluZyB0YXNrTmFtZSApCi0gICAgewotICAgICAgICBzZXRQcmVmaXgoIHRhc2tOYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IGxpc3RlbmVyIG9mIHRhc2tGaW5pc2hlZCBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoKQotICAgIHsKLSAgICAgICAgc2V0UHJlZml4KCBudWxsICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IGxpc3RlbmVyIG9mIGxvZyBtZXNzYWdlIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2coIFN0cmluZyBtZXNzYWdlICkKLSAgICB7Ci0gICAgICAgIG91dHB1dCggbWVzc2FnZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBsaXN0ZW5lciBvZiBsb2cgbWVzc2FnZSBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHRocm93YWJsZSB0aGUgdGhyb3dhYmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9nKCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gICAgewotICAgICAgICBvdXRwdXQoIG1lc3NhZ2UgKyAiXG4iICsgRXhjZXB0aW9uVXRpbC5wcmludFN0YWNrVHJhY2UoIHRocm93YWJsZSwgNSwgdHJ1ZSApICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBjbGFzcyB0byBvdXRwdXQgZGF0YS4KLSAgICAgKiBPdmVyaWRlIGluIHN1Yi1jbGFzc2VzIHRvIGRpcmVjdCB0byBhIGRpZmZlcmVudCBkZXN0aW5hdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb3V0cHV0KCBmaW5hbCBTdHJpbmcgZGF0YSApCi0gICAgewotICAgICAgICBpZiggbnVsbCAhPSBnZXRQcmVmaXgoKSApIFN5c3RlbS5vdXQucHJpbnRsbiggIlx0WyIgKyBnZXRQcmVmaXgoKSArICJdICIgKyBkYXRhICk7Ci0gICAgICAgIGVsc2UgU3lzdGVtLm91dC5wcmludGxuKCBkYXRhICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRQcmVmaXgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcHJlZml4OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFByZWZpeCggZmluYWwgU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICBtX3ByZWZpeCA9IHByZWZpeDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvamF2YS9vcmcvYXBhY2hlL215cm1pZG9uL2xpc3RlbmVycy9Qcm9qZWN0TGlzdGVuZXIuamF2YSBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlzdGVuZXJzL1Byb2plY3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzIxZjUwLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbXlybWlkb24vbGlzdGVuZXJzL1Byb2plY3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15cm1pZG9uLmxpc3RlbmVyczsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHRvIGltcGxlbWVudCBpZiB5b3Ugd2FudCB0byByZWNlaXZlCi0gKiBub3RpZmljYXRpb24gb2YgcHJvamVjdCBzdGF0dXMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5QZXRlciBEb25hbGQ8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdExpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogTm90aWZ5IGxpc3RlbmVyIG9mIHByb2plY3RTdGFydGVkIGV2ZW50LgotICAgICAqLwotICAgIHZvaWQgcHJvamVjdFN0YXJ0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBsaXN0ZW5lciBvZiBwcm9qZWN0RmluaXNoZWQgZXZlbnQuCi0gICAgICovCi0gICAgdm9pZCBwcm9qZWN0RmluaXNoZWQoKTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBsaXN0ZW5lciBvZiB0YXJnZXRTdGFydGVkIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldE5hbWUgdGhlIG5hbWUgb2YgdGFyZ2V0Ci0gICAgICovCi0gICAgdm9pZCB0YXJnZXRTdGFydGVkKCBTdHJpbmcgdGFyZ2V0TmFtZSApOwotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IGxpc3RlbmVyIG9mIHRhcmdldEZpbmlzaGVkIGV2ZW50LgotICAgICAqLwotICAgIHZvaWQgdGFyZ2V0RmluaXNoZWQoKTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBsaXN0ZW5lciBvZiB0YXNrU3RhcnRlZCBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXNrTmFtZSB0aGUgbmFtZSBvZiB0YXNrCi0gICAgICovCi0gICAgdm9pZCB0YXNrU3RhcnRlZCggU3RyaW5nIHRhc2tOYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgbGlzdGVuZXIgb2YgdGFza0ZpbmlzaGVkIGV2ZW50LgotICAgICAqLwotICAgIHZvaWQgdGFza0ZpbmlzaGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgbGlzdGVuZXIgb2YgbG9nIG1lc3NhZ2UgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHZvaWQgbG9nKCBTdHJpbmcgbWVzc2FnZSApOwotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IGxpc3RlbmVyIG9mIGxvZyBtZXNzYWdlIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIHRoZSB0aHJvd2FibGUKLSAgICAgKi8KLSAgICB2b2lkIGxvZyggU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUgKTsKLX0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYWtlL3ByaW1pdGl2ZS10ZXN0cy5hbnQgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFrZS9wcmltaXRpdmUtdGVzdHMuYW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGQzNDg2Li4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYWtlL3ByaW1pdGl2ZS10ZXN0cy5hbnQKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSBCYXNpYyB0ZXN0cyBidWlsZCBmaWxlCi0KLUF1dGhvcnM6Ci0gUGV0ZXIgRG9uYWxkIDxkb25hbGRwQGFwYWNoZS5vcmc+Ci0KLUxlZ2FsOgotICBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tPgotCi08cHJvamVjdCBuYW1lPSJNeVNhbXBsZSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLSAgPGltcG9ydCBsaWJyYXJ5PSJzZWxmdGVzdCIgLz4KLQotICA8cHJvcGVydHkgbmFtZT0ieWVhciIgdmFsdWU9IjIwMDAiLz4KLQotICA8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InRlc3QtdGFyZ2V0IiAvPgotCi0gIDx0YXJnZXQgbmFtZT0iZmlsZS1tYW5pcCI+Ci0gICAgPGZpbGUtbWFuaXAtdGVzdCBiYXNlLWRpcmVjdG9yeT0iLiI+Ci0gICAgICA8c291cmNlPgotICAgICAgICA8aW5jbHVkZSB2YWx1ZT0iKiovKi5qYXZhIiAvPiAgICAgICAKLSAgICAgIDwvc291cmNlPgotICAgIDwvZmlsZS1tYW5pcC10ZXN0PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InVuZGVmaW5lZC10YXNrIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJBYm91dCB0byBleGVjdXRlIHRhc2sgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkIi8+Ci0gICAgPGVjaG8yIG1lc3NhZ2U9IlRoaXMgc2hvdWxkIGhhdmUgZmFpbGVkIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibm8tdGVzdC10YXJnZXQiIGlmPSJuby1kby10ZXN0cyI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iTm8gdGVzdHMgZG9uZSBoZXJlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdC10YXJnZXQiIGRlcGVuZHM9Im5vLXRlc3QtdGFyZ2V0IiB1bmxlc3M9Im5vLWRvLXRlc3RzIj4KLQotICAgIDxlY2hvIG1lc3NhZ2U9IlRlc3RzIGF3YXkiLz4KLQotICAgIDxwcmltLXRlc3QKLSAgICAgICAgaW50ZWdlcj0iMSIKLSAgICAgICAgaW50ZWdlcjI9IjIiCi0gICAgICAgIHNob3J0PSIzIgotICAgICAgICBzaG9ydDI9IjQiCi0gICAgICAgIGxvbmc9IjUiCi0gICAgICAgIGxvbmcyPSI2IgotICAgICAgICBieXRlPSI3IgotICAgICAgICBieXRlMj0iOCIKLSAgICAgICAgc3RyaW5nPSJhU3RyaW5nIgotICAgICAgICBmbG9hdD0iMS4wIgotICAgICAgICBmbG9hdDI9IjIuMCIKLSAgICAgICAgZG91YmxlPSIzLjAiCi0gICAgICAgIGRvdWJsZTI9IjQuMCIKLSAgICAgLz4KLQotICAgIDxzdWItZWxlbWVudHMtdGVzdD4KLSAgICAgIDxjcmVhdGUtYmVlcCBtZXNzYWdlPSJBIHN0cmluZyIgLz4KLSAgICAgIDxhZGQtYmVlcCBtZXNzYWdlPSJBbm90aGVyIFN0cmluZyIgLz4KLSAgICA8L3N1Yi1lbGVtZW50cy10ZXN0PgotCi0gICAgPGNvbmYtdGVzdCBtZXNzYWdlPSIuLi4iIC8+Ci0gICAgCi0gICAgPGNvbnRlbnQtdGVzdD4xMjM8L2NvbnRlbnQtdGVzdD4KLSAgICAKLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFrZS9zYW1wbGUuYW50IGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL21ha2Uvc2FtcGxlLmFudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyMjBmZS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFrZS9zYW1wbGUuYW50CisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIFNhbXBsZSBidWlsZCBmaWxlCi0KLUF1dGhvcnM6Ci0gUGV0ZXIgRG9uYWxkIDxkb25hbGRwQGFwYWNoZS5vcmc+Ci0KLUxlZ2FsOgotICBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tPgotCi08cHJvamVjdCBuYW1lPSJNeVNhbXBsZSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLSAgPHByb2plY3RyZWYgbmFtZT0icHJpbSIgbG9jYXRpb249InByaW1pdGl2ZS10ZXN0cy5hbnQiIC8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InllYXIiIHZhbHVlPSIyMDAwIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJ0eXBlZGVmLXRlc3QsIGNvbnZlcnRlcmRlZi10ZXN0LCBkYXRhdHlwZS10ZXN0LCBuYW1lc3BhY2UtdGVzdCwgYW50MS10YXNrbGliLXRlc3QsIHByaW0tPmZpbGUtbWFuaXAiIC8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ4cC1kZXBsb3llci10ZXN0IiBkZXBlbmRzPSJ0eXBlZGVmLXRlc3QsIHByaW0tPnVuZGVmaW5lZC10YXNrIiAvPgotCi0gIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJwcm9wZXJ0eS10ZXN0LCB0eXBlZGVmLXRlc3QsIGNvbnZlcnRlcmRlZi10ZXN0LCBhbnQtY2FsbC10ZXN0LCBkYXRhdHlwZS10ZXN0LCBuYW1lc3BhY2UtdGVzdCwgYW50MS10YXNrbGliLXRlc3QsIHByaW0tPm1haW4iIC8+Ci0KLTwhLS0gICAgCi0gICAgPHJlZ2lzdGVyLXRhc2tsaWIgbGliPSIuLi8uLi9kaXN0L2xpYi9jb3JlLmF0bCIgLz4KLS0tPgotCi0gIDx0YXJnZXQgbmFtZT0icHJvcGVydHktdGVzdCI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJsYWgiIHZhbHVlPSJmcmVkIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSIke2JsYWh9IiB2YWx1ZT0iYmFybmV5IiAvPgotCi0gICAgPGVjaG8gbWVzc2FnZT0iRG9pbmcgdGhlIGZ1bmt5IEVjaG8gd2l0aCAke2JsYWh9ICR7ZnJlZH0gWWVhcj0ke3llYXJ9ISIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InR5cGVkZWYtdGVzdCI+Ci0gICAgPHR5cGVkZWYgbmFtZT0iZWNobzIiIAotICAgICAgICAgICAgIHR5cGU9InRhc2siIAotICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmUuRWNobyIgCi0gICAgICAgICAgICAgbGliPSIuLi8uLi9kaXN0L2xpYi9jb3JlLmF0bCIgLz4KLQotICAgIDxlY2hvMiBtZXNzYWdlPSJMdWtlIHRvIEVjaG8gYmFzZS4gQ2FuIHlvdSBoZWFyIG1lPyIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbnZlcnRlcmRlZi10ZXN0Ij4KLSAgICA8Y29udmVydGVyZGVmIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmUuU3RyaW5nVG9DbGFzc0NvbnZlcnRlciIKLSAgICAgICAgICAgICAgICAgIHNvdXJjZS10eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24tdHlwZT0iamF2YS5sYW5nLkNsYXNzIgotICAgICAgICAgICAgICAgICAgbGliPSIuLi8uLi9kaXN0L2xpYi9jb3JlLmF0bCIgLz4KLSAgPC90YXJnZXQ+IAotCi0gIDx0YXJnZXQgbmFtZT0iYW50LWNhbGwtdGVzdCI+Ci0gICAgPCEtLSB0ZXN0IGVsaWRlZCB1bnRpbCB3ZSBkZWNpZGUgc2NvcGUgYW5kIG5lY2Vzc2l0eSBvZiBhbnQtY2FsbCAtLT4KLSAgICA8ZWNobyBtZXNzYWdlPSJBbnRDYWxsIHRlc3QgZWxpZGVkIHVudGlsIHdlIGRlY2lkZSBzY29wZSBhbmQgbmVjZXNzaXR5IG9mIGFudC1jYWxsIi8+Ci08IS0tCi0gICAgPGFudC1jYWxsIHRhcmdldD0iYW50LWNhbGwtdGVzdC10YXJnZXQiPgotICAgICAgPHBhcmFtIG5hbWU9ImJsYWgiIHZhbHVlPSJibGFoLXZhbHVlIiAvPgotICAgIDwvYW50LWNhbGw+Ci0tLT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJhbnQtY2FsbC10ZXN0LXRhcmdldCI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iVGhpcyBzaG91bGQgZmFpbCAuLi4uIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iJHtibGFofSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9Ildob2EgLSBpdCBubyBmYWlsLiBZb3UgdXNlZCBhbnQtY2FsbCB0byBjYWxsIG1lIGFuZCBzZXQgcGFyYW0gYmxhaCEiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkYXRhdHlwZS10ZXN0Ij4KLSAgICA8cHJvcGVydHkgbmFtZT0iZm9vIj4KLSAgICAgIDxwYXR0ZXJuIHZhbHVlPSIqLmphdmEiLz4KLSAgICA8L3Byb3BlcnR5PgotCi0gICAgPHBhdHRlcm4gaWQ9ImZvbzIiIHZhbHVlPSIqLmphdmEiIGlmPSIuLi4iIC8+Ci0KLSAgICA8ZWNobyBtZXNzYWdlPSJmb289JHtmb299IiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImZvbzI9JHtmb28yfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJuYW1lc3BhY2UtdGVzdCI+Ci0KLSAgICA8IS0tIGFudCBhbmQgZG9jIGFyZSBidWlsdCBpbiBuYW1lc3BhY2VzIC0tPgotICAgIDxlY2hvIGFudDpmYWlsLW9uLWVycm9yPSJ0cnVlIiBtZXNzYWdlPSJTb21lIHJhbmRvbSBtZXNzYWdlIj4KLSAgICAgIDxkb2M6ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRlc3QgY2FzZSBmb3IgYXNwZWN0cwotICAgICAgPC9kb2M6ZGVzY3JpcHRpb24+Ci0gICAgICA8YW50OnNvbWUtZWxlbWVudCBzb21lLWF0dHJpYnV0ZT0iYmxhaCIvPgotICAgIDwvZWNobz4KLQotICAgIDwhLS0gbG9hZCBmYWNpbGl0eSBmb3IgYmxlZTogbmFtZXNwYWNlIC0tPgotICAgIDxmYWNpbGl0eSBuYW1lc3BhY2U9ImJsZWUiPgotICAgICAgPG5vb3AvPgotICAgIDwvZmFjaWxpdHk+Ci0KLSAgICA8ZWNobyBibGVlOnNvbWUtcGFyYW09ImJsYWgiIG1lc3NhZ2U9IkJsZWUgbmFtZXNwYWNlIHRlc3Qgc3VjY2Vzc2Z1bCEiLz4KLQotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImFudDEtdGFza2xpYi10ZXN0Ij4KLQotICAgIDxhbnQxLXRhc2tsaWIgcHJlZml4PSJhMS0iIGxpYj0iLi4vLi4vZGlzdC9saWIvYW50MS1jb21wYXQuamFyIi8+Ci0KLSAgICA8YTEtZWNobyBtZXNzYWdlPSJCb28hIiAvPgotICAgIDxhMS1ta2RpciBkaXI9Ii4uLy4uL2Rpc3QvdGVzdCIvPgotICAgIDxhMS1jb3B5IGZpbGU9Ii4uLy4uL3Rvb2xzL2xpYi9hbnQuamFyIiB0b2ZpbGU9Ii4uLy4uL2Rpc3QvdGVzdC9hbnQxLWNvbXBhdC5qYXIiIC8+Ci0KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFrZS90ZW1wbGF0ZS1zaW1wbGUuYXRpIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL21ha2UvdGVtcGxhdGUtc2ltcGxlLmF0aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MjQ2MS4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFrZS90ZW1wbGF0ZS1zaW1wbGUuYXRpCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTw/eHNsLXBhcmFtcyBsb2NhdGlvbj0idGVtcGxhdGUtc2ltcGxlLnByb3BlcnRpZXMiPz4KLTw/eHNsLXBhcmFtIG5hbWU9ImJhciIgdmFsdWU9ImJheiI/PgotPD94c2wtc3R5bGVzaGVldCBocmVmPSJ0ZW1wbGF0ZS1zaW1wbGUueHNsIj8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi0gIDx0YXJnZXQgbmFtZT0ibWFpbiI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InllYXIiIHZhbHVlPSIyMDAwIi8+Ci0KLSAgICA8ZWNobyBtZXNzYWdlPSJCZWZvcmUgdGVtcGxhdGUiLz4KLSAgICA8ZWNoby10ZW1wbGF0ZSBtc2c9IlRlbXBsYXRlIGVjaG8gMSEiIC8+Ci0gICAgPGVjaG8tdGVtcGxhdGUgbXNnPSJUZW1wbGF0ZSBlY2hvIDIhIiAvPgotICAgIDxlY2hvLXRlbXBsYXRlIG1zZz0iVGVtcGxhdGUgZWNobyAzISIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJBZnRlciB0ZW1wbGF0ZSIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYWtlL3RlbXBsYXRlLXNpbXBsZS5wcm9wZXJ0aWVzIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL21ha2UvdGVtcGxhdGUtc2ltcGxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDAxZTguLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21ha2UvdGVtcGxhdGUtc2ltcGxlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgSGVyZSBpcyBzYW1wbGUgcHJvcGVydHkgZmlsZQotZm9vPWJhcgpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21ha2UvdGVtcGxhdGUtc2ltcGxlLnhzbCBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYWtlL3RlbXBsYXRlLXNpbXBsZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMWU4NzkuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21ha2UvdGVtcGxhdGUtc2ltcGxlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZWNoby10ZW1wbGF0ZSI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iVGhpcyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgYSB0ZW1wbGF0ZSB0byBleHBhbmQiIC8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iYSBzaW5nbGUgZWxlbWVudCBpbnRvIGEgbGlzdCBvZiB0YXNrcyB0byBkby4gSW4gdGhpcyIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJleGFtcGxlIGl0IGlzIGxhcmdlbHkgYSBjYXNlIG9mIGVjaG9pbmcgYW4gYXR0cmlidXRlIiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImllLiBtc2c9J3tAbXNnfScgYW5kIGVtYmVkZGRpbmcgYW4gYW50IHZhcmlhYmxlICR7e3llYXJ9fSIgLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21hbmlmZXN0L2FudC1tYW5pZmVzdC5tZiBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9hbnQtbWFuaWZlc3QubWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOWVhOGIuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21hbmlmZXN0L2FudC1tYW5pZmVzdC5tZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1NYWluLUNsYXNzOiBvcmcuYXBhY2hlLm15cm1pZG9uLmxhdW5jaGVyLk1haW4KLUNyZWF0ZWQtQnk6IEFwYWNoZSBBbnQgUHJvamVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9hbnQxLWFudC1kZXNjcmlwdG9yLnhtbCBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9hbnQxLWFudC1kZXNjcmlwdG9yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWUyYy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFuaWZlc3QvYW50MS1hbnQtZGVzY3JpcHRvci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxhbnQtbGliPgotICA8dHlwZXM+Ci0gICAgPHRhc2sgbmFtZT0iYW50MS10YXNrbGliIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24ubGlicy5hbnQxLkFudDFUYXNrbGliIiAvPgotICA8L3R5cGVzPgotPC9hbnQtbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9idWlsdGluLWFudC1kZXNjcmlwdG9yLnhtbCBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9idWlsdGluLWFudC1kZXNjcmlwdG9yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3NGQwMi4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFuaWZlc3QvYnVpbHRpbi1hbnQtZGVzY3JpcHRvci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08YW50LWxpYj4KLQotICA8dHlwZXM+Ci0KLSAgICA8bGlzdGVuZXIgbmFtZT0iZGVmYXVsdCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmxpc3RlbmVycy5EZWZhdWx0UHJvamVjdExpc3RlbmVyIi8+Ci0gICAgPGFzcGVjdCBuYW1lPSJub29wIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24uYXNwZWN0cy5Ob29wQXNwZWN0SGFuZGxlciIvPgotICAgIDxwcm9qZWN0LWJ1aWxkZXIgbmFtZT0iYW50IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5idWlsZGVyLkRlZmF1bHRQcm9qZWN0QnVpbGRlciIvPgotICAgIDxwcm9qZWN0LWJ1aWxkZXIgbmFtZT0iYXRpIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24uY29tcG9uZW50cy5idWlsZGVyLkFUSVByb2plY3RCdWlsZGVyIi8+Ci0KLSAgICA8IS0tIGJhc2ljIHRhc2tzL2RhdGF0eXBlcy9jb3ZlcnRlcnMgcmVxdWlyZWQgaW4gbW9zdCBlbnZpcm9ubWVudHMgLS0+Ci0gICAgPHRhc2sgbmFtZT0icGF0dGVybiIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmZyYW1ld29yay5UeXBlSW5zdGFuY2VUYXNrIiAvPgotICAgIDxkYXRhLXR5cGUgbmFtZT0icGF0dGVybiIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmZyYW1ld29yay5QYXR0ZXJuIiAvPgotCi0gIDwvdHlwZXM+Ci0KLTwvYW50LWxpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFuaWZlc3QvYnVpbHRpbi1hbnQtcm9sZXMueG1sIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL21hbmlmZXN0L2J1aWx0aW4tYW50LXJvbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2YjU0Ny4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFuaWZlc3QvYnVpbHRpbi1hbnQtcm9sZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08cm9sZXM+Ci0gIDxyb2xlIHNob3J0aGFuZD0idGFzayIgICAgICAgICAgICAgbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5hcGkuVGFzayIvPgotICA8cm9sZSBzaG9ydGhhbmQ9ImRhdGEtdHlwZSIgICAgICAgIG5hbWU9Im9yZy5hcGFjaGUubXlybWlkb24uZnJhbWV3b3JrLkRhdGFUeXBlIi8+Ci0gIDxyb2xlIHNob3J0aGFuZD0ibGlzdGVuZXIiICAgICAgICAgbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saXN0ZW5lcnMuUHJvamVjdExpc3RlbmVyIi8+Ci0gIDxyb2xlIHNob3J0aGFuZD0iYXNwZWN0IiAgICAgICAgICAgbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5hc3BlY3RzLkFzcGVjdEhhbmRsZXIiLz4KLSAgPHJvbGUgc2hvcnRoYW5kPSJwcm9qZWN0LWJ1aWxkZXIiICBuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmNvbXBvbmVudHMuYnVpbGRlci5Qcm9qZWN0QnVpbGRlciIvPgotPC9yb2xlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFuaWZlc3QvY29yZS1hbnQtZGVzY3JpcHRvci54bWwgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFuaWZlc3QvY29yZS1hbnQtZGVzY3JpcHRvci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzRlYmUuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21hbmlmZXN0L2NvcmUtYW50LWRlc2NyaXB0b3IueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPGFudC1saWI+Ci0gIAotICA8dHlwZXM+Ci0KLSAgICA8IS0tIGJhc2ljIHRhc2tzL2RhdGF0eXBlcy9jb3ZlcnRlcnMgcmVxdWlyZWQgaW4gbW9zdCBlbnZpcm9ubWVudHMgLS0+Ci0gICAgPHRhc2sgbmFtZT0iZWNobyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuY29yZS5FY2hvIiAvPgotICAgIDx0YXNrIG5hbWU9InByb3BlcnR5IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24ubGlicy5jb3JlLlByb3BlcnR5IiAvPgotCi0gIDwvdHlwZXM+Ci0gIAotICA8Y29udmVydGVycz4KLQotICAgIDxjb252ZXJ0ZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuY29yZS5TdHJpbmdUb0ZpbGVDb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgc291cmNlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLSAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uPSJqYXZhLmlvLkZpbGUiIC8+Ci0gICAgPGNvbnZlcnRlciBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24ubGlicy5jb3JlLlN0cmluZ1RvTG9uZ0NvbnZlcnRlciIgCi0gICAgICAgICAgICAgICBzb3VyY2U9ImphdmEubGFuZy5TdHJpbmciIAotICAgICAgICAgICAgICAgZGVzdGluYXRpb249ImphdmEubGFuZy5Mb25nIiAvPgotICAgIDxjb252ZXJ0ZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuY29yZS5TdHJpbmdUb0ludGVnZXJDb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgc291cmNlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLSAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uPSJqYXZhLmxhbmcuSW50ZWdlciIgLz4KLSAgICA8Y29udmVydGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmUuU3RyaW5nVG9TaG9ydENvbnZlcnRlciIgCi0gICAgICAgICAgICAgICBzb3VyY2U9ImphdmEubGFuZy5TdHJpbmciIAotICAgICAgICAgICAgICAgZGVzdGluYXRpb249ImphdmEubGFuZy5TaG9ydCIgLz4KLSAgICA8Y29udmVydGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmUuU3RyaW5nVG9CeXRlQ29udmVydGVyIiAKLSAgICAgICAgICAgICAgIHNvdXJjZT0iamF2YS5sYW5nLlN0cmluZyIgCi0gICAgICAgICAgICAgICBkZXN0aW5hdGlvbj0iamF2YS5sYW5nLkJ5dGUiIC8+Ci0gICAgPGNvbnZlcnRlciBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24ubGlicy5jb3JlLlN0cmluZ1RvRG91YmxlQ29udmVydGVyIiAKLSAgICAgICAgICAgICAgIHNvdXJjZT0iamF2YS5sYW5nLlN0cmluZyIgCi0gICAgICAgICAgICAgICBkZXN0aW5hdGlvbj0iamF2YS5sYW5nLkRvdWJsZSIgLz4KLSAgICA8Y29udmVydGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmUuU3RyaW5nVG9GbG9hdENvbnZlcnRlciIgCi0gICAgICAgICAgICAgICBzb3VyY2U9ImphdmEubGFuZy5TdHJpbmciIAotICAgICAgICAgICAgICAgZGVzdGluYXRpb249ImphdmEubGFuZy5GbG9hdCIgLz4KLSAgICA8Y29udmVydGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmUuU3RyaW5nVG9DbGFzc0NvbnZlcnRlciIgCi0gICAgICAgICAgICAgICBzb3VyY2U9ImphdmEubGFuZy5TdHJpbmciIAotICAgICAgICAgICAgICAgZGVzdGluYXRpb249ImphdmEubGFuZy5DbGFzcyIgLz4KLSAgICA8Y29udmVydGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLmNvcmUuU3RyaW5nVG9VUkxDb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgc291cmNlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLSAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uPSJqYXZhLm5ldC5VUkwiIC8+Ci0KLSAgPC9jb252ZXJ0ZXJzPgotCi08L2FudC1saWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21hbmlmZXN0L215cm1pZG9uLW1hbmlmZXN0Lm1mIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL21hbmlmZXN0L215cm1pZG9uLW1hbmlmZXN0Lm1mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmE1ZmJmLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9teXJtaWRvbi1tYW5pZmVzdC5tZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1NYWluLUNsYXNzOiBvcmcuYXBhY2hlLm15cm1pZG9uLmZyb250ZW5kcy5DTElNYWluCi1DcmVhdGVkLUJ5OiBBcGFjaGUgQW50IFByb2plY3QKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9ydW50aW1lLWFudC1kZXNjcmlwdG9yLnhtbCBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9ydW50aW1lLWFudC1kZXNjcmlwdG9yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5ZjVkNC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvbWFuaWZlc3QvcnVudGltZS1hbnQtZGVzY3JpcHRvci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08YW50LWxpYj4KLSAgCi0gIDx0eXBlcz4KLSAgICA8IS0tIGNvcmUgdGFza3MgZm9yIG9wZXJhdGlvbiAtLT4KLSAgICA8dGFzayBuYW1lPSJmYWNpbGl0eSIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMucnVudGltZS5GYWNpbGl0eSIgLz4KLSAgICA8dGFzayBuYW1lPSJ0eXBlZGVmIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24ubGlicy5ydW50aW1lLlR5cGVEZWYiIC8+Ci0gICAgPHRhc2sgbmFtZT0iY29udmVydGVyZGVmIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24ubGlicy5ydW50aW1lLkNvbnZlcnRlckRlZiIgLz4KLSAgICA8dGFzayBuYW1lPSJpbXBvcnQiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLnJ1bnRpbWUuSW1wb3J0IiAvPgotICAgIDwhLS08dGFzayBuYW1lPSJhbnQtY2FsbCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMucnVudGltZS5BbnRDYWxsIiAvPi0tPgotICA8L3R5cGVzPgotCi08L2FudC1saWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21hbmlmZXN0L3NlbGZ0ZXN0LWFudC1kZXNjcmlwdG9yLnhtbCBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9tYW5pZmVzdC9zZWxmdGVzdC1hbnQtZGVzY3JpcHRvci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Y2U4NTQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL21hbmlmZXN0L3NlbGZ0ZXN0LWFudC1kZXNjcmlwdG9yLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxhbnQtbGliPiAKLSAgPHR5cGVzPgotICAgIDwhLS0gdGFza3MgdG8gdGVzdCBvcGVyYXRpb24gb2YgZW5naW5lIC0tPgotICAgIDx0YXNrIG5hbWU9InByaW0tdGVzdCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuc2VsZnRlc3QuUHJpbWl0aXZlVHlwZXNUZXN0IiAvPgotICAgIDx0YXNrIG5hbWU9InN1Yi1lbGVtZW50cy10ZXN0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24ubGlicy5zZWxmdGVzdC5TdWJFbGVtZW50VGVzdCIgLz4KLSAgICA8dGFzayBuYW1lPSJjb25mLXRlc3QiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5teXJtaWRvbi5saWJzLnNlbGZ0ZXN0LkNvbmZpZ3VyYXRpb25UZXN0IiAvPgotICAgIDx0YXNrIG5hbWU9ImNvbnRlbnQtdGVzdCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm15cm1pZG9uLmxpYnMuc2VsZnRlc3QuQ29udGVudFRlc3QiIC8+Ci0gICAgPHRhc2sgbmFtZT0iZmlsZS1tYW5pcC10ZXN0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUubXlybWlkb24ubGlicy5zZWxmdGVzdC5GaWxlTWFuaXB1bGF0aW9uVGVzdCIgLz4KLSAgPC90eXBlcz4KLTwvYW50LWxpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvc2NyaXB0L2FudCBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9zY3JpcHQvYW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODcwOTcyLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9zY3JpcHQvYW50CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyEvYmluL3NoCi0KLWlmIFsgLWYgJEhPTUUvLmFudHJjIF0gOyB0aGVuIAotICAuICRIT01FLy5hbnRyYwotZmkKLQotIyBDeWd3aW4gc3VwcG9ydC4KLWlmIFsgIiRPU1RZUEUiID09ICJjeWd3aW4zMiIgXSB8fCBbICIkT1NUWVBFIiA9ICJjeWd3aW4iIF07IHRoZW4KLSAgaWYgWyAhICIkSkFWQV9IT01FIiA9ICIiIF07IHRoZW4KLSAgICBKQVZBX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAkSkFWQV9IT01FYAotICBmaQotZmkKLQotIyMgcmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIGxpbmsgdG8gYW50J3MgaG9tZQotUFJHPSQwCi1wcm9nbmFtZT1gYmFzZW5hbWUgJDBgCi0gIAotd2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCi0gIGxzPWBscyAtbGQgIiRQUkciYAotICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCi0gIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KLSAgICBQUkc9IiRsaW5rIgotICBlbHNlCi0gICAgUFJHPSJgZGlybmFtZSAkUFJHYC8kbGluayIKLSAgZmkKLWRvbmUKLSAgCi1BTlRfSE9NRT1gZGlybmFtZSAiJFBSRyJgLy4uCi0KLWlmIFsgIiRKQVZBX0hPTUUiID09ICIiIF0gOyB0aGVuCi0KLSAgZWNobyAiV2FybmluZzogSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuIgotICBlY2hvICIgIElmIGJ1aWxkIGZhaWxzIGJlY2F1c2Ugc3VuLiogY2xhc3NlcyBjb3VsZCBub3QgYmUgZm91bmQiCi0gIGVjaG8gIiAgeW91IHdpbGwgbmVlZCB0byBzZXQgdGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgZWNobyAiICB0byB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBqYXZhLiIKLSAgaWYgWyAiJEpBVkFDTUQiID0gIiIgXSA7IHRoZW4gCi0gICAgSkFWQUNNRD1qYXZhCi0gIGZpCi1lbHNlCi0gIGlmIFsgIiRKQVZBQ01EIiA9ICIiIF0gOyB0aGVuIAotICAgIEpBVkFDTUQ9JEpBVkFfSE9NRS9iaW4vamF2YQotICBmaQotZmkKLQotJEpBVkFDTUQgJEFOVF9PUFRTIC1qYXIgJEFOVF9IT01FL2xpYi9hbnQuamFyICRACmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMvc2NyaXB0L2FudC5iYXQgYi9wcm9wb3NhbC9teXJtaWRvbi9zcmMvc2NyaXB0L2FudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjY5YmQuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL3NjcmlwdC9hbnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLWlmIGV4aXN0ICIlSE9NRSVcYW50cmNfcHJlLmJhdCIgY2FsbCAiJUhPTUUlXGFudHJjX3ByZS5iYXQiCi0KLWlmIG5vdCAiJU9TJSI9PSJXaW5kb3dzX05UIiBnb3RvIHN0YXJ0Ci0KLXJlbSAlfmRwMCBpcyBuYW1lIG9mIGN1cnJlbnQgc2NyaXB0IHVuZGVyIE5UCi1zZXQgREVGQVVMVF9BTlRfSE9NRT0lfmRwMAotCi1yZW0gOiBvcGVyYXRvciB3b3JrcyBzaW1pbGFyIHRvIG1ha2UgOiBvcGVyYXRvcgotc2V0IERFRkFVTFRfQU5UX0hPTUU9JURFRkFVTFRfQU5UX0hPTUU6XGJpblw9JQotCi1pZiAiJUFOVF9IT01FJSI9PSIiIHNldCBBTlRfSE9NRT0lREVGQVVMVF9BTlRfSE9NRSUKLXNldCBERUZBVUxUX0FOVF9IT01FPQotCi06c3RhcnQKLQotaWYgbm90ICIlQU5UX0hPTUUlIiA9PSAiIiBnb3RvIGFudF9ob21lX2ZvdW5kCi0KLWVjaG8uCi1lY2hvIFdhcm5pbmc6IEFOVF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuCi1lY2hvICAgVGhpcyBuZWVkcyB0byBiZSBzZXQgZm9yIFdpbjl4IGFzIGl0J3MgY29tbWFuZCBwcm9tcHQgCi1lY2hvICAgc2NyaXB0aW5nIGJpdGVzCi1lY2hvLgotZ290byBlbmQKLQotOmFudF9ob21lX2ZvdW5kCi0KLWlmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gamF2YUNtZFNldHVwCi0KLWVjaG8uCi1lY2hvIFdhcm5pbmc6IEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LgotZWNobyAgIElmIGJ1aWxkIGZhaWxzIGJlY2F1c2Ugc3VuLiogY2xhc3NlcyBjb3VsZCBub3QgYmUgZm91bmQKLWVjaG8gICB5b3Ugd2lsbCBuZWVkIHRvIHNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlCi1lY2hvICAgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgamF2YS4KLWVjaG8uCi0KLXJlbSBob3BlIHRoYXQgdGhlcmUgaXMgamF2YSBjb21tYW5kIGluIHBhdGgKLWlmICIlSkFWQUNNRCUiID09ICIiIHNldCBKQVZBQ01EPWphdmEKLWdvdG8gYXJnU2V0dXAKLQotcmVtIGlmIEpBVkFfSE9NRSBpcyBzZXQgdGhlbiBtYWtlIHN1cmUgd2UgdXNlIHRoYXQgamF2YSBleGUKLTpqYXZhQ21kU2V0dXAKLWlmICIlSkFWQUNNRCUiID09ICIiIHNldCBKQVZBQ01EPSVKQVZBX0hPTUUlXGJpblxqYXZhCi0KLTphcmdTZXR1cAotCi1zZXQgQU5UX0NNRF9MSU5FX0FSR1M9Ci0KLXJlbSBTbHVycCBhbGwgYXJncy4uLgotOnNldHVwQXJncwotaWYgIiUwIiA9PSAiIiBnb3RvIGRvbmVBcmdzCi1zZXQgQU5UX0NNRF9MSU5FX0FSR1M9JUFOVF9DTURfTElORV9BUkdTJSAlMQotc2hpZnQKLWdvdG8gc2V0dXBBcmdzCi0KLTpkb25lQXJncwotcmVtIE1tbW1tbSB0YXN0eSAtIGZpbmlzaGVkIHNsdXJwaW5nIGFyZ3MKLQotJUpBVkFDTUQlICVBTlRfT1BUUyUgLWphciAlQU5UX0hPTUUlXGxpYlxhbnQuamFyICVBTlRfQ01EX0xJTkVfQVJHUyUKLQotOmVuZAotaWYgZXhpc3QgIiVIT01FJVxhbnRyY19wb3N0LmJhdCIgY2FsbCAiJUhPTUUlXGFudHJjX3Bvc3QuYmF0Igotc2V0IEFOVF9DTURfTElORV9BUkdTPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9zY3JpcHQvYW50UnVuIGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL3NjcmlwdC9hbnRSdW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTE4ZjEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL3NjcmlwdC9hbnRSdW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBBcmdzOiBESVIgY29tbWFuZAotY2QgIiQxIgotQ01EPSIkMiIKLXNoaWZ0Ci1zaGlmdAotCi1leGVjICRDTUQgIiRAIgpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vc3JjL3NjcmlwdC9hbnRSdW4uYmF0IGIvcHJvcG9zYWwvbXlybWlkb24vc3JjL3NjcmlwdC9hbnRSdW4uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBkMWNlLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy9zY3JpcHQvYW50UnVuLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLUBlY2hvIG9mZgotCi1jZCAlMQotc2V0IEFOVF9SVU5fQ01EPSUyCi1zaGlmdAotc2hpZnQKLQotc2V0IFBBUkFNUz0KLTpsb29wCi1pZiAiJTEiID09ICIiIGdvdG8gcnVuQ29tbWFuZAotc2V0IFBBUkFNUz0lUEFSQU1TJSAlMQotc2hpZnQKLWdvdG8gbG9vcAotCi06cnVuQ29tbWFuZAotZWNobyAlQU5UX1JVTl9DTUQlICVQQVJBTVMlCi0lQU5UX1JVTl9DTUQlICVQQVJBTVMlCi0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3NyYy94ZG9jcy9kZXNpZ24uaHRtbCBiL3Byb3Bvc2FsL215cm1pZG9uL3NyYy94ZG9jcy9kZXNpZ24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzY2VlMC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi9zcmMveGRvY3MvZGVzaWduLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotCi08aHRtbD4KLTxoZWFkPgotICAgIDx0aXRsZT5NeXJtaWRvbjogVGhlIEFudDIuMCBQcm9wb3NhbDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBCR0NPTE9SPSIjZmZmZmZmIj4KLQotPGNlbnRlcj4KLSAgPGgxPk15cm1pZG9uOiBUaGUgQW50Mi4wIFByb3Bvc2FsPC9oMT4KLSAgPGk+YnkgUGV0ZXIgRG9uYWxkIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPiZsdDtkb25hbGRwQGFwYWNoZS5vcmcmZ3Q7PC9hPjwvaT4KLTwvY2VudGVyPgotCi08YnIgLz4KLQotPGRpdiBhbGlnbj0iY2VudGVyIj4KLSAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjYwJSI+Ci0gICAgPHRyPgotICAgICAgPHRkIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgPGk+TXlybWlkb24gaXMgYSBwcm9wb3NhbCBmb3IgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQiPkFudDwvYT4gMi4wLCBhIAotICAgICAgICBqYXZhIGJhc2VkIGJ1aWxkIHRvb2wuIFVubGlrZSBvdGhlciBwcm9wb3NhbHMgaXQgd2FzIHNwZWNpZmljYWxseSBkZXNpZ25lZCBhcyAKLSAgICAgICAgYm90aCBhIHRvb2wgYSBhbiBBUEkgbGlicmFyeSB0aGF0IGNhbiBiZSByZXVzZWQgaW4gb3RoZXIgZG9tYWlucy48L2k+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLQotPGJyIC8+Ci0KLTxoMz5UbyBkbyBhbmQgd2hhdCBub3QgdG8gZG88L2gzPgotCi08YmxvY2txdW90ZT4KLSAgPHA+Ci0gICAgVGhlcmUgaXMgYSBudW1iZXIgb2YgaXNzdWVzIHRoYXQgdGhpcyBwcm9wb3NhbCBhZGRyZXNzZXMgYW5kIGEgbnVtYmVyIG9mIGlzc3VlcyB0aGF0IAotICAgIGhhdmUgYmVlbiBkZWxpYmVyYXRlbHkgZWxpZGVkLiBUaGUgZm9jdXMgaXMgY3VycmVudGx5IGF0IHRoZSBsb3dlciBsZXZlbHMgLSBuYW1lbHkKLSAgICB0aGUgdGFzayBleGVjdXRpb24gZW5naW5lLCB0aGUgbm90aW9uIG9mIGNvbnRleHRzL3Njb3BlcywgbG9hZGluZyBvZiB0YXNrbGV0cywgCi0gICAgZGF0YXR5cGVzIGFuZCBjb252ZXJ0ZXJzIGV0Yy4gV2hpbGUgaXQgZG9lcyBpbXBsZW1lbnQgYSBQcm9qZWN0IGVuZ2luZSBBUEkgaXMgc3RpbGwgCi0gICAgYmVpbmcgZGlzY3Vzc2VkIG9uIGFudC1kZXYgYW5kIHRoaXMgcHJvcG9zYWwganVzdCBhZG9wdHMgQW50MS54J3MgbW9kZWwgdW50aWwgYSBiZXR0ZXIKLSAgICB1bmRlcnN0YW5kaW5nIGlzIGdhaW5lZCBvZiB3aGF0IGlzIHJlcXVpcmVkLgotICA8L3A+Ci0KLSAgPHA+Ci0gICAgTmVpdGhlciB0aGlzIGRvY3VtZW50IG5vciB0aGUgcHJvcG9zYWwgaXMgaW50ZW5kZWQgdG8gYmUgYSB2aXNpb24gc3RhdGVtZW50LiBSYXRoZXIgaXQgCi0gICAgaXMgYSBkZXNjcmlwdGlvbiBvZiBob3cgaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgYmFzZWQgb24gY29tbW9ubHkgYWNjZXB0ZWQgbmVlZHMgCi0gICAgcmVxdWVzdGVkIG9uIGFudCBsaXN0cyBhbmQgZGlzY3Vzc2VkIGJ5IGFudC1kZXYuIFRoZSB2aXNpb24gc3RhdGVtZW50IGlzIG1vcmUgCi0gICAgc3Ryb25nbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBQcm9qZWN0IEFQSSBhbmQgZXh0ZW50aW9ucyAoQ0pBTiwgaW1wb3J0IHByb2plY3QgdHJlZXMsCi0gICAgcHJlcHJvY2Vzc2luZyB2aWEgeHNsdC9jc3Mvd2hhdGV2ZXIsIHRlbXBsYXRpbmcgZXRjKS4gQW5kIHRodXMgaXMgbm90IGFkZHJlc3NlZCBoZXJlLgotICA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoMz5UaGUgUHJpbWUgRGlyZWN0aXZlOiBFeGVjdXRlIHRhc2tzPC9oMz4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPgotICAgIE9uZSBvZiB0aGUgcHJpbWFyeSBjb25jZXJucyBvZiBhbnQgaXMgcHJvdmlkaW5nIGEgdGFzayBleGVjdXRpb24gZW52aXJvbm1lbnQgKFRFRSkuIAotICAgIFRoZSBURUUgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc2VydmljZXMgdG8gdGFza3MuIFRoZSBURUUgbWFuYWdlcyB0aGUgbGlmZWN5Y2xlIG9mIAotICAgIHRoZSB0YXNrcy4gVGhpcyBpbmNsdWRlcyBwcm92aWRpbmcgdGhlIHRhc2tzIHdpdGggYSBsb2dnZXIgaW5zdGFuY2UsIGNvbnRleHQgCi0gICAgaW5mb3JtYXRpb24gYW5kIGFjY2VzcyB0byBwZWVyIGNvbXBvbmVudHMuIFRoZSBsaWZlY3ljbGUgYWxzbyBpbnZvbHZlcyBleGVjdXRpbmcgCi0gICAgaW5pdCgpLCBydW4oKSBhbmQgZGlzcG9zZSgpIG1ldGhvZHMgYXQgYXBwcm9wcmlhdGUgdGltZXMuCi0gIDwvcD4KLQotICA8cD4KLSAgICBJbnN0ZWFkIG9mIHJlaW52ZW50aW5nIHRoZSB3aGVlbCB0aGlzIHByb3Bvc2FsIGluc3RlYWQgcmV1c2VzIHRoZSBBdmFsb24gZnJhbWV3b3JrCi0gICAgdGhhdCBhbHJlYWR5IHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIG1hbnkgb2YgdGhlIGNvbmNlcHRzIHJlcXVpcmVkLiBJdCBhbHJlYWR5IGhhcyAKLSAgICBpbnRlcmZhY2VzL2NsYXNzZXMgdG8gbW9kZWwgY29uY2VwdHMgb2YgY29udGV4dCwgbG9nZ2VyLCBjb250YWluZXJzIGV0Yy4KLSAgPC9wPgotICAKLSAgPHA+Ci0gICAgT25lIG9mIHRoZSByZXF1aXJlbWVudHMgaWRlbnRpZmllZCB3YXMgdGhlIG5lZWQgZm9yIGR5bmFtaWMgaW50ZXJwcmV0YXRpb24gYW5kIAotICAgIGluc3RhbnRpYXRpb24gb2YgdGFza3MuIFRvIGltcGxlbWVudCB0aGlzIHRoZXJlIG5lZWRzIHRvIGJlIGFuIGFic3RyYWN0aW9uIGxheWVyIAotICAgIGJldHdlZW4gdGFzayBvYmplY3QgaW5zdGFuY2VzIGFuZCB0aGUgb2JqZWN0cyB0aGF0IGFyZSBtYW5pcHVsYXRlZCBieSBwcm9qZWN0cyAKLSAgICBhbmQgdG9vbHMgb3V0c2lkZSB0YXNrbGV0IEFQSS4gVGhpcyBhYnN0cmFjdGlvbiBoYXMgdGhlIHNhbWUgcmVxdWlyZW1lbnRzIGFzIAotICAgIENvbmZpZ3VyYXRpb24gb2JqZWN0cyBpbiBBdmFsb24gYW5kIHRodXMgdGhlIHRhc2sgcHJveGllcyBhcmUgcmVwcmVzZW50ZWQgYnkgCi0gICAgQXZhbG9ucyBDb25maWd1cmF0aW9uIG9iamVjdC4KLSAgPC9wPgotPC9ibG9ja3F1b3RlPgotCi08aDM+U09DLCBJT0MgYW5kIHRoZSBhbHBoYWJldCBzb3VwPC9oMz4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPgotICAgIFRoZSBkZXNpZ24gb2YgTXlybWlkb24gZm9sbG93cyBtYW55IG9mIHRoZSBkZXNpZ24gcGF0dGVybnMgZm91bmQgaW4gQXZhbG9uLiBUaGUgc3Ryb25nZXN0Ci0gICAgaW5mbHVlbmNlIGNuYSBiZSBzZWVuIGZyb20gdGhlIG1ldGEtcGF0dGVybnM7IFNlcGFyYXRpb24gb2YgQ29uY2VybnMgKFNPQykgYW5kIEludmVyc2lvbiBvZiAKLSAgICBDb250cm9sIChJT0MpLiAKLSAgPC9wPgotCi0gIDxwPgotICAgIFNPQyBlc3NlbnRpYWxseSBpcyBhIGRlc2lnbiBwYXR0ZXJuIHVzZWQgdG8gc2VwYXJhdGUgdGhlIHN5c3RlbSBhY2Nyb2RpbmcgdG8gcmVsZXZlbnQKLSAgICBkaW1lbnNpb25zLiAoU09DIGlzIG9mdGVuIGNhbGxlZCBtdWx0aS1kaW1lbnNpb25hbCBTT0MpLiBUaGUgZGVmaW5pdGlvbiBvZiAicmVsZXZlbnQiCi0gICAgaXMgZG9tYWluIHNwZWNpZmljIGFuZCBpbiBvdXIgY2FzZSB0aGVyZSBpcyBhIG51bWJlciBvZiBkaW1lbnNpb25zLiBGb3IgaW5zdGFuY2UgeW91IAotICAgIHdpbGwgbm90aWNlIHRoYXQgdGhlcmUgaXMgYSBzZXBhcmF0aW9uIGJldHdlZW4gcHJvamVjdCwgdGFza2xldCwgY29udmVyc2lvbiBhbmQgZGF0YXR5cGUgCi0gICAgZnVuY3Rpb25hbGl0eS4gV2hlcmUgaW4gQW50MS54IHRoZXNlIHdlcmUgb25seSBwYXJ0aWFsbHkgc2VwYXJhdGVkIG9yIHRpZ2h0bHkgY291cGxlZCAKLSAgICB0aGVyZSBpcyBub3cgZGVjb3VwbGluZy4gVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBlYXN5IHJldXNlIG9mIHBhcnRzIGluIG90aGVyIHByb2plY3RzLiBpZSAKLSAgICBJdCBpcyBub3cgZXh0cmVtZWx5IGVhc3kgdG8gcmV1c2UgdGhlIHRhc2tsZXQgYXBpIGluIG90aGVyIHRvb2xzIChzdWNoIGFzIEluc3RhbGxzaGllbGQgCi0gICAgdHlwZSBhcHBzIG9yIENyb24tbGlrZSBkZWFtb25zIGV0YykuCi0gIDwvcD4KLQotICA8cD4KLSAgICBBbm90aGVyIGRpbWVuc2lvbiBpbiB3aGljaCBteXJtaWRvbiBpcyBzZXBhcmF0ZWQgaXMgYnkgdXNlcnMuIEZvciBpbnN0YW5jZSB0aGVyZSBpcyAKLSAgICBhIHNlcGFyYXRpb24gYmV0d2VlbiBlbmdpbmUgY29kZSBhbmQgY2xpZW50IGNvZGUuIFRoZSBjbGllbnQgY29kZSBpcyB0aGUgY29kZSB1c2VkIGJ5IAotICAgIHRob3NlIHdobyBpbXBsZW1lbnQgdGhlIGNvbXBvbmVudHMuIEZvciBpbnN0YW5jZSB0YXNrbGV0IGRldmVsb3BlcnMgb25seSBoYXZlIHRvIAotICAgIGxvb2sgYXQgY2xpZW50IGNvZGUgZm9yIHRhc2tsZXRzIGFuZCBuZXZlciBsb29rIGF0IGltcGxlbWVudGF0aW9uIG9mIGVuZ2luZS4KLSAgPC9wPgotCi0gIDxwPgotICAgIEludmVyc2lvbiBvZiBDb250cm9sIChJT0MpIGFrYSB0aGUgSG9seXdvb2QgUHJpbmNpcGxlIChEb24ndCBjYWxsIHVzIC0gd2UnbGwgY2FsbCB5b3UpIGlzCi0gICAgYW5vdGhlciBwYXR0ZXJuIGFwcGxpZWQgd2l0aGluIE15cm1pZG9uLiBJbiB0aGlzIHBhdHRlcm4gaXQgaXMgdGhlIGNvbnRhaW5lciB0aGF0IHByb3ZpZGVzCi0gICAgZmFjaWxpdGllcyBhbmQgZXhlY3V0ZXMgbGlmZWN5Y2xlIGJ5IGNhbGxpbmcgbWV0aG9kcyBvZiBjaGlsZCBjb21wb25lbnRzLiBTbyBpbnN0ZWFkIG9mIHRoZSAKLSAgICBjb21wb25lbnQgY2FsbGluZyBtZXRob2RzIHRvIGxvb2t1cCBvciBjcmVhdGUgcGVlciBjb21wb25lbnRzIG9yIG1ldGhvZCBtYW5hZ2luZyBpdCdzIAotICAgIG93biBsaWZlY3ljbGUgdGhlIGNvbnRhaW5lciBpcyByZXNwb25zaWJsZSBmb3IgdGhlc2UgZnVuY3Rpb25zLiAKLSAgPC9wPgotCi0gIDxwPgotICAgIFRoZXNlIGFwcHJvYWNoIHNob3VsZCBiZSBmYW1pbGlhciB0byBhIHNlcnZsZXQgb3IgRUpCIGRldmVsb3BlciBhcyB0aGV5IGFyZSBhbHNvIGJhc2VkIG9uIAotICAgIFNPQyBhbmQgSU9DIGV4Y2VwdCB0aGV5IGRvIGl0IGF0IGEgbG93ZXIgcmVzb2x1dGlvbi4gRm9yIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgCi0gICAgdGhlc2UgZGVzaWduIGFwcHJvYWNoZXMgaGF2ZSBhIGxvb2sgYXQgPGEgCi0gICAgaHJlZj0iaHR0cDovL2phdmEuYXBhY2hlLm9yZy9mcmFtZXdvcmsvZGV2ZWxvcGVyL2luZGV4Lmh0bWwiPgotICAgIGh0dHA6Ly9qYXZhLmFwYWNoZS5vcmcvZnJhbWV3b3JrL2RldmVsb3Blci9pbmRleC5odG1sPC9hPi4KLSAgPC9wPgotCi0gIDxwPgotICAgIFRoZSByZXN1bHQgb2YgdGhlc2UgZGVzaWduIGNob2ljZXMgaXMgYSBtb3JlIGZsZXhhYmxlIGFuZCByZXVzYWJsZSBjb21wb25lbnRzLgotICA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoMz5Fbm91Z2ggdGhlb3J5IC0gZ2l2ZSBtZSBOdXRzIGFuZCBCb2x0czwvaDM+Ci0KLTxibG9ja3F1b3RlPgotICA8cD4KLSAgICBUaGUgY29kZSBpcyBzZXBhcmF0ZWQgaW50byA1IGRpZmZlcmVudCBzZWN0aW9ucy4gVGhlc2UgYXJlIHRoZSBwcm9qZWN0LCB0YXN0bGV0LAotICAgIGNvbnZlcnRlciwgZGF0YXR5cGUgYW5kIGZyb250ZW5kIEFQSXMuIFRoZSBwcm9qZWN0IEFQSSBpcyBjb25jZXJuZWQgd2l0aCBidWlsZGluZyAKLSAgICBhbmQgcmVwcmVzZW50aW5nIGEgcHJvamVjdC4gVGhlIHRhc2tsZXQgQVBJIGlzIGNvbmNlcm5lZCB3aXRoIGV4ZWN1dGluZyB0YXNrcyBpbiBhIAotICAgIHBhcnRpY3VsYXIgZW52aXJvbm1lbnQuIFRoZSBjb252ZXJ0ZXIgQVBJIGlzIGNvbmNlcm5lZCB3aXRoIGNvbnZlcnRpbmcgaW5zdGFuY2VzIG9mIG9uZQotICAgIHR5cGUgaW50byBhbm90aGVyIHR5cGUuIFRoZSBkYXRhdHlwZSBBUEkgaXMgdXNlZCB0byByZWdpc3RlciwgbG9hZCBhbmQgaW5zdGFudGlhdGUgCi0gICAgaW5zdGFuY2VzIG9mIG5hbWVkIGRhdGF0eXBlcy4gVGhlIGZyb250ZW5kIEFQSSBpbnZvbHZlcyBpbnN0YW50aWF0aW5nIGFuZCBtYW5hZ2luZyAKLSAgICBhbGwgdGhlIG90aGVyIGNvbXBvbmVudHMgYW5kIG1ha2luZyBpdCBlYXN5IHRvIGJ1aWxkIGRpZmZlcmVudCBmcm9udGVuZHMgKENMSSwgR1VJLCAKLSAgICBTZXJ2bGV0KS4KLSAgPC9wPgotCi0gIDxwPgotICAgIFdoZW4gTXlybWlkb24gaXMgc3RhcnRlZCBpdCBpbnRlcmFjdHMgd2l0aCBGcm9udEVuZCBBUEkuIEl0IGFxdWlyZXMgYSBQcm9qZWN0QnVpbGRlciAKLSAgICBpbnN0YW5jZSBmcm9tIEZyb250RW5kIEFQSSBhbmQgdXNlcyBpdCB0byBidWlsZCBhIHByb2plY3QuIEl0IHRoZW4gYXF1aXJlcyBhIAotICAgIFByb2plY3RFbmdpbmUgaW5zdGFuY2UgZnJvbSBGcm9udEVuZCBhZ2FpbiBhbmQgdXNlcyBpdCB0byBleGVjdXRlIHRoZSBjcmVhdGVkIHByb2plY3QuCi0gICAgVGhpcyBwcm9qZWN0IHdpbGwgZmlyc3QgZXhlY3V0ZSB0aGUgaW1wbGljaXQgdGFyZ2V0ICh3aGljaCBpbmNsdWRlcyBhbGwgb2YgcHJvcGVydGllcyAKLSAgICBvdXRzaWRlIHRhcmdldCBlbGVtZW50KS4gQW5kIHRoZW4gZXhlY3V0ZSB0aGUgZGVmYXVsdCBvciBzcGVjaWZpZWQgdGFyZ2V0LiBFYWNoIHRhcmdldCAKLSAgICBleGVjdXRlcyBpdCdzIGRlcGVuZGVuY2llcyBmaXJzdCBhbmQgdGhlbiBjaGVja3MgaXQncyBjb25kaXRpb24gdG8gc2VlIGlmIGl0IHNob3VsZCAKLSAgICBleGVjdXRlIGl0c2VsZi4gRWFjaCB0YXJnZXQgY29udGFpbnMgYSBsaXN0IG9mIHRhc2tzIChpbiB0aGUgZm9ybSBvZiBDb25maWd1cmFpdG9uIAotICAgIG9iamVjdHMpLiBUaGVzZSBhcmUgcGFzc2VkIHRvIHRoZSB0YXNrbGV0IEFQSSB0aGF0IGluc3RhbnRpYXRlcyBhbmQgZXhlY3V0ZXMgdGhlIHRhc2tzLiAKLSAgICBUaGUgdGFza2xldCBBUEkgaW5zdGFudGlhdGVzIHRoZSByZWxldmVudCB0YXNrIGFuZCB0aGVuIGFwcGxpZXMgcnVsZXMgdG8gdXNlIHRoZSAKLSAgICBDb25maWd1cmF0aW9uIG9iamVjdCB0byBjb25maWd1cmUgdGhlIHRhc2suIEluIHNvbWUgY2FzZXMgdGhpcyBpbnZvbHZlcyByZXNvbHZpbmcgCi0gICAgcHJvcGVydGllcyBhbmQgY29udmVydGluZyB2YWx1ZXMgdG8gdGhlIGNvcnJlY3QgdHlwZSByZXF1aXJlZCBieSB0YXNrLiBUaGUgY29udmVydGlvbgotICAgIGlzIGRvbmUgYnkgQ29udmVydGVyIEFQSS4gUHJvcGVydGllcyBhcmUgYXNzb2NpYXRpb25zIGJldHdlZW4gYSBuYW1lIGFuZCBhIHZhbHVlLCB0aGUgCi0gICAgdHlwZXMgb2YgdGhlIHZhbHVlIGFyZW1hbmFnZWQgYnkgdGhlIERhdGFUeXBlIEFQSSBhbmQgYWNjZXNzZWQgdmlhIHRoZSBQcm9wZXJ0eSB0YXNrLgotICA8L3A+Ci0KLSAgPHA+Ci0gICAgTm93IGlmIHlvdSB3YW50ZWQgdG8gY2hhbmdlIGEgY2VydGFpbiBjb21wb25lbnQgb2YgdGhlIHN5c3RlbSAtIGxldHMgc2F5IHRoZSBQcm9qZWN0QnVpbGRlcgotICAgIGNvbXBvbmVudC4gWW91IGluc3RlYWQgd2FudCB0byB1c2UgYSBjb21wb25lbnQgdGhhdCB5b3Ugd3JvdGUgeW91cnNlbGYgdGhhdCBidWlsZHMgYSBwcm9qZWN0Ci0gICAgd2l0aCB0aGUgcmVzdWx0IG9mIGEgeHNsdCArIHhtbCAtPiB4bWwgcHJvY2VzcyBzbyB0aGF0IHlvdSBjYW4gdXNlIHN0YXRpYyB0ZW1wbGF0aW5nLiBUaGUgCi0gICAgd2F5IHRvIGRvIHRoaXMgd291bGQgYmUgdG8gc2V0IHRoZSBwcm9wZXJ0eSAiYW50LmNvbXAuYnVpbGRlciIgdG8gCi0gICAgImNvbS5iaXouYW50Lk15WFNMVFByb2plY3RCdWlsZGVyIiBiZWZvcmUgaGFuZGluZyB0aGUgcHJvcGVydGllcyB0byB0aGUgRnJvbnRFbmQgQVBJLiBUaGUgCi0gICAgRnJvbnRFbmQgQVBJIHdvdWxkIHRoZW4gd2lyZSB0b2dldGhlciB0aGUgY29tcG9uZW50cyBhcHByb3ByaWF0ZWx5IGFuZCB0aGUgc2FtZSBwcm9jZXNzIGFzIAotICAgIGRvY3VtZW50ZWQgYWJvdmUgd291bGQgYmUgdXNlZC4gT3RoZXIgY29tcG9uZW50cyBjYW4gYmUgcmVwbGFjZWQgaW4gYSBzaW1pbGFyIG1hbm5lci4gRm9yIAotICAgIGEgZnVsbCBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IHNlZSB0aGUgZGVmYXVsdCBGcm9udEVuZCBpbXBsZW1lbnRhdGlvbi4KLSAgPC9wPgotCi0gIDxwPgotICAgIE5vdyBpbnN0ZWFkIG9mIHJlcGxhY2luZyBhIGNvbXBvbmVudCBpbiB0aGUgc3lzdGVtIHNheSB5b3Ugd2FudGVkIHRvIGFkZCBhbiBleHRyYSB0YXNrLiBJbiAKLSAgICB0aGlzIGNhc2UgeW91IHdvdWxkIGNyZWF0ZSBhIHRhc2sgImNvbS5iaXouYW50LnRhc2tzLlByb2Nlc3NGaWxlIiB0aGF0IGV4dGVuZHMgCi0gICAgIm9yZy5hcGFjaGUuYW50LnRhc2tsZXQuQWJzdHJhY3RUYXNrbGV0Ii4gWW91IHdvdWxkIHRoZW4gaW1wbGVtZW50IHJ1bigpIG1ldGhvZCB0byBkbyB0aGUKLSAgICB3b3JrIGFuZCBhbmQgc2V0dGVyIG1ldGhvZHMgdG8gYWNjZXB0IHBhcmFtZXRlcnMuIFRoZSBydW4gbWV0aG9kIGNhbiB0aHJvdyBBbnRFeGNlcHRpb24gaWYKLSAgICB0aGUgdGFzayBmYWlscyBmb3IgYW55IHJlYXNvbi4gVGhlIHNldHRlciBtZXRob2RzIGFyZSBpbiBmb3JtYXQgb2YgQW50MS54IHNldHRlcnMgd2l0aCBvbmUgCi0gICAgZXh0ZW50aW9uLiBUaGUgZXh0ZW50aW9uIGFsbG93cyAnLScgY2hhcmFjdGVycyB0byBhcHBlYXIgaW4geG1sIG5hbWVzIGFuZCB0aGVzZSB3aWxsIGJlIAotICAgIHRyYW5zZmVycmVkIGludG8gY2FwaXRhbGlzYXRpb24gb2YgbmV4dCBjaGFyYWN0ZXIgaW4gamF2YSBuYW1lcy4gaWUgZmlsZS1wZXJtaXNzaW9uIAotICAgIGF0dHJpYnV0ZSAtLSZndDsgc2V0RmlsZVBlcm1pc3Npb24oKSBtZXRob2QuIEFmdGVyIGltcGxlbWVudGluZyB0aGlzIHRhc2sgeW91IHdvdWxkIGhhdmUgCi0gICAgdG8gZGVmaW5lIGl0IGluIHRhc2tkZWYueG1sIG9mIGl0J3MgYXJjaGl2ZSBvciBlbHNlIGRlZmluZSBpdCB3aXRoIGEgdGFza2RlZiBjb25zdHJ1Y3QuCi0gIDwvcD4KLSAgCi0gIDxwPgotICAgIEluIGEgc2ltaWxhciBtZXRob2QgbmV3IGNvbnZlcnRlcnMgYW5kIGRhdGF0eXBlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIHN5c3RlbS4gRm9yIGV4YW1wbGUKLSAgICBpZiB5b3UgbmVlZGVkIHRvIGFkZCBhIFRlc3RTZXQgZGF0YXR5cGUgdGhhdCBoZWxkIGEgbGlzdCBvZiB0ZXN0IG5hbWVzIHRoZW4gdGhpcyB3b3VsZCAKLSAgICBiZSBwb3NzaWJsZS4gWW91IGNvdWxkIGFsc28gYWRkIGEgY29udmVydGVyIHRoYXQgY29udmVydGVkIGEgbGlzdCBvZiBjb21tYSBzZXBhcmF0ZWQgCi0gICAgc3RyaW5ncyBpbnRvIGEgVGVzdFNldC4gICAgCi0gIDwvcD4KLQotICA8cD4KLSAgICBUaGUgb25lIHRoaW5nIHRoYXQgdGhpcyBwcm9wb3NhbCBkb2VzIG5vdCBhZGRyZXNzIGlzIHZhbGlkYXRpb24gY29uY2VybnMuIFlvdSB3aWxsIG5vdGljZQotICAgIHRoYXQgdGhlIGFib3ZlIGlzIG1haW5seSBhaW1lZCB0byByZWR1Y2UgdGhlIGNvbXBsZXhpdHkgZm9yIHRhc2sgZGV2ZWxvcGVycy4gV2hlcmUgaW4gMS54Ci0gICAgeW91IGhhZCB0byBtYW5hZ2UgY29udmVydGlvbiBtYW51YWxseSAoZGVwZW5kaW5nIG9uIHZlcnNpb24gb2YgQW50KSBhbmQgYWxzbyBoYWQgdG8gZXhwbGNpdGx5Ci0gICAgaW5jb3Jwb3JhdGUgc3VwcG9ydCBmb3IgZGF0YXR5cGVzIG1hbnVhbGx5LiBUaGUgb25lIG90aGVyIGNvbmNlcm4gdGhhdCB3YXMgY29kZWQgaW50byBldmVyeQotICAgIHRhc2sgd2FzIHZhbGlkYXRpb24uIGllIFdlcmUgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyBzZXQgPyBJdCB3b3VsZCBiZSBkZXNpcmFibGUgdG8gYmUgYWJsZSB0bwotICAgIGFzc29jaWF0ZSBtZXRhLWluZm9ybWF0aW9uIHdpdGggdGhlIHRhc2sgdGhhdCBpbmRpY2F0ZWQgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMuIFRoaXMgd291bGQgCi0gICAgcmVkdWNlIHRoZSB3b3JrbG9hZCBvbiB0YXNrIGRldmVsb3BlcnMgZXZlbiBtb3JlIGFuZCBlbmNvdXJhZ2UgYmV0dGVyIHRhc2sgc3RydWN0dXJlLiBUaGlzIAotICAgIGlzIGEgZnV0dXJlIFRPRE8uCi0gIDwvcD4KLQotPC9ibG9ja3F1b3RlPgotCi08aDM+QSBSb3NlIGJ5IGFueSBvdGhlciBuYW1lIC4uLjwvaDM+Ci0KLTxibG9ja3F1b3RlPgotICA8cD4KLSAgICBUaGUgbmFtZSBNeXJtaWRvbiBpcyBhIGRlcml2YXRpb24gb2YgYSBteXRob2xvZ2ljYWwgbmFtZSBmb3Igc29tZSBhbnN0IHRoYXQgd2VyZSB0dXJuZWQgCi0gICAgaW50byBzb2xkaWVycyBieSB0aGUgZ29kIFpldXMuIEl0IGNhbWUgdG8gbWVhbiAiYSBzdWJvcmRpbmF0ZSB3aG8gZXhlY3V0ZXMgb3JkZXJzIAotICAgIHVucXVlc3Rpb25pbmdseSIgd2hpY2ggc2VlbWVkIHN1aXRhYmxlIGZvciBhIHRhc2sgZXhlY3V0aW9uL2J1aWxkIHRvb2wuIEEgbW9yZSBjb21wbGV0ZQotICAgIGRlc2NyaXB0aW9uIHN0b2xlbiBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9ib25kaS1ibHVlLnBhcmxlei5jb20vcHJldmlvdXNfd29yZHMvbXlybWlkb24udHh0Ij4KLSAgICBodHRwOi8vYm9uZGktYmx1ZS5wYXJsZXouY29tL3ByZXZpb3VzX3dvcmRzL215cm1pZG9uLnR4dDwvYT4uCi0gIDwvcD4KLQotICA8cXVvdGU+Ci0gICAgPGk+VGhlIGFwcGVsbGF0aW9uIE15cm1pZG9uIHdhcyBkZXJpdmVkIGZyb20gdGhlIEdyZWVrIHdvcmQgIm15cm1leCIsCi0gICAgbWVhbmluZyBhbnQuICBBY2NvcmRpbmcgdG8gR3JlZWsgbXl0aG9sb2d5LCB0aGUgTXlybWlkb25zIHdlcmUKLSAgICB0cmFuc2Zvcm1lZCBpbnRvIGh1bWFucyBieSB0aGUgZ29kIFpldXMgYXMgYW4gYWN0IG9mIGtpbmRuZXNzIHRvIGhpcwotICAgIHNvbiBBZWFjdXMuICBLaW5nIEFlYWN1cywgY2FwdGl2YXRlZCBieSBhIGNvbG9ueSBvZiBhbnRzLCBwcmF5ZWQKLSAgICB0aGF0IGhlIHNob3VsZCByZWNlaXZlIGFuIGluY3JlYXNlIGluIHBvcHVsYXRpb24gZXF1YWwgdG8gdGhlCi0gICAgbnVtYmVyIG9mIGFudHMgYmVmb3JlIGhpbS4gIFdoZW4gaGUgYXdva2UgdGhlIG5leHQgZGF5LCB0aGUgYW50cwotICAgIHdlcmUgaGlzIGh1bWFuIHN1YmplY3RzLiAgVGhlcmVhZnRlciwgdGhleSB3ZXJlIGtub3duIGFzIHRoZQotICAgIE15cm1pZG9ucy4gIFNlZSAiVGhlIElsaWFkIiBmb3IgSG9tZXJzJyBhY2NvdW50IG9mIHRoZSBNeXJtaWRvbnMKLSAgICBkdXJpbmcgdGhlIFRyb2phbiBXYXIuPC9pPgotICA8L3F1b3RlPgotCi08L2Jsb2NrcXVvdGU+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi90b29scy9iaW4vYW50IGIvcHJvcG9zYWwvbXlybWlkb24vdG9vbHMvYmluL2FudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxZjA4NC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi90b29scy9iaW4vYW50CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi1pZiBbIC1mICRIT01FLy5hbnRyYyBdIDsgdGhlbiAKLSAgLiAkSE9NRS8uYW50cmMKLWZpCi0KLWlmIFsgIiRBTlRfSE9NRSIgPSAiIiBdIDsgdGhlbgotICAjIHRyeSB0byBmaW5kIEFOVAotICBpZiBbIC1kIC9vcHQvYW50IF0gOyB0aGVuIAotICAgIEFOVF9IT01FPS9vcHQvYW50Ci0gIGZpCi0KLSAgaWYgWyAtZCAke0hPTUV9L29wdC9hbnQgXSA7IHRoZW4gCi0gICAgQU5UX0hPTUU9JHtIT01FfS9vcHQvYW50Ci0gIGZpCi0KLSAgIyMgcmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIGxpbmsgdG8gYW50J3MgaG9tZQotICBQUkc9JDAKLSAgcHJvZ25hbWU9YGJhc2VuYW1lICQwYAotICAKLSAgd2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCi0gICAgbHM9YGxzIC1sZCAiJFBSRyJgCi0gICAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAotICAgIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KLQlQUkc9IiRsaW5rIgotICAgIGVsc2UKLQlQUkc9ImBkaXJuYW1lICRQUkdgLyRsaW5rIgotICAgIGZpCi0gIGRvbmUKLSAgCi0gIEFOVF9IT01FPWBkaXJuYW1lICIkUFJHImAvLi4KLQotZmkKLQotIyBBbGxvdyAuYW50cmMgdG8gc3BlY2lmaXkgZmxhZ3MgdG8gamF2YSBjbWQKLWlmIFsgIiRKQVZBQ01EIiA9ICIiIF0gOyB0aGVuIAotICBKQVZBQ01EPWphdmEKLWZpCi0KLUxPQ0FMQ0xBU1NQQVRIPWBlY2hvICRBTlRfSE9NRS9saWIvKi5qYXIgfCB0ciAnICcgJzonYAotCi1pZiBbICIkQ0xBU1NQQVRIIiAhPSAiIiBdIDsgdGhlbgotICBMT0NBTENMQVNTUEFUSD0kTE9DQUxDTEFTU1BBVEg6JENMQVNTUEFUSAotZmkKLQotaWYgWyAiJEpBVkFfSE9NRSIgIT0gIiIgXSA7IHRoZW4KLSAgaWYgdGVzdCAtZiAkSkFWQV9IT01FL2xpYi90b29scy5qYXIgOyB0aGVuCi0gICAgTE9DQUxDTEFTU1BBVEg9JExPQ0FMQ0xBU1NQQVRIOiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphcgotICBmaQotCi0gIGlmIHRlc3QgLWYgJEpBVkFfSE9NRS9saWIvY2xhc3Nlcy56aXAgOyB0aGVuCi0gICAgTE9DQUxDTEFTU1BBVEg9JExPQ0FMQ0xBU1NQQVRIOiRKQVZBX0hPTUUvbGliL2NsYXNzZXMuemlwCi0gIGZpCi1maQotCi0kSkFWQUNNRCAtY2xhc3NwYXRoICRMT0NBTENMQVNTUEFUSCAtRGFudC5ob21lPSR7QU5UX0hPTUV9ICRBTlRfT1BUUyBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluICRACi0KZGlmZiAtLWdpdCBhL3Byb3Bvc2FsL215cm1pZG9uL3Rvb2xzL2Jpbi9hbnQuYmF0IGIvcHJvcG9zYWwvbXlybWlkb24vdG9vbHMvYmluL2FudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5NzQ3NWEuLjAwMDAwMDAKLS0tIGEvcHJvcG9zYWwvbXlybWlkb24vdG9vbHMvYmluL2FudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1AZWNobyBvZmYKLXJlbSBmaW5kIEFOVF9IT01FCi1pZiBub3QgIiVBTlRfSE9NRSUiPT0iIiBnb3RvIGNoZWNrSmF2YQotCi1yZW0gY2hlY2sgZm9yIGFudCBpbiBQcm9ncmFtIEZpbGVzIG9uIHN5c3RlbSBkcml2ZQotaWYgbm90IGV4aXN0ICIlU3lzdGVtRHJpdmUlXFByb2dyYW0gRmlsZXNcYW50IiBnb3RvIGNoZWNrU3lzdGVtRHJpdmUKLXNldCBBTlRfSE9NRT0lU3lzdGVtRHJpdmUlXFByb2dyYW0gRmlsZXNcYW50Ci1nb3RvIGNoZWNrSmF2YQotCi06Y2hlY2tTeXN0ZW1Ecml2ZQotcmVtIGNoZWNrIGZvciBhbnQgaW4gcm9vdCBkaXJlY3Rvcnkgb2Ygc3lzdGVtIGRyaXZlCi1pZiBub3QgZXhpc3QgIiVTeXN0ZW1Ecml2ZSVcYW50IiBnb3RvIG5vQW50SG9tZQotc2V0IEFOVF9IT01FPSVTeXN0ZW1Ecml2ZSVcYW50Ci1nb3RvIGNoZWNrSmF2YQotCi06bm9BbnRIb21lCi1lY2hvIEFOVF9IT01FIGlzIG5vdCBzZXQgYW5kIGFudCBjb3VsZCBub3QgYmUgbG9jYXRlZC4gUGxlYXNlIHNldCBBTlRfSE9NRS4KLWdvdG8gZW5kCi0KLTpjaGVja0phdmEKLWlmICIlSkFWQUNNRCUiID09ICIiIHNldCBKQVZBQ01EPWphdmEKLQotc2V0IExPQ0FMQ0xBU1NQQVRIPQotZm9yICUlaSBpbiAoJUFOVF9IT01FJVxsaWJcKi5qYXIpIGRvIGNhbGwgJUFOVF9IT01FJVxiaW5cbGNwLmJhdCAlJWkKLXNldCBMT0NBTENMQVNTUEFUSD0lTE9DQUxDTEFTU1BBVEglOyVDTEFTU1BBVEglCi0KLWlmICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBydW5BbnQKLWlmIGV4aXN0ICVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIgY2FsbCAlQU5UX0hPTUUlXGJpblxsY3AuYmF0ICVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIKLWlmIGV4aXN0ICVKQVZBX0hPTUUlXGxpYlxjbGFzc2VzLnppcCBjYWxsICVBTlRfSE9NRSVcYmluXGxjcC5iYXQgJUpBVkFfSE9NRSVcbGliXGNsYXNzZXMuemlwCi0KLTpydW5BbnQKLSVKQVZBQ01EJSAtY2xhc3NwYXRoICIlTE9DQUxDTEFTU1BBVEglIiAtRGFudC5ob21lPSIlQU5UX0hPTUUlIiAlQU5UX09QVFMlIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4gJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKLQotOmVuZAotc2V0IExPQ0FMQ0xBU1NQQVRIPQotCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi90b29scy9iaW4vYW50UnVuIGIvcHJvcG9zYWwvbXlybWlkb24vdG9vbHMvYmluL2FudFJ1bgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzOGIxOC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi90b29scy9iaW4vYW50UnVuCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEFyZ3M6IERJUiBjb21tYW5kCi1jZCAkMQotQ01EPSQyCi1zaGlmdAotc2hpZnQKLQotaWYgdGVzdCAtZiAkQ01ELnNoOyB0aGVuCi0gIENNRD0ic2ggJENNRC5zaCIKLWZpCi0KLWVjaG8gJENNRCAkQCB8IHNoCmRpZmYgLS1naXQgYS9wcm9wb3NhbC9teXJtaWRvbi90b29scy9iaW4vYW50UnVuLmJhdCBiL3Byb3Bvc2FsL215cm1pZG9uL3Rvb2xzL2Jpbi9hbnRSdW4uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGUwMzUxLi4wMDAwMDAwCi0tLSBhL3Byb3Bvc2FsL215cm1pZG9uL3Rvb2xzL2Jpbi9hbnRSdW4uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1AZWNobyBvZmYKLQotY2QgJTEKLXNldCBBTlRfUlVOX0NNRD0lMgotc2hpZnQKLXNoaWZ0Ci0KLSVBTlRfUlVOX0NNRCUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vdG9vbHMvYmluL2xjcC5iYXQgYi9wcm9wb3NhbC9teXJtaWRvbi90b29scy9iaW4vbGNwLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZlYjBkMC4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi90b29scy9iaW4vbGNwLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotc2V0IExPQ0FMQ0xBU1NQQVRIPSVMT0NBTENMQVNTUEFUSCU7JTEKLQpkaWZmIC0tZ2l0IGEvcHJvcG9zYWwvbXlybWlkb24vdG9vbHMvbGliL2FudC5qYXIgYi9wcm9wb3NhbC9teXJtaWRvbi90b29scy9saWIvYW50LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0NzcxNy4uMDAwMDAwMAotLS0gYS9wcm9wb3NhbC9teXJtaWRvbi90b29scy9saWIvYW50LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9hbnRpZG90ZS9XSEFULUlTLVRISVMtUCBiL3NyYy9hbnRpZG90ZS9XSEFULUlTLVRISVMtUApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzZjFhYS4uMDAwMDAwMAotLS0gYS9zcmMvYW50aWRvdGUvV0hBVC1JUy1USElTLVAKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVRoaXMgL3VzZWQvIHRvIGJlIHRoZSBob21lIG9mIEFudGlkb3RlLCB0aGUgR1VJIGZvciBBbnQuIEl0IGhhcyBtb3ZlZAotKG9yIHJhdGhlciwgZ3JhZHVhdGUpIHRvIHRoZSBjdnMgbW9kdWxlIGpha2FydGEtYW50LWFudGlkb3RlLCBhbmQgbXVzdAotYmUgcmV0cmlldmVkIHNlcGFyYXRlbHkgZnJvbSBBbnQsIGJ1dCBjYW4gYmUgZm91bmQgaW4gdGhlIHNhbWUgcGxhY2UgeW91IGZvdW5kCi1zb3VyY2UgdmVyc2lvbiBvZiBBbnQuCi0KLS0tIFRoZSBBbnRpZG90ZSBUZWFtIC0tCmRpZmYgLS1naXQgYS9zcmMvZXRjL2FudC5zcGVjIGIvc3JjL2V0Yy9hbnQuc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkMGM4Yy4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL2FudC5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotU3VtbWFyeTogSmF2YSBidWlsZCB0b29sCi1OYW1lOiBhbnQKLVZlcnNpb246IDEuMAotUmVsZWFzZTogMAotR3JvdXA6IERldmVsb3BtZW50L1Rvb2xzCi1Db3B5cmlnaHQ6IEFwYWNoZSAtIGZyZWUKLVByb3ZpZGVzOiBhbnQKLVVybDogaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZwotCi1Tb3VyY2U6IGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnVpbGRzL25pZ2h0bHkvYW50L2pha2FydGEtdG9vbHMuc3JjLnppcAotUHJlZml4OiAvb3B0Ci0KLSVkZXNjcmlwdGlvbgotUGxhdGZvcm0taW5kZXBlbmRlbnQgYnVpbGQgdG9vbCBmb3IgamF2YS4KLQotJXByZXAKLXJtIC1yZiAke1JQTV9CVUlMRF9ESVJ9L2pha2FydGEtdG9vbHMKLXVuemlwIC14ICRSUE1fU09VUkNFX0RJUi9qYWthcnRhLXRvb2xzLnNyYy56aXAKLQotJWJ1aWxkCi1jZCAke1JQTV9CVUlMRF9ESVJ9L2pha2FydGEtdG9vbHMKLWNkIGFudAotc2ggYm9vdHN0cmFwLnNoCi1zaCBidWlsZC5zaCAKLQotJWluc3RhbGwKLWNkICR7UlBNX0JVSUxEX0RJUn0vamFrYXJ0YS10b29scwotY2QgYW50Ci1zaCBidWlsZC5zaCAtRGRpc3QuZGlyIC9vcHQgIGRpc3QKLQotJWNsZWFuCi0KLSVwb3N0Ci1sbiAtcyAvb3B0L2FudC9iaW4vYW50IC91c3IvYmluCi0KLSVwcmV1bgotICAKLSVmaWxlcwotIyMgJWRlZmF0dHIoLSxyb290LHJvb3QpCi0lZGlyIC9vcHQvYW50Ci0lZGlyIC9vcHQvYW50L2JpbgotJWRpciAvb3B0L2FudC9saWIKLSVkaXIgL29wdC9hbnQvZG9jcwotL29wdC9hbnQvbGliL2FudC5qYXIKLS9vcHQvYW50L2xpYi94bWwuamFyCi0vb3B0L2FudC9saWIvbW9vLmphcgotJWNvbmZpZyAvb3B0L2FudC9saWIvYnVpbGQueG1sCi0vb3B0L2FudC9iaW4vYW50Ci0vb3B0L2FudC9iaW4vYW50UnVuCi0vb3B0L2FudC9kb2NzL2luZGV4Lmh0bWwKLQotJWNoYW5nZWxvZwpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9jb3ZlcmFnZS1mcmFtZXMueHNsIGIvc3JjL2V0Yy9jb3ZlcmFnZS1mcmFtZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTVjNmI0Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvY292ZXJhZ2UtZnJhbWVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi08IS0tCi0gCi0gU2FtcGxlIHN0eWxlc2hlZXQgdG8gYmUgdXNlZCB3aXRoIEpQcm9iZSAzLjAgWE1MIG91dHB1dC4KLSAKLSBJdCBjcmVhdGVzIGEgc2V0IG9mIEhUTUwgZmlsZXMgYSBsYSBqYXZhZG9jIHdoZXJlIHlvdSBjYW4gYnJvd3NlIGVhc2lseQotIHRocm91Z2ggYWxsIHBhY2thZ2VzIGFuZCBjbGFzc2VzLgotIAotIEl0IGlzIGJlc3QgdXNlZCB3aXRoIEpQcm9iZSBDb3ZlcmFnZSBBbnQgdGFzayB0aGF0IGdpdmVzIHlvdSB0aGUgYmVuZWZpdAotIG9mIGEgcmVmZXJlbmNlIGNsYXNzcGF0aCBzbyB0aGF0IHlvdSBoYXZlIHRoZSBsaXN0IG9mIGNsYXNzZXMvbWV0aG9kcwotIHRoYXQgYXJlIG5vdCB1c2VkIGF0IGFsbCBpbiBhIGdpdmVuIGNsYXNzcGF0aC4KLSAKLSBAYXV0aG9yIFN0ZXBoYW5lIEJhaWxsaWV6IDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSIvPgotIAotLS0+Ci08eHNsOnN0eWxlc2hlZXQJeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLQl4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0JeG1sbnM6cmVkaXJlY3Q9Im9yZy5hcGFjaGUueGFsYW4ueHNsdC5leHRlbnNpb25zLlJlZGlyZWN0IgotCWV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJyZWRpcmVjdCI+Ci0KLTx4c2w6b3V0cHV0CW1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KLTx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KLQotPCEtLSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkgaXMgY3VycmVudCBkaXJlY3RvcnkgLS0+Ci08eHNsOnBhcmFtIG5hbWU9Im91dHB1dC5kaXIiIHNlbGVjdD0iJy4nIi8+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvb3QgZWxlbWVudAotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL3NuYXBzaG90Ij4KLQk8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KLQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9pbmRleC5odG1sIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiLz4KLQk8L3JlZGlyZWN0OndyaXRlPgotCi0JPCEtLSBjcmVhdGUgdGhlIHN0eWxlc2hlZXQuY3NzIC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQotCTwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiLz4KLQk8L3JlZGlyZWN0OndyaXRlPgotCi0JPCEtLSBjcmVhdGUgdGhlIGFsbC1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5wYWNrYWdlcyIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsY2xhc3Nlcy1mcmFtZS5odG1sIj4KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZSIgbW9kZT0id3JpdGUiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRnJhbWVzZXQgZGVmaW5pdGlvbi4gRW50cnkgcG9pbnQgZm9yIHRoZSByZXBvcnQuCi0JMyBmcmFtZXM6IHBhY2thZ2VMaXN0RnJhbWUsIGNsYXNzTGlzdEZyYW1lLCBjbGFzc0ZyYW1lCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgotPGh0bWw+Ci0JPGhlYWQ+PHRpdGxlPkNvdmVyYWdlIFJlc3VsdHMuPC90aXRsZT48L2hlYWQ+Ci0JPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgotCQk8ZnJhbWVzZXQgcm93cz0iMzAlLDcwJSI+Ci0JCQk8ZnJhbWUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+Ci0JCQk8ZnJhbWUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+Ci0JCTwvZnJhbWVzZXQ+Ci0JCTxmcmFtZSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgotCTwvZnJhbWVzZXQ+Ci0JPG5vZnJhbWVzPgotCQk8aDI+RnJhbWUgQWxlcnQ8L2gyPgotCQk8cD4KLQkJVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi0JCTwvcD4KLQk8L25vZnJhbWVzPgotPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlTdHlsZXNoZWV0IENTUyB1c2VkCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KLQlCT0RZIHsKLQkJZm9udDpub3JtYWwgNjglIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhOwotCQljb2xvcjojMDAwMDAwOwotCX0KLQlURCB7Ci0JCUZPTlQtU0laRTogNjglCi0JfQotCVRIIHsKLQkJRk9OVC1TSVpFOiA2OCU7Zm9udC13ZWlnaHQ6Ym9sZDsKLQl9Ci0JUCB7Ci0JCWxpbmUtaGVpZ2h0OjEuNWVtOwotCQltYXJnaW4tdG9wOjAuNWVtOyBtYXJnaW4tYm90dG9tOjEuMGVtOwotCX0KLQlIMSB7Ci0JCU1BUkdJTjogMHB4IDBweCA1cHg7IEZPTlQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLQl9Ci0JSDIgewotCQlNQVJHSU4tVE9QOiAxZW07IE1BUkdJTi1CT1RUT006IDAuNWVtOyBGT05UOiBib2xkIDEyNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLQl9Ci0JSDMgewotCQlNQVJHSU4tQk9UVE9NOiAwLjVlbTsgRk9OVDogYm9sZCAxMTUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0JfQotCUg0IHsKLQkJTUFSR0lOLUJPVFRPTTogMC41ZW07IEZPTlQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotCX0KLQlINSB7Ci0JCU1BUkdJTi1CT1RUT006IDAuNWVtOyBGT05UOiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLQl9Ci0JSDYgewotCQlNQVJHSU4tQk9UVE9NOiAwLjVlbTsgRk9OVDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0JfQotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlMaXN0IG9mIGFsbCBjbGFzc2VzIGluIGFsbCBwYWNrYWdlcwotCVRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgcGFnZSBpbiB0aGUgY2xhc3NMaXN0RnJhbWUKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNuYXBzaG90IiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0JPGh0bWw+Ci0JCTxoZWFkPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiLz4KLQkJPC9oZWFkPgotCQk8Ym9keT4KLQkJCTxoMj5DbGFzc2VzPC9oMj4KLQkJCTxwPgotCQkJPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFja2FnZS9jbGFzcyI+Ci0JCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQkJICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IihhbmNlc3Rvcjo6cGFja2FnZSlbbGFzdCgpXS9AbmFtZSIvPgotCQkJCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImxpbmsiPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0nJykiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJHBhY2thZ2UubmFtZSwnLicsJy8nKSIvPjx4c2w6dGV4dD4vPC94c2w6dGV4dD4KLQkJCQkJCTwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+Ci0JCQkJICAgIDwveHNsOnZhcmlhYmxlPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgbm93cmFwPSJub3dyYXAiPgotCQkJCQkJCTxhIHRhcmdldD0iY2xhc3NGcmFtZSIgaHJlZj0ieyRsaW5rfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCTwvdGFibGU+Ci0JCQk8L3A+Ci0JCTwvYm9keT4KLQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBsaXN0IG9mIGFsbCBwYWNrYWdlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNuYXBzaG90IiBtb2RlPSJhbGwucGFja2FnZXMiPgotCTxodG1sPgotCQk8aGVhZD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIi8+Ci0JCTwvaGVhZD4KLQkJPGJvZHk+Ci0JCQk8aDI+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkhvbWU8L2E+PC9oMj4KLQkJCTxoMj5QYWNrYWdlczwvaDI+Ci0JCQk8cD4KLQkJCTx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0JCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhY2thZ2UiPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIgb3JkZXI9ImFzY2VuZGluZyIvPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgbm93cmFwPSJub3dyYXAiPgotCQkJCQkJCTxhIGhyZWY9Int0cmFuc2xhdGUoQG5hbWUsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLQkJCQkJCQk8L2E+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmZvci1lYWNoPgotCQkJPC90YWJsZT4KLQkJCTwvcD4KLQkJPC9ib2R5PgotCTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIG92ZXJ2aWV3IG9mIHN0YXRpc3RpY3MgaW4gcGFja2FnZXMgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJzbmFwc2hvdCIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiPgotCTxodG1sPgotCQk8aGVhZD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIi8+Ci0JCTwvaGVhZD4KLQkJPGJvZHkgb25sb2FkPSJvcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLQkJPGgyPlN1bW1hcnk8L2gyPgotCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJPHRyIGJnY29sb3I9IiNBNkNBRjAiIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPkRhdGU8L3RoPgotCQkJCTx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+RWxhcHNlZCB0aW1lPC90aD4KLQkJCQk8dGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPlJlcG9ydGVkIENsYXNzZXM8L3RoPgotCQkJCTx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+TWV0aG9kcyBIaXQ8L3RoPgotCQkJCTx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+TGluZXMgSGl0PC90aD4KLQkJCTwvdHI+Ci0JCQk8dHIgYmdjb2xvcj0iI0VFRUVFIiB2YWxpZ249InRvcCI+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXhlY3V0aW9uX2xvZy9AcHJvZ3JhbV9zdGFydCIvPjwvdGQ+Ci0JCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKGV4ZWN1dGlvbl9sb2cvQGVsYXBzZWRfdGltZSBkaXYgMTAwMCwnMC4wJykiLz5zZWNzPC90ZD4KLQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KHBhY2thZ2UvY2xhc3MpIi8+PC90ZD4KLQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9tZXRob2RzIGRpdiBjb3YuZGF0YS9AdG90YWxfbWV0aG9kcywnMC4wJScpIi8+PC90ZD4KLQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9saW5lcyBkaXYgY292LmRhdGEvQHRvdGFsX2xpbmVzLCcwLjAlJykiLz48L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQkJPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9Ijk1JSI+Ci0JCTx0cj4KLQkJPHRkCXN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+Ci0JCVRvIGVuc3VyZSBhY2N1cmF0ZSB0ZXN0IHJ1bnMgb24gSmF2YSBhcHBsaWNhdGlvbnMsIGRldmVsb3BlcnMgbmVlZCB0byBrbm93IGhvdyBtdWNoIG9mCi0JCXRoZSBjb2RlIGhhcyBiZWVuIHRlc3RlZCwgYW5kIHdoZXJlIHRvIGZpbmQgYW55IHVudGVzdGVkIGNvZGUuIENvdmVyYWdlIGhlbHBzIHlvdQotCQlsb2NhdGUgdW50ZXN0ZWQgY29kZSwgYW5kIG1lYXN1cmUgcHJlY2lzZWx5IGhvdyBtdWNoIGNvZGUgaGFzIGJlZW4gZXhlcmNpc2VkLgotCQlUaGUgcmVzdWx0IGlzIGEgaGlnaGVyIHF1YWxpdHkgYXBwbGljYXRpb24gaW4gYSBzaG9ydGVyIHBlcmlvZCBvZiB0aW1lLgotCQk8cC8+Ci0JCTwvdGQ+Ci0JCTwvdHI+Ci0JCTwvdGFibGU+Ci0KLQkJPGgyPlBhY2thZ2VzPC9oMj4KLQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icGFja2FnZVsxXSIgbW9kZT0ic3RhdHMuaGVhZGVyIi8+Ci0JCQk8IS0tIGRpc3BsYXkgcGFja2FnZXMgYW5kIHNvcnQgdGhlbSB2aWEgdGhlaXIgY292ZXJhZ2UgcmF0ZSAtLT4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYWNrYWdlIj4KLQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJudW1iZXIiIHNlbGVjdD0iY292LmRhdGEvQGhpdF9saW5lcyBkaXYgY292LmRhdGEvQHRvdGFsX2xpbmVzIi8+Ci0JCQkJPHRyIGJnY29sb3I9IiNFRUVFRSIgdmFsaWduPSJ0b3AiPgotCQkJCQk8dGQ+PGEgaHJlZj0ie3RyYW5zbGF0ZShAbmFtZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgotCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9tZXRob2RzIGRpdiBjb3YuZGF0YS9AdG90YWxfbWV0aG9kcywnMC4wJScpIi8+PC90ZD4KLQkJCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKGNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcywnMC4wJScpIi8+PC90ZD4KLQkJCQk8L3RyPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwvdGFibGU+Ci0JCTwvYm9keT4KLQkJPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0KLSBkZXRhaWxlZCBpbmZvIGZvciBhIHBhY2thZ2UuIEl0IHdpbGwgb3V0cHV0IHRoZSBsaXN0IG9mIGNsYXNzZXMKLSwgdGhlIHN1bW1hcnkgcGFnZSwgYW5kIHRoZSBpbmZvIGZvciBlYWNoIGNsYXNzCi0tLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9IndyaXRlIj4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KLQkJPHhzbDppZiB0ZXN0PSJub3QoQG5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoQG5hbWUsJy4nLCcvJykiLz48L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSJAbmFtZSA9ICcnIj4uPC94c2w6aWY+Ci0JPC94c2w6dmFyaWFibGU+Ci0KLQk8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KLQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLWZyYW1lLmh0bWwiPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzZXMubGlzdCIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBjcmVhdGUgYSBwYWNrYWdlLXN1bW1hcnkuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InBhY2thZ2Uuc3VtbWFyeSIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBmb3IgZWFjaCBjbGFzcywgY3JlYXRlcyBhIEBuYW1lLmh0bWwgLS0+Ci0JPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNsYXNzIj4KLQkJPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BuYW1lfS5odG1sIj4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3MuZGV0YWlscyIvPgotCQk8L3JlZGlyZWN0OndyaXRlPgotCTwveHNsOmZvci1lYWNoPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbGlzdCBvZiBjbGFzc2VzIGluIGEgcGFja2FnZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9ImNsYXNzZXMubGlzdCI+Ci0JPGh0bWw+Ci0JCTxIRUFEPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQG5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvSEVBRD4KLQkJPEJPRFk+Ci0JCQk8dGFibGUgd2lkdGg9IjEwMCUiPgotCQkJCTx0cj4KLQkJCQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KLQkJCQkJCTxIMj48YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC9IMj4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJPC90YWJsZT4KLQkKLQkJCTxIMj5DbGFzc2VzPC9IMj4KLQkJCTxwPgotCQkJPFRBQkxFIFdJRFRIPSIxMDAlIj4KLQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iY2xhc3MiPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgbm93cmFwPSJub3dyYXAiPgotCQkJCQkJCTxhIGhyZWY9IntAbmFtZX0uaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmZvci1lYWNoPgotCQkJPC9UQUJMRT4KLQkJCTwvcD4KLQkJPC9CT0RZPgotCTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIHN1bW1hcnkgb2YgYSBwYWNrYWdlIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFja2FnZSIgbW9kZT0icGFja2FnZS5zdW1tYXJ5Ij4KLQk8SFRNTD4KLQkJPEhFQUQ+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC9IRUFEPgotCQk8IS0tIHdoZW4gbG9hZGluZyB0aGlzIHBhY2thZ2UsIGl0IHdpbGwgb3BlbiB0aGUgY2xhc3NlcyBpbnRvIHRoZSBmcmFtZSAtLT4KLQkJPEJPRFkgb25sb2FkPSJvcGVuKCdwYWNrYWdlLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0JCQk8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2gzPgotCQkJCi0JCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ic3RhdHMuaGVhZGVyIi8+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJzdGF0cyIvPgotCQkJPC90YWJsZT4KLQkJCQkJCi0JCQk8eHNsOmlmIHRlc3Q9ImNvdW50KGNsYXNzKSAmZ3Q7IDAiPgotCQkJCTxIMj5DbGFzc2VzPC9IMj4KLQkJCQk8cD4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN0YXRzLmhlYWRlciIvPgotCQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNsYXNzIiBtb2RlPSJzdGF0cyI+Ci0JCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJudW1iZXIiIHNlbGVjdD0iY292LmRhdGEvQGhpdF9saW5lcyBkaXYgY292LmRhdGEvQHRvdGFsX2xpbmVzIi8+Ci0JCQkJCTwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLQkJCQk8L3RhYmxlPgotCQkJCTwvcD4KLQkJCTwveHNsOmlmPgotCQk8L0JPRFk+Ci0JPC9IVE1MPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gZGV0YWlscyBvZiBhIGNsYXNzIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3MiIG1vZGU9ImNsYXNzLmRldGFpbHMiPgotCTx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IihhbmNlc3Rvcjo6cGFja2FnZSlbbGFzdCgpXS9AbmFtZSIvPgotCTxIVE1MPgotCQk8SEVBRD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvSEVBRD4KLQkJPEJPRFk+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotCQkJPEgzPkNsYXNzIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+LjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvSDM+Ci0KLQkJCTwhLS0gY2xhc3Mgc3VtbWFyeSAtLT4KLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJzdGF0cy5oZWFkZXIiLz4KLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN0YXRzIi8+Ci0JCQk8L3RhYmxlPgotCQotCQkJPCEtLSBkZXRhaWxzIG9mIG1ldGhvZHMgLS0+Ci0JCQk8SDI+TWV0aG9kczwvSDI+Ci0JCQk8cD4KLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtZXRob2RbMV0iIG1vZGU9InN0YXRzLmhlYWRlciIvPgotCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWV0aG9kIiBtb2RlPSJzdGF0cyI+Ci0JCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9Im51bWJlciIgc2VsZWN0PSJjb3YuZGF0YS9AaGl0X2xpbmVzIGRpdiBjb3YuZGF0YS9AdG90YWxfbGluZXMiLz4KLQkJCQk8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0JCQk8L3RhYmxlPgotCQkJCi0JCQk8L3A+Ci0JCTwvQk9EWT4KLQk8L0hUTUw+Ci0KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFBhZ2UgSEVBREVSIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KLQk8aDE+Q292ZXJhZ2UgUmVzdWx0czwvaDE+Ci0JPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQk8dHI+Ci0JCTx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KLQkJPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9J2h0dHA6Ly93d3cuc2l0cmFrYS5jb20vanByb2JlJz5TaXRyYWthIEpQcm9iZTwvYT4gYW5kIDxhIGhyZWY9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcnPkFudDwvYT4uPC90ZD4KLQk8L3RyPgotCTwvdGFibGU+Ci0JPGhyIHNpemU9IjEiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9InRhYmxlLmhlYWRlciI+Ci0JPHRyIGJnY29sb3I9IiNBNkNBRjAiIHZhbGlnbj0idG9wIj4KLQkJPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgotCQk8dGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPk1ldGhvZHMgSGl0PC90aD4KLQkJPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5MaW5lcyBIaXQ8L3RoPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIiBtb2RlPSJzdGF0cy5oZWFkZXIiPgotCTx0ciBiZ2NvbG9yPSIjQTZDQUYwIiB2YWxpZ249InRvcCI+Ci0JCTx0aCB3aWR0aD0iOTAlIj5OYW1lPC90aD4KLQkJPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5MaW5lcyBIaXQ8L3RoPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldGhvZCIgbW9kZT0ic3RhdHMiPgotCTx0ciBiZ2NvbG9yPSIjRUVFRUUiIHZhbGlnbj0idG9wIj4KLQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+Ci0JCTx0ZD4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9saW5lcyBkaXYgY292LmRhdGEvQHRvdGFsX2xpbmVzLCcwLjAlJykiLz4KLQkJPC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2V8Y2xhc3MiIG1vZGU9InN0YXRzLmhlYWRlciI+Ci0JPHRyIGJnY29sb3I9IiNBNkNBRjAiIHZhbGlnbj0idG9wIj4KLQkJPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgotCQk8dGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPk1ldGhvZHMgSGl0PC90aD4KLQkJPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5MaW5lcyBIaXQ8L3RoPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2V8Y2xhc3MiIG1vZGU9InN0YXRzIj4KLQk8dHIgYmdjb2xvcj0iI0VFRUVFIiB2YWxpZ249InRvcCI+Ci0JCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3RkPgotCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9tZXRob2RzIGRpdiBjb3YuZGF0YS9AdG90YWxfbWV0aG9kcywnMC4wJScpIi8+PC90ZD4KLQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKGNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcywnMC4wJScpIi8+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0KLSAgICB0cmFuc2Zvcm0gc3RyaW5nIGxpa2UgYS5iLmMgdG8gLi4vLi4vLi4vCi0gICAgQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdHJhbnNmb3JtIGludG8gYSBkZXNjZW5kaW5nIGRpcmVjdG9yeSBwYXRoCi0tLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGF0aCI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+Ci0JPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aCwnLicpIj4KLQkJPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRwYXRoLCcuJykiLz48L3hzbDp3aXRoLXBhcmFtPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOmlmPgotCTx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPgotCQk8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KLQk8L3hzbDppZj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gY3JlYXRlIHRoZSBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0IGJhc2VkIG9uIHRoZSBwYWNrYWdlIG5hbWUgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCTx4c2w6cGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0JPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIFRJVExFPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvTElOSz4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCi0KZGlmZiAtLWdpdCBhL3NyYy9ldGMvanVuaXQtZnJhbWVzLnhzbCBiL3NyYy9ldGMvanVuaXQtZnJhbWVzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhNGVhZC4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL2p1bml0LWZyYW1lcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0CXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotCXhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLnhzbHQuZXh0ZW5zaW9ucy5SZWRpcmVjdCIKLQlleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgU3R5bGVzaGVldCB0byB0cmFuc2Zvcm0gYW4gWE1MIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBBbnQgSlVuaXQgdGFzayBpbnRvCi0gICAgYSBzZXQgb2YgSmF2YURvYy1saWtlIEhUTUwgcGFnZSB0byBtYWtlIHBhZ2VzIG1vcmUgY29udmVuaWVudCB0byBiZSBicm93c2VkLgotICAgIAotICAgIEl0IHVzZSB0aGUgWGFsYW4gcmVkaXJlY3QgZXh0ZW5zaW9uIHRvIHdyaXRlIHRvIG11bHRpcGxlIG91dHB1dCBmaWxlcy4KLSAgICAKLSAgICBOb3RlOiBIVE1MIG91dHB1dCBjYW4gYmUgbWFkZSBtdWNoIG1vcmUgY2xlYW4gYnkgcmVtb3Zpbmcgbm9uIGNzcyBhdHRyaWJ1dGVzCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIvPgotPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIi8+Ci0KLTwhLS0KLSAgICBYYWxhbiByZWRpcmVjdCBleHRlbnNpb24gd3JpdGVzIHJlbGF0aXZlIGZpbGUgYmFzZWQgb24gdGhlIHBhcmVudCBkaXJlY3RvcnkKLSAgICBmcm9tIHRoZSBtYWluIG91dHB1dCBmaWxlLCB1bmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5ldmVyIHNldCBhbmQgeW91IGhhdmUKLSAgICB0byBkbyBpdCB5b3Vyc2VsZiBvbiB0aGUgQVBJLiBUaGUgY29kZSB0aGF0IGRvZXMgaXQgaW4gY29tbWFuZCBsaW5lIHdhcwotICAgIGNvbW1lbnRlZCBvdXQgaW4gWGFsYW4gMS4yLjIgOi0oCi0gICAgCi0gICAgVGhlcmVmb3JlIEkgd2lsbCB1c2UgYSBzdHlsZXNoZWV0IHBhcmFtIGZvciB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KLSAgICAKLSAgICBUaGlzIGhhcyB0byBiZSBpbnZva2VkIGFzIGZvbGxvd3MgZnJvbSB0aGUgY29tbWFuZCBsaW5lOgotICAgIAotICAgIGphdmEgLWNsYXNzcGF0aCBic2YuamFyO3hhbGFuLmphcjt4ZXJjZXMuamFyIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1JTiB0ZXN0c3VpdGVzLnhtbCAtWFNMIGp1bml0LWZyYW1lcy54c2wgLVBBUkFNIG91dHB1dC5kaXIgJy4vcmVwb3J0JwotLS0+Ci08eHNsOnBhcmFtIG5hbWU9Im91dHB1dC5kaXIiIHNlbGVjdD0iJy4nIi8+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyI+Ci0JPCEtLSBjcmVhdGUgdGhlIGluZGV4Lmh0bWwgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIi8+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQotCTwhLS0gY3JlYXRlIHRoZSBzdHlsZXNoZWV0LmNzcyAtLT4KLQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9zdHlsZXNoZWV0LmNzcyI+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0KLQk8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KLQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIi8+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQotCTwhLS0gY3JlYXRlIHRoZSBhbGwtcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KLQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1mcmFtZS5odG1sIj4KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwucGFja2FnZXMiLz4KLQk8L3JlZGlyZWN0OndyaXRlPgotCQotCTwhLS0gY3JlYXRlIHRoZSBhbGwtY2xhc3Nlcy5odG1sIGF0IHRoZSByb290IC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmNsYXNzZXMiLz4KLQk8L3JlZGlyZWN0OndyaXRlPgotCQotCTwhLS0gcHJvY2VzcyBhbGwgcGFja2FnZXMgLS0+Ci0JPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2UiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZSI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLmRpciI+Ci0JCTx4c2w6aWYgdGVzdD0ibm90KCRuYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRuYW1lLCcuJywnLycpIi8+PC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+LjwveHNsOmlmPgotCTwveHNsOnZhcmlhYmxlPgkKLQk8IS0tUHJvY2Vzc2luZyBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dC5kaXIiLz4gLS0+Ci0JPCEtLSBjcmVhdGUgYSBjbGFzc2VzLWxpc3QuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1mcmFtZS5odG1sIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBjcmVhdGUgYSBwYWNrYWdlLXN1bW1hcnkuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQkKLQk8IS0tIGZvciBlYWNoIGNsYXNzLCBjcmVhdGVzIGEgQG5hbWUuaHRtbCAtLT4KLQk8IS0tIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCBpbm5lciBjbGFzc2VzIGhhdmluZyB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIC0tPgotCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbQHBhY2thZ2UgPSAkbmFtZV0iPgotCQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QG5hbWV9Lmh0bWwiPgotCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIi8+Ci0JCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JPC94c2w6Zm9yLWVhY2g+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIj4KLTxodG1sPgotCTxoZWFkPgotCQk8dGl0bGU+VW5pdCBUZXN0IFJlc3VsdHMuPC90aXRsZT4KLQk8L2hlYWQ+Ci0JPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgotCQk8ZnJhbWVzZXQgcm93cz0iMzAlLDcwJSI+Ci0JCQk8ZnJhbWUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+Ci0JCQk8ZnJhbWUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+Ci0JCTwvZnJhbWVzZXQ+Ci0JCTxmcmFtZSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgotCTwvZnJhbWVzZXQ+Ci0JPG5vZnJhbWVzPgotCQk8aDI+RnJhbWUgQWxlcnQ8L2gyPgotCQk8cD4KLQkJVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi0JCTwvcD4KLQk8L25vZnJhbWVzPgotPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Ci1ib2R5IHsKLQlmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7Ci0JY29sb3I6IzAwMDAwMDsKLX0KLXRkIHsKLQlmb250LXNpemU6IDY4JQotfQotcCB7Ci0JbGluZS1oZWlnaHQ6MS41ZW07Ci0JbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKLX0KLWgxIHsKLQltYXJnaW46IDBweCAwcHggNXB4OwotCWZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLX0KLWgyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oMyB7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JZm9udDogYm9sZCAxMTUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oNCB7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oNSB7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oNiB7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci0uRXJyb3IgewotCWZvbnQtd2VpZ2h0OmJvbGQ7Ci0JY29sb3I6cmVkOwotfQotLkZhaWx1cmUgewotCWZvbnQtd2VpZ2h0OmJvbGQ7Ci0JY29sb3I6cHVycGxlOwotfQotCi08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBUaGlzIHBhZ2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgdGVzdHN1aXRlIGNsYXNzLgotICAgIEl0IHByaW50cyBhIHN1bW1hcnkgb2YgdGhlIHRlc3RzdWl0ZSBhbmQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQKLSAgICB0ZXN0Y2FzZSBtZXRob2RzLgotICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgotCTxodG1sPgotCQk8aGVhZD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvaGVhZD4KLQkJPGJvZHk+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgkKLQkJCTxoMz5DbGFzcyA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPi48L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2gzPgotCi0JCQkKLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQudGVzdCIvPgotCQkJPC90YWJsZT4KLQkKLQkJCTxoMj5UZXN0czwvaDI+Ci0JCQk8cD4KLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIi8+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Rlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ii8+Ci0JCQk8L3RhYmxlPgotCQkJCi0JCQk8L3A+Ci0JCTwvYm9keT4KLQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBUaGlzIHBhZ2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgcGFja2FnZS4KLSAgICBJdCBwcmludHMgdGhlIG5hbWUgb2YgYWxsIGNsYXNzZXMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgcGFja2FnZS4KLSAgICBAcGFyYW0gbmFtZSB0aGUgcGFja2FnZSBuYW1lIHRvIHByaW50IGNsYXNzZXMuCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0JPGh0bWw+Ci0JCTxoZWFkPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvaGVhZD4KLQkJPGJvZHk+Ci0JCQk8dGFibGUgd2lkdGg9IjEwMCUiPgotCQkJCTx0cj4KLQkJCQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KLQkJCQkJCTxoMj48YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L2E+PC9oMj4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJPC90YWJsZT4KLQkKLQkJCTxoMj5DbGFzc2VzPC9oMj4KLQkJCTxwPgotCQkJPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgbm93cmFwPSJub3dyYXAiPgotCQkJCQkJCTxhIGhyZWY9IntAbmFtZX0uaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmZvci1lYWNoPgotCQkJPC90YWJsZT4KLQkJCTwvcD4KLQkJPC9ib2R5PgotCTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLQlDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwKLQlvbiBlYWNoIGNsYXNzLgotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0JPGh0bWw+Ci0JCTxoZWFkPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvaGVhZD4KLQkJPGJvZHk+Ci0JCQk8aDI+Q2xhc3NlczwvaDI+Ci0JCQk8cD4KLQkJCTx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLQkJCQk8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0JCQk8L3RhYmxlPgotCQkJPC9wPgotCQk8L2JvZHk+Ci0JPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLmNsYXNzZXMiPgotCTwhLS0gKGFuY2VzdG9yOjpwYWNrYWdlKVtsYXN0KCldIGlzIGJ1Z2d5IGluIE1TWE1MMywgZml4ZWQgaW4gU1AxPyAtLT4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgotCTx0cj4KLQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KLQkJCTxhIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWU9JycpIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJHBhY2thZ2UubmFtZSwnLicsJy8nKSIvPjx4c2w6dGV4dD4vPC94c2w6dGV4dD4KLQkJCQkJPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0Pi5odG1sPC94c2w6dGV4dD4KLQkJCQk8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQk8L2E+Ci0JCTwvdGQ+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLQlDcmVhdGVzIGFuIGh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgZmlsZXMgb24KLQllYWNoIHBhY2thZ2UgZXhpc3Rpbmcgb24gdGVzdHN1aXRlcy4KLQlAYnVnIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIGhlcmUsIEkgZG9uJ3Qga25vdyB5ZXQgaG93IHRvIGhhbmRsZSB1bm5hbWVkIHBhY2thZ2UgOigKLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KLQk8aHRtbD4KLQkJPGhlYWQ+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC9oZWFkPgotCQk8Ym9keT4KLQkJCTxoMj48YSBocmVmPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+SG9tZTwvYT48L2gyPgotCQkJPGgyPlBhY2thZ2VzPC9oMj4KLQkJCTxwPgotCQkJCTx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIiBtb2RlPSJhbGwucGFja2FnZXMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KLQkJCQkJPC94c2w6YXBwbHktdGVtcGxhdGVzPgotCQkJCTwvdGFibGU+Ci0JCQk8L3A+Ci0JCTwvYm9keT4KLQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJhbGwucGFja2FnZXMiPgotCTx0cj4KLQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KLQkJCTxhIGhyZWY9Int0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgotCQkJPC9hPgotCQk8L3RkPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyI+Ci0JPGh0bWw+Ci0JCTxoZWFkPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvaGVhZD4KLQkJPGJvZHk+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0JCTxoMj5TdW1tYXJ5PC9oMj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Q291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGVzdHMpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXJyb3JDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BlcnJvcnMpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZmFpbHVyZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGZhaWx1cmVzKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRpbWVDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0aW1lKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1Y2Nlc3NSYXRlIiBzZWxlY3Q9IigkdGVzdENvdW50IC0gJGZhaWx1cmVDb3VudCAtICRlcnJvckNvdW50KSBkaXYgJHRlc3RDb3VudCIvPgotCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQk8dHIgYmdjb2xvcj0iI0E2Q0FGMCIgdmFsaWduPSJ0b3AiPgotCQkJPHRkPjxzdHJvbmc+VGVzdHM8L3N0cm9uZz48L3RkPgotCQkJPHRkPjxzdHJvbmc+RmFpbHVyZXM8L3N0cm9uZz48L3RkPgotCQkJPHRkPjxzdHJvbmc+RXJyb3JzPC9zdHJvbmc+PC90ZD4KLQkJCTx0ZD48c3Ryb25nPlN1Y2Nlc3MgcmF0ZTwvc3Ryb25nPjwvdGQ+Ci0JCQk8dGQ+PHN0cm9uZz5UaW1lPC9zdHJvbmc+PC90ZD4KLQkJPC90cj4KLQkJPHRyIGJnY29sb3I9IiNFRUVFRSIgdmFsaWduPSJ0b3AiPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJPC94c2w6YXR0cmlidXRlPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KLQkJCTx0ZD4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3RkPgotCQkJPHRkPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3RkPgotCi0JCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI5NSUiPgotCQk8dHI+Ci0JCTx0ZAlzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgotCQlOb3RlOiA8ZW0+ZmFpbHVyZXM8L2VtPiBhcmUgYW50aWNpcGF0ZWQgYW5kIGNoZWNrZWQgZm9yIHdpdGggYXNzZXJ0aW9ucyB3aGlsZSA8ZW0+ZXJyb3JzPC9lbT4gYXJlIHVuYW50aWNpcGF0ZWQuCi0JCTwvdGQ+Ci0JCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCQotCQk8aDI+UGFja2FnZXM8L2gyPgotCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+Ci0JCQkJPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiIG9yZGVyPSJhc2NlbmRpbmciLz4KLQkJCQk8IS0tIGdldCB0aGUgbm9kZSBzZXQgY29udGFpbmluZyBhbGwgdGVzdHN1aXRlcyB0aGF0IGhhdmUgdGhlIHNhbWUgcGFja2FnZSAtLT4KLQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIi8+Ci0JCQkJPHRyIGJnY29sb3I9IiNFRUVFRSIgdmFsaWduPSJ0b3AiPgotCQkJCQk8IS0tIGRpc3BsYXkgYSBmYWlsdXJlIGlmIHRoZXJlIGlzIGFueSBmYWlsdXJlL2Vycm9yIGluIHRoZSBwYWNrYWdlIC0tPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0JCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQk8eHNsOndoZW4gdGVzdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BlcnJvcnMpICZndDsgMCI+RXJyb3I8L3hzbDp3aGVuPgotCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGZhaWx1cmVzKSAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgotCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCTwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHRkPjxhIGhyZWY9Int0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L2E+PC90ZD4KLQkJCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQHRlc3RzKSIvPjwvdGQ+Ci0JCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BlcnJvcnMpIi8+PC90ZD4KLQkJCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGZhaWx1cmVzKSIvPjwvdGQ+Ci0JCQkJCTx0ZD4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0B0aW1lKSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC90YWJsZT4KLQkJPC9ib2R5PgotCQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0JPGh0bWw+Ci0JCTxoZWFkPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvaGVhZD4KLQkJPGJvZHk+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotCQkJPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC9oMz4KLQkJCQotCQkJPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MubWV0cmljcy5oZWFkZXIiLz4KLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLQkJCTwvdGFibGUtLT4KLQkJCQotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnNhbWVwYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gJG5hbWVdIi8+Ci0JCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbnNhbWVwYWNrYWdlKSAmZ3Q7IDAiPgotCQkJCTxoMj5DbGFzc2VzPC9oMj4KLQkJCQk8cD4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+Ci0JCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGluc2FtZXBhY2thZ2UiIG1vZGU9InByaW50LnRlc3QiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLQkJCQkJPC94c2w6YXBwbHktdGVtcGxhdGVzPgotCQkJCTwvdGFibGU+Ci0JCQkJPC9wPgotCQkJPC94c2w6aWY+Ci0JCTwvYm9keT4KLQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tCi0gICAgdHJhbnNmb3JtIHN0cmluZyBsaWtlIGEuYi5jIHRvIC4uLy4uLy4uLwotICAgIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRyYW5zZm9ybSBpbnRvIGEgZGVzY2VuZGluZyBkaXJlY3RvcnkgcGF0aAotLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPgotCTx4c2w6cGFyYW0gbmFtZT0icGF0aCIvPgotCTx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHBhdGgsJy4nKSI+Ci0JCTx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgkKLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+CQotCTwveHNsOmlmPgotCTx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPgotCQk8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4JCi0JPC94c2w6aWY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGNyZWF0ZSB0aGUgbGluayB0byB0aGUgc3R5bGVzaGVldCBiYXNlZCBvbiB0aGUgcGFja2FnZSBuYW1lIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLQk8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvbGluaz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gUGFnZSBIRUFERVIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgotCTxoMT5Vbml0IFRlc3QgUmVzdWx0czwvaDE+Ci0JPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQk8dHI+Ci0JCTx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KLQkJPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9J2h0dHA6Ly93d3cuanVuaXQub3JnJz5KVW5pdDwvYT4gYW5kIDxhIGhyZWY9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcnPkFudDwvYT4uPC90ZD4KLQk8L3RyPgotCTwvdGFibGU+Ci0JPGhyIHNpemU9IjEiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGNsYXNzIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIj4KLQk8dHIgYmdjb2xvcj0iI0E2Q0FGMCIgdmFsaWduPSJ0b3AiPgotCQk8dGQgd2lkdGg9IjgwJSI+PHN0cm9uZz5OYW1lPC9zdHJvbmc+PC90ZD4KLQkJPHRkPjxzdHJvbmc+VGVzdHM8L3N0cm9uZz48L3RkPgotCQk8dGQ+PHN0cm9uZz5FcnJvcnM8L3N0cm9uZz48L3RkPgotCQk8dGQ+PHN0cm9uZz5GYWlsdXJlczwvc3Ryb25nPjwvdGQ+Ci0JCTx0ZCBub3dyYXA9Im5vd3JhcCI+PHN0cm9uZz5UaW1lKHMpPC9zdHJvbmc+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbWV0aG9kIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiPgotCTx0ciBiZ2NvbG9yPSIjQTZDQUYwIiB2YWxpZ249InRvcCI+Ci0JCTx0ZD48c3Ryb25nPk5hbWU8L3N0cm9uZz48L3RkPgotCQk8dGQ+PHN0cm9uZz5TdGF0dXM8L3N0cm9uZz48L3RkPgotCQk8dGQgd2lkdGg9IjgwJSI+PHN0cm9uZz5UeXBlPC9zdHJvbmc+PC90ZD4KLQkJPHRkIG5vd3JhcD0ibm93cmFwIj48c3Ryb25nPlRpbWUocyk8L3N0cm9uZz48L3RkPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGNsYXNzIGluZm9ybWF0aW9uIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJwcmludC50ZXN0Ij4KLQk8dHIgYmdjb2xvcj0iI0VFRUVFIiB2YWxpZ249InRvcCI+CQkKLQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IkBlcnJvcnNbLiZndDsgMF0iPkVycm9yPC94c2w6d2hlbj4KLQkJCQk8eHNsOndoZW4gdGVzdD0iQGZhaWx1cmVzWy4mZ3Q7IDBdIj5GYWlsdXJlPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDphdHRyaWJ1dGU+Ci0JCTx0ZD48YSBocmVmPSJ7QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdGVzdHMiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZXJyb3JzIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGZhaWx1cmVzIi8+PC90ZD4KLQkJPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ij4KLQk8dHIgYmdjb2xvcj0iI0VFRUVFIiB2YWxpZ249InRvcCI+Ci0JICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+RXJyb3I8L3hzbDp3aGVuPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIj5GYWlsdXJlPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT5UYWJsZVJvd0NvbG9yPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDphdHRyaWJ1dGU+Ci0JCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3RkPgotCQk8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIj4KLQkJCQk8dGQ+RmFpbHVyZTwvdGQ+Ci0JCQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmFpbHVyZSIvPjwvdGQ+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj4KLQkJCQk8dGQ+RXJyb3I8L3RkPgotCQkJCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImVycm9yIi8+PC90ZD4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8dGQ+U3VjY2VzczwvdGQ+Ci0JCQkJPHRkPjwvdGQ+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQkJPHRkPgotCQkgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB0aW1lIi8+Ci0JCSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIE5vdGUgOiB0aGUgYmVsb3cgdGVtcGxhdGUgZXJyb3IgYW5kIGZhaWx1cmUgYXJlIHRoZSBzYW1lIHN0eWxlCi0gICAgICAgICAgICBzbyBqdXN0IGNhbGwgdGhlIHNhbWUgc3R5bGUgc3RvcmUgaW4gdGhlIHRvb2xraXQgdGVtcGxhdGUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJmYWlsdXJlIj4KLQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVycm9yIj4KLQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gU3R5bGUgZm9yIHRoZSBlcnJvciBhbmQgZmFpbHVyZSBpbiB0aGUgdGVzdGNhc2UgdGVtcGxhdGUgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiPgotCTx4c2w6Y2hvb3NlPgotCQk8eHNsOndoZW4gdGVzdD0ibm90KEBtZXNzYWdlKSI+Ti9BPC94c2w6d2hlbj4KLQkJPHhzbDpvdGhlcndpc2U+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4KLQkJPC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLQk8IS0tIGRpc3BsYXkgdGhlIHN0YWNrdHJhY2UgLS0+Ci0JPGNvZGU+Ci0JCTxwLz4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iLiIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwvY29kZT4KLQk8IS0tIHRoZSBsYXR0ZXIgaXMgYmV0dGVyIGJ1dCBtaWdodCBiZSBwcm9ibGVtYXRpYyBmb3Igbm9uLTIxIiBtb25pdG9ycy4uLiAtLT4KLQk8IS0tcHJlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9wcmUtLT4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tCi0JdGVtcGxhdGUgdGhhdCB3aWxsIGNvbnZlcnQgYSBjYXJyaWFnZSByZXR1cm4gaW50byBhIGJyIHRhZwotCUBwYXJhbSB3b3JkIHRoZSB0ZXh0IGZyb20gd2hpY2ggdG8gY29udmVydCBDUiB0byBCUiB0YWcKLS0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmQiLz4KLQk8eHNsOmNob29zZT4KLQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCR3b3JkLCcmI3hBOycpIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCR3b3JkLCcmI3hBOycpIi8+Ci0JCQk8YnIvPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkd29yZCwnJiN4QTsnKSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC94c2w6d2hlbj4KLQkJPHhzbDpvdGhlcndpc2U+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmQiLz4KLQkJPC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgotCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMDAnKSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KLQk8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwJScpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci0JCmRpZmYgLS1naXQgYS9zcmMvZXRjL2p1bml0LW5vZnJhbWVzLnhzbCBiL3NyYy9ldGMvanVuaXQtbm9mcmFtZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU0MWNhLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvanVuaXQtbm9mcmFtZXMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldAl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVN0eWxlc2hlZXQgdG8gdHJhbnNmb3JtIGFuIFhNTCBmaWxlIGdlbmVyYXRlZCBieSB0aGUgQW50IE1BdWRpdCB0YXNrIGludG8KLQlhIHNldCBvZiBKYXZhRG9jLWxpa2UgSFRNTCBwYWdlIHRvIG1ha2UgcGFnZXMgbW9yZSBjb252ZW5pZW50IHRvIGJlIGJyb3dzZWQuCi0JCi0JSXQgdXNlIHRoZSBYYWxhbiByZWRpcmVjdCBleHRlbnNpb24gdG8gd3JpdGUgdG8gbXVsdGlwbGUgb3V0cHV0IGZpbGVzLgotCQotCU5vdGU6IEhUTUwgb3V0cHV0IGNhbiBiZSBtYWRlIG11Y2ggbW9yZSBjbGVhbiBieSByZW1vdmluZyBub24gY3NzIGF0dHJpYnV0ZXMKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci08eHNsOmRlY2ltYWwtZm9ybWF0IGRlY2ltYWwtc2VwYXJhdG9yPSIuIiBncm91cGluZy1zZXBhcmF0b3I9IiwiIC8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiPgotCTxIVE1MPgotCQk8SEVBRD4KLQkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLQkJQk9EWSB7Ci0JCQlmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7Ci0JCQljb2xvcjojMDAwMDAwOwotCQl9Ci0JCVRBQkxFIFRSIFRELCBUQUJMRSBUUiBUSCB7Ci0JCSAgICBmb250LXNpemU6IDY4JTsKLQkJfQotCQlUQUJMRS5kZXRhaWxzIFRSIFRIewotCQkJZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JCQl0ZXh0LWFsaWduOmxlZnQ7Ci0JCQliYWNrZ3JvdW5kOiNBNkNBRjA7Ci0JCX0KLQkJVEFCTEUuZGV0YWlscyBUUiBURHsKLQkJCWJhY2tncm91bmQ6I0VFRUVFMDsKLQkJfQotCQkKLQkJUCB7Ci0JCQlsaW5lLWhlaWdodDoxLjVlbTsKLQkJCW1hcmdpbi10b3A6MC41ZW07IG1hcmdpbi1ib3R0b206MS4wZW07Ci0JCX0KLQkJSDEgewotCQkJTUFSR0lOOiAwcHggMHB4IDVweDsgRk9OVDogMTY1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotCQl9Ci0JCUgyIHsKLQkJCU1BUkdJTi1UT1A6IDFlbTsgTUFSR0lOLUJPVFRPTTogMC41ZW07IEZPTlQ6IGJvbGQgMTI1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotCQl9Ci0JCUgzIHsKLQkJCU1BUkdJTi1CT1RUT006IDAuNWVtOyBGT05UOiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLQkJfQotCQlINCB7Ci0JCQlNQVJHSU4tQk9UVE9NOiAwLjVlbTsgRk9OVDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0JCX0KLQkJSDUgewotCQkJTUFSR0lOLUJPVFRPTTogMC41ZW07IEZPTlQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotCQl9Ci0JCUg2IHsKLQkJCU1BUkdJTi1CT1RUT006IDAuNWVtOyBGT05UOiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLQkJfQotCQkuRXJyb3IgewotCQkJZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cmVkOwotCQl9Ci0JCS5GYWlsdXJlIHsKLQkJCWZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnB1cnBsZTsKLQkJfQotCQk8L3N0eWxlPgotCQk8L0hFQUQ+Ci0JCTxib2R5PgotCQkJPGEgbmFtZT0iI3RvcCI+PC9hPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4JCi0JCQkKLQkJCTwhLS0gU3VtbWFyeSBwYXJ0IC0tPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1bW1hcnkiLz4KLQkJCTxociBzaXplPSIxIiB3aWR0aD0iOTUlIiBhbGlnbj0ibGVmdCIvPgotCQkJCi0JCQk8IS0tIFBhY2thZ2UgTGlzdCBwYXJ0IC0tPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2VsaXN0Ii8+Ci0JCQk8aHIgc2l6ZT0iMSIgd2lkdGg9Ijk1JSIgYWxpZ249ImxlZnQiLz4KLQkJCQotCQkJPCEtLSBGb3IgZWFjaCBwYWNrYWdlIGNyZWF0ZSBpdHMgcGFydCAtLT4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlcyIvPgotCQkJPGhyIHNpemU9IjEiIHdpZHRoPSI5NSUiIGFsaWduPSJsZWZ0Ii8+Ci0JCQkKLQkJCTwhLS0gRm9yIGVhY2ggY2xhc3MgY3JlYXRlIHRoZSAgcGFydCAtLT4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzIi8+Ci0JCQkKLQkJPC9ib2R5PgotCTwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotCQotCQotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gV3JpdGUgYSBsaXN0IG9mIGFsbCBwYWNrYWdlcyB3aXRoIGFuIGh5cGVybGluayB0byB0aGUgYW5jaG9yIG9mICAgIC0tPgotCTwhLS0gb2YgdGhlIHBhY2thZ2UgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZWxpc3QiPgkKLQkJPGgyPlBhY2thZ2VzPC9oMj4KLQkJTm90ZTogcGFja2FnZSBzdGF0aXN0aWNzIGFyZSBub3QgY29tcHV0ZWQgcmVjdXJzaXZlbHksIHRoZXkgb25seSBzdW0gdXAgYWxsIG9mIGl0cyB0ZXN0c3VpdGVzIG51bWJlcnMuCi0JCTx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotCQkJPCEtLSBsaXN0IGFsbCBwYWNrYWdlcyByZWN1cnNpdmVseSAtLT4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL3Rlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+Ci0JCQkJPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KLQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RzdWl0ZXMtaW4tcGFja2FnZSIgc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9IGN1cnJlbnQoKS9AcGFja2FnZV0iLz4KLQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0oJHRlc3RzdWl0ZXMtaW4tcGFja2FnZS9AdGVzdHMpIi8+Ci0JCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0BlcnJvcnMpIi8+Ci0JCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKCR0ZXN0c3VpdGVzLWluLXBhY2thZ2UvQGZhaWx1cmVzKSIvPgotCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0B0aW1lKSIvPgotCQkJCQotCQkJCTwhLS0gd3JpdGUgYSBzdW1tYXJ5IGZvciB0aGUgcGFja2FnZSAtLT4KLQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQk8IS0tIHNldCBhIG5pY2UgY29sb3IgZGVwZW5kaW5nIGlmIHRoZXJlIGlzIGFuIGVycm9yL2ZhaWx1cmUgLS0+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+Ci0JCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlcnJvckNvdW50ICZndDsgMCI+RXJyb3I8L3hzbDp3aGVuPgotCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQk8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx0ZD48YSBocmVmPSIje0BwYWNrYWdlfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+PC9hPjwvdGQ+Ci0JCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlc3RDb3VudCIvPjwvdGQ+Ci0JCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L3RkPgotCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmYWlsdXJlQ291bnQiLz48L3RkPgotCQkJCQk8dGQ+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiR0aW1lQ291bnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwvdGFibGU+CQkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFdyaXRlIGEgcGFja2FnZSBsZXZlbCByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEl0IGNyZWF0ZXMgYSB0YWJsZSB3aXRoIHZhbHVlcyBmcm9tIHRoZSBkb2N1bWVudDogICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIE5hbWUgfCBUZXN0cyB8IEVycm9ycyB8IEZhaWx1cmVzIHwgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2VzIj4KLQkJPCEtLSBjcmVhdGUgYW4gYW5jaG9yIHRvIHRoaXMgcGFja2FnZSBuYW1lIC0tPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KLQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0JCQkJPGEgbmFtZT0iI3tAcGFja2FnZX0iPjwvYT4KLQkJCQk8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L2gzPgotCQkJCQotCQkJCTx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+Ci0JCQkKLQkJCQkJPCEtLSBtYXRjaCB0aGUgdGVzdHN1aXRlcyBvZiB0aGlzIHBhY2thZ2UgLS0+Ci0JCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIiBtb2RlPSJwcmludC50ZXN0Ii8+Ci0JCQkJPC90YWJsZT4KLQkJCQk8YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT4KLQkJCQk8cC8+Ci0JCQkJPHAvPgotCQk8L3hzbDpmb3ItZWFjaD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzZXMiPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0idGVzdHN1aXRlIj4KLQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQk8IS0tIGNyZWF0ZSBhbiBhbmNob3IgdG8gdGhpcyBjbGFzcyBuYW1lIC0tPgotCQkJPGEgbmFtZT0iI3tAbmFtZX0iPjwvYT4KLQkJCTxoMz5UZXN0Q2FzZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2gzPgotCQkJCi0JCQk8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLQkJCQk8IS0tIEhlYWRlciAtLT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiLz4KLQotCQkJCTwhLS0gbWF0Y2ggdGhlIHRlc3RjYXNlcyBvZiB0aGlzIHBhY2thZ2UgLS0+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCIvPgotCQkJPC90YWJsZT4KLQkJCTxwLz4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvcGVydGllcyIvPgotCQkJCi0JCQk8YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT4KLQkJPC94c2w6Zm9yLWVhY2g+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdW1tYXJ5Ij4KLQkJPGgyPlN1bW1hcnk8L2gyPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0ZXN0cykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGVycm9ycykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZmFpbHVyZXMpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRpbWUpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2Vzc1JhdGUiIHNlbGVjdD0iKCR0ZXN0Q291bnQgLSAkZmFpbHVyZUNvdW50IC0gJGVycm9yQ291bnQpIGRpdiAkdGVzdENvdW50Ii8+Ci0JCTx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJPHRoPlRlc3RzPC90aD4KLQkJCTx0aD5GYWlsdXJlczwvdGg+Ci0JCQk8dGg+RXJyb3JzPC90aD4KLQkJCTx0aD5TdWNjZXNzIHJhdGU8L3RoPgotCQkJPHRoPlRpbWU8L3RoPgotCQk8L3RyPgotCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iJGZhaWx1cmVDb3VudCAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJPC94c2w6YXR0cmlidXRlPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KLQkJCTx0ZD4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3RkPgotCQkJPHRkPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3RkPgotCi0JCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI5NSUiPgotCQk8dHI+Ci0JCTx0ZAlzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgotCQlOb3RlOiA8aT5mYWlsdXJlczwvaT4gYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgPGk+ZXJyb3JzPC9pPiBhcmUgdW5hbnRpY2lwYXRlZC4KLQkJPC90ZD4KLQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9wZXJ0aWVzIj4KLQk8IS0tCi0JICAgIEkgaGF2ZSBOTyBpZGVhIGhvdyB0byBkaXNwbGF5IHByb3BlcnRpZXMgISA6LSgKLQkgICAgSXQgdGFrZXMgYW4gaW5jcmVkaWJsZSBhbW91bnQgb2Ygc3BhY2UgaW4gdGhlIHBhZ2UgYW5kIGl0J3MKLQkgICAgcmVhbGx5IHVucmVhZGFibGUuCi0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY291bnQiIHNlbGVjdD0iY291bnQocHJvcGVydHkpIi8+Ci0JICAgIDxoMz5TeXN0ZW0gUHJvcGVydGllczwvaDM+Ci0JCTx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJPHRoPk5hbWU8L3RoPgotCQkJPHRoPlZhbHVlPC90aD4KLQkJPC90cj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+Ci0JCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz48L3RkPgotCQkJPC90cj4KLQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwvdGFibGU+Ci0JLS0+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JCi08IS0tIFBhZ2UgSEVBREVSIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KLQk8aDE+VW5pdCBUZXN0IFJlc3VsdHM8L2gxPgotCTx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0JPHRyPgotCQk8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Ci0JCTx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSdodHRwOi8vd3d3Lmp1bml0Lm9yZyc+SlVuaXQ8L2E+IGFuZCA8YSBocmVmPSdodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2FudCc+QW50PC9hPi48L3RkPgotCTwvdHI+Ci0JPC90YWJsZT4KLQk8aHIgc2l6ZT0iMSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iaGVhZGVyIj4KLQk8dHIgdmFsaWduPSJ0b3AiPgotCQk8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+Ci0JCTx0aD5UZXN0czwvdGg+Ci0JCTx0aD5FcnJvcnM8L3RoPgotCQk8dGg+RmFpbHVyZXM8L3RoPgotCQk8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBjbGFzcyBoZWFkZXIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciI+Ci0JPHRyIHZhbGlnbj0idG9wIj4KLQkJPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgotCQk8dGg+VGVzdHM8L3RoPgotCQk8dGg+RXJyb3JzPC90aD4KLQkJPHRoPkZhaWx1cmVzPC90aD4KLQkJPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbWV0aG9kIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiPgotCTx0ciB2YWxpZ249InRvcCI+Ci0JCTx0aD5OYW1lPC90aD4KLQkJPHRoPlN0YXR1czwvdGg+Ci0JCTx0aCB3aWR0aD0iODAlIj5UeXBlPC90aD4KLQkJPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0icHJpbnQudGVzdCI+Ci0JPHRyIHZhbGlnbj0idG9wIj4KLQkJPCEtLSBzZXQgYSBuaWNlIGNvbG9yIGRlcGVuZGluZyBpZiB0aGVyZSBpcyBhbiBlcnJvci9mYWlsdXJlIC0tPgotCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iQGZhaWx1cmVzWy4mZ3Q7IDBdIj5GYWlsdXJlPC94c2w6d2hlbj4KLQkJCQk8eHNsOndoZW4gdGVzdD0iQGVycm9yc1suJmd0OyAwXSI+RXJyb3I8L3hzbDp3aGVuPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDphdHRyaWJ1dGU+Ci0JCi0JCTwhLS0gcHJpbnQgdGVzdHN1aXRlIGluZm9ybWF0aW9uIC0tPgotCQk8dGQ+PGEgaHJlZj0iI3tAbmFtZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgotCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0ZXN0cyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGVycm9ycyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZhaWx1cmVzIi8+PC90ZD4KLQkJPHRkPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB0aW1lIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L3RkPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiPgotCTx0ciB2YWxpZ249InRvcCI+Ci0JCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIHwgZXJyb3IiPkVycm9yPC94c2w6d2hlbj4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6YXR0cmlidXRlPgotCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KLQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+Ci0JCQkJPHRkPkZhaWx1cmU8L3RkPgotCQkJCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZhaWx1cmUiLz48L3RkPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+Ci0JCQkJPHRkPkVycm9yPC90ZD4KLQkJCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlcnJvciIvPjwvdGQ+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPHRkPlN1Y2Nlc3M8L3RkPgotCQkJCTx0ZD48L3RkPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JCTx0ZD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBOb3RlIDogdGhlIGJlbG93IHRlbXBsYXRlIGVycm9yIGFuZCBmYWlsdXJlIGFyZSB0aGUgc2FtZSBzdHlsZQotCQkJc28ganVzdCBjYWxsIHRoZSBzYW1lIHN0eWxlIHN0b3JlIGluIHRoZSB0b29sa2l0IHRlbXBsYXRlIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZmFpbHVyZSI+Ci0JPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJlcnJvciI+Ci0JPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFN0eWxlIGZvciB0aGUgZXJyb3IgYW5kIGZhaWx1cmUgaW4gdGhlIHRlc2Nhc2UgdGVtcGxhdGUgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiPgotCTx4c2w6Y2hvb3NlPgotCQk8eHNsOndoZW4gdGVzdD0ibm90KEBtZXNzYWdlKSI+Ti9BPC94c2w6d2hlbj4KLQkJPHhzbDpvdGhlcndpc2U+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4KLQkJPC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLQk8IS0tIGRpc3BsYXkgdGhlIHN0YWNrdHJhY2UgLS0+Ci0JPGNvZGU+Ci0JCTxwLz4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iLiIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwvY29kZT4KLQk8IS0tIHRoZSBsYXRlciBpcyBiZXR0ZXIgYnV0IG1pZ2h0IGJlIHByb2JsZW1hdGljIGZvciBub24tMjEiIG1vbml0b3JzLi4uIC0tPgotCTwhLS1wcmU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3ByZS0tPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0KLQl0ZW1wbGF0ZSB0aGF0IHdpbGwgY29udmVydCBhIGNhcnJpYWdlIHJldHVybiBpbnRvIGEgYnIgdGFnCi0JQHBhcmFtIHdvcmQgdGhlIHRleHQgZnJvbSB3aGljaCB0byBjb252ZXJ0IENSIHRvIEJSIHRhZwotLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgotCTx4c2w6cGFyYW0gbmFtZT0id29yZCIvPgotCTx4c2w6Y2hvb3NlPgotCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHdvcmQsJyYjeEE7JykiPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHdvcmQsJyYjeEE7JykiLz4KLQkJCTxici8+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCR3b3JkLCcmI3hBOycpIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L3hzbDp3aGVuPgotCQk8eHNsOm90aGVyd2lzZT4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29yZCIvPgotCQk8L3hzbDpvdGhlcndpc2U+Ci0JPC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLQk8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwMCcpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgotCTx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KLQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS9zcmMvZXRjL2xvZy54c2wgYi9zcmMvZXRjL2xvZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDQwN2UuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy9sb2cueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvVFIvV0QteHNsIiB4bWxuczpIVE1MPSJodHRwOi8vd3d3LnczLm9yZy9Qcm9maWxlcy9YSFRNTC10cmFuc2l0aW9uYWwiPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQk8aHRtbD4KLQkJPGJvZHk+Ci0JCQk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0JCTwvYm9keT4KLQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiI+Ci0JPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImJ1aWxkIj4KLQk8Y2VudGVyPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDQ0MiPjx0cj4KLQkJCTx4c2w6aWYgdGVzdD0iLltAZXJyb3JdIj4KLQkJCQk8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIzMCUiPjxiPkJ1aWxkIEZhaWxlZDwvYj48L3RkPiAKLQkJCQk8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjQwJSI+PGI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlcnJvciIvPjwvYj48L3RkPgotCQkJPC94c2w6aWY+Ci0JCQk8eHNsOmlmIHRlc3Q9Ii5bbm90KEBlcnJvcildIj4KLQkJCQk8dGQ+PGI+QnVpbGQgQ29tcGxldGU8L2I+PC90ZD4KLQkJCTwveHNsOmlmPgotCQkJPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjMwJSI+PGI+VG90YWwgVGltZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aW1lIi8+PC9iPjwvdGQ+Ci0JCTwvdHI+PC90YWJsZT4KLQkJCi0JCTxici8+Ci0JCTx0YWJsZSA+Ci0JCQk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0JCTwvdGFibGU+Ci0JCQotCTwvY2VudGVyPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVzc2FnZVtAcHJpb3JpdHkhPSdkZWJ1ZyddIj4KLQk8dHIgdmFsaWduPSJ0b3AiPgotCQkKLQkJPHRkPjxiPjxwcmU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0Bsb2NhdGlvbiIvPjwvcHJlPjwvYj48L3RkPgotCQk8dGQ+PGI+PHByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz48L3ByZT48L2I+PC90ZD4KLQotCQk8dGQ+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJTVFlMRSI+Y29sb3I6Ci0JCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJAcHJpb3JpdHlbLj0nZXJyb3InXSI+cmVkPC94c2w6d2hlbj4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IkBwcmlvcml0eVsuPSd3YXJuJ10iPmJyb3duPC94c2w6d2hlbj4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IkBwcmlvcml0eVsuPSdpbmZvJ10iPmdyYXk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iQHByaW9yaXR5Wy49J2RlYnVnJ10iPmdyYXk8L3hzbDp3aGVuPgotCQkJCTwveHNsOmNob29zZT4KLQkJCTwveHNsOmF0dHJpYnV0ZT4KLQkJCTxwcmU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPjwvcHJlPgotCQk8L3RkPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvZXRjL21hbmlmZXN0IGIvc3JjL2V0Yy9tYW5pZmVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3YmUzMy4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL21hbmlmZXN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLU1haW4tQ2xhc3M6IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4KLUNsYXNzLVBhdGg6IGpheHAuamFyIHBhcnNlci5qYXIgY3JpbXNvbi5qYXIgb3B0aW9uYWwuamFyIHhhbGFuLmphcgotCi0KZGlmZiAtLWdpdCBhL3NyYy9ldGMvbWF1ZGl0LWZyYW1lcy54c2wgYi9zcmMvZXRjL21hdWRpdC1mcmFtZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmVkOGUxLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvbWF1ZGl0LWZyYW1lcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0CXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotCXhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLnhzbHQuZXh0ZW5zaW9ucy5SZWRpcmVjdCIKLQlleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFN0eWxlc2hlZXQgdG8gdHJhbnNmb3JtIGFuIFhNTCBmaWxlIGdlbmVyYXRlZCBieSB0aGUgQW50IE1BdWRpdCB0YXNrIGludG8KLSAgICBhIHNldCBvZiBKYXZhRG9jLWxpa2UgSFRNTCBwYWdlIHRvIG1ha2UgcGFnZXMgbW9yZSBjb252ZW5pZW50IHRvIGJlIGJyb3dzZWQuCi0gICAgCi0gICAgSXQgdXNlIHRoZSBYYWxhbiByZWRpcmVjdCBleHRlbnNpb24gdG8gd3JpdGUgdG8gbXVsdGlwbGUgb3V0cHV0IGZpbGVzLgotICAgIAotICAgIE5vdGU6IEhUTUwgb3V0cHV0IGNhbiBiZSBtYWRlIG11Y2ggbW9yZSBjbGVhbiBieSByZW1vdmluZyBub24gY3NzIGF0dHJpYnV0ZXMKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08eHNsOm91dHB1dAltZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci08eHNsOmRlY2ltYWwtZm9ybWF0IGRlY2ltYWwtc2VwYXJhdG9yPSIuIiBncm91cGluZy1zZXBhcmF0b3I9IiwiIC8+Ci0KLTwhLS0KLSAgICBYYWxhbiByZWRpcmVjdCBleHRlbnNpb24gd3JpdGVzIHJlbGF0aXZlIGZpbGUgYmFzZWQgb24gdGhlIHBhcmVudCBkaXJlY3RvcnkKLSAgICBmcm9tIHRoZSBtYWluIG91dHB1dCBmaWxlLCB1bmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5ldmVyIHNldCBhbmQgeW91IGhhdmUKLSAgICB0byBkbyBpdCB5b3Vyc2VsZiBvbiB0aGUgQVBJLiBUaGUgY29kZSB0aGF0IGRvZXMgaXQgaW4gY29tbWFuZCBsaW5lIHdhcwotICAgIGNvbW1lbnRlZCBvdXQgaW4gWGFsYW4gMS4yLjIgOi0oCi0gICAgCi0gICAgVGhlcmVmb3JlIEkgd2lsbCB1c2UgYSBzdHlsZXNoZWV0IHBhcmFtIGZvciB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KLSAgICAKLSAgICBUaGlzIGhhcyB0byBiZSBpbnZva2VkIGFzIGZvbGxvd3MgZnJvbSB0aGUgY29tbWFuZCBsaW5lOgotICAgIAotICAgIGphdmEgLWNsYXNzcGF0aCBic2YuamFyO3hhbGFuLmphcjt4ZXJjZXMuamFyIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1JTiBtYXVkaXQueG1sIC1YU0wgbWF1ZGl0LnhzbCAtUEFSQU0gb3V0cHV0LmRpciAnLi9yZXBvcnQnCi0tLT4KLTx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzc2VzIj4KLQk8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KLQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9pbmRleC5odG1sIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiLz4KLQk8L3JlZGlyZWN0OndyaXRlPgotCi0JPCEtLSBjcmVhdGUgdGhlIHN0eWxlc2hlZXQuY3NzIC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQotCTwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiLz4KLQk8L3JlZGlyZWN0OndyaXRlPgotCi0JPCEtLSBjcmVhdGUgdGhlIGFsbC1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5wYWNrYWdlcyIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsY2xhc3Nlcy1mcmFtZS5odG1sIj4KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KLQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi9jbGFzc1tub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjpjbGFzcy9AcGFja2FnZSldIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2UiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZSI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLmRpciI+Ci0JCTx4c2w6aWYgdGVzdD0ibm90KCRuYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRuYW1lLCcuJywnLycpIi8+PC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+LjwveHNsOmlmPgotCTwveHNsOnZhcmlhYmxlPgkKLQk8IS0tUHJvY2Vzc2luZyBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dC5kaXIiLz4gLS0+Ci0JPCEtLSBjcmVhdGUgYSBjbGFzc2VzLWxpc3QuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1mcmFtZS5odG1sIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBjcmVhdGUgYSBwYWNrYWdlLXN1bW1hcnkuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQkKLQk8IS0tIGZvciBlYWNoIGNsYXNzLCBjcmVhdGVzIGEgQG5hbWUuaHRtbCAtLT4KLQk8IS0tIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCBpbm5lciBjbGFzc2VzIGhhdmluZyB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIC0tPgotCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvY2xhc3Nlcy9jbGFzc1tAcGFja2FnZSA9ICRuYW1lXSI+Ci0JCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0uaHRtbCI+Ci0JCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiLz4KLQkJPC9yZWRpcmVjdDp3cml0ZT4KLQk8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgotPEhUTUw+Ci0JPEhFQUQ+PFRJVExFPkF1ZGl0IFJlc3VsdHMuPC9USVRMRT48L0hFQUQ+Ci0JPEZSQU1FU0VUIGNvbHM9IjIwJSw4MCUiPgotCQk8RlJBTUVTRVQgcm93cz0iMzAlLDcwJSI+Ci0JCQk8RlJBTUUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+Ci0JCQk8RlJBTUUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+Ci0JCTwvRlJBTUVTRVQ+Ci0JCTxGUkFNRSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgotCTwvRlJBTUVTRVQ+Ci0JPG5vZnJhbWVzPgotCQk8SDI+RnJhbWUgQWxlcnQ8L0gyPgotCQk8UD4KLQkJVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi0JCTwvUD4KLQk8L25vZnJhbWVzPgotPC9IVE1MPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Ci1CT0RZIHsKLQlmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7Ci0JY29sb3I6IzAwMDAwMDsKLX0KLVREIHsKLQlGT05ULVNJWkU6IDY4JQotfQotUCB7Ci0JbGluZS1oZWlnaHQ6MS41ZW07Ci0JbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKLX0KLUgxIHsKLQlNQVJHSU46IDBweCAwcHggNXB4OyBGT05UOiAxNjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1IMiB7Ci0JTUFSR0lOLVRPUDogMWVtOyBNQVJHSU4tQk9UVE9NOiAwLjVlbTsgRk9OVDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1IMyB7Ci0JTUFSR0lOLUJPVFRPTTogMC41ZW07IEZPTlQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotSDQgewotCU1BUkdJTi1CT1RUT006IDAuNWVtOyBGT05UOiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLX0KLUg1IHsKLQlNQVJHSU4tQk9UVE9NOiAwLjVlbTsgRk9OVDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1INiB7Ci0JTUFSR0lOLUJPVFRPTTogMC41ZW07IEZPTlQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBwcmludCB0aGUgdmlvbGF0aW9ucyBvZiB0aGUgY2xhc3MgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iY2xhc3MuZGV0YWlscyI+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KLQk8SFRNTD4KLQkJPEhFQUQ+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L0hFQUQ+Ci0JCTxCT0RZPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4JCi0JCQk8SDM+Q2xhc3MgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4uPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9IMz4KLQotCQkJCi0JCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzcy5hdWRpdC5oZWFkZXIiLz4KLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50LmF1ZGl0Ii8+Ci0JCQk8L3RhYmxlPgotCQotCQkJPEgyPlZpb2xhdGlvbnM8L0gyPgotCQkJPHA+Ci0JCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ2aW9sYXRpb24uYXVkaXQuaGVhZGVyIi8+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Zpb2xhdGlvbiIgbW9kZT0icHJpbnQuYXVkaXQiPgotCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJudW1iZXIiIHNlbGVjdD0iQGxpbmUiLz4KLQkJCQk8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0JCQk8L3RhYmxlPgotCQkJCi0JCQk8L3A+Ci0JCTwvQk9EWT4KLQk8L0hUTUw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0JPEhUTUw+Ci0JCTxIRUFEPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvSEVBRD4KLQkJPEJPRFk+Ci0JCQk8dGFibGUgd2lkdGg9IjEwMCUiPgotCQkJCTx0cj4KLQkJCQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KLQkJCQkJCTxIMj48YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L2E+PC9IMj4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJPC90YWJsZT4KLQkKLQkJCTxIMj5DbGFzc2VzPC9IMj4KLQkJCTxwPgotCQkJPFRBQkxFIFdJRFRIPSIxMDAlIj4KLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii9jbGFzc2VzL2NsYXNzWy4vQHBhY2thZ2UgPSAkbmFtZV0iIG1vZGU9ImNsYXNzZXMubGlzdCI+Ci0JCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQkJPC94c2w6YXBwbHktdGVtcGxhdGVzPgotCQkJPC9UQUJMRT4KLQkJCTwvcD4KLQkJPC9CT0RZPgotCTwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotPCEtLSB0aGUgY2xhc3MgdG8gbGlzdCAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJjbGFzc2VzLmxpc3QiPgotCTx0cj4KLQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KLQkJCTwhLS0gQGJ1ZyBuYW1pbmcgdG8gZml4IGZvciBpbm5lciBjbGFzc2VzIC0tPgotCQkJPGEgaHJlZj0ie0BuYW1lfS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KLQkJPC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotCUNyZWF0ZXMgYW4gYWxsLWNsYXNzZXMuaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbAotCW9uIGVhY2ggY2xhc3MuCi0tLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzZXMiIG1vZGU9ImFsbC5jbGFzc2VzIj4KLQk8aHRtbD4KLQkJPGhlYWQ+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC9oZWFkPgotCQk8Ym9keT4KLQkJCTxoMj5DbGFzc2VzPC9oMj4KLQkJCTxwPgotCQkJPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL2NsYXNzIiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0JCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQkJPC94c2w6YXBwbHktdGVtcGxhdGVzPgotCQkJPC90YWJsZT4KLQkJCTwvcD4KLQkJPC9ib2R5PgotCTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICAgIDwhLS0gKGFuY2VzdG9yOjpwYWNrYWdlKVtsYXN0KCldIGlzIGJ1Z2d5IGluIE1TWE1MMyA/IC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0JPHRyPgotCQk8dGQgbm93cmFwPSJub3dyYXAiPgotCQkJPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0nJykiPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgotCQkJCQk8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgotCQkJCTwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLQkJCTwvYT4KLQkJPC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotCUNyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbCBmaWxlcyBvbgotCWVhY2ggcGFja2FnZSBleGlzdGluZyBvbiB0ZXN0c3VpdGVzLgotCUBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzc2VzIiBtb2RlPSJhbGwucGFja2FnZXMiPgotCTxodG1sPgotCQk8aGVhZD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L2hlYWQ+Ci0JCTxib2R5PgotCQkJPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+Ci0JCQk8aDI+UGFja2FnZXM8L2gyPgotCQkJPHA+Ci0JCQkJPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjbGFzc1tub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjpjbGFzcy9AcGFja2FnZSldIiBtb2RlPSJhbGwucGFja2FnZXMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiIG9yZGVyPSJhc2NlbmRpbmciLz4KLQkJCQkJPC94c2w6YXBwbHktdGVtcGxhdGVzPgotCQkJCTwvdGFibGU+Ci0JCQk8L3A+Ci0JCTwvYm9keT4KLQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3MiIG1vZGU9ImFsbC5wYWNrYWdlcyI+Ci0JPHRyPgotCQk8dGQgbm93cmFwPSJub3dyYXAiPgotCQkJPGEgaHJlZj0ie3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0JCQk8L2E+Ci0JCTwvdGQ+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzZXMiIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIj4KLQk8aHRtbD4KLQkJPGhlYWQ+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC9oZWFkPgotCQk8Ym9keSBvbmxvYWQ9Im9wZW4oJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJykiPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotCQk8aDI+U3VtbWFyeTwvaDI+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCTx0ciBiZ2NvbG9yPSIjQTZDQUYwIiB2YWxpZ249InRvcCI+Ci0JCQk8dGQ+PGI+QXVkaXRlZCBjbGFzc2VzPC9iPjwvdGQ+Ci0JCQk8dGQ+PGI+UmVwb3J0ZWQgY2xhc3NlczwvYj48L3RkPgotCQkJPHRkPjxiPlZpb2xhdGlvbnM8L2I+PC90ZD4KLQkJPC90cj4KLQkJPHRyIGJnY29sb3I9IiNFRUVFRSIgdmFsaWduPSJ0b3AiPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXVkaXRlZCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZXBvcnRlZCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2aW9sYXRpb25zIi8+PC90ZD4KLQkJPC90cj4KLQkJPC90YWJsZT4KLQkJPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9Ijk1JSI+Ci0JCTx0cj4KLQkJPHRkCXN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+Ci0JCU5vdGU6IFJ1bGVzIGNoZWNrZWQgaGF2ZSBvcmlnaW5hdGVkIGZyb20gc3R5bGUgZ3VpZGVsaW5lcyBzdWdnZXN0ZWQgYnkgdGhlIGxhbmd1YWdlIGRlc2lnbmVycywKLQkJZXhwZXJpZW5jZSBmcm9tIHRoZSBKYXZhIGRldmVsb3BtZW50IGNvbW11bml0eSBhbmQgaW5zaXRlIGV4cGVyaWVuY2UuIFZpb2xhdGlvbnMgYXJlIGdlbmVyYWxseQotCQlyZXBvcnRlZCB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvalRPQy5kb2MuaHRtbCI+SmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uczwvYT4gKEpMUyB4LngueCkKLQkJYW5kIE1ldGFtYXRhIEF1ZGl0IHJ1bGVzICh4LngpLgotCQlQbGVhc2UgY29uc3VsdCB0aGVzZSBkb2N1bWVudHMgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdmlvbGF0aW9ucy4KLQkJPHAvPgotCQlPbmUgc2hvdWxkIG5vdGUgdGhhdCB0aGVzZSB2aW9sYXRpb25zIGRvIG5vdCBuZWNlc3NhcnkgdW5kZXJsaW5lIGVycm9ycyBidXQgc2hvdWxkIGJlIHVzZWQKLQkJYXMgYW4gaW5kaWNhdGlvbiBmb3IgPGk+cG9zc2libGU8L2k+IGVycm9ycy4gQXMgYWx3YXlzLCB1c2UgeW91ciBiZXN0IGp1ZGdtZW50IGFuZCByZXZpZXcKLQkJdGhlbSBjYXJlZnVsbHksIGl0IG1pZ2h0IHNhdmUgeW91IGhvdXJzIG9mIGRlYnVnZ2luZy4KLQkJPC90ZD4KLQkJPC90cj4KLQkJPC90YWJsZT4KLQotCQk8aDI+UGFja2FnZXM8L2gyPgotCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzLmF1ZGl0LmhlYWRlciIvPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNsYXNzW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OmNsYXNzL0BwYWNrYWdlKV0iPgotCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIiBvcmRlcj0iYXNjZW5kaW5nIi8+Ci0JCQkJPHRyIGJnY29sb3I9IiNFRUVFRSIgdmFsaWduPSJ0b3AiPgotCQkJCQk8dGQ+PGEgaHJlZj0ie3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwvYT48L3RkPgotCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgvY2xhc3Nlcy9jbGFzc1suL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXS9AdmlvbGF0aW9ucykiLz48L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC90YWJsZT4KLQkJPC9ib2R5PgotCQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0JPEhUTUw+Ci0JCTxIRUFEPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvSEVBRD4KLQkJPEJPRFk+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotCQkJPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC9oMz4KLQkJCQotCQkJPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MubWV0cmljcy5oZWFkZXIiLz4KLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLQkJCTwvdGFibGUtLT4KLQkJCQotCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgvY2xhc3Nlcy9jbGFzc1suL0BwYWNrYWdlID0gJG5hbWVdKSAmZ3Q7IDAiPgotCQkJCTxIMj5DbGFzc2VzPC9IMj4KLQkJCQk8cD4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MuYXVkaXQuaGVhZGVyIi8+Ci0JCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iL2NsYXNzZXMvY2xhc3NbLi9AcGFja2FnZSA9ICRuYW1lXSIgbW9kZT0icHJpbnQuYXVkaXQiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLQkJCQkJPC94c2w6YXBwbHktdGVtcGxhdGVzPgotCQkJCTwvdGFibGU+Ci0JCQkJPC9wPgotCQkJPC94c2w6aWY+Ci0JCTwvQk9EWT4KLQk8L0hUTUw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tCi0gICAgdHJhbnNmb3JtIHN0cmluZyBsaWtlIGEuYi5jIHRvIC4uLy4uLy4uLwotICAgIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRyYW5zZm9ybSBpbnRvIGEgZGVzY2VuZGluZyBkaXJlY3RvcnkgcGF0aAotLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPgotCTx4c2w6cGFyYW0gbmFtZT0icGF0aCIvPgotCTx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHBhdGgsJy4nKSI+Ci0JCTx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgkKLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+CQotCTwveHNsOmlmPgotCTx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPgotCQk8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4JCi0JPC94c2w6aWY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGNyZWF0ZSB0aGUgbGluayB0byB0aGUgc3R5bGVzaGVldCBiYXNlZCBvbiB0aGUgcGFja2FnZSBuYW1lIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLQk8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotCTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBUSVRMRT0iU3R5bGUiPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48L3hzbDppZj5zdHlsZXNoZWV0LmNzczwveHNsOmF0dHJpYnV0ZT48L0xJTks+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIFBhZ2UgSEVBREVSIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KLQk8aDE+QXVkaXQgUmVzdWx0czwvaDE+Ci0JPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQk8dHI+Ci0JCTx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KLQkJPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9J2h0dHA6Ly93d3cud2ViZ2Fpbi5jb20vcHJvZHVjdHMvcXVhbGl0eV9hbmFseXplci8nPldlYmdhaW4gUUEvTWV0YW1hdGEgQXVkaXQ8L2E+IGFuZCA8YSBocmVmPSdodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnJz5BbnQ8L2E+LjwvdGQ+Ci0JPC90cj4KLQk8L3RhYmxlPgotCTxociBzaXplPSIxIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBjbGFzcyBoZWFkZXIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzLmF1ZGl0LmhlYWRlciI+Ci0JPHRyIGJnY29sb3I9IiNBNkNBRjAiIHZhbGlnbj0idG9wIj4KLQkJPHRkIHdpZHRoPSI4MCUiPjxiPk5hbWU8L2I+PC90ZD4KLQkJPHRkPjxiPlZpb2xhdGlvbnM8L2I+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbWV0aG9kIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0idmlvbGF0aW9uLmF1ZGl0LmhlYWRlciI+Ci0JPHRyIGJnY29sb3I9IiNBNkNBRjAiIHZhbGlnbj0idG9wIj4KLQkJPHRkPjxiPkxpbmU8L2I+PC90ZD4KLQkJPHRkPjxiPk1lc3NhZ2U8L2I+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJwcmludC5hdWRpdCI+Ci0JPHRyIGJnY29sb3I9IiNFRUVFRSIgdmFsaWduPSJ0b3AiPgkJCi0JCTx0ZD48YSBocmVmPSJ7QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdmlvbGF0aW9ucyIvPjwvdGQ+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ2aW9sYXRpb24iIG1vZGU9InByaW50LmF1ZGl0Ij4KLQk8dHIgYmdjb2xvcj0iI0VFRUVFIiB2YWxpZ249InRvcCI+CQkKLQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGluZSIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBtZXNzYWdlIi8+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPC94c2w6c3R5bGVzaGVldD4KLQkKZGlmZiAtLWdpdCBhL3NyYy9ldGMvbW1ldHJpY3MtZnJhbWVzLnhzbCBiL3NyYy9ldGMvbW1ldHJpY3MtZnJhbWVzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyYTYzMy4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL21tZXRyaWNzLWZyYW1lcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0CXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotCXhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4iCi0JeG1sbnM6cmVkaXJlY3Q9Im9yZy5hcGFjaGUueGFsYW4ueHNsdC5leHRlbnNpb25zLlJlZGlyZWN0IgotCWV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4YWxhbiIKLQlleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgotCi08IS0tCi0JRm9yIHhhbGFuIDEuMi4yCi0JeG1sbnM6eGFsYW4tbm9kZXNldD0ib3JnLmFwYWNoZS54YWxhbi54c2x0LmV4dGVuc2lvbnMuTm9kZXNldCIKLS0tPgotPHhzbDpvdXRwdXQJbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIvPgotPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIiAvPgotCi08IS0tCi0gICAgWGFsYW4gcmVkaXJlY3QgZXh0ZW5zaW9uIHdyaXRlcyByZWxhdGl2ZSBmaWxlIGJhc2VkIG9uIHRoZSBwYXJlbnQgZGlyZWN0b3J5Ci0gICAgZnJvbSB0aGUgbWFpbiBvdXRwdXQgZmlsZSwgdW5mb3J0dW5hdGVseSwgdGhpcyBpcyBuZXZlciBzZXQgYW5kIHlvdSBoYXZlCi0gICAgdG8gZG8gaXQgeW91cnNlbGYgb24gdGhlIEFQSS4gVGhlIGNvZGUgdGhhdCBkb2VzIGl0IGluIGNvbW1hbmQgbGluZSB3YXMKLSAgICBjb21tZW50ZWQgb3V0IGluIFhhbGFuIDEuMi4yIDotKAotICAgIAotICAgIFRoZXJlZm9yZSBJIHdpbGwgdXNlIGEgc3R5bGVzaGVldCBwYXJhbSBmb3IgdGhlIG91dHB1dCBkaXJlY3RvcnkuCi0gICAgCi0gICAgVGhpcyBoYXMgdG8gYmUgaW52b2tlZCBhcyBmb2xsb3dzIGZyb20gdGhlIGNvbW1hbmQgbGluZToKLSAgICAKLSAgICBqYXZhIC1jbGFzc3BhdGggYnNmLmphcjt4YWxhbi5qYXI7eGVyY2VzLmphciBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyAtSU4gbWV0cmljcy54bWwgLVhTTCBtZXRyaWNzLnhzbCAtUEFSQU0gb3V0cHV0LmRpciAnLi9yZXBvcnQnCi0tLT4KLTx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KLQotPCEtLSBkZWZhdWx0IG1heCB2YWx1ZSBmb3IgdGhlIG1ldHJpY3MgLS0+Ci08eHNsOnBhcmFtIG5hbWU9InZnLm1heCIgc2VsZWN0PSIxMCIvPgotPHhzbDpwYXJhbSBuYW1lPSJsb2MubWF4IiBzZWxlY3Q9IjEwMDAiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZGl0Lm1heCIgc2VsZWN0PSIxMCIvPgotPHhzbDpwYXJhbSBuYW1lPSJub2EubWF4IiBzZWxlY3Q9IjI1MCIvPgotPHhzbDpwYXJhbSBuYW1lPSJucm0ubWF4IiBzZWxlY3Q9IjUwIi8+Ci08eHNsOnBhcmFtIG5hbWU9Im5sbS5tYXgiIHNlbGVjdD0iMjUwIi8+Ci08eHNsOnBhcmFtIG5hbWU9IndtYy5tYXgiIHNlbGVjdD0iMjUwIi8+Ci08eHNsOnBhcmFtIG5hbWU9InJmYy5tYXgiIHNlbGVjdD0iNTAiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZGFjLm1heCIgc2VsZWN0PSIxMCIvPgotPHhzbDpwYXJhbSBuYW1lPSJmYW5vdXQubWF4IiBzZWxlY3Q9IjEwIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImNiby5tYXgiIHNlbGVjdD0iMTUiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibGNvbS5tYXgiIHNlbGVjdD0iMTAiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibm9jbC5tYXgiIHNlbGVjdD0iMTAiLz4KLQotCi08IS0tIGNyZWF0ZSBhIHRyZWUgZnJhZ21lbnQgLS0+Ci08eHNsOnZhcmlhYmxlIG5hbWU9ImRvY3RyZWUudmFyIj4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY2xhc3NlcyI+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLy9jbGFzcyI+Ci0gICAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhY2thZ2UiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iKGFuY2VzdG9yOjpwYWNrYWdlKVtsYXN0KCldL0BuYW1lIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IkAqIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ci0JCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3MubmFtZSIvPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0ibWV0aG9kIi8+Ci0gICAgICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L3hzbDplbGVtZW50PgotPC94c2w6dmFyaWFibGU+Ci0KLTx4c2w6dmFyaWFibGUgbmFtZT0iZG9jdHJlZSIgc2VsZWN0PSJ4YWxhbjpub2Rlc2V0KCRkb2N0cmVlLnZhcikiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0cmljcyI+Ci0KLQk8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KLQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9pbmRleC5odG1sIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiLz4KLQk8L3JlZGlyZWN0OndyaXRlPgotCi0JPCEtLSBjcmVhdGUgdGhlIHN0eWxlc2hlZXQuY3NzIC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQotCTwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiLz4KLQk8L3JlZGlyZWN0OndyaXRlPgotCi0JPCEtLSBjcmVhdGUgdGhlIGFsbC1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5wYWNrYWdlcyIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0JPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsY2xhc3Nlcy1mcmFtZS5odG1sIj4KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgotCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JCi0JPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3BhY2thZ2UiLz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiPgotCTx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLmRpciI+Ci0JCTx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJHBhY2thZ2UubmFtZSwnLicsJy8nKSIvPjwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJyI+LjwveHNsOmlmPgotCTwveHNsOnZhcmlhYmxlPgkKLQk8eHNsOm1lc3NhZ2U+UHJvY2Vzc2luZyBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dC5kaXIiLz4KLQk8L3hzbDptZXNzYWdlPgotCTwhLS0gY3JlYXRlIGEgY2xhc3Nlcy1saXN0Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgotCTxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2UtZnJhbWUuaHRtbCI+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3Nlcy5saXN0Ii8+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQkKLQk8IS0tIGNyZWF0ZSBhIHBhY2thZ2Utc3VtbWFyeS5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KLQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icGFja2FnZS5zdW1tYXJ5Ii8+Ci0JPC9yZWRpcmVjdDp3cml0ZT4KLQkKLQk8IS0tIGZvciBlYWNoIGNsYXNzLCBjcmVhdGVzIGEgQG5hbWUuaHRtbCAtLT4KLQk8IS0tIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCBpbm5lciBjbGFzc2VzIGhhdmluZyB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIC0tPgotCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9jdHJlZS9jbGFzc2VzL2NsYXNzW0BwYWNrYWdlID0gY3VycmVudCgpL0BuYW1lXSI+Ci0JICAgIDwhLS1Qcm9jZXNzaW5nIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjx4c2w6dGV4dD4mIzEwOzwveHNsOnRleHQ+IC0tPgotCQk8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QG5hbWV9Lmh0bWwiPgotCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIi8+Ci0JCTwvcmVkaXJlY3Q6d3JpdGU+Ci0JPC94c2w6Zm9yLWVhY2g+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBsaXR0bGUgdHJpY2sgdG8gY29tcHV0ZSB0aGUgY2xhc3NuYW1lIGZvciBpbm5lciBhbmQgbm9uIGlubmVyIGNsYXNzZXMgLS0+Ci08IS0tIHRoaXMgaXMgYWxsIGluIG9uZSBsaW5lIHRvIGF2b2lkIENSTEYgaW4gdGhlIG5hbWUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iY2xhc3MubmFtZSI+Ci0gICAgPHhzbDppZiB0ZXN0PSJwYXJlbnQ6OmNsYXNzIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InBhcmVudDo6Y2xhc3MiIG1vZGU9ImNsYXNzLm5hbWUiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6aWY+PHhzbDppZiB0ZXN0PSJub3QocGFyZW50OjpjbGFzcykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmlmPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIj4KLTxIVE1MPgotCTxIRUFEPjxUSVRMRT5NZXRyaWNzIFJlc3VsdHMuPC9USVRMRT48L0hFQUQ+Ci0JPEZSQU1FU0VUIGNvbHM9IjIwJSw4MCUiPgotCQk8RlJBTUVTRVQgcm93cz0iMzAlLDcwJSI+Ci0JCQk8RlJBTUUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+Ci0JCQk8RlJBTUUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+Ci0JCTwvRlJBTUVTRVQ+Ci0JCTxGUkFNRSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgotCTwvRlJBTUVTRVQ+Ci0JPG5vZnJhbWVzPgotCQk8SDI+RnJhbWUgQWxlcnQ8L0gyPgotCQk8UD4KLQkJVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi0JCTwvUD4KLQk8L25vZnJhbWVzPgotPC9IVE1MPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gdGhpcyBpcyB0aGUgc3R5bGVzaGVldCBjc3MgdG8gdXNlIGZvciBuZWFybHkgZXZlcnl0aGluZyAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiPgotQk9EWSB7Ci0JZm9udDpub3JtYWwgNjglIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhOwotCWNvbG9yOiMwMDAwMDA7Ci19Ci1URCB7Ci0JRk9OVC1TSVpFOiA2OCUKLX0KLVAgewotCWxpbmUtaGVpZ2h0OjEuNWVtOwotCW1hcmdpbi10b3A6MC41ZW07IG1hcmdpbi1ib3R0b206MS4wZW07Ci19Ci1IMSB7Ci0JTUFSR0lOOiAwcHggMHB4IDVweDsgRk9OVDogMTY1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotSDIgewotCU1BUkdJTi1UT1A6IDFlbTsgTUFSR0lOLUJPVFRPTTogMC41ZW07IEZPTlQ6IGJvbGQgMTI1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotSDMgewotCU1BUkdJTi1CT1RUT006IDAuNWVtOyBGT05UOiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLX0KLUg0IHsKLQlNQVJHSU4tQk9UVE9NOiAwLjVlbTsgRk9OVDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1INSB7Ci0JTUFSR0lOLUJPVFRPTTogMC41ZW07IEZPTlQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotSDYgewotCU1BUkdJTi1CT1RUT006IDAuNWVtOyBGT05UOiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLX0KLS5FcnJvciB7Ci0JZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cmVkOwotfQotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBwcmludCB0aGUgbWV0cmljcyBvZiB0aGUgY2xhc3MgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iY2xhc3MuZGV0YWlscyI+Ci0JPCEtLXhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iKGFuY2VzdG9yOjpwYWNrYWdlKVtsYXN0KCldL0BuYW1lIi8tLT4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgotCTxIVE1MPgotCQk8SEVBRD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvSEVBRD4KLQkJPEJPRFk+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgkKLQkJCTxIMz5DbGFzcyA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJ3VubmFtZWQgcGFja2FnZScpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPi48L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L0gzPgotCi0JCQkKLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsbC5tZXRyaWNzLmhlYWRlciIvPgkJCQkKLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLQkJCTwvdGFibGU+Ci0JCi0JCQk8SDI+TWV0aG9kczwvSDI+Ci0JCQk8cD4KLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1ldGhvZC5tZXRyaWNzLmhlYWRlciIvPgotCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWV0aG9kIiBtb2RlPSJwcmludC5tZXRyaWNzIi8+Ci0JCQk8L3RhYmxlPgkJCQotCQkJCi0JCQk8L3A+Ci0JCTwvQk9EWT4KLQk8L0hUTUw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWNrYWdlIiBtb2RlPSJjbGFzc2VzLmxpc3QiPgotCTxIVE1MPgotCQk8SEVBRD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L0hFQUQ+Ci0JCTxCT0RZPgotCQkJPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0JCQkJCQk8SDI+PGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvSDI+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwvdGFibGU+Ci0JCi0JCQk8SDI+Q2xhc3NlczwvSDI+Ci0JCQk8cD4KLQkJCTxUQUJMRSBXSURUSD0iMTAwJSI+Ci0JCQkJPCEtLSB4YWxhbi1ub2Rlc2V0Om5vZGVzZXQgZm9yIFhhbGFuIDEuMi4yIC0tPgotICAgIAkJICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9jdHJlZS9jbGFzc2VzL2NsYXNzW0BwYWNrYWdlID0gY3VycmVudCgpL0BuYW1lXSI+Ci0gICAgCQkgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0JCQkJCQkJPGEgaHJlZj0ie0BuYW1lfS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+ICAgIAkJICAgICAgICAKLSAgICAJCSAgICA8L3hzbDpmb3ItZWFjaD4KLQkJCTwvVEFCTEU+Ci0JCQk8L3A+Ci0JCTwvQk9EWT4KLQk8L0hUTUw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tCi0JQ3JlYXRlcyBhbiBhbGwtY2xhc3Nlcy5odG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sCi0Jb24gZWFjaCBjbGFzcy4KLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0cmljcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgotCTxodG1sPgotCQk8aGVhZD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IicnIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L2hlYWQ+Ci0JCTxib2R5PgotCQkJPGgyPkNsYXNzZXM8L2gyPgotCQkJPHA+Ci0JCQk8dGFibGUgd2lkdGg9IjEwMCUiPgotCQkJICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9jdHJlZS9jbGFzc2VzL2NsYXNzIj4KLQkJCSAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLQkJCSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgotCQkJICAgIDwveHNsOmZvci1lYWNoPgotCQkJPC90YWJsZT4KLQkJCTwvcD4KLQkJPC9ib2R5PgotCTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjbGFzcy5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0JPHRyPgotCQk8dGQgbm93cmFwPSJub3dyYXAiPgotCQkJPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0ndW5uYW1lZCBwYWNrYWdlJykiPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+PHhzbDp0ZXh0Pi5odG1sPC94c2w6dGV4dD4KLQkJCQk8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+Ci0JCQk8L2E+Ci0JCTwvdGQ+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tCi0JQ3JlYXRlcyBhbiBodG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sIGZpbGVzIG9uCi0JZWFjaCBwYWNrYWdlIGV4aXN0aW5nIG9uIHRlc3RzdWl0ZXMuCi0JQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSBoZXJlLCBJIGRvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgdW5uYW1lZCBwYWNrYWdlIDooCi0tLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldHJpY3MiIG1vZGU9ImFsbC5wYWNrYWdlcyI+Ci0JPGh0bWw+Ci0JCTxoZWFkPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iLi9wYWNrYWdlL0BuYW1lIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L2hlYWQ+Ci0JCTxib2R5PgotCQkJPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+Ci0JCQk8aDI+UGFja2FnZXM8L2gyPgotCQkJPHA+Ci0JCQkJPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy9wYWNrYWdlW25vdCguL0BuYW1lID0gJ3VubmFtZWQgcGFja2FnZScpXSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQkJCTwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLQkJCQk8L3RhYmxlPgotCQkJPC9wPgotCQk8L2JvZHk+Ci0JPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9ImFsbC5wYWNrYWdlcyI+Ci0JPHRyPgotCQk8dGQgbm93cmFwPSJub3dyYXAiPgotCQkJPGEgaHJlZj0ie3RyYW5zbGF0ZShAbmFtZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQk8L2E+Ci0JCTwvdGQ+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldHJpY3MiIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIj4KLQk8aHRtbD4KLQkJPGhlYWQ+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSInJyIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC9oZWFkPgotCQk8Ym9keSBvbmxvYWQ9Im9wZW4oJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJykiPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotCQk8aDI+U3VtbWFyeTwvaDI+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCTx0ciBiZ2NvbG9yPSIjQTZDQUYwIiB2YWxpZ249InRvcCI+Ci0JCQk8dGQ+PGI+VihHKTwvYj48L3RkPgotCQkJPHRkPjxiPkxPQzwvYj48L3RkPgotCQkJPHRkPjxiPkRJVDwvYj48L3RkPgotCQkJPHRkPjxiPk5PQTwvYj48L3RkPgotCQkJPHRkPjxiPk5STTwvYj48L3RkPgotCQkJPHRkPjxiPk5MTTwvYj48L3RkPgotCQkJPHRkPjxiPldNQzwvYj48L3RkPgotCQkJPHRkPjxiPlJGQzwvYj48L3RkPgotCQkJPHRkPjxiPkRBQzwvYj48L3RkPgotCQkJPHRkPjxiPkZBTk9VVDwvYj48L3RkPgotCQkJPHRkPjxiPkNCTzwvYj48L3RkPgotCQkJPHRkPjxiPkxDT008L2I+PC90ZD4KLQkJCTx0ZD48Yj5OT0NMPC9iPjwvdGQ+Ci0JCTwvdHI+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPgotCQk8L3RhYmxlPgotCQk8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTUlIj4KLQkJPHRyPgotCQk8dGQJc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KLQkJTm90ZTogTWV0cmljcyBldmFsdWF0ZSB0aGUgcXVhbGl0eSBvZiBzb2Z0d2FyZSBieSBhbmFseXppbmcJdGhlCXByb2dyYW0Jc291cmNlIGFuZCBxdWFudGlmeWluZwotCQl2YXJpb3VzCWtpbmQgb2YJY29tcGxleGl0eS4JQ29tcGxleGl0eSBpcyBhCWNvbW1vbiBzb3VyY2Ugb2YgcHJvYmxlbXMgYW5kIGRlZmVjdHMgaW4gc29mdHdhcmUuCi0JCUhpZ2ggY29tcGxleGl0eQltYWtlcyBpdCBtb3JlIGRpZmZpY3VsdAl0byBkZXZlbG9wLAl1bmRlcnN0YW5kLAltYWludGFpbiwgZXh0ZW5kLCB0ZXN0IGFuZCBkZWJ1ZwotCQlhIHByb2dyYW0uCi0JCTxwLz4KLQkJVGhlIHByaW1hcnkgdXNlIG9mIG1ldHJpY3MgaXMgdG8gZm9jdXMgeW91cglhdHRlbnRpb24gb24gdGhvc2UgcGFydHMgb2YgY29kZSB0aGF0IHBvdGVudGlhbGx5IGFyZQotCQljb21wbGV4aXR5IGhvdCBzcG90cy4gT25jZSB0aGUgY29tcGxleCBhcmVhcyB5b3VyIHByb2dyYW0gaGF2ZSBiZWVuIHVuY292ZXJlZCwgeW91IGNhbiB0YWtlIHJlbWVkaWFsCi0JCWFjdGlvbnMuCi0JCUZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IG1ldHJpY3MgYW5kIHRoZWlyIG1lYW5pbmcsIHBsZWFzZSBjb25zdWx0Ci0JCU1ldGFtYXRhIE1ldHJpY3MgbWFudWFsLgotCQk8L3RkPgotCQk8L3RyPgotCQk8L3RhYmxlPgotCi0JCTxoMj5QYWNrYWdlczwvaDI+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWxsLm1ldHJpY3MuaGVhZGVyIi8+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi8vcGFja2FnZVtub3QoQG5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJyldIj4KLQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIgb3JkZXI9ImFzY2VuZGluZyIvPgkJCQkKLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3RhYmxlPgotCQk8IS0tIEBidWcgdGhlcmUgY291bGQgc29tZSBjbGFzc2VzIGF0IHRoaXMgbGV2ZWwgKGNsYXNzZXMgaW4gdW5uYW1lZCBwYWNrYWdlKSAtLT4KLQkJPC9ib2R5PgotCQk8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFja2FnZSIgbW9kZT0icGFja2FnZS5zdW1tYXJ5Ij4KLQk8SFRNTD4KLQkJPEhFQUQ+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC9IRUFEPgotCQk8Ym9keSBvbmxvYWQ9Im9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJykiPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLQkJCTwhLS0gY3JlYXRlIGFuIGFuY2hvciB0byB0aGlzIHBhY2thZ2UgbmFtZSAtLT4KLQkJCTxoMz5QYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvaDM+Ci0JCQkKLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsbC5tZXRyaWNzLmhlYWRlciIvPgotCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPgotCQkJPC90YWJsZT4KLQkJCQotCQkJPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9Ijk1JSI+Ci0JCQk8dHI+Ci0JCQk8dGQJc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KLQkJCU5vdGU6IE1ldHJpY3MgZXZhbHVhdGUgdGhlIHF1YWxpdHkgb2Ygc29mdHdhcmUgYnkgYW5hbHl6aW5nCXRoZQlwcm9ncmFtCXNvdXJjZSBhbmQgcXVhbnRpZnlpbmcKLQkJCXZhcmlvdXMJa2luZCBvZgljb21wbGV4aXR5LglDb21wbGV4aXR5IGlzIGEJY29tbW9uIHNvdXJjZSBvZiBwcm9ibGVtcyBhbmQgZGVmZWN0cyBpbiBzb2Z0d2FyZS4KLQkJCUhpZ2ggY29tcGxleGl0eQltYWtlcyBpdCBtb3JlIGRpZmZpY3VsdAl0byBkZXZlbG9wLAl1bmRlcnN0YW5kLAltYWludGFpbiwgZXh0ZW5kLCB0ZXN0IGFuZCBkZWJ1ZwotCQkJYSBwcm9ncmFtLgotCQkJPHAvPgotCQkJVGhlIHByaW1hcnkgdXNlIG9mIG1ldHJpY3MgaXMgdG8gZm9jdXMgeW91cglhdHRlbnRpb24gb24gdGhvc2UgcGFydHMgb2YgY29kZSB0aGF0IHBvdGVudGlhbGx5IGFyZQotCQkJY29tcGxleGl0eSBob3Qgc3BvdHMuIE9uY2UgdGhlIGNvbXBsZXggYXJlYXMgeW91ciBwcm9ncmFtIGhhdmUgYmVlbiB1bmNvdmVyZWQsIHlvdSBjYW4gdGFrZSByZW1lZGlhbAotCQkJYWN0aW9ucy4KLQkJCUZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IG1ldHJpY3MgYW5kIHRoZWlyIG1lYW5pbmcsIHBsZWFzZSBjb25zdWx0Ci0JCQlNZXRhbWF0YSBNZXRyaWNzIG1hbnVhbC4KLQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPC90YWJsZT4KLQkJCQotCQkJCi0JCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb2N0cmVlL2NsYXNzZXMvY2xhc3NbQHBhY2thZ2UgPSBjdXJyZW50KCkvQG5hbWVdKSAmZ3Q7IDAiPgotCQkJCTxIMj5DbGFzc2VzPC9IMj4KLQkJCQk8cD4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWxsLm1ldHJpY3MuaGVhZGVyIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9jdHJlZS9jbGFzc2VzL2NsYXNzW0BwYWNrYWdlID0gY3VycmVudCgpL0BuYW1lXSI+Ci0JCQkgICAgICAgIAk8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotCQkJICAgICAgICAJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC5tZXRyaWNzIi8+Ci0JCQkgICAgPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90YWJsZT4KLQkJCQk8L3A+Ci0JCQk8L3hzbDppZj4KLQkJPC9ib2R5PgotCTwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLSAgICB0cmFuc2Zvcm0gc3RyaW5nIGxpa2UgYS5iLmMgdG8gLi4vLi4vLi4vCi0gICAgQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdHJhbnNmb3JtIGludG8gYSBkZXNjZW5kaW5nIGRpcmVjdG9yeSBwYXRoCi0tLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGF0aCI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+Ci0JPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aCwnLicpIj4KLQkJPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+CQotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aCwnLicpIi8+PC94c2w6d2l0aC1wYXJhbT4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCi0JPC94c2w6aWY+Ci0JPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgsJy4nKSkgYW5kIG5vdCgkcGF0aCA9ICcnKSI+Ci0JCTx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgkKLQk8L3hzbDppZj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gY3JlYXRlIHRoZSBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0IGJhc2VkIG9uIHRoZSBwYWNrYWdlIG5hbWUgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotCTx4c2w6cGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0JPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIFRJVExFPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvTElOSz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gUGFnZSBIRUFERVIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgotCTxoMT5NZXRyaWNzIFJlc3VsdHM8L2gxPgotCTx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0JPHRyPgotCQk8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Ci0JCTx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSdodHRwOi8vd3d3LndlYmdhaW4uY29tL3Byb2R1Y3RzL3F1YWxpdHlfYW5hbHl6ZXIvJz5XZWJnYWluIFFBL01ldGFtYXRhIE1ldHJpY3M8L2E+IGFuZCA8YSBocmVmPSdodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnJz5BbnQ8L2E+LjwvdGQ+Ci0JPC90cj4KLQk8L3RhYmxlPgotCTxociBzaXplPSIxIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBjbGFzcyBoZWFkZXIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImFsbC5tZXRyaWNzLmhlYWRlciI+Ci0JPHRyIGJnY29sb3I9IiNBNkNBRjAiIHZhbGlnbj0idG9wIj4KLQkJPHRkIHdpZHRoPSI4MCUiPjxiPk5hbWU8L2I+PC90ZD4KLQkJPHRkIG5vd3JhcD0ibm93cmFwIj48Yj5WKEcpPC9iPjwvdGQ+Ci0JCTx0ZD48Yj5MT0M8L2I+PC90ZD4KLQkJPHRkPjxiPkRJVDwvYj48L3RkPgotCQk8dGQ+PGI+Tk9BPC9iPjwvdGQ+Ci0JCTx0ZD48Yj5OUk08L2I+PC90ZD4KLQkJPHRkPjxiPk5MTTwvYj48L3RkPgotCQk8dGQ+PGI+V01DPC9iPjwvdGQ+Ci0JCTx0ZD48Yj5SRkM8L2I+PC90ZD4KLQkJPHRkPjxiPkRBQzwvYj48L3RkPgotCQk8dGQ+PGI+RkFOT1VUPC9iPjwvdGQ+Ci0JCTx0ZD48Yj5DQk88L2I+PC90ZD4KLQkJPHRkPjxiPkxDT008L2I+PC90ZD4KLQkJPHRkPjxiPk5PQ0w8L2I+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbWV0aG9kIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0ibWV0aG9kLm1ldHJpY3MuaGVhZGVyIj4KLQk8dHIgYmdjb2xvcj0iI0E2Q0FGMCIgdmFsaWduPSJ0b3AiPgotCQk8dGQgd2lkdGg9IjgwJSI+PGI+TmFtZTwvYj48L3RkPgotCQk8dGQgbm93cmFwPSJub3dyYXAiPjxiPlYoRyk8L2I+PC90ZD4KLQkJPHRkPjxiPkxPQzwvYj48L3RkPgotCQk8dGQ+PGI+RkFOT1VUPC9iPjwvdGQ+Ci0JCTx0ZD48Yj5DQk88L2I+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbWV0aG9kIGluZm9ybWF0aW9uIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIiBtb2RlPSJwcmludC5tZXRyaWNzIj4KLQk8dHIgYmdjb2xvcj0iI0VFRUVFIiB2YWxpZ249InRvcCI+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHZnIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGxvYyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYW5vdXQiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAY2JvIi8+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gY2xhc3MgaW5mb3JtYXRpb24gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0icHJpbnQubWV0cmljcyI+Ci0JPHRyIGJnY29sb3I9IiNFRUVFRSIgdmFsaWduPSJ0b3AiPgkJCi0JCTx0ZD48YSBocmVmPSJ7QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdmciLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbG9jIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGRpdCIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBub2EiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbnJtIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQG5sbSIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB3bWMiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAcmZjIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGRhYyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYW5vdXQiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAY2JvIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGxjb20iLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbm9jbCIvPjwvdGQ+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlfHBhY2thZ2UiIG1vZGU9InByaW50Lm1ldHJpY3MiPgotCTx0ciBiZ2NvbG9yPSIjRUVFRUUiIHZhbGlnbj0idG9wIj4JCQotCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHZnIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGxvYyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBkaXQiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbm9hIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQG5ybSIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBubG0iLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAd21jIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHJmYyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBkYWMiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZmFub3V0Ii8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGNibyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBsY29tIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQG5vY2wiLz48L3RkPgotCTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0cmljcyIgbW9kZT0icHJpbnQubWV0cmljcyI+Ci0JPHRyIGJnY29sb3I9IiNFRUVFRSIgdmFsaWduPSJ0b3AiPgotCSAgICA8IS0tIHRoZSBnbG9iYWwgbWV0cmljcyBpcyB0aGUgdG9wIHBhY2thZ2UgbWV0cmljcyAtLT4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0B2ZyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AbG9jIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0BkaXQiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQG5vYSIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AbnJtIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0BubG0iLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQHdtYyIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AcmZjIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0BkYWMiLz48L3RkPgotCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQGZhbm91dCIvPjwvdGQ+Ci0JCTx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AY2JvIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0BsY29tIi8+PC90ZD4KLQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0Bub2NsIi8+PC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBob3cgdG8gZGlzcGxheSB0aGUgbWV0cmljcyB3aXRoIHRoZWlyIG1heCB2YWx1ZSAtLT4KLTwhLS0gQHRvZG8gdGhlIG1heCB2YWx1ZXMgbXVzdCBiZSBleHRlcm5hbCB0byB0aGUgeHNsIC0tPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQHZnIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9Im1heCIgc2VsZWN0PSIkdmcubWF4Ii8+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJAbG9jIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9Im1heCIgc2VsZWN0PSIkbG9jLm1heCIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBkaXQiPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0JCQk8eHNsOndpdGgtcGFyYW0JbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+Ci0JCQk8eHNsOndpdGgtcGFyYW0JbmFtZT0ibWF4IiBzZWxlY3Q9IiRkaXQubWF4Ii8+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJAbm9hIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9Im1heCIgc2VsZWN0PSIkbm9hLm1heCIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQG5ybSI+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLQkJCTx4c2w6d2l0aC1wYXJhbQluYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KLQkJCTx4c2w6d2l0aC1wYXJhbQluYW1lPSJtYXgiIHNlbGVjdD0iJG5ybS5tYXgiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBubG0iPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0JCQk8eHNsOndpdGgtcGFyYW0JbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+Ci0JCQk8eHNsOndpdGgtcGFyYW0JbmFtZT0ibWF4IiBzZWxlY3Q9IiRubG0ubWF4Ii8+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJAd21jIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9Im1heCIgc2VsZWN0PSIkd21jLm1heCIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQHJmYyI+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLQkJCTx4c2w6d2l0aC1wYXJhbQluYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KLQkJCTx4c2w6d2l0aC1wYXJhbQluYW1lPSJtYXgiIHNlbGVjdD0iJHJmYy5tYXgiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBkYWMiPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0JCQk8eHNsOndpdGgtcGFyYW0JbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+Ci0JCQk8eHNsOndpdGgtcGFyYW0JbmFtZT0ibWF4IiBzZWxlY3Q9IiRkYWMubWF4Ii8+Ci0JCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJAZmFub3V0Ij4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9Im1heCIgc2VsZWN0PSIkZmFub3V0Lm1heCIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQGNibyI+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLQkJCTx4c2w6d2l0aC1wYXJhbQluYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KLQkJCTx4c2w6d2l0aC1wYXJhbQluYW1lPSJtYXgiIHNlbGVjdD0iJGNiby5tYXgiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBsY29tIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9Im1heCIgc2VsZWN0PSIkbGNvbS5tYXgiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBub2NsIj4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotCQkJPHhzbDp3aXRoLXBhcmFtCW5hbWU9Im1heCIgc2VsZWN0PSIkbm9jbC5tYXgiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJtYXgiLz4KLQkJPHhzbDppZgl0ZXN0PSIkdmFsdWUgPiAkbWF4Ij4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5FcnJvcjwveHNsOmF0dHJpYnV0ZT4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFsdWUiLz4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KLQkKZGlmZiAtLWdpdCBhL3NyYy9ldGMvcGtnaW5mbyBiL3NyYy9ldGMvcGtnaW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkMjkyNS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3BrZ2luZm8KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVBLRz0iQVNGYW50IgotTkFNRT0iQXBhY2hlIEFudCBidWlsZCB0b29sIgotVkVSU0lPTj0iMS4wIgotQVJDSD0ic3BhcmMgaTM4NiIKLUNMQVNTRVM9Im5vbmUiCi1DQVRFR09SWT0idXRpbGl0eSIKLVZFTkRPUj0iQXBhY2hlIgotRU1BSUw9ImNvc3RpbkBlbmcuc3VuLmNvbSIKLUJBU0VESVI9LwpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wcm90b3R5cGUgYi9zcmMvZXRjL3Byb3RvdHlwZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkMzc0Yi4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Byb3RvdHlwZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLWkgcGtnaW5mbwotZCBub25lIC9vcHQvYW50IDA3NTUgY29zdGluIG90aGVyCi1kIG5vbmUgL29wdC9hbnQvbGliIDA3NTUgY29zdGluIHN0YWZmCi1mIG5vbmUgL29wdC9hbnQvbGliL2FudC5qYXIgMDY0NCBjb3N0aW4gc3RhZmYKLWYgbm9uZSAvb3B0L2FudC9saWIveG1sLmphciAwNjQ0IGNvc3RpbiBzdGFmZgotZiBub25lIC9vcHQvYW50L2xpYi9tb28uamFyIDA2NDQgY29zdGluIHN0YWZmCi1mIG5vbmUgL29wdC9hbnQvbGliL2J1aWxkLnhtbCAwNjQ0IGNvc3RpbiBzdGFmZgotZCBub25lIC9vcHQvYW50L2JpbiAwNzU1IGNvc3RpbiBzdGFmZgotZiBub25lIC9vcHQvYW50L2Jpbi9hbnQgMDc1NSBjb3N0aW4gc3RhZmYKLWYgbm9uZSAvb3B0L2FudC9iaW4vYW50UnVuIDA3NTUgY29zdGluIHN0YWZmCi1kIG5vbmUgL29wdC9hbnQvZG9jcyAwNzU1IGNvc3RpbiBzdGFmZgotZiBub25lIC9vcHQvYW50L2RvY3MvaW5kZXguaHRtbCAwNjQ0IGNvc3RpbiBzdGFmZgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvLmN2c2lnbm9yZSBiL3NyYy9ldGMvdGVzdGNhc2VzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZGVmOWIuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotdGFza2RlZnMudG1wCi0KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLmluYyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzMjkyNS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxlY2hvIG1lc3NhZ2U9ImZyb20gaW5jbHVkZWQgZW50aXR5Ii8+Ci08L3RhcmdldD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4NzlmMi4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IURPQ1RZUEUgcHJvamVjdCBbCi0gIDwhRU5USVRZIGluY2x1ZGUgU1lTVEVNICJmaWxlOi4vaW5jbHVkZS5pbmMiPgotXT4KLQotPHByb2plY3QgbmFtZT0iaW5jbHVkZS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0gICAgJmluY2x1ZGU7Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvcmVsYXRpdmUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL3JlbGF0aXZlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkZjdlZS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvcmVsYXRpdmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCFET0NUWVBFIHByb2plY3QgWwotICA8IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAiLi9pbmNsdWRlLmluYyI+Ci1dPgotCi08cHJvamVjdCBuYW1lPSJpbmNsdWRlLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLSAgICAmaW5jbHVkZTsKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCAiYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L2luY2x1ZGUuaW5jIiAiYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L2luY2x1ZGUuaW5jIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzMjkyNS4uMDAwMDAwMAotLS0gImEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9pbmNsdWRlLmluYyIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxlY2hvIG1lc3NhZ2U9ImZyb20gaW5jbHVkZWQgZW50aXR5Ii8+Ci08L3RhcmdldD4KZGlmZiAtLWdpdCAiYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L2luY2x1ZGUueG1sIiAiYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L2luY2x1ZGUueG1sIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiZWZmNi4uMDAwMDAwMAotLS0gImEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9pbmNsdWRlLnhtbCIKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IURPQ1RZUEUgcHJvamVjdCBbCi0gIDwhRU5USVRZIGluY2x1ZGUgU1lTVEVNICJmaWxlOmluY2x1ZGUuaW5jIj4KLV0+Ci0KLTxwcm9qZWN0IG5hbWU9ImluY2x1ZGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotICAgICZpbmNsdWRlOwotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0ICJhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvcmVsYXRpdmUueG1sIiAiYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L3JlbGF0aXZlLnhtbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWVkNDAuLjAwMDAwMDAKLS0tICJhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvcmVsYXRpdmUueG1sIgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLSAgPCFFTlRJVFkgaW5jbHVkZSBTWVNURU0gImluY2x1ZGUuaW5jIj4KLV0+Ci0KLTxwcm9qZWN0IG5hbWU9ImluY2x1ZGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotICAgICZpbmNsdWRlOwotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0ICJhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvc2ltcGxlLnhtbCIgImIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9zaW1wbGUueG1sIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkZmY1NC4uMDAwMDAwMAotLS0gImEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9zaW1wbGUueG1sIgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJpbmNsdWRlLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLTx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxlY2hvIG1lc3NhZ2U9ImZyb20gc2ltcGxlIGJ1aWxkZmlsZSIvPgotPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy8uY3ZzaWdub3JlIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkZWY5Yi4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi10YXNrZGVmcy50bXAKLQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YmY5ZWQuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJhbnQtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJ0ZXN0MSx0ZXN0Mix0ZXN0Myx0ZXN0NCIvPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIgZGlyPSIuIiB0YXJnZXQ9InRlc3QxIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDxhbnRjYWxsLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJ0ZXN0MyIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImR1bW15Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDYiPgotICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIgZGlyPSIuIiB0YXJnZXQ9ImR1bW15Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZHVtbXkiPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50c3RydWN0dXJlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudHN0cnVjdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDlhZDkuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50c3RydWN0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9ImFudHN0cnVjdHVyZS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPGFudHN0cnVjdHVyZS8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hdmFpbGFibGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXZhaWxhYmxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZjYjVhYS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hdmFpbGFibGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJhdmFpbGFibGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxhdmFpbGFibGUvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDMiPgotICAgIDxhdmFpbGFibGUgZmlsZT0idGVzdCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKLSAgICAgICAgICAgICAgIGZpbGU9InNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RoaXNfZmlsZV9kb2VzX25vdF9leGlzdCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKLSAgICAgICAgICAgICAgIGZpbGU9ImF2YWlsYWJsZS54bWwiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCi0gICAgICAgICAgICAgICByZXNvdXJjZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvdGhpc19yZXNvdXJjZV9kb2VzX25vdF9leGlzdCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q3Ij4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDgiPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAotICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy50aGlzX2NsYXNzX2RvZXNfbm90X2V4aXN0Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDkiPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAotICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MTAiPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAotICAgICAgICAgICAgICAgZmlsZT0iYXZhaWxhYmxlLnhtbCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQiLz4KLSAgPC90YXJnZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9InRlc3QxMSI+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCi0gICAgICAgICAgICAgICBmaWxlPSJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hdmFpbGFibGUueG1sIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnRoaXNfY2xhc3NfZG9lc19ub3RfZXhpc3QiLz4KLSAgPC90YXJnZXQ+ICAKLSAgCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEyIj4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSIiIAotICAgICAgICAgICAgICAgZmlsZT0iYXZhaWxhYmxlLnhtbCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxMyI+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCi0gICAgICAgICAgICAgICBmaWxlPSIiIHR5cGU9ImZpbGUiIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEzYiI+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCi0gICAgICAgICAgICAgICBmaWxlPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MTQiPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAotICAgICAgICAgICAgICAgcmVzb3VyY2U9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxNSI+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCi0gICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnRoaXNfY2xhc3NfZG9lc19ub3RfZXhpc3QiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MTYiPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAotICAgICAgICAgICAgICAgZmlsZT0iIiB0eXBlPSJkaXIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MTciPgotICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAotICAgICAgICAgICAgICAgZmlsZT0iLi4vdGFza2RlZnMiIHR5cGU9ImRpciIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxOCI+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCi0gICAgICAgICAgICAgICBmaWxlPSIuLi90aGlzX2Rpcl9zaG91bGRfbmV2ZXJfZXhpc3QiIHR5cGU9ImRpciIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29weS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4ZjgwMy4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJjb3B5LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KLSAgICA8Y29weSBmaWxlPSJjb3B5LnhtbCIgdG9maWxlPSJjb3B5dGVzdDEudG1wIiAvPgotICA8L3RhcmdldD4KLSAKLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPGNvcHkgZmlsZT0iY29weS54bWwiIHRvZGlyPSJjb3B5dGVzdDFkaXIiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICA8L3RhcmdldD4KLSAKLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4gCi0gICAgPGRlbGV0ZSBmaWxlPSJjb3B5dGVzdDEudG1wIi8+Ci0gICAgPGRlbGV0ZSBkaXI9ImNvcHl0ZXN0MWRpciIvPgotICA8L3RhcmdldD4KLQotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZGlyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlkaXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM1NzQyLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlkaXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9ImNvcHlkaXItdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxjb3B5ZGlyLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPGNvcHlkaXIgc3JjPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gICAgPGNvcHlkaXIgZGVzdD0iIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDQiPgotICAgIDxjb3B5ZGlyIHNyYz0iLiIgCi0gICAgICAgICAgICAgZGVzdD0iLiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KLSAgICA8bWtkaXIgZGlyPSIuLi90YXNrZGVmcy50bXAiIC8+Ci0gICAgPGNvcHlkaXIgc3JjPSIuIiAKLSAgICAgICAgICAgICBkZXN0PSIuLi90YXNrZGVmcy50bXAiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+Ci0gICAgPGNvcHlkaXIgc3JjPSIuIiAKLSAgICAgICAgICAgICBkZXN0PSJ0ZW1wbGF0ZS54bWwiLz4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlmaWxlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlmaWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkM2NkNC4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZmlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0iY29weWZpbGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxjb3B5ZmlsZS8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDxjb3B5ZmlsZSBzcmM9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICA8Y29weWZpbGUgZGVzdD0iIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDQiPgotICAgIDxjb3B5ZmlsZSBzcmM9InRlbXBsYXRlLnhtbCIgCi0gICAgICAgICAgICAgZGVzdD0idGVtcGxhdGUueG1sIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDUiPgotICAgIDxjb3B5ZmlsZSBzcmM9ImNvcHlmaWxlLnhtbCIgCi0gICAgICAgICAgICAgZGVzdD0iY29weWZpbGUudG1wIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDYiPgotICAgIDxkZWxldGUgZmlsZT0idGVzdGRpciIvPgotICAgIDxta2RpciBkaXI9InRlc3RkaXIiIC8+Ci0gICAgPGNvcHlmaWxlIHNyYz0iY29weWZpbGUueG1sIiAKLSAgICAgICAgICAgICAgZGVzdD0idGVzdGRpciIKLSAgICAgICAgICAgICAgZm9yY2VvdmVyd3JpdGU9InRydWUiIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gICAgPGRlbGV0ZSBkaXI9InRlc3RkaXIiIC8+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY3ZzcGFzcy54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jdnNwYXNzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjNjJhZC4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jdnNwYXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJjdnNwYXNzLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLQotICA8dGFza2RlZiBuYW1lPSJjdnNwYXNzIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNWU1Bhc3MiLz4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KLSAgICA8Y3ZzcGFzcyAvPgotICA8L3RhcmdldD4KLSAKLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPGN2c3Bhc3MKLSAgICAgIGN2c3Jvb3Q9Ijpwc2VydmVyOmFub25jdnNAamFrYXJ0YS5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyIKLSAgICAgIHBhc3NmaWxlPSJ0ZXN0cGFzc2ZpbGUudG1wIgotICAgIC8+Ci0gIDwvdGFyZ2V0PgotIAotICA8IS0tIHRlc3RQYXNzRmlsZSAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gICAgPGN2c3Bhc3MKLSAgICAgIGN2c3Jvb3Q9Ijpwc2VydmVyOmFub25jdnNAamFrYXJ0YS5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyIKLSAgICAgIHBhc3N3b3JkPSJhbm9uY3ZzIgotICAgICAgcGFzc2ZpbGU9InRlc3RwYXNzZmlsZS50bXAiCi0gICAgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB0ZXN0UGFzc0ZpbGVEdXBsaWNhdGVFbnRyeSAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+Ci0gICAgPGN2c3Bhc3MKLSAgICAgIGN2c3Jvb3Q9Ijpwc2VydmVyOmFub25jdnNAamFrYXJ0YS5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyIKLSAgICAgIHBhc3N3b3JkPSJhbm9uY3ZzIgotICAgICAgcGFzc2ZpbGU9InRlc3RwYXNzZmlsZS50bXAiCi0gICAgLz4KLSAgICA8Y3ZzcGFzcwotICAgICAgY3Zzcm9vdD0iOnBzZXJ2ZXI6YW5vbmN2c0BqYWthcnRhLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIgotICAgICAgcGFzc3dvcmQ9ImFub25jdnMiCi0gICAgICBwYXNzZmlsZT0idGVzdHBhc3NmaWxlLnRtcCIKLSAgICAvPgotICAgIDxjdnNwYXNzCi0gICAgICBjdnNyb290PSI6cHNlcnZlcjpndWVzdEBjdnMudGlncmlzLm9yZzovY3ZzIgotICAgICAgcGFzc3dvcmQ9Imd1ZXN0IgotICAgICAgcGFzc2ZpbGU9InRlc3RwYXNzZmlsZS50bXAiCi0gICAgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSB0ZXN0UGFzc0ZpbGVNdWx0aXBsZUVudHJ5IC0tPgotICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KLSAgICA8Y3ZzcGFzcwotICAgICAgY3Zzcm9vdD0iOnBzZXJ2ZXI6YW5vbmN2c0BqYWthcnRhLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIgotICAgICAgcGFzc3dvcmQ9ImFub25jdnMiCi0gICAgICBwYXNzZmlsZT0idGVzdHBhc3NmaWxlLnRtcCIKLSAgICAvPgotICAgIDxjdnNwYXNzCi0gICAgICBjdnNyb290PSI6cHNlcnZlcjphbm9uY3ZzQHhtbC5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyIKLSAgICAgIHBhc3N3b3JkPSJhbm9uY3ZzIgotICAgICAgcGFzc2ZpbGU9InRlc3RwYXNzZmlsZS50bXAiCi0gICAgLz4KLSAgICA8Y3ZzcGFzcwotICAgICAgY3Zzcm9vdD0iOnBzZXJ2ZXI6Z3Vlc3RAY3ZzLnRpZ3Jpcy5vcmc6L2N2cyIKLSAgICAgIHBhc3N3b3JkPSJndWVzdCIKLSAgICAgIHBhc3NmaWxlPSJ0ZXN0cGFzc2ZpbGUudG1wIgotICAgIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+IAotICAgIDxkZWxldGUgZmlsZT0idGVzdHBhc3NmaWxlLnRtcCIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsZXRlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbGV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMTBlZWUuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsZXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJkZWxldGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxkZWxldGUvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KLSAgICA8Y29weWRpciBzcmM9Ii4iIAotICAgICAgICAgICAgIGRlc3Q9InRhc2tkZWZzLnRtcCIvPgotICAgIDxkZWxldGUgZmlsZT0idGFza2RlZnMudG1wIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDMiPgotICAgIDxjb3B5ZGlyIHNyYz0iLiIgCi0gICAgICAgICAgICAgZGVzdD0idGFza2RlZnMudG1wIi8+Ci0gICAgPGRlbGV0ZSBkaXI9InRhc2tkZWZzLnRtcC9hbnQueG1sIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDQiPgotICAgIDxjb3B5ZGlyIHNyYz0iLiIgCi0gICAgICAgICAgICAgZGVzdD0idGFza2RlZnMudG1wIi8+Ci0gICAgPGRlbGV0ZSBkaXI9InRhc2tkZWZzLnRtcCIvPgotICA8L3RhcmdldD4KLQotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kZWx0cmVlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbHRyZWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2FlOTk5Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbHRyZWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9ImRlbHRyZWUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxkZWx0cmVlLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPGRlbHRyZWUgZGlyPSJ0YXNrZGVmcy50bXAiLz4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlcGVuZHNldC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kZXBlbmRzZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWJkYzJkLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlcGVuZHNldC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0iZGVwZW5kc2V0LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KLSAgICA8ZGVwZW5kc2V0Lz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPGRlcGVuZHNldD4KLSAgICAgIDxzcmNmaWxlbGlzdCBkaXI9Ii4iIGluY2x1ZGVzPSJ0ZXN0Mi50bXAiLz4KLSAgICA8L2RlcGVuZHNldD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gICAgPGRlcGVuZHNldD4KLSAgICAgIDx0YXJnZXRmaWxlc2V0IGRpcj0iLiIgZmlsZXM9InRlc3QzLnRtcCIvPgotICAgIDwvZGVwZW5kc2V0PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KLSAgICA8dG91Y2ggZmlsZT0idGVzdDQudG1wIi8+Ci0gICAgPGRlcGVuZHNldD4KLSAgICAgIDxzcmNmaWxlbGlzdCBkaXI9Ii4iIGZpbGVzPSJ0ZXN0NC50bXAiLz4KLSAgICAgIDx0YXJnZXRmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9ImktZG8tbm90LWV4aXN0Ii8+Ci0gICAgPC9kZXBlbmRzZXQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDUiPgotICAgIDx0b3VjaCBtaWxsaXM9IjAiIGZpbGU9Im9sZGVyLnRtcCIvPgotICAgIDx0b3VjaCBmaWxlPSJuZXdlci50bXAiLz4KLSAgICA8ZGVwZW5kc2V0PgotICAgICAgPHNyY2ZpbGVsaXN0IGRpcj0iLiIgZmlsZXM9Im5ld2VyLnRtcCIvPgotICAgICAgPHRhcmdldGZpbGVsaXN0IGRpcj0iLiIgZmlsZXM9Im9sZGVyLnRtcCIvPgotICAgIDwvZGVwZW5kc2V0PgotICA8L3RhcmdldD4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+IAotICAgIDxkZWxldGUgZmlsZT0idGVzdDQudG1wIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSJvbGRlci50bXAiLz4KLSAgICA8ZGVsZXRlIGZpbGU9Im5ld2VyLnRtcCIvPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG8ueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZWNoby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTgxMDQuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZWNoby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0iZWNoby10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPGVjaG8vPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJPVVRQVVQgT0YgRUNITyIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICA8ZWNobz4KLSAgICBUaGlzIAotICAgIGlzCi0gICAgYSAKLSAgICBtdWx0aWxpbmUKLSAgICBtZXNzYWdlCi0gICAgPC9lY2hvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZhaWwueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmFpbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGI4MTUuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmFpbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0iZmFpbC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPGZhaWwvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KLSAgICA8ZmFpbCBtZXNzYWdlPSJ0ZXN0Ii8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxYTg0My4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9ImZpbHRlci10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPGZpbHRlci8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDxmaWx0ZXIgdG9rZW49IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICA8ZmlsdGVyIHZhbHVlPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+Ci0gICAgPGZpbHRlciB0b2tlbj0iIiB2YWx1ZT0iIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDUiPgotICAgIDxmaWx0ZXIgdG9rZW49InllYXIiIHZhbHVlPSIyMDAwIiAvPgotICAgIDxjb3B5IGZpbGU9ImZpbHRlcjEudHh0IiB0b2ZpbGU9ImZpbHRlcmVkLnRtcCIgZmlsdGVyaW5nPSJ5ZXMiIG92ZXJ3cml0ZT0ieWVzIiAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KLSAgICA8ZmlsdGVyIHRva2VuPSJ5ZWFyIiB2YWx1ZT0iMjAwMCIgLz4KLSAgICA8Y29weSB0b2Rpcj0iLi90YXNrZGVmcy50bXAiIGZpbHRlcmluZz0ieWVzIiBvdmVyd3JpdGU9InllcyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJmaWx0ZXIxLnR4dCIgLz4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDciPgotICAgIDxmaWx0ZXIgdG9rZW49IlJPT1QiIHZhbHVlPSJyb290IiAvPgotICAgIDxjb3B5IGZpbGU9ImZpbHRlcjIudHh0IiB0b2ZpbGU9ImZpbHRlcmVkLnRtcCIgZmlsdGVyaW5nPSJ5ZXMiIG92ZXJ3cml0ZT0ieWVzIiAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q4Ij4KLSAgICA8ZmlsdGVyIHRva2VuPSJST09UIiB2YWx1ZT0icm9vdCIgLz4KLSAgICA8Y29weSB0b2Rpcj0iLi90YXNrZGVmcy50bXAiIGZpbHRlcmluZz0ieWVzIiBvdmVyd3JpdGU9InllcyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJmaWx0ZXIyLnR4dCIvPgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlcjEudHh0IGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyMS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNGY5NzYuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyMS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1AeWVhckAKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlcjIudHh0IGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyMi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2QwNmIuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyMi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08JUAgaW5jbHVkZSBmaWxlPSJAUk9PVEAvc29tZS9pbmNsdWRlLmpzcCIlPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9idWlsZC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhMzM2OS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IGRlZmF1bHQ9ImNsZWFudXAiIGJhc2VkaXI9Ii4iPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDxta2RpciBkaXI9InJlc3VsdCIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgICA8ZGVsZXRlIGRpcj0icmVzdWx0IiAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCi0gICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bmsxLmphdmEiCi0gICAgICAgICAgICAgamF2YWZpbGVzPSJ0cnVlIgotICAgICAgICAgICAgIHRhYj0iYWRkIgotICAgICAgICAgICAgIGVvbD0iY3JsZiIKLSAgICAgICAgICAgICBlb2Y9ImFzaXMiCi0gICAgICAgICAgICAgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGZpeGNybGYgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0IgotICAgICAgICAgICAgIGluY2x1ZGVzPSJKdW5rMi5qYXZhIgotICAgICAgICAgICAgIGphdmFmaWxlcz0idHJ1ZSIKLSAgICAgICAgICAgICB0YWI9ImFkZCIKLQkgICAgIGNyPSJhZGQiCi0gICAgICAgICAgICAgZW9sPSJjcmxmIgotICAgICAgICAgICAgIGVvZj0iYXNpcyIKLSAgICAgICAgICAgICAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCi0gICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bmszLmphdmEiCi0gICAgICAgICAgICAgamF2YWZpbGVzPSJ0cnVlIgotICAgICAgICAgICAgIHRhYj0icmVtb3ZlIgotICAgICAgICAgICAgIGVvbD0ibGYiCi0gICAgICAgICAgICAgZW9mPSJhc2lzIgotICAgICAgICAgICAgIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKLSAgICAgICAgICAgICBpbmNsdWRlcz0iSnVuazQuamF2YSIKLSAgICAgICAgICAgICBqYXZhZmlsZXM9InRydWUiCi0gICAgICAgICAgICAgdGFiPSJyZW1vdmUiCi0gICAgICAgICAgICAgZW9sPSJsZiIKLSAgICAgICAgICAgICBlb2Y9ImFzaXMiCi0gICAgICAgICAgICAgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGZpeGNybGYgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0IgotICAgICAgICAgICAgIGluY2x1ZGVzPSJKdW5rNS5qYXZhIgotICAgICAgICAgICAgIHRhYj0icmVtb3ZlIgotICAgICAgICAgICAgIGVvbD0ibGYiCi0gICAgICAgICAgICAgZW9mPSJhc2lzIgotICAgICAgICAgICAgIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDYiIGRlcGVuZHM9ImluaXQiPgotICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKLSAgICAgICAgICAgICBpbmNsdWRlcz0iSnVuazYuamF2YSIKLSAgICAgICAgICAgICB0YWI9ImFkZCIKLQkgICAgIGNyPSJyZW1vdmUiCi0gICAgICAgICAgICAgZW9sPSJjcmxmIgotICAgICAgICAgICAgIGVvZj0iYXNpcyIKLSAgICAgICAgICAgICAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q3IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCi0gICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bms3LmphdmEiCi0gICAgICAgICAgICAgdGFiPSJhZGQiCi0JICAgICBjcj0iYWRkIgotICAgICAgICAgICAgIGVvZj0iYXNpcyIKLSAgICAgICAgICAgICAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q4IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCi0gICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bms4LmphdmEiCi0JICAgICBqYXZhZmlsZXM9InRydWUiCi0gICAgICAgICAgICAgdGFiPSJhZGQiCi0JICAgICBjcj0iYWRkIgotICAgICAgICAgICAgIGVvZj0iYWRkIgotICAgICAgICAgICAgIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDkiIGRlcGVuZHM9ImluaXQiPgotICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKLSAgICAgICAgICAgICBpbmNsdWRlcz0iSnVuazkuamF2YSIKLQkgICAgIGphdmFmaWxlcz0idHJ1ZSIKLSAgICAgICAgICAgICB0YWI9InJlbW92ZSIKLQkgICAgIGNyPSJyZW1vdmUiCi0gICAgICAgICAgICAgZW9mPSJyZW1vdmUiCi0gICAgICAgICAgICAgLz4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazEuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyMWI4ZC4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bmsxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgSnVuazEgew0KLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7DQotCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiDQotCWlmIChteWJvb2wpIHsJLyogSGVyZSBpcyBhIG11bHRpLWxpbmUNCi0JCQkgICAod2l0aCBlbWJlZGRlZCcJJ3RhYikNCi0JICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtDQotCX0gLy8gZW5kIG9mIGlmIChteWJvb2wpDQotCQ0KLSAgICB9IC8vIGVuZCBvZiBtYWluICgpDQotfQ0KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazIuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyMWI4ZC4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bmsyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgSnVuazEgew0KLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7DQotCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiDQotCWlmIChteWJvb2wpIHsJLyogSGVyZSBpcyBhIG11bHRpLWxpbmUNCi0JCQkgICAod2l0aCBlbWJlZGRlZCcJJ3RhYikNCi0JICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtDQotCX0gLy8gZW5kIG9mIGlmIChteWJvb2wpDQotCQ0KLSAgICB9IC8vIGVuZCBvZiBtYWluICgpDQotfQ0KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazMuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyNzE2Ni4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bmszLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgSnVuazEgewotICAgIHB1YmxpYyBib29sZWFuIG15Ym9vbDsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOwotICAgICAgICAvLyAgICAgIEhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCi0gICAgICAgIGlmIChteWJvb2wpIHsgICAvKiBIZXJlIGlzIGEgbXVsdGktbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGggZW1iZWRkZWQnICAgICAgJ3RhYikKLSAgICAgICAgICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsgICAgICAvLzwtdGFiLT4gICAgICAgPC0KLSAgICAgICAgfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKLSAgICAgICAgCi0gICAgfSAvLyBlbmQgb2YgbWFpbiAoKQotfQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNC5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDI3MTY2Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBKdW5rMSB7Ci0gICAgcHVibGljIGJvb2xlYW4gbXlib29sOwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7Ci0gICAgICAgIC8vICAgICAgSGVyZSBpcyBhIGNvbW1lbnQgd2l0aCBhbiBlbWJlZGRlZCB0YWIKLSAgICAgICAgaWYgKG15Ym9vbCkgeyAgIC8qIEhlcmUgaXMgYSBtdWx0aS1saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aCBlbWJlZGRlZCcgICAgICAndGFiKQotICAgICAgICAgICAgQ29tbWVudCAqL2NoYXIgbXljaGFyID0gJwknOyAgICAgIC8vPC10YWItPiAgICAgICA8LQotICAgICAgICB9IC8vIGVuZCBvZiBpZiAobXlib29sKQotICAgICAgICAKLSAgICB9IC8vIGVuZCBvZiBtYWluICgpCi19CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms1LmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTAxYTUuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJIGhhdmUgICAgICBhIHRhYiIpOwotICAgICAgICAvLyAgICAgIEhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCi0gICAgICAgIGlmIChteWJvb2wpIHsgICAvKiBIZXJlIGlzIGEgbXVsdGktbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGggZW1iZWRkZWQnICAgICAgJ3RhYikKLSAgICAgICAgICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcgICAnOyAgICAgIC8vPC10YWItPiAgICAgICA8LQotICAgICAgICB9IC8vIGVuZCBvZiBpZiAobXlib29sKQotICAgICAgICAKLSAgICB9IC8vIGVuZCBvZiBtYWluICgpCi19CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms2LmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjFiOGQuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsNCi0gICAgcHVibGljIGJvb2xlYW4gbXlib29sOw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgew0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOw0KLQkvLwlIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYg0KLQlpZiAobXlib29sKSB7CS8qIEhlcmUgaXMgYSBtdWx0aS1saW5lDQotCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpDQotCSAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7CS8vPC10YWItPgk8LQ0KLQl9IC8vIGVuZCBvZiBpZiAobXlib29sKQ0KLQkNCi0gICAgfSAvLyBlbmQgb2YgbWFpbiAoKQ0KLX0NCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms3LmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjFiOGQuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsNCi0gICAgcHVibGljIGJvb2xlYW4gbXlib29sOw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgew0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOw0KLQkvLwlIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYg0KLQlpZiAobXlib29sKSB7CS8qIEhlcmUgaXMgYSBtdWx0aS1saW5lDQotCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpDQotCSAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7CS8vPC10YWItPgk8LQ0KLQl9IC8vIGVuZCBvZiBpZiAobXlib29sKQ0KLQkNCi0gICAgfSAvLyBlbmQgb2YgbWFpbiAoKQ0KLX0NCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms4LmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYThlODQuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsNCi0gICAgcHVibGljIGJvb2xlYW4gbXlib29sOw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgew0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOw0KLQkvLwlIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYg0KLQlpZiAobXlib29sKSB7CS8qIEhlcmUgaXMgYSBtdWx0aS1saW5lDQotCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpDQotCSAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7CS8vPC10YWItPgk8LQ0KLQl9IC8vIGVuZCBvZiBpZiAobXlib29sKQ0KLQkNCi0gICAgfSAvLyBlbmQgb2YgbWFpbiAoKQ0KLX0NCi0aClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rOS5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDI3MTY2Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBKdW5rMSB7Ci0gICAgcHVibGljIGJvb2xlYW4gbXlib29sOwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7Ci0gICAgICAgIC8vICAgICAgSGVyZSBpcyBhIGNvbW1lbnQgd2l0aCBhbiBlbWJlZGRlZCB0YWIKLSAgICAgICAgaWYgKG15Ym9vbCkgeyAgIC8qIEhlcmUgaXMgYSBtdWx0aS1saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aCBlbWJlZGRlZCcgICAgICAndGFiKQotICAgICAgICAgICAgQ29tbWVudCAqL2NoYXIgbXljaGFyID0gJwknOyAgICAgIC8vPC10YWItPiAgICAgICA8LQotICAgICAgICB9IC8vIGVuZCBvZiBpZiAobXlib29sKQotICAgICAgICAKLSAgICB9IC8vIGVuZCBvZiBtYWluICgpCi19CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmsxLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmsxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjk3NDcuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOwotCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCi0JaWYgKG15Ym9vbCkgewkvKiBIZXJlIGlzIGEgbXVsdGktbGluZQotCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpCi0JICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtCi0JfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKLQkKLSAgICB9IC8vIGVuZCBvZiBtYWluICgpCi19CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmsyLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmsyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjk3NDcuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOwotCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCi0JaWYgKG15Ym9vbCkgewkvKiBIZXJlIGlzIGEgbXVsdGktbGluZQotCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpCi0JICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtCi0JfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKLQkKLSAgICB9IC8vIGVuZCBvZiBtYWluICgpCi19CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmszLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmszLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjk3NDcuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOwotCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCi0JaWYgKG15Ym9vbCkgewkvKiBIZXJlIGlzIGEgbXVsdGktbGluZQotCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpCi0JICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtCi0JfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKLQkKLSAgICB9IC8vIGVuZCBvZiBtYWluICgpCi19CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms0LmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjcxNjYuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJIGhhdmUJYSB0YWIiKTsKLSAgICAgICAgLy8gICAgICBIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYgotICAgICAgICBpZiAobXlib29sKSB7ICAgLyogSGVyZSBpcyBhIG11bHRpLWxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoIGVtYmVkZGVkJyAgICAgICd0YWIpCi0gICAgICAgICAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7ICAgICAgLy88LXRhYi0+ICAgICAgIDwtCi0gICAgICAgIH0gLy8gZW5kIG9mIGlmIChteWJvb2wpCi0gICAgICAgIAotICAgIH0gLy8gZW5kIG9mIG1haW4gKCkKLX0KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazUuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyNzE2Ni4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgSnVuazEgewotICAgIHB1YmxpYyBib29sZWFuIG15Ym9vbDsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOwotICAgICAgICAvLyAgICAgIEhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCi0gICAgICAgIGlmIChteWJvb2wpIHsgICAvKiBIZXJlIGlzIGEgbXVsdGktbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGggZW1iZWRkZWQnICAgICAgJ3RhYikKLSAgICAgICAgICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsgICAgICAvLzwtdGFiLT4gICAgICAgPC0KLSAgICAgICAgfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKLSAgICAgICAgCi0gICAgfSAvLyBlbmQgb2YgbWFpbiAoKQotfQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rNi5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDI3MTY2Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBKdW5rMSB7Ci0gICAgcHVibGljIGJvb2xlYW4gbXlib29sOwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7Ci0gICAgICAgIC8vICAgICAgSGVyZSBpcyBhIGNvbW1lbnQgd2l0aCBhbiBlbWJlZGRlZCB0YWIKLSAgICAgICAgaWYgKG15Ym9vbCkgeyAgIC8qIEhlcmUgaXMgYSBtdWx0aS1saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aCBlbWJlZGRlZCcgICAgICAndGFiKQotICAgICAgICAgICAgQ29tbWVudCAqL2NoYXIgbXljaGFyID0gJwknOyAgICAgIC8vPC10YWItPiAgICAgICA8LQotICAgICAgICB9IC8vIGVuZCBvZiBpZiAobXlib29sKQotICAgICAgICAKLSAgICB9IC8vIGVuZCBvZiBtYWluICgpCi19CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms3LmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjcxNjYuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIEp1bmsxIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJIGhhdmUJYSB0YWIiKTsKLSAgICAgICAgLy8gICAgICBIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYgotICAgICAgICBpZiAobXlib29sKSB7ICAgLyogSGVyZSBpcyBhIG11bHRpLWxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoIGVtYmVkZGVkJyAgICAgICd0YWIpCi0gICAgICAgICAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7ICAgICAgLy88LXRhYi0+ICAgICAgIDwtCi0gICAgICAgIH0gLy8gZW5kIG9mIGlmIChteWJvb2wpCi0gICAgICAgIAotICAgIH0gLy8gZW5kIG9mIG1haW4gKCkKLX0KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazguamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2OTc0Ny4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgSnVuazEgewotICAgIHB1YmxpYyBib29sZWFuIG15Ym9vbDsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCVN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7Ci0JLy8JSGVyZSBpcyBhIGNvbW1lbnQgd2l0aCBhbiBlbWJlZGRlZCB0YWIKLQlpZiAobXlib29sKSB7CS8qIEhlcmUgaXMgYSBtdWx0aS1saW5lCi0JCQkgICAod2l0aCBlbWJlZGRlZCcJJ3RhYikKLQkgICAgQ29tbWVudCAqL2NoYXIgbXljaGFyID0gJwknOwkvLzwtdGFiLT4JPC0KLQl9IC8vIGVuZCBvZiBpZiAobXlib29sKQotCQotICAgIH0gLy8gZW5kIG9mIG1haW4gKCkKLX0KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazkuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhOGU4NC4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgSnVuazEgew0KLSAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7DQotCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiDQotCWlmIChteWJvb2wpIHsJLyogSGVyZSBpcyBhIG11bHRpLWxpbmUNCi0JCQkgICAod2l0aCBlbWJlZGRlZCcJJ3RhYikNCi0JICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtDQotCX0gLy8gZW5kIG9mIGlmIChteWJvb2wpDQotCQ0KLSAgICB9IC8vIGVuZCBvZiBtYWluICgpDQotfQ0KLRoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nZXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ2V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2YzIwYy4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPGdldC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDxnZXQgc3JjPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gICAgPGdldCBzcmM9IiIgZGVzdD0iIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDQiPgotICAgIDxnZXQgc3JjPSIiIGRlc3Q9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgZGVzdD0iIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDYiPgotICAgIDxnZXQgc3JjPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiBkZXN0PSJnZXQudG1wIi8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ndW56aXAueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ3VuemlwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlNzU1Ni4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ndW56aXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPGd1bnppcC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDxndW56aXAgc3JjPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gICAgPGd1bnppcCBzcmM9Imd6aXAudG1wIgotICAgICAgICAgICAgZGVzdD0iZ3ppcC50bXAyIi8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nemlwLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d6aXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmFkZmQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d6aXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPGd6aXAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KLSAgICA8Z3ppcCBzcmM9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICA8Z3ppcCB6aXBmaWxlPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+Ci0gICAgPGd6aXAgc3JjPSIuIiB6aXBmaWxlPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NSI+Ci0gICAgPGd6aXAgc3JjPSIuIiB6aXBmaWxlPSJnemlwLnRtcCIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamFyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NGMxZmUuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJqYXItdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxqYXIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KLSAgICA8amFyCi0gICAgCWphcmZpbGU9Imphci50bXAiCi0gICAgCW1hbmlmZXN0PSJub25lIgotICAgIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDMiPgotICAgIDxqYXIKLSAgICAJamFyZmlsZT0iamFyLnRtcCIKLQl3aGVuZW1wdHk9ImZvcm1hdCBDOiAveSIgCi0gICAgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+Ci0gICA8IS0tIGRlbGV0ZSB0aGUgdG1wLmphciBvciB0aGUgbmV4dCB0ZXN0IHdpbGwgZmFpbCAtLT4KLSAgIDxkZWxldGUgZmlsZT0idG1wLmphciIvPgotICAgPGphcgotICAgIAlqYXJmaWxlPSJ0bXAuamFyIgotCWJhc2VkaXI9Ii4iCi0JaW5jbHVkZXM9Imphci54bWwiCi0gICAgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRlc3QgaXMgdG8gbWFrZSBzdXJlIHVwVG9EYXRlIGlzIHdvcmtpbmcgLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdDUiPgotICAgIDxqYXIKLSAgICAJamFyZmlsZT0idG1wLmphciIKLQliYXNlZGlyPSIuIgotCWluY2x1ZGVzPSJqYXIueG1sIgotICAgIC8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWtkaXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWtkaXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGUxNjhiLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21rZGlyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ4eHgtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxta2Rpci8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDxta2RpciBkaXI9InRlbXBsYXRlLnhtbCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICA8bWtkaXIgZGlyPSJ0ZXN0ZGlyLnRtcCIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIuZyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2FudGxyLmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWI5NjguLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIuZworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLWNsYXNzIENhbGNQYXJzZXIgZXh0ZW5kcyBQYXJzZXI7Ci1vcHRpb25zIHsKLQlidWlsZEFTVCA9IHRydWU7CS8vIHVzZXMgQ29tbW9uQVNUIGJ5IGRlZmF1bHQKLX0KLQotZXhwcgotCToJbWV4cHIgKFBMVVNeIG1leHByKSogU0VNSSEKLQk7Ci0KLW1leHByCi0JOglhdG9tIChTVEFSXiBhdG9tKSoKLQk7Ci0KLWF0b206CUlOVAotCTsKLQotY2xhc3MgQ2FsY0xleGVyIGV4dGVuZHMgTGV4ZXI7Ci0KLVdTCToJKCcgJwotCXwJJ1x0JwotCXwJJ1xuJwotCXwJJ1xyJykKLQkJeyBfdHR5cGUgPSBUb2tlbi5TS0lQOyB9Ci0JOwotCi1MUEFSRU46CScoJwotCTsKLQotUlBBUkVOOgknKScKLQk7Ci0KLVNUQVI6CScqJwotCTsKLQotUExVUzoJJysnCi0JOwotCi1TRU1JOgknOycKLQk7Ci0KLXByb3RlY3RlZAotRElHSVQKLQk6CScwJy4uJzknCi0JOwotCi1JTlQJOgkoRElHSVQpKwotCTsKLQotY2xhc3MgQ2FsY1RyZWVXYWxrZXIgZXh0ZW5kcyBUcmVlUGFyc2VyOwotCi1leHByIHJldHVybnMgW2Zsb2F0IHJdCi17Ci0JZmxvYXQgYSxiOwotCXI9MDsKLX0KLQk6CSMoUExVUyBhPWV4cHIgYj1leHByKQl7ciA9IGErYjt9Ci0JfAkjKFNUQVIgYT1leHByIGI9ZXhwcikJe3IgPSBhKmI7fQotCXwJaTpJTlQJCQl7ciA9IChmbG9hdClJbnRlZ2VyLnBhcnNlSW50KGkuZ2V0VGV4dCgpKTt9Ci0JOwotCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9hbnRsci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9hbnRsci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZWMzNWYuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9ImFudGxyLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLQotICA8cHJvcGVydHkgbmFtZT0idG1wLmRpciIgdmFsdWU9ImFudGxyLnRtcCIvPgotCi0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPGFudGxyLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPCEtLSBkZWxldGUgdGhlIHRtcCBkaXJlY3RvcnksIGl0IG1heSBleGlzdHMgaWYgYSBwcmV2aW91cyBBTlRMUiB0ZXN0Ci0gICAgICAgICBmYWlsZWQuICBUaGlzIGluIHR1cm4gd2lsbCBjYXVzZSB0aGlzIHRlc3QgdG8gZmFpbCwgYXMgaXQgdGVzdHMKLSAgICAgICAgIHRoZSBidWlsZCBleGNlcHRpb24gd2hlbiB0aGUgb3V0cHV0ZGlyZWN0b3J5IGlzIGludmFsaWQuIC0tPgotICAgIDxkZWx0cmVlIGRpcj0iJHt0bXAuZGlyfSIvPgotICAgIDxhbnRsciB0YXJnZXQ9ImFudGxyLmciIG91dHB1dGRpcmVjdG9yeT0iJHt0bXAuZGlyfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9Ii8+Ci0gICAgPGFudGxyIHRhcmdldD0iYW50bHIuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDQiPgotICAgIDxkZWx0cmVlIGRpcj0iJHt0bXAuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0iLz4KLSAgICA8YW50bHIgdGFyZ2V0PSJqYXZhLmciIG91dHB1dGRpcmVjdG9yeT0iJHt0bXAuZGlyfSIvPgotICAgIDxhbnRsciB0YXJnZXQ9ImphdmEudHJlZS5nIiBvdXRwdXRkaXJlY3Rvcnk9IiR7dG1wLmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NSI+Ci0gICAgPGFudGxyIHRhcmdldD0iamF2YS50cmVlLmciIG91dHB1dGRpcmVjdG9yeT0iJHt0bXAuZGlyfSIgZm9yaz0ieWVzIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDYiPgotICAgIDxkZWx0cmVlIGRpcj0iJHt0bXAuZGlyfSIvPgotICAgIDwhLS0gVGhpcyB0bXAuZGlyIG5lZWRzIHRvIGJlIGRlbGV0ZWQgYnkgdGhlIGJ1aWxkIGZpbGUgd2hpY2ggZXhlY3V0ZXMgdGhpcyB0ZXN0LiAtLT4KLSAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9Ii8+Ci0gICAgPGFudGxyIHRhcmdldD0iamF2YS5nIiBvdXRwdXRkaXJlY3Rvcnk9IiR7dG1wLmRpcn0iIC8+Ci0gICAgPGFudGxyIGRpcj0iJHt0bXAuZGlyfSIKLSAgICAgICAgICAgdGFyZ2V0PSJqYXZhLnRyZWUuZyIKLSAgICAgICAgICAgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9IgotICAgICAgICAgICBmb3JrPSJ5ZXMiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NyI+Ci0gICAgPGFudGxyIHRhcmdldD0iYW50bHIueG1sIi8+Ci0gIDwvdGFyZ2V0PiAgICAKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2phdmEuZyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2phdmEuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2ZWY3Mi4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9qYXZhLmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY2ICswLDAgQEAKLS8qKiBKYXZhIDEuMiBSZWNvZ25pemVyCi0gKgotICogUnVuICdqYXZhIE1haW4gPGRpcmVjdG9yeSBmdWxsIG9mIGphdmEgZmlsZXM+JwotICoKLSAqIENvbnRyaWJ1dGluZyBhdXRob3JzOgotICoJCUpvaG4gTWl0Y2hlbGwJCWpvaG5tQG5vbi5uZXQKLSAqCQlUZXJlbmNlIFBhcnIJCXBhcnJ0QG1hZ2VsYW5nLmNvbQotICoJCUpvaG4gTGlsbGV5CQkJamxpbGxleUBlbXBhdGh5LmNvbQotICoJCVNjb3R0IFN0YW5jaGZpZWxkCXRoZXRpY2tAbWFnZWxhbmcuY29tCi0gKgkJTWFya3VzIE1vaG5lbiAgICAgICBtb2huZW5AaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZQotICoJCVBldGVyIFdpbGxpYW1zCQlwd2lsbGlhbXNAbmV0ZHluYW1pY3MuY29tCi0gKgotICogVmVyc2lvbiAxLjAwIERlY2VtYmVyIDksIDE5OTcgLS0gaW5pdGlhbCByZWxlYXNlCi0gKiBWZXJzaW9uIDEuMDEgRGVjZW1iZXIgMTAsIDE5OTcKLSAqCQlmaXhlZCBidWcgaW4gb2N0YWwgZGVmICgwLi43IG5vdCAwLi44KQotICogVmVyc2lvbiAxLjEwIEF1Z3VzdCAxOTk4IChwYXJydCkKLSAqCQlhZGRlZCB0cmVlIGNvbnN0cnVjdGlvbgotICoJCWZpeGVkIGRlZmluaXRpb24gb2YgV1MsY29tbWVudHMgZm9yIG1hYyxwYyx1bml4IG5ld2xpbmVzCi0gKgkJYWRkZWQgdW5hcnkgcGx1cwotICogVmVyc2lvbiAxLjExIChOb3YgMjAsIDE5OTgpCi0gKgkJQWRkZWQgInNodXR1cCIgb3B0aW9uIHRvIHR1cm4gb2ZmIGxhc3QgYW1iaWcgd2FybmluZy4KLSAqCQlGaXhlZCBpbm5lciBjbGFzcyBkZWYgdG8gYWxsb3cgbmFtZWQgY2xhc3MgZGVmcyBhcyBzdGF0ZW1lbnRzCi0gKgkJc3luY2hyb25pemVkIHJlcXVpcmVzIGNvbXBvdW5kIG5vdCBzaW1wbGUgc3RhdGVtZW50Ci0gKgkJYWRkIFtdIGFmdGVyIGJ1aWx0SW5UeXBlIERPVCBjbGFzcyBpbiBwcmltYXJ5RXhwcmVzc2lvbgotICoJCSJjb25zdCIgaXMgcmVzZXJ2ZWQgYnV0IG5vdCB2YWxpZC4ucmVtb3ZlZCBmcm9tIG1vZGlmaWVycwotICogVmVyc2lvbiAxLjEyIChGZWIgMiwgMTk5OSkKLSAqCQlDaGFuZ2VkIExJVEVSQUxfeHh4IHRvIHh4eCBpbiB0cmVlIGdyYW1tYXIuCi0gKgkJVXBkYXRlZCBqYXZhLmcgdG8gdXNlIHRva2VucyB7Li4ufSBub3cgZm9yIDIuNi4wIChuZXcgZmVhdHVyZSkuCi0gKgotICogVmVyc2lvbiAxLjEzIChBcHIgMjMsIDE5OTkpCi0gKgkJRGlkbid0IGhhdmUgKHN0YXQpPyBmb3IgZWxzZSBjbGF1c2UgaW4gdHJlZSBwYXJzZXIuCi0gKgkJRGlkbid0IGdlbiBBU1RzIGZvciBpbnRlcmZhY2UgZXh0ZW5kcy4gIFVwZGF0ZWQgdHJlZSBwYXJzZXIgdG9vLgotICoJCVVwZGF0ZWQgdG8gMi42LjAuCi0gKiBWZXJzaW9uIDEuMTQgKEp1biAyMCwgMTk5OSkKLSAqCQlBbGxvd2VkIGZpbmFsL2Fic3RyYWN0IG9uIGxvY2FsIGNsYXNzZXMuCi0gKgkJUmVtb3ZlZCBsb2NhbCBpbnRlcmZhY2VzIGZyb20gbWV0aG9kcwotICoJCVB1dCBpbnN0YW5jZW9mIHByZWNlZGVuY2Ugd2hlcmUgaXQgYmVsb25ncy4uLmluIHJlbGF0aW9uYWxFeHByCi0gKgkJCUl0IGFsc28gaGFkIGV4cHIgbm90IHR5cGUgYXMgYXJnOyBmaXhlZCBpdC4KLSAqCQlNaXNzaW5nICEgb24gU0VNSSBpbiBjbGFzc0Jsb2NrCi0gKgkJZml4ZWQ6IChleHByKSArICJzdHJpbmciIHdhcyBwYXJzZWQgaW5jb3JyZWN0bHkgKCsgYXMgdW5hcnkgcGx1cykuCi0gKgkJZml4ZWQ6IGRpZG4ndCBsaWtlIE9iamVjdFtdLmNsYXNzIGluIHBhcnNlciBvciB0cmVlIHBhcnNlcgotICogVmVyc2lvbiAxLjE1IChKdW4gMjYsIDE5OTkpCi0gKgkJU2NyZXdlZCB1cCBydWxlIHdpdGggaW5zdGFuY2VvZiBpbiBpdC4gOiggIEZpeGVkLgotICoJCVRyZWUgcGFyc2VyIGRpZG4ndCBsaWtlIChleHByKS5zb21ldGhpbmc7IGZpeGVkLgotICoJCUFsbG93ZWQgbXVsdGlwbGUgaW5oZXJpdGFuY2UgaW4gdHJlZSBncmFtbWFyLiBvb3BzLgotICogVmVyc2lvbiAxLjE2IChBdWd1c3QgMjIsIDE5OTkpCi0gKgkJRXh0ZW5kaW5nIGFuIGludGVyZmFjZSBidWlsdCBhIHdhY2t5IHRyZWU6IGhhZCBleHRyYSBFWFRFTkRTLgotICoJCVRyZWUgZ3JhbW1hciBkaWRuJ3QgYWxsb3cgbXVsdGlwbGUgc3VwZXJpbnRlcmZhY2VzLgotICoJCVRyZWUgZ3JhbW1hciBkaWRuJ3QgYWxsb3cgZW1wdHkgdmFyIGluaXRpYWxpemVyOiB7fQotICogVmVyc2lvbiAxLjE3IChPY3RvYmVyIDEyLCAxOTk5KQotICoJCUVTQyBsZXhlciBydWxlIGFsbG93ZWQgMzk5IG1heCBub3QgMzc3IG1heC4KLSAqCQlqYXZhLnRyZWUuZyBkaWRuJ3QgaGFuZGxlIHRoZSBleHByZXNzaW9uIG9mIHN5bmNocm9uaXplZAotICoJCQlzdGF0ZW1lbnRzLgotICoKLSAqIFZlcnNpb24gdHJhY2tpbmcgbm93IGRvbmUgd2l0aCBmb2xsb3dpbmcgSUQ6Ci0gKgotICogJElkJAotICoKLSAqIEJVRzoKLSAqIAkJRG9lc24ndCBsaWtlIGJvb2xlYW4uY2xhc3MhCi0gKgotICogY2xhc3MgVGVzdCB7Ci0gKiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmcgYXJnc1tdICkgewotICogICAgIGlmIChib29sZWFuLmNsYXNzLmVxdWFscyhib29sZWFuLmNsYXNzKSkgewotICogICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3b3JrcyIpOwotICogICAgIH0KLSAqICAgfQotICogfQotICoKLSAqIFRoaXMgZ3JhbW1hciBpcyBpbiB0aGUgUFVCTElDIERPTUFJTgotICovCi1jbGFzcyBKYXZhUmVjb2duaXplciBleHRlbmRzIFBhcnNlcjsKLW9wdGlvbnMgewotCWsgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR3byB0b2tlbiBsb29rYWhlYWQKLQlleHBvcnRWb2NhYj1KYXZhOyAgICAgICAgICAgICAgICAvLyBDYWxsIGl0cyB2b2NhYnVsYXJ5ICJKYXZhIgotCWNvZGVHZW5NYWtlU3dpdGNoVGhyZXNob2xkID0gMjsgIC8vIFNvbWUgb3B0aW1pemF0aW9ucwotCWNvZGVHZW5CaXRzZXRUZXN0VGhyZXNob2xkID0gMzsKLQlkZWZhdWx0RXJyb3JIYW5kbGVyID0gZmFsc2U7ICAgICAvLyBEb24ndCBnZW5lcmF0ZSBwYXJzZXIgZXJyb3IgaGFuZGxlcnMKLQlidWlsZEFTVCA9IHRydWU7Ci19Ci0KLXRva2VucyB7Ci0JQkxPQ0s7IE1PRElGSUVSUzsgT0JKQkxPQ0s7IFNMSVNUOyBDVE9SX0RFRjsgTUVUSE9EX0RFRjsgVkFSSUFCTEVfREVGOyAKLQlJTlNUQU5DRV9JTklUOyBTVEFUSUNfSU5JVDsgVFlQRTsgQ0xBU1NfREVGOyBJTlRFUkZBQ0VfREVGOyAKLQlQQUNLQUdFX0RFRjsgQVJSQVlfREVDTEFSQVRPUjsgRVhURU5EU19DTEFVU0U7IElNUExFTUVOVFNfQ0xBVVNFOwotCVBBUkFNRVRFUlM7IFBBUkFNRVRFUl9ERUY7IExBQkVMRURfU1RBVDsgVFlQRUNBU1Q7IElOREVYX09QOyAKLQlQT1NUX0lOQzsgUE9TVF9ERUM7IE1FVEhPRF9DQUxMOyBFWFBSOyBBUlJBWV9JTklUOyAKLQlJTVBPUlQ7IFVOQVJZX01JTlVTOyBVTkFSWV9QTFVTOyBDQVNFX0dST1VQOyBFTElTVDsgRk9SX0lOSVQ7IEZPUl9DT05ESVRJT047IAotCUZPUl9JVEVSQVRPUjsgRU1QVFlfU1RBVDsgRklOQUw9ImZpbmFsIjsgQUJTVFJBQ1Q9ImFic3RyYWN0IjsKLX0KLQkKLS8vIENvbXBpbGF0aW9uIFVuaXQ6IEluIEphdmEsIHRoaXMgaXMgYSBzaW5nbGUgZmlsZS4gIFRoaXMgaXMgdGhlIHN0YXJ0Ci0vLyAgIHJ1bGUgZm9yIHRoaXMgcGFyc2VyCi1jb21waWxhdGlvblVuaXQKLQk6CS8vIEEgY29tcGlsYXRpb24gdW5pdCBzdGFydHMgd2l0aCBhbiBvcHRpb25hbCBwYWNrYWdlIGRlZmluaXRpb24KLQkJKAlwYWNrYWdlRGVmaW5pdGlvbgotCQl8CS8qIG5vdGhpbmcgKi8KLQkJKQotCi0JCS8vIE5leHQgd2UgaGF2ZSBhIHNlcmllcyBvZiB6ZXJvIG9yIG1vcmUgaW1wb3J0IHN0YXRlbWVudHMKLQkJKCBpbXBvcnREZWZpbml0aW9uICkqCi0KLQkJLy8gV3JhcHBpbmcgdGhpbmdzIHVwIHdpdGggYW55IG51bWJlciBvZiBjbGFzcyBvciBpbnRlcmZhY2UKLQkJLy8gICAgZGVmaW5pdGlvbnMKLQkJKCB0eXBlRGVmaW5pdGlvbiApKgotCi0JCUVPRiEKLQk7Ci0KLQotLy8gUGFja2FnZSBzdGF0ZW1lbnQ6ICJwYWNrYWdlIiBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyLgotcGFja2FnZURlZmluaXRpb24KLQlvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9IC8vIGxldCBBTlRMUiBoYW5kbGUgZXJyb3JzCi0JOglwOiJwYWNrYWdlIl4geyNwLnNldFR5cGUoUEFDS0FHRV9ERUYpO30gaWRlbnRpZmllciBTRU1JIQotCTsKLQotCi0vLyBJbXBvcnQgc3RhdGVtZW50OiBpbXBvcnQgZm9sbG93ZWQgYnkgYSBwYWNrYWdlIG9yIGNsYXNzIG5hbWUKLWltcG9ydERlZmluaXRpb24KLQlvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9Ci0JOglpOiJpbXBvcnQiXiB7I2kuc2V0VHlwZShJTVBPUlQpO30gaWRlbnRpZmllclN0YXIgU0VNSSEKLQk7Ci0KLS8vIEEgdHlwZSBkZWZpbml0aW9uIGluIGEgZmlsZSBpcyBlaXRoZXIgYSBjbGFzcyBvciBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLXR5cGVEZWZpbml0aW9uCi0Jb3B0aW9ucyB7ZGVmYXVsdEVycm9ySGFuZGxlciA9IHRydWU7fQotCToJbTptb2RpZmllcnMhCi0JCSggY2xhc3NEZWZpbml0aW9uWyNtXQotCQl8IGludGVyZmFjZURlZmluaXRpb25bI21dCi0JCSkKLQl8CVNFTUkhCi0JOwotCi0vKiogQSBkZWNsYXJhdGlvbiBpcyB0aGUgY3JlYXRpb24gb2YgYSByZWZlcmVuY2Ugb3IgcHJpbWl0aXZlLXR5cGUgdmFyaWFibGUKLSAqICBDcmVhdGUgYSBzZXBhcmF0ZSBUeXBlL1ZhciB0cmVlIGZvciBlYWNoIHZhciBpbiB0aGUgdmFyIGxpc3QuCi0gKi8KLWRlY2xhcmF0aW9uIQotCToJbTptb2RpZmllcnMgdDp0eXBlU3BlY1tmYWxzZV0gdjp2YXJpYWJsZURlZmluaXRpb25zWyNtLCN0XQotCQl7I2RlY2xhcmF0aW9uID0gI3Y7fQotCTsKLQotLy8gQSBsaXN0IG9mIHplcm8gb3IgbW9yZSBtb2RpZmllcnMuICBXZSBjb3VsZCBoYXZlIHVzZWQgKG1vZGlmaWVyKSogaW4KLS8vICAgcGxhY2Ugb2YgYSBjYWxsIHRvIG1vZGlmaWVycywgYnV0IEkgdGhvdWdodCBpdCB3YXMgYSBnb29kIGlkZWEgdG8ga2VlcAotLy8gICB0aGlzIHJ1bGUgc2VwYXJhdGUgc28gdGhleSBjYW4gZWFzaWx5IGJlIGNvbGxlY3RlZCBpbiBhIFZlY3RvciBpZgotLy8gICBzb21lb25lIHNvIGRlc2lyZXMKLW1vZGlmaWVycwotCToJKCBtb2RpZmllciApKgotCQl7I21vZGlmaWVycyA9ICMoW01PRElGSUVSUywgIk1PRElGSUVSUyJdLCAjbW9kaWZpZXJzKTt9Ci0JOwotCi0KLS8vIEEgdHlwZSBzcGVjaWZpY2F0aW9uIGlzIGEgdHlwZSBuYW1lIHdpdGggcG9zc2libGUgYnJhY2tldHMgYWZ0ZXJ3YXJkcwotLy8gICAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KLXR5cGVTcGVjW2Jvb2xlYW4gYWRkSW1hZ05vZGVdCi0JOiBjbGFzc1R5cGVTcGVjW2FkZEltYWdOb2RlXQotCXwgYnVpbHRJblR5cGVTcGVjW2FkZEltYWdOb2RlXQotCTsKLQotLy8gQSBjbGFzcyB0eXBlIHNwZWNpZmljYXRpb24gaXMgYSBjbGFzcyB0eXBlIHdpdGggcG9zc2libGUgYnJhY2tldHMgYWZ0ZXJ3YXJkcwotLy8gICAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KLWNsYXNzVHlwZVNwZWNbYm9vbGVhbiBhZGRJbWFnTm9kZV0KLQk6CWlkZW50aWZpZXIgKGxiOkxCUkFDS14geyNsYi5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLISkqCi0JCXsKLQkJCWlmICggYWRkSW1hZ05vZGUgKSB7Ci0JCQkJI2NsYXNzVHlwZVNwZWMgPSAjKCNbVFlQRSwiVFlQRSJdLCAjY2xhc3NUeXBlU3BlYyk7Ci0JCQl9Ci0JCX0KLQk7Ci0KLS8vIEEgYnVpbHRpbiB0eXBlIHNwZWNpZmljYXRpb24gaXMgYSBidWlsdGluIHR5cGUgd2l0aCBwb3NzaWJsZSBicmFja2V0cwotLy8gYWZ0ZXJ3YXJkcyAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KLWJ1aWx0SW5UeXBlU3BlY1tib29sZWFuIGFkZEltYWdOb2RlXQotCToJYnVpbHRJblR5cGUgKGxiOkxCUkFDS14geyNsYi5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLISkqCi0JCXsKLQkJCWlmICggYWRkSW1hZ05vZGUgKSB7Ci0JCQkJI2J1aWx0SW5UeXBlU3BlYyA9ICMoI1tUWVBFLCJUWVBFIl0sICNidWlsdEluVHlwZVNwZWMpOwotCQkJfQotCQl9Ci0JOwotCi0vLyBBIHR5cGUgbmFtZS4gd2hpY2ggaXMgZWl0aGVyIGEgKHBvc3NpYmx5IHF1YWxpZmllZCkgY2xhc3MgbmFtZSBvcgotLy8gICBhIHByaW1pdGl2ZSAoYnVpbHRpbikgdHlwZQotdHlwZQotCToJaWRlbnRpZmllcgotCXwJYnVpbHRJblR5cGUKLQk7Ci0KLS8vIFRoZSBwcmltaXRpdmUgdHlwZXMuCi1idWlsdEluVHlwZQotCToJInZvaWQiCi0JfAkiYm9vbGVhbiIKLQl8CSJieXRlIgotCXwJImNoYXIiCi0JfAkic2hvcnQiCi0JfAkiaW50IgotCXwJImZsb2F0IgotCXwJImxvbmciCi0JfAkiZG91YmxlIgotCTsKLQotLy8gQSAocG9zc2libHktcXVhbGlmaWVkKSBqYXZhIGlkZW50aWZpZXIuICBXZSBzdGFydCB3aXRoIHRoZSBmaXJzdCBJREVOVAotLy8gICBhbmQgZXhwYW5kIGl0cyBuYW1lIGJ5IGFkZGluZyBkb3RzIGFuZCBmb2xsb3dpbmcgSURFTlRTCi1pZGVudGlmaWVyCi0JOglJREVOVCAgKCBET1ReIElERU5UICkqCi0JOwotCi1pZGVudGlmaWVyU3RhcgotCToJSURFTlQKLQkJKCBET1ReIElERU5UICkqCi0JCSggRE9UXiBTVEFSICApPwotCTsKLQotCi0vLyBtb2RpZmllcnMgZm9yIEphdmEgY2xhc3NlcywgaW50ZXJmYWNlcywgY2xhc3MvaW5zdGFuY2UgdmFycyBhbmQgbWV0aG9kcwotbW9kaWZpZXIKLQk6CSJwcml2YXRlIgotCXwJInB1YmxpYyIKLQl8CSJwcm90ZWN0ZWQiCi0JfAkic3RhdGljIgotCXwJInRyYW5zaWVudCIKLQl8CSJmaW5hbCIKLQl8CSJhYnN0cmFjdCIKLQl8CSJuYXRpdmUiCi0JfAkidGhyZWFkc2FmZSIKLQl8CSJzeW5jaHJvbml6ZWQiCi0vLwl8CSJjb25zdCIJCQkvLyByZXNlcnZlZCB3b3JkOyBsZWF2ZSBvdXQKLQl8CSJ2b2xhdGlsZSIKLQk7Ci0KLQotLy8gRGVmaW5pdGlvbiBvZiBhIEphdmEgY2xhc3MKLWNsYXNzRGVmaW5pdGlvbiFbQVNUIG1vZGlmaWVyc10KLQk6CSJjbGFzcyIgSURFTlQKLQkJLy8gaXQgX21pZ2h0XyBoYXZlIGEgc3VwZXJjbGFzcy4uLgotCQlzYzpzdXBlckNsYXNzQ2xhdXNlCi0JCS8vIGl0IG1pZ2h0IGltcGxlbWVudCBzb21lIGludGVyZmFjZXMuLi4KLQkJaWM6aW1wbGVtZW50c0NsYXVzZQotCQkvLyBub3cgcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGNsYXNzCi0JCWNiOmNsYXNzQmxvY2sKLQkJeyNjbGFzc0RlZmluaXRpb24gPSAjKCNbQ0xBU1NfREVGLCJDTEFTU19ERUYiXSwKLQkJCQkJCQkgICBtb2RpZmllcnMsSURFTlQsc2MsaWMsY2IpO30KLQk7Ci0KLXN1cGVyQ2xhc3NDbGF1c2UhCi0JOgkoICJleHRlbmRzIiBpZDppZGVudGlmaWVyICk/Ci0JCXsjc3VwZXJDbGFzc0NsYXVzZSA9ICMoI1tFWFRFTkRTX0NMQVVTRSwiRVhURU5EU19DTEFVU0UiXSxpZCk7fQotCTsKLQotLy8gRGVmaW5pdGlvbiBvZiBhIEphdmEgSW50ZXJmYWNlCi1pbnRlcmZhY2VEZWZpbml0aW9uIVtBU1QgbW9kaWZpZXJzXQotCToJImludGVyZmFjZSIgSURFTlQKLQkJLy8gaXQgbWlnaHQgZXh0ZW5kIHNvbWUgb3RoZXIgaW50ZXJmYWNlcwotCQlpZTppbnRlcmZhY2VFeHRlbmRzCi0JCS8vIG5vdyBwYXJzZSB0aGUgYm9keSBvZiB0aGUgaW50ZXJmYWNlIChsb29rcyBsaWtlIGEgY2xhc3MuLi4pCi0JCWNiOmNsYXNzQmxvY2sKLQkJeyNpbnRlcmZhY2VEZWZpbml0aW9uID0gIygjW0lOVEVSRkFDRV9ERUYsIklOVEVSRkFDRV9ERUYiXSwKLQkJCQkJCQkJCW1vZGlmaWVycyxJREVOVCxpZSxjYik7fQotCTsKLQotCi0vLyBUaGlzIGlzIHRoZSBib2R5IG9mIGEgY2xhc3MuICBZb3UgY2FuIGhhdmUgZmllbGRzIGFuZCBleHRyYSBzZW1pY29sb25zLAotLy8gVGhhdCdzIGFib3V0IGl0ICh1bnRpbCB5b3Ugc2VlIHdoYXQgYSBmaWVsZCBpcy4uLikKLWNsYXNzQmxvY2sKLQk6CUxDVVJMWSEKLQkJCSggZmllbGQgfCBTRU1JISApKgotCQlSQ1VSTFkhCi0JCXsjY2xhc3NCbG9jayA9ICMoW09CSkJMT0NLLCAiT0JKQkxPQ0siXSwgI2NsYXNzQmxvY2spO30KLQk7Ci0KLS8vIEFuIGludGVyZmFjZSBjYW4gZXh0ZW5kIHNldmVyYWwgb3RoZXIgaW50ZXJmYWNlcy4uLgotaW50ZXJmYWNlRXh0ZW5kcwotCToJKAotCQllOiJleHRlbmRzIiEKLQkJaWRlbnRpZmllciAoIENPTU1BISBpZGVudGlmaWVyICkqCi0JCSk/Ci0JCXsjaW50ZXJmYWNlRXh0ZW5kcyA9ICMoI1tFWFRFTkRTX0NMQVVTRSwiRVhURU5EU19DTEFVU0UiXSwKLQkJCQkJCQkjaW50ZXJmYWNlRXh0ZW5kcyk7fQotCTsKLQotLy8gQSBjbGFzcyBjYW4gaW1wbGVtZW50IHNldmVyYWwgaW50ZXJmYWNlcy4uLgotaW1wbGVtZW50c0NsYXVzZQotCToJKAotCQkJaToiaW1wbGVtZW50cyIhIGlkZW50aWZpZXIgKCBDT01NQSEgaWRlbnRpZmllciApKgotCQkpPwotCQl7I2ltcGxlbWVudHNDbGF1c2UgPSAjKCNbSU1QTEVNRU5UU19DTEFVU0UsIklNUExFTUVOVFNfQ0xBVVNFIl0sCi0JCQkJCQkJCSAjaW1wbGVtZW50c0NsYXVzZSk7fQotCTsKLQotLy8gTm93IHRoZSB2YXJpb3VzIHRoaW5ncyB0aGF0IGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIGNsYXNzIG9yIGludGVyZmFjZS4uLgotLy8gTm90ZSB0aGF0IG5vdCBhbGwgb2YgdGhlc2UgYXJlIHJlYWxseSB2YWxpZCBpbiBhbiBpbnRlcmZhY2UgKGNvbnN0cnVjdG9ycywKLS8vICAgZm9yIGV4YW1wbGUpLCBhbmQgaWYgdGhpcyBncmFtbWFyIHdlcmUgdXNlZCBmb3IgYSBjb21waWxlciB0aGVyZSB3b3VsZAotLy8gICBuZWVkIHRvIGJlIHNvbWUgc2VtYW50aWMgY2hlY2tzIHRvIG1ha2Ugc3VyZSB3ZSdyZSBkb2luZyB0aGUgcmlnaHQgdGhpbmcuLi4KLWZpZWxkIQotCToJLy8gbWV0aG9kLCBjb25zdHJ1Y3Rvciwgb3IgdmFyaWFibGUgZGVjbGFyYXRpb24KLQkJbW9kczptb2RpZmllcnMKLQkJKAloOmN0b3JIZWFkIHM6Y29tcG91bmRTdGF0ZW1lbnQgLy8gY29uc3RydWN0b3IKLQkJCXsjZmllbGQgPSAjKCNbQ1RPUl9ERUYsIkNUT1JfREVGIl0sIG1vZHMsIGgsIHMpO30KLQotCQl8CWNkOmNsYXNzRGVmaW5pdGlvblsjbW9kc10gICAgICAgLy8gaW5uZXIgY2xhc3MKLQkJCXsjZmllbGQgPSAjY2Q7fQotCQkJCi0JCXwJaWQ6aW50ZXJmYWNlRGVmaW5pdGlvblsjbW9kc10gICAvLyBpbm5lciBpbnRlcmZhY2UKLQkJCXsjZmllbGQgPSAjaWQ7fQotCi0JCXwJdDp0eXBlU3BlY1tmYWxzZV0gIC8vIG1ldGhvZCBvciB2YXJpYWJsZSBkZWNsYXJhdGlvbihzKQotCQkJKAlJREVOVCAgLy8gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotCi0JCQkJLy8gcGFyc2UgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgotCQkJCUxQQVJFTiEgcGFyYW06cGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0IFJQQVJFTiEKLQotCQkJCXJ0OnJldHVyblR5cGVCcmFja2Vyc09uRW5kT2ZNZXRob2RIZWFkWyN0XQotCi0JCQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCB0byB0aHJvdwotCQkJCSh0Yzp0aHJvd3NDbGF1c2UpPwotCi0JCQkJKCBzMjpjb21wb3VuZFN0YXRlbWVudCB8IFNFTUkgKQotCQkJCXsjZmllbGQgPSAjKCNbTUVUSE9EX0RFRiwiTUVUSE9EX0RFRiJdLAotCQkJCQkJICAgICBtb2RzLAotCQkJCQkJCSAjKCNbVFlQRSwiVFlQRSJdLHJ0KSwKLQkJCQkJCQkgSURFTlQsCi0JCQkJCQkJIHBhcmFtLAotCQkJCQkJCSB0YywKLQkJCQkJCQkgczIpO30KLQkJCXwJdjp2YXJpYWJsZURlZmluaXRpb25zWyNtb2RzLCN0XSBTRU1JCi0vLwkJCQl7I2ZpZWxkID0gIygjW1ZBUklBQkxFX0RFRiwiVkFSSUFCTEVfREVGIl0sIHYpO30KLQkJCQl7I2ZpZWxkID0gI3Y7fQotCQkJKQotCQkpCi0KLSAgICAvLyAic3RhdGljIHsgLi4uIH0iIGNsYXNzIGluaXRpYWxpemVyCi0JfAkic3RhdGljIiBzMzpjb21wb3VuZFN0YXRlbWVudAotCQl7I2ZpZWxkID0gIygjW1NUQVRJQ19JTklULCJTVEFUSUNfSU5JVCJdLCBzMyk7fQotCi0gICAgLy8gInsgLi4uIH0iIGluc3RhbmNlIGluaXRpYWxpemVyCi0JfAlzNDpjb21wb3VuZFN0YXRlbWVudAotCQl7I2ZpZWxkID0gIygjW0lOU1RBTkNFX0lOSVQsIklOU1RBTkNFX0lOSVQiXSwgczQpO30KLQk7Ci0KLXZhcmlhYmxlRGVmaW5pdGlvbnNbQVNUIG1vZHMsIEFTVCB0XQotCToJdmFyaWFibGVEZWNsYXJhdG9yW2dldEFTVEZhY3RvcnkoKS5kdXBUcmVlKG1vZHMpLAotCQkJCQkJICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCi0JCSgJQ09NTUEhCi0JCQl2YXJpYWJsZURlY2xhcmF0b3JbZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUobW9kcyksCi0JCQkJCQkJICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCi0JCSkqCi0JOwotCi0vKiogRGVjbGFyYXRpb24gb2YgYSB2YXJpYWJsZS4gIFRoaXMgY2FuIGJlIGEgY2xhc3MvaW5zdGFuY2UgdmFyaWFibGUsCi0gKiAgIG9yIGEgbG9jYWwgdmFyaWFibGUgaW4gYSBtZXRob2QKLSAqIEl0IGNhbiBhbHNvIGluY2x1ZGUgcG9zc2libGUgaW5pdGlhbGl6YXRpb24uCi0gKi8KLXZhcmlhYmxlRGVjbGFyYXRvciFbQVNUIG1vZHMsIEFTVCB0XQotCToJaWQ6SURFTlQgZDpkZWNsYXJhdG9yQnJhY2tldHNbdF0gdjp2YXJJbml0aWFsaXplcgotCQl7I3ZhcmlhYmxlRGVjbGFyYXRvciA9ICMoI1tWQVJJQUJMRV9ERUYsIlZBUklBQkxFX0RFRiJdLCBtb2RzLCAjKCNbVFlQRSwiVFlQRSJdLGQpLCBpZCwgdik7fQotCTsKLQotZGVjbGFyYXRvckJyYWNrZXRzW0FTVCB0eXBdCi0JOgl7I2RlY2xhcmF0b3JCcmFja2V0cz10eXA7fQotCQkobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKLQk7Ci0KLXZhckluaXRpYWxpemVyCi0JOgkoIEFTU0lHTl4gaW5pdGlhbGl6ZXIgKT8KLQk7Ci0KLS8vIFRoaXMgaXMgYW4gaW5pdGlhbGl6ZXIgdXNlZCB0byBzZXQgdXAgYW4gYXJyYXkuCi1hcnJheUluaXRpYWxpemVyCi0JOglsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShBUlJBWV9JTklUKTt9Ci0JCQkoCWluaXRpYWxpemVyCi0JCQkJKAotCQkJCQkvLyBDT05GTElDVDogZG9lcyBhIENPTU1BIGFmdGVyIGFuIGluaXRpYWxpemVyIHN0YXJ0IGEgbmV3Ci0JCQkJCS8vICAgICAgICAgICBpbml0aWFsaXplciBvciBzdGFydCB0aGUgb3B0aW9uICcsJyBhdCBlbmQ/Ci0JCQkJCS8vICAgICAgICAgICBBTlRMUiBnZW5lcmF0ZXMgcHJvcGVyIGNvZGUgYnkgbWF0Y2hpbmcKLQkJCQkJLy8JCQkgdGhlIGNvbW1hIGFzIHNvb24gYXMgcG9zc2libGUuCi0JCQkJCW9wdGlvbnMgewotCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJOgotCQkJCQlDT01NQSEgaW5pdGlhbGl6ZXIKLQkJCQkpKgotCQkJCShDT01NQSEpPwotCQkJKT8KLQkJUkNVUkxZIQotCTsKLQotCi0vLyBUaGUgdHdvICJ0aGluZ3MiIHRoYXQgY2FuIGluaXRpYWxpemUgYW4gYXJyYXkgZWxlbWVudCBhcmUgYW4gZXhwcmVzc2lvbgotLy8gICBhbmQgYW5vdGhlciAobmVzdGVkKSBhcnJheSBpbml0aWFsaXplci4KLWluaXRpYWxpemVyCi0JOglleHByZXNzaW9uCi0JfAlhcnJheUluaXRpYWxpemVyCi0JOwotCi0vLyBUaGlzIGlzIHRoZSBoZWFkZXIgb2YgYSBtZXRob2QuICBJdCBpbmNsdWRlcyB0aGUgbmFtZSBhbmQgcGFyYW1ldGVycwotLy8gICBmb3IgdGhlIG1ldGhvZC4KLS8vICAgVGhpcyBhbHNvIHdhdGNoZXMgZm9yIGEgbGlzdCBvZiBleGNlcHRpb24gY2xhc3NlcyBpbiBhICJ0aHJvd3MiIGNsYXVzZS4KLWN0b3JIZWFkCi0JOglJREVOVCAgLy8gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotCi0JCS8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KLQkJTFBBUkVOISBwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgUlBBUkVOIQotCi0JCS8vIGdldCB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVjbGFyZWQgdG8gdGhyb3cKLQkJKHRocm93c0NsYXVzZSk/Ci0JOwotCi0vLyBUaGlzIGlzIGEgbGlzdCBvZiBleGNlcHRpb24gY2xhc3NlcyB0aGF0IHRoZSBtZXRob2QgaXMgZGVjbGFyZWQgdG8gdGhyb3cKLXRocm93c0NsYXVzZQotCToJInRocm93cyJeIGlkZW50aWZpZXIgKCBDT01NQSEgaWRlbnRpZmllciApKgotCTsKLQotCi1yZXR1cm5UeXBlQnJhY2tlcnNPbkVuZE9mTWV0aG9kSGVhZFtBU1QgdHlwXQotCToJeyNyZXR1cm5UeXBlQnJhY2tlcnNPbkVuZE9mTWV0aG9kSGVhZCA9IHR5cDt9Ci0JCShsYjpMQlJBQ0teIHsjbGIuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9IFJCUkFDSyEpKgotCTsKLQotLy8gQSBsaXN0IG9mIGZvcm1hbCBwYXJhbWV0ZXJzCi1wYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QKLQk6CSggcGFyYW1ldGVyRGVjbGFyYXRpb24gKCBDT01NQSEgcGFyYW1ldGVyRGVjbGFyYXRpb24gKSogKT8KLQkJeyNwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgPSAjKCNbUEFSQU1FVEVSUywiUEFSQU1FVEVSUyJdLAotCQkJCQkJCQkJI3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCk7fQotCTsKLQotLy8gQSBmb3JtYWwgcGFyYW1ldGVyLgotcGFyYW1ldGVyRGVjbGFyYXRpb24hCi0JOglwbTpwYXJhbWV0ZXJNb2RpZmllciB0OnR5cGVTcGVjW2ZhbHNlXSBpZDpJREVOVAotCQlwZDpwYXJhbWV0ZXJEZWNsYXJhdG9yQnJhY2tldHNbI3RdCi0JCXsjcGFyYW1ldGVyRGVjbGFyYXRpb24gPSAjKCNbUEFSQU1FVEVSX0RFRiwiUEFSQU1FVEVSX0RFRiJdLAotCQkJCQkJCQkJcG0sICMoW1RZUEUsIlRZUEUiXSxwZCksIGlkKTt9Ci0JOwotCi1wYXJhbWV0ZXJEZWNsYXJhdG9yQnJhY2tldHNbQVNUIHRdCi0JOgl7I3BhcmFtZXRlckRlY2xhcmF0b3JCcmFja2V0cyA9IHQ7fQotCQkobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKLQk7Ci0KLXBhcmFtZXRlck1vZGlmaWVyCi0JOgkoZjoiZmluYWwiKT8KLQkJeyNwYXJhbWV0ZXJNb2RpZmllciA9ICMoI1tNT0RJRklFUlMsIk1PRElGSUVSUyJdLCBmKTt9Ci0JOwotCi0vLyBDb21wb3VuZCBzdGF0ZW1lbnQuICBUaGlzIGlzIHVzZWQgaW4gbWFueSBjb250ZXh0czoKLS8vICAgSW5zaWRlIGEgY2xhc3MgZGVmaW5pdGlvbiBwcmVmaXhlZCB3aXRoICJzdGF0aWMiOgotLy8gICAgICBpdCBpcyBhIGNsYXNzIGluaXRpYWxpemVyCi0vLyAgIEluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gd2l0aG91dCAic3RhdGljIjoKLS8vICAgICAgaXQgaXMgYW4gaW5zdGFuY2UgaW5pdGlhbGl6ZXIKLS8vICAgQXMgdGhlIGJvZHkgb2YgYSBtZXRob2QKLS8vICAgQXMgYSBjb21wbGV0ZWx5IGluZGVwZGVudCBicmFjZWQgYmxvY2sgb2YgY29kZSBpbnNpZGUgYSBtZXRob2QKLS8vICAgICAgaXQgc3RhcnRzIGEgbmV3IHNjb3BlIGZvciB2YXJpYWJsZSBkZWZpbml0aW9ucwotCi1jb21wb3VuZFN0YXRlbWVudAotCToJbGM6TENVUkxZXiB7I2xjLnNldFR5cGUoU0xJU1QpO30KLQkJCS8vIGluY2x1ZGUgdGhlIChwb3NzaWJseS1lbXB0eSkgbGlzdCBvZiBzdGF0ZW1lbnRzCi0JCQkoc3RhdGVtZW50KSoKLQkJUkNVUkxZIQotCTsKLQotCi1zdGF0ZW1lbnQKLQkvLyBBIGxpc3Qgb2Ygc3RhdGVtZW50cyBpbiBjdXJseSBicmFjZXMgLS0gc3RhcnQgYSBuZXcgc2NvcGUhCi0JOgljb21wb3VuZFN0YXRlbWVudAotCi0JLy8gY2xhc3MgZGVmaW5pdGlvbgotCXwJY2xhc3NEZWZpbml0aW9uWyNbTU9ESUZJRVJTLCAiTU9ESUZJRVJTIl1dCi0KLQkvLyBmaW5hbCBjbGFzcyBkZWZpbml0aW9uCi0JfAkiZmluYWwiISBjbGFzc0RlZmluaXRpb25bIygjW01PRElGSUVSUywgIk1PRElGSUVSUyJdLCNbRklOQUwsImZpbmFsIl0pXQotCi0JLy8gYWJzdHJhY3QgY2xhc3MgZGVmaW5pdGlvbgotCXwJImFic3RyYWN0IiEgY2xhc3NEZWZpbml0aW9uWyMoI1tNT0RJRklFUlMsICJNT0RJRklFUlMiXSwjW0FCU1RSQUNULCJhYnN0cmFjdCJdKV0KLQotCS8vIGRlY2xhcmF0aW9ucyBhcmUgYW1iaWd1b3VzIHdpdGggIklEIERPVCIgcmVsYXRpdmUgdG8gZXhwcmVzc2lvbgotCS8vIHN0YXRlbWVudHMuICBNdXN0IGJhY2t0cmFjayB0byBiZSBzdXJlLiAgQ291bGQgdXNlIGEgc2VtYW50aWMKLQkvLyBwcmVkaWNhdGUgdG8gdGVzdCBzeW1ib2wgdGFibGUgdG8gc2VlIHdoYXQgdGhlIHR5cGUgd2FzIGNvbWluZwotCS8vIHVwLCBidXQgdGhhdCdzIHByZXR0eSBoYXJkIHdpdGhvdXQgYSBzeW1ib2wgdGFibGUgOykKLQl8CShkZWNsYXJhdGlvbik9PiBkZWNsYXJhdGlvbiBTRU1JIQotCi0JLy8gQW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQuICBUaGlzIGNvdWxkIGJlIGEgbWV0aG9kIGNhbGwsCi0JLy8gYXNzaWdubWVudCBzdGF0ZW1lbnQsIG9yIGFueSBvdGhlciBleHByZXNzaW9uIGV2YWx1YXRlZCBmb3IKLQkvLyBzaWRlLWVmZmVjdHMuCi0JfAlleHByZXNzaW9uIFNFTUkhCi0KLQkvLyBBdHRhY2ggYSBsYWJlbCB0byB0aGUgZnJvbnQgb2YgYSBzdGF0ZW1lbnQKLQl8CUlERU5UIGM6Q09MT05eIHsjYy5zZXRUeXBlKExBQkVMRURfU1RBVCk7fSBzdGF0ZW1lbnQKLQotCS8vIElmLWVsc2Ugc3RhdGVtZW50Ci0JfAkiaWYiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBzdGF0ZW1lbnQKLQkJKAotCQkJLy8gQ09ORkxJQ1Q6IHRoZSBvbGQgImRhbmdsaW5nLWVsc2UiIHByb2JsZW0uLi4KLQkJCS8vICAgICAgICAgICBBTlRMUiBnZW5lcmF0ZXMgcHJvcGVyIGNvZGUgbWF0Y2hpbmcKLQkJCS8vCQkJIGFzIHNvb24gYXMgcG9zc2libGUuICBIdXNoIHdhcm5pbmcuCi0JCQlvcHRpb25zIHsKLQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0JCQl9Ci0JCToKLQkJCSJlbHNlIiEgc3RhdGVtZW50Ci0JCSk/Ci0KLQkvLyBGb3Igc3RhdGVtZW50Ci0JfAkiZm9yIl4KLQkJCUxQQVJFTiEKLQkJCQlmb3JJbml0IFNFTUkhICAgLy8gaW5pdGlhbGl6ZXIKLQkJCQlmb3JDb25kCVNFTUkhICAgLy8gY29uZGl0aW9uIHRlc3QKLQkJCQlmb3JJdGVyICAgICAgICAgLy8gdXBkYXRlcgotCQkJUlBBUkVOIQotCQkJc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGVtZW50IHRvIGxvb3Agb3ZlcgotCi0JLy8gV2hpbGUgc3RhdGVtZW50Ci0JfAkid2hpbGUiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBzdGF0ZW1lbnQKLQotCS8vIGRvLXdoaWxlIHN0YXRlbWVudAotCXwJImRvIl4gc3RhdGVtZW50ICJ3aGlsZSIhIExQQVJFTiEgZXhwcmVzc2lvbiBSUEFSRU4hIFNFTUkhCi0KLQkvLyBnZXQgb3V0IG9mIGEgbG9vcCAob3Igc3dpdGNoKQotCXwJImJyZWFrIl4gKElERU5UKT8gU0VNSSEKLQotCS8vIGRvIG5leHQgaXRlcmF0aW9uIG9mIGEgbG9vcAotCXwJImNvbnRpbnVlIl4gKElERU5UKT8gU0VNSSEKLQotCS8vIFJldHVybiBhbiBleHByZXNzaW9uCi0JfAkicmV0dXJuIl4gKGV4cHJlc3Npb24pPyBTRU1JIQotCi0JLy8gc3dpdGNoL2Nhc2Ugc3RhdGVtZW50Ci0JfAkic3dpdGNoIl4gTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgTENVUkxZIQotCQkJKCBjYXNlc0dyb3VwICkqCi0JCVJDVVJMWSEKLQotCS8vIGV4Y2VwdGlvbiB0cnktY2F0Y2ggYmxvY2sKLQl8CXRyeUJsb2NrCi0KLQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQl8CSJ0aHJvdyJeIGV4cHJlc3Npb24gU0VNSSEKLQotCS8vIHN5bmNocm9uaXplIGEgc3RhdGVtZW50Ci0JfAkic3luY2hyb25pemVkIl4gTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgY29tcG91bmRTdGF0ZW1lbnQKLQotCS8vIGVtcHR5IHN0YXRlbWVudAotCXwJczpTRU1JIHsjcy5zZXRUeXBlKEVNUFRZX1NUQVQpO30KLQk7Ci0KLQotY2FzZXNHcm91cAotCToJKAkvLyBDT05GTElDVDogdG8gd2hpY2ggY2FzZSBncm91cCBkbyB0aGUgc3RhdGVtZW50cyBiaW5kPwotCQkJLy8gICAgICAgICAgIEFOVExSIGdlbmVyYXRlcyBwcm9wZXIgY29kZTogaXQgZ3JvdXBzIHRoZQotCQkJLy8gICAgICAgICAgIG1hbnkgImNhc2UiLyJkZWZhdWx0IiBsYWJlbHMgdG9nZXRoZXIgdGhlbgotCQkJLy8gICAgICAgICAgIGZvbGxvd3MgdGhlbSB3aXRoIHRoZSBzdGF0ZW1lbnRzCi0JCQlvcHRpb25zIHsKLQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0JCQl9Ci0JCQk6Ci0JCQlhQ2FzZQotCQkpKwotCQljYXNlU0xpc3QKLQkJeyNjYXNlc0dyb3VwID0gIyhbQ0FTRV9HUk9VUCwgIkNBU0VfR1JPVVAiXSwgI2Nhc2VzR3JvdXApO30KLQk7Ci0KLWFDYXNlCi0JOgkoImNhc2UiXiBleHByZXNzaW9uIHwgImRlZmF1bHQiKSBDT0xPTiEKLQk7Ci0KLWNhc2VTTGlzdAotCToJKHN0YXRlbWVudCkqCi0JCXsjY2FzZVNMaXN0ID0gIygjW1NMSVNULCJTTElTVCJdLCNjYXNlU0xpc3QpO30KLQk7Ci0KLS8vIFRoZSBpbml0aWFsaXplciBmb3IgYSBmb3IgbG9vcAotZm9ySW5pdAotCQkvLyBpZiBpdCBsb29rcyBsaWtlIGEgZGVjbGFyYXRpb24sIGl0IGlzCi0JOgkoCShkZWNsYXJhdGlvbik9PiBkZWNsYXJhdGlvbgotCQkvLyBvdGhlcndpc2UgaXQgY291bGQgYmUgYW4gZXhwcmVzc2lvbiBsaXN0Li4uCi0JCXwJZXhwcmVzc2lvbkxpc3QKLQkJKT8KLQkJeyNmb3JJbml0ID0gIygjW0ZPUl9JTklULCJGT1JfSU5JVCJdLCNmb3JJbml0KTt9Ci0JOwotCi1mb3JDb25kCi0JOgkoZXhwcmVzc2lvbik/Ci0JCXsjZm9yQ29uZCA9ICMoI1tGT1JfQ09ORElUSU9OLCJGT1JfQ09ORElUSU9OIl0sI2ZvckNvbmQpO30KLQk7Ci0KLWZvckl0ZXIKLQk6CShleHByZXNzaW9uTGlzdCk/Ci0JCXsjZm9ySXRlciA9ICMoI1tGT1JfSVRFUkFUT1IsIkZPUl9JVEVSQVRPUiJdLCNmb3JJdGVyKTt9Ci0JOwotCi0vLyBhbiBleGNlcHRpb24gaGFuZGxlciB0cnkvY2F0Y2ggYmxvY2sKLXRyeUJsb2NrCi0JOgkidHJ5Il4gY29tcG91bmRTdGF0ZW1lbnQKLQkJKGhhbmRsZXIpKgotCQkoICJmaW5hbGx5Il4gY29tcG91bmRTdGF0ZW1lbnQgKT8KLQk7Ci0KLQotLy8gYW4gZXhjZXB0aW9uIGhhbmRsZXIKLWhhbmRsZXIKLQk6CSJjYXRjaCJeIExQQVJFTiEgcGFyYW1ldGVyRGVjbGFyYXRpb24gUlBBUkVOISBjb21wb3VuZFN0YXRlbWVudAotCTsKLQotCi0vLyBleHByZXNzaW9ucwotLy8gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlc2UgZXhwcmVzc2lvbnMgZm9sbG93IHRoZSBwYXR0ZXJuCi0vLyAgIHRoaXNMZXZlbEV4cHJlc3Npb24gOgotLy8gICAgICAgbmV4dEhpZ2hlclByZWNlZGVuY2VFeHByZXNzaW9uCi0vLyAgICAgICAgICAgKE9QRVJBVE9SIG5leHRIaWdoZXJQcmVjZWRlbmNlRXhwcmVzc2lvbikqCi0vLyB3aGljaCBpcyBhIHN0YW5kYXJkIHJlY3Vyc2l2ZSBkZWZpbml0aW9uIGZvciBhIHBhcnNpbmcgYW4gZXhwcmVzc2lvbi4KLS8vIFRoZSBvcGVyYXRvcnMgaW4gamF2YSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZXM6Ci0vLyAgICBsb3dlc3QgICgxMykgID0gKj0gLz0gJT0gKz0gLT0gPDw9ID4+PSA+Pj49ICY9IF49IHw9Ci0vLyAgICAgICAgICAgICgxMikgID86Ci0vLyAgICAgICAgICAgICgxMSkgIHx8Ci0vLyAgICAgICAgICAgICgxMCkgICYmCi0vLyAgICAgICAgICAgICggOSkgIHwKLS8vICAgICAgICAgICAgKCA4KSAgXgotLy8gICAgICAgICAgICAoIDcpICAmCi0vLyAgICAgICAgICAgICggNikgID09ICE9Ci0vLyAgICAgICAgICAgICggNSkgIDwgPD0gPiA+PQotLy8gICAgICAgICAgICAoIDQpICA8PCA+PgotLy8gICAgICAgICAgICAoIDMpICArKGJpbmFyeSkgLShiaW5hcnkpCi0vLyAgICAgICAgICAgICggMikgICogLyAlCi0vLyAgICAgICAgICAgICggMSkgICsrIC0tICsodW5hcnkpIC0odW5hcnkpICB+ICAhICAodHlwZSkKLS8vICAgICAgICAgICAgICAgICAgW10gICAoKSAobWV0aG9kIGNhbGwpICAuIChkb3QgLS0gaWRlbnRpZmllciBxdWFsaWZpY2F0aW9uKQotLy8gICAgICAgICAgICAgICAgICBuZXcgICAoKSAgKGV4cGxpY2l0IHBhcmVudGhlc2lzKQotLy8KLS8vIHRoZSBsYXN0IHR3byBhcmUgbm90IHVzdWFsbHkgb24gYSBwcmVjZWRlbmNlIGNoYXJ0OyBJIHB1dCB0aGVtIGluCi0vLyB0byBwb2ludCBvdXQgdGhhdCBuZXcgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiAnLicsIHNvIHlvdQotLy8gY2FuIHZhbGlkeSB1c2UKLS8vICAgICBuZXcgRnJhbWUoKS5zaG93KCkKLS8vIAotLy8gTm90ZSB0aGF0IHRoZSBhYm92ZSBwcmVjZWRlbmNlIGxldmVscyBtYXAgdG8gdGhlIHJ1bGVzIGJlbG93Li4uCi0vLyBPbmNlIHlvdSBoYXZlIGEgcHJlY2VkZW5jZSBjaGFydCwgd3JpdGluZyB0aGUgYXBwcm9wcmlhdGUgcnVsZXMgYXMgYmVsb3cKLS8vICAgaXMgdXN1YWxseSB2ZXJ5IHN0cmFpZ2h0Zm93YXJkCi0KLQotCi0vLyB0aGUgbW90aGVyIG9mIGFsbCBleHByZXNzaW9ucwotZXhwcmVzc2lvbgotCToJYXNzaWdubWVudEV4cHJlc3Npb24KLQkJeyNleHByZXNzaW9uID0gIygjW0VYUFIsIkVYUFIiXSwjZXhwcmVzc2lvbik7fQotCTsKLQotCi0vLyBUaGlzIGlzIGEgbGlzdCBvZiBleHByZXNzaW9ucy4KLWV4cHJlc3Npb25MaXN0Ci0JOglleHByZXNzaW9uIChDT01NQSEgZXhwcmVzc2lvbikqCi0JCXsjZXhwcmVzc2lvbkxpc3QgPSAjKCNbRUxJU1QsIkVMSVNUIl0sIGV4cHJlc3Npb25MaXN0KTt9Ci0JOwotCi0KLS8vIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiAobGV2ZWwgMTMpCi1hc3NpZ25tZW50RXhwcmVzc2lvbgotCToJY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JCSgJKAlBU1NJR05eCi0gICAgICAgICAgICB8ICAgUExVU19BU1NJR05eCi0gICAgICAgICAgICB8ICAgTUlOVVNfQVNTSUdOXgotICAgICAgICAgICAgfCAgIFNUQVJfQVNTSUdOXgotICAgICAgICAgICAgfCAgIERJVl9BU1NJR05eCi0gICAgICAgICAgICB8ICAgTU9EX0FTU0lHTl4KLSAgICAgICAgICAgIHwgICBTUl9BU1NJR05eCi0gICAgICAgICAgICB8ICAgQlNSX0FTU0lHTl4KLSAgICAgICAgICAgIHwgICBTTF9BU1NJR05eCi0gICAgICAgICAgICB8ICAgQkFORF9BU1NJR05eCi0gICAgICAgICAgICB8ICAgQlhPUl9BU1NJR05eCi0gICAgICAgICAgICB8ICAgQk9SX0FTU0lHTl4KLSAgICAgICAgICAgICkKLQkJCWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JCSk/Ci0JOwotCi0KLS8vIGNvbmRpdGlvbmFsIHRlc3QgKGxldmVsIDEyKQotY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JOglsb2dpY2FsT3JFeHByZXNzaW9uCi0JCSggUVVFU1RJT05eIGFzc2lnbm1lbnRFeHByZXNzaW9uIENPTE9OISBjb25kaXRpb25hbEV4cHJlc3Npb24gKT8KLQk7Ci0KLQotLy8gbG9naWNhbCBvciAofHwpICAobGV2ZWwgMTEpCi1sb2dpY2FsT3JFeHByZXNzaW9uCi0JOglsb2dpY2FsQW5kRXhwcmVzc2lvbiAoTE9SXiBsb2dpY2FsQW5kRXhwcmVzc2lvbikqCi0JOwotCi0KLS8vIGxvZ2ljYWwgYW5kICgmJikgIChsZXZlbCAxMCkKLWxvZ2ljYWxBbmRFeHByZXNzaW9uCi0JOglpbmNsdXNpdmVPckV4cHJlc3Npb24gKExBTkReIGluY2x1c2l2ZU9yRXhwcmVzc2lvbikqCi0JOwotCi0KLS8vIGJpdHdpc2Ugb3Igbm9uLXNob3J0LWNpcmN1aXRpbmcgb3IgKHwpICAobGV2ZWwgOSkKLWluY2x1c2l2ZU9yRXhwcmVzc2lvbgotCToJZXhjbHVzaXZlT3JFeHByZXNzaW9uIChCT1JeIGV4Y2x1c2l2ZU9yRXhwcmVzc2lvbikqCi0JOwotCi0KLS8vIGV4Y2x1c2l2ZSBvciAoXikgIChsZXZlbCA4KQotZXhjbHVzaXZlT3JFeHByZXNzaW9uCi0JOglhbmRFeHByZXNzaW9uIChCWE9SXiBhbmRFeHByZXNzaW9uKSoKLQk7Ci0KLQotLy8gYml0d2lzZSBvciBub24tc2hvcnQtY2lyY3VpdGluZyBhbmQgKCYpICAobGV2ZWwgNykKLWFuZEV4cHJlc3Npb24KLQk6CWVxdWFsaXR5RXhwcmVzc2lvbiAoQkFORF4gZXF1YWxpdHlFeHByZXNzaW9uKSoKLQk7Ci0KLQotLy8gZXF1YWxpdHkvaW5lcXVhbGl0eSAoPT0vIT0pIChsZXZlbCA2KQotZXF1YWxpdHlFeHByZXNzaW9uCi0JOglyZWxhdGlvbmFsRXhwcmVzc2lvbiAoKE5PVF9FUVVBTF4gfCBFUVVBTF4pIHJlbGF0aW9uYWxFeHByZXNzaW9uKSoKLQk7Ci0KLQotLy8gYm9vbGVhbiByZWxhdGlvbmFsIGV4cHJlc3Npb25zIChsZXZlbCA1KQotcmVsYXRpb25hbEV4cHJlc3Npb24KLQk6CXNoaWZ0RXhwcmVzc2lvbgotCQkoCSgJKAlMVF4KLQkJCQl8CUdUXgotCQkJCXwJTEVeCi0JCQkJfAlHRV4KLQkJCQkpCi0JCQkJc2hpZnRFeHByZXNzaW9uCi0JCQkpKgotCQl8CSJpbnN0YW5jZW9mIl4gdHlwZVNwZWNbdHJ1ZV0KLQkJKQotCTsKLQotCi0vLyBiaXQgc2hpZnQgZXhwcmVzc2lvbnMgKGxldmVsIDQpCi1zaGlmdEV4cHJlc3Npb24KLQk6CWFkZGl0aXZlRXhwcmVzc2lvbiAoKFNMXiB8IFNSXiB8IEJTUl4pIGFkZGl0aXZlRXhwcmVzc2lvbikqCi0JOwotCi0KLS8vIGJpbmFyeSBhZGRpdGlvbi9zdWJ0cmFjdGlvbiAobGV2ZWwgMykKLWFkZGl0aXZlRXhwcmVzc2lvbgotCToJbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICgoUExVU14gfCBNSU5VU14pIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbikqCi0JOwotCi0KLS8vIG11bHRpcGxpY2F0aW9uL2RpdmlzaW9uL21vZHVsbyAobGV2ZWwgMikKLW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgotCToJdW5hcnlFeHByZXNzaW9uICgoU1RBUl4gfCBESVZeIHwgTU9EXiApIHVuYXJ5RXhwcmVzc2lvbikqCi0JOwotCi11bmFyeUV4cHJlc3Npb24KLQk6CUlOQ14gdW5hcnlFeHByZXNzaW9uCi0JfAlERUNeIHVuYXJ5RXhwcmVzc2lvbgotCXwJTUlOVVNeIHsjTUlOVVMuc2V0VHlwZShVTkFSWV9NSU5VUyk7fSB1bmFyeUV4cHJlc3Npb24KLQl8CVBMVVNeICB7I1BMVVMuc2V0VHlwZShVTkFSWV9QTFVTKTt9IHVuYXJ5RXhwcmVzc2lvbgotCXwJdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCi0JOwotCi11bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKLQk6CUJOT1ReIHVuYXJ5RXhwcmVzc2lvbgotCXwJTE5PVF4gdW5hcnlFeHByZXNzaW9uCi0KLQl8CSgJLy8gc3VicnVsZSBhbGxvd3Mgb3B0aW9uIHRvIHNodXQgb2ZmIHdhcm5pbmdzCi0JCQlvcHRpb25zIHsKLQkJCQkvLyAiKGludCIgYW1iaWcgd2l0aCBwb3N0Zml4RXhwciBkdWUgdG8gbGFjayBvZiBzZXF1ZW5jZQotCQkJCS8vIGluZm8gaW4gbGluZWFyIGFwcHJveGltYXRlIExMKGspLiAgSXQncyBvay4gIFNodXQgdXAuCi0JCQkJZ2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlOwotCQkJfQotCQk6CS8vIElmIHR5cGVjYXN0IGlzIGJ1aWx0IGluIHR5cGUsIG11c3QgYmUgbnVtZXJpYyBvcGVyYW5kCi0JCQkvLyBBbHNvLCBubyByZWFzb24gdG8gYmFja3RyYWNrIGlmIHR5cGUga2V5d29yZCBsaWtlIGludCwgZmxvYXQuLi4KLQkJCWxwYjpMUEFSRU5eIHsjbHBiLnNldFR5cGUoVFlQRUNBU1QpO30gYnVpbHRJblR5cGVTcGVjW3RydWVdIFJQQVJFTiEKLQkJCXVuYXJ5RXhwcmVzc2lvbgotCi0JCQkvLyBIYXZlIHRvIGJhY2t0cmFjayB0byBzZWUgaWYgb3BlcmF0b3IgZm9sbG93cy4gIElmIG5vIG9wZXJhdG9yCi0JCQkvLyBmb2xsb3dzLCBpdCdzIGEgdHlwZWNhc3QuICBObyBzZW1hbnRpYyBjaGVja2luZyBuZWVkZWQgdG8gcGFyc2UuCi0JCQkvLyBpZiBpdCBfbG9va3NfIGxpa2UgYSBjYXN0LCBpdCBfaXNfIGEgY2FzdDsgZWxzZSBpdCdzIGEgIihleHByKSIKLQkJfAkoTFBBUkVOIGNsYXNzVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIHVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyk9PgotCQkJbHA6TFBBUkVOXiB7I2xwLnNldFR5cGUoVFlQRUNBU1QpO30gY2xhc3NUeXBlU3BlY1t0cnVlXSBSUEFSRU4hCi0JCQl1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKLQotCQl8CXBvc3RmaXhFeHByZXNzaW9uCi0JCSkKLQk7Ci0KLS8vIHF1YWxpZmllZCBuYW1lcywgYXJyYXkgZXhwcmVzc2lvbnMsIG1ldGhvZCBpbnZvY2F0aW9uLCBwb3N0IGluYy9kZWMKLXBvc3RmaXhFeHByZXNzaW9uCi0JOglwcmltYXJ5RXhwcmVzc2lvbiAvLyBzdGFydCB3aXRoIGEgcHJpbWFyeQotCi0JCSgJLy8gcXVhbGlmaWVkIGlkIChpZC5pZC5pZC5pZC4uLikgLS0gYnVpbGQgdGhlIG5hbWUKLQkJCURPVF4gKCBJREVOVAotCQkJCXwgInRoaXMiCi0JCQkJfCAiY2xhc3MiCi0JCQkJfCBuZXdFeHByZXNzaW9uCi0JCQkJfCAic3VwZXIiIExQQVJFTiAoIGV4cHJlc3Npb25MaXN0ICk/IFJQQVJFTgotCQkJCSkKLQkJCS8vIHRoZSBhYm92ZSBsaW5lIG5lZWRzIGEgc2VtYW50aWMgY2hlY2sgdG8gbWFrZSBzdXJlICJjbGFzcyIKLQkJCS8vICAgaXMgdGhlIF9sYXN0XyBxdWFsaWZpZXIuCi0KLQkJCS8vIGFsbG93IENsYXNzTmFtZVtdLmNsYXNzCi0JCXwJKCBsYmM6TEJSQUNLXiB7I2xiYy5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLISApKwotCQkJRE9UXiAiY2xhc3MiCi0KLQkJCS8vIGFuIGFycmF5IGluZGV4aW5nIG9wZXJhdGlvbgotCQl8CWxiOkxCUkFDS14geyNsYi5zZXRUeXBlKElOREVYX09QKTt9IGV4cHJlc3Npb24gUkJSQUNLIQotCi0JCQkvLyBtZXRob2QgaW52b2NhdGlvbgotCQkJLy8gVGhlIG5leHQgbGluZSBpcyBub3Qgc3RyaWN0bHkgcHJvcGVyOyBpdCBhbGxvd3MgeCgzKSg0KSBvcgotCQkJLy8gIHhbMl0oNCkgd2hpY2ggYXJlIG5vdCB2YWxpZCBpbiBKYXZhLiAgSWYgdGhpcyBncmFtbWFyIHdlcmUgdXNlZAotCQkJLy8gIHRvIHZhbGlkYXRlIGEgSmF2YSBwcm9ncmFtIGEgc2VtYW50aWMgY2hlY2sgd291bGQgYmUgbmVlZGVkLCBvcgotCQkJLy8gICB0aGlzIHJ1bGUgd291bGQgZ2V0IHJlYWxseSB1Z2x5Li4uCi0JCXwJbHA6TFBBUkVOXiB7I2xwLnNldFR5cGUoTUVUSE9EX0NBTEwpO30KLQkJCQlhcmdMaXN0Ci0JCQlSUEFSRU4hCi0JCSkqCi0KLQkJLy8gcG9zc2libHkgYWRkIG9uIGEgcG9zdC1pbmNyZW1lbnQgb3IgcG9zdC1kZWNyZW1lbnQuCi0JCS8vIGFsbG93cyBJTkMvREVDIG9uIHRvbyBtdWNoLCBidXQgc2VtYW50aWNzIGNhbiBjaGVjawotCQkoCWluOklOQ14geyNpbi5zZXRUeXBlKFBPU1RfSU5DKTt9Ci0JIAl8CWRlOkRFQ14geyNkZS5zZXRUeXBlKFBPU1RfREVDKTt9Ci0JCXwJLy8gbm90aGluZwotCQkpCi0KLQkJLy8gbG9vayBmb3IgaW50LmNsYXNzIGFuZCBpbnRbXS5jbGFzcwotCXwJYnVpbHRJblR5cGUgCi0JCSggbGJ0OkxCUkFDS14geyNsYnQuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9IFJCUkFDSyEgKSoKLQkJRE9UXiAiY2xhc3MiCi0JOwotCi0vLyB0aGUgYmFzaWMgZWxlbWVudCBvZiBhbiBleHByZXNzaW9uCi1wcmltYXJ5RXhwcmVzc2lvbgotCToJSURFTlQKLQl8CW5ld0V4cHJlc3Npb24KLQl8CWNvbnN0YW50Ci0JfAkic3VwZXIiCi0JfAkidHJ1ZSIKLQl8CSJmYWxzZSIKLQl8CSJ0aGlzIgotCXwJIm51bGwiCi0JfAlMUEFSRU4hIGFzc2lnbm1lbnRFeHByZXNzaW9uIFJQQVJFTiEKLQk7Ci0KLS8qKiBvYmplY3QgaW5zdGFudGlhdGlvbi4KLSAqICBUcmVlcyBhcmUgYnVpbHQgYXMgaWxsdXN0cmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBpbnB1dC90cmVlIHBhaXJzOgotICogIAotICogIG5ldyBUKCkKLSAqICAKLSAqICBuZXcKLSAqICAgfAotICogICBUIC0tICBFTElTVAotICogICAgICAgICAgIHwKLSAqICAgICAgICAgIGFyZzEgLS0gYXJnMiAtLSAuLiAtLSBhcmduCi0gKiAgCi0gKiAgbmV3IGludFtdCi0gKgotICogIG5ldwotICogICB8Ci0gKiAgaW50IC0tIEFSUkFZX0RFQ0xBUkFUT1IKLSAqICAKLSAqICBuZXcgaW50W10gezEsMn0KLSAqCi0gKiAgbmV3Ci0gKiAgIHwKLSAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUiAtLSBBUlJBWV9JTklUCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQUiAtLSBFWFBSCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgIDIKLSAqICAKLSAqICBuZXcgaW50WzNdCi0gKiAgbmV3Ci0gKiAgIHwKLSAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUgotICogICAgICAgICAgICAgICAgfAotICogICAgICAgICAgICAgIEVYUFIKLSAqICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICAgICAgIDMKLSAqICAKLSAqICBuZXcgaW50WzFdWzJdCi0gKiAgCi0gKiAgbmV3Ci0gKiAgIHwKLSAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUgotICogICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgIEFSUkFZX0RFQ0xBUkFUT1IgLS0gRVhQUgotICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgICBFWFBSICAgICAgICAgICAgIDEKLSAqICAgICAgICAgICAgICAgfAotICogICAgICAgICAgICAgICAyCi0gKiAgCi0gKi8KLW5ld0V4cHJlc3Npb24KLQk6CSJuZXciXiB0eXBlCi0JCSgJTFBBUkVOISBhcmdMaXN0IFJQQVJFTiEgKGNsYXNzQmxvY2spPwotCi0JCQkvL2phdmEgMS4xCi0JCQkvLyBOb3RlOiBUaGlzIHdpbGwgYWxsb3cgYmFkIGNvbnN0cnVjdHMgbGlrZQotCQkJLy8gICAgbmV3IGludFs0XVtdWzNdIHtleHAsZXhwfS4KLQkJCS8vICAgIFRoZXJlIG5lZWRzIHRvIGJlIGEgc2VtYW50aWMgY2hlY2sgaGVyZS4uLgotCQkJLy8gdG8gbWFrZSBzdXJlOgotCQkJLy8gICBhKSBbIGV4cHIgXSBhbmQgWyBdIGFyZSBub3QgbWl4ZWQKLQkJCS8vICAgYikgWyBleHByIF0gYW5kIGFuIGluaXQgYXJlIG5vdCB1c2VkIHRvZ2V0aGVyCi0KLQkJfAluZXdBcnJheURlY2xhcmF0b3IgKGFycmF5SW5pdGlhbGl6ZXIpPwotCQkpCi0JOwotCi1hcmdMaXN0Ci0JOgkoCWV4cHJlc3Npb25MaXN0Ci0JCXwJLypub3RoaW5nKi8KLQkJCXsjYXJnTGlzdCA9ICNbRUxJU1QsIkVMSVNUIl07fQotCQkpCi0JOwotCi1uZXdBcnJheURlY2xhcmF0b3IKLQk6CSgKLQkJCS8vIENPTkZMSUNUOgotCQkJLy8gbmV3RXhwcmVzc2lvbiBpcyBhIHByaW1hcnlFeHByZXNzaW9uIHdoaWNoIGNhbiBiZQotCQkJLy8gZm9sbG93ZWQgYnkgYW4gYXJyYXkgaW5kZXggcmVmZXJlbmNlLiAgVGhpcyBpcyBvaywKLQkJCS8vIGFzIHRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIHN0YXkgaW4gdGhpcyBsb29wIGFzCi0JCQkvLyBsb25nIGFzIGl0IHNlZXMgYW4gTEJSQUNLIChwcm9wZXIgYmVoYXZpb3IpCi0JCQlvcHRpb25zIHsKLQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0JCQl9Ci0JCToKLQkJCWxiOkxCUkFDS14geyNsYi5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30KLQkJCQkoZXhwcmVzc2lvbik/Ci0JCQlSQlJBQ0shCi0JCSkrCi0JOwotCi1jb25zdGFudAotCToJTlVNX0lOVAotCXwJQ0hBUl9MSVRFUkFMCi0JfAlTVFJJTkdfTElURVJBTAotCXwJTlVNX0ZMT0FUCi0JOwotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGhlIEphdmEgc2Nhbm5lcgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbGFzcyBKYXZhTGV4ZXIgZXh0ZW5kcyBMZXhlcjsKLQotb3B0aW9ucyB7Ci0JZXhwb3J0Vm9jYWI9SmF2YTsgICAgICAvLyBjYWxsIHRoZSB2b2NhYnVsYXJ5ICJKYXZhIgotCXRlc3RMaXRlcmFscz1mYWxzZTsgICAgLy8gZG9uJ3QgYXV0b21hdGljYWxseSB0ZXN0IGZvciBsaXRlcmFscwotCWs9NDsgICAgICAgICAgICAgICAgICAgLy8gZm91ciBjaGFyYWN0ZXJzIG9mIGxvb2thaGVhZAotfQotCi0KLQotLy8gT1BFUkFUT1JTCi1RVUVTVElPTgkJOgknPycJCTsKLUxQQVJFTgkJCToJJygnCQk7Ci1SUEFSRU4JCQk6CScpJwkJOwotTEJSQUNLCQkJOgknWycJCTsKLVJCUkFDSwkJCToJJ10nCQk7Ci1MQ1VSTFkJCQk6CSd7JwkJOwotUkNVUkxZCQkJOgknfScJCTsKLUNPTE9OCQkJOgknOicJCTsKLUNPTU1BCQkJOgknLCcJCTsKLS8vRE9UCQkJOgknLicJCTsKLUFTU0lHTgkJCToJJz0nCQk7Ci1FUVVBTAkJCToJIj09Igk7Ci1MTk9UCQkJOgknIScJCTsKLUJOT1QJCQk6CSd+JwkJOwotTk9UX0VRVUFMCQk6CSIhPSIJOwotRElWCQkJCToJJy8nCQk7Ci1ESVZfQVNTSUdOCQk6CSIvPSIJOwotUExVUwkJCToJJysnCQk7Ci1QTFVTX0FTU0lHTgkJOgkiKz0iCTsKLUlOQwkJCQk6CSIrKyIJOwotTUlOVVMJCQk6CSctJwkJOwotTUlOVVNfQVNTSUdOCToJIi09Igk7Ci1ERUMJCQkJOgkiLS0iCTsKLVNUQVIJCQk6CScqJwkJOwotU1RBUl9BU1NJR04JCToJIio9Igk7Ci1NT0QJCQkJOgknJScJCTsKLU1PRF9BU1NJR04JCToJIiU9Igk7Ci1TUgkJCQk6CSI+PiIJOwotU1JfQVNTSUdOCQk6CSI+Pj0iCTsKLUJTUgkJCQk6CSI+Pj4iCTsKLUJTUl9BU1NJR04JCToJIj4+Pj0iCTsKLUdFCQkJCToJIj49Igk7Ci1HVAkJCQk6CSI+IgkJOwotU0wJCQkJOgkiPDwiCTsKLVNMX0FTU0lHTgkJOgkiPDw9Igk7Ci1MRQkJCQk6CSI8PSIJOwotTFQJCQkJOgknPCcJCTsKLUJYT1IJCQk6CSdeJwkJOwotQlhPUl9BU1NJR04JCToJIl49Igk7Ci1CT1IJCQkJOgknfCcJCTsKLUJPUl9BU1NJR04JCToJInw9Igk7Ci1MT1IJCQkJOgkifHwiCTsKLUJBTkQJCQk6CScmJwkJOwotQkFORF9BU1NJR04JCToJIiY9Igk7Ci1MQU5ECQkJOgkiJiYiCTsKLVNFTUkJCQk6CSc7JwkJOwotCi0KLS8vIFdoaXRlc3BhY2UgLS0gaWdub3JlZAotV1MJOgkoCScgJwotCQl8CSdcdCcKLQkJfAknXGYnCi0JCS8vIGhhbmRsZSBuZXdsaW5lcwotCQl8CSgJIlxyXG4iICAvLyBFdmlsIERPUwotCQkJfAknXHInICAgIC8vIE1hY2ludG9zaAotCQkJfAknXG4nICAgIC8vIFVuaXggKHRoZSByaWdodCB3YXkpCi0JCQkpCi0JCQl7IG5ld2xpbmUoKTsgfQotCQkpCi0JCXsgX3R0eXBlID0gVG9rZW4uU0tJUDsgfQotCTsKLQotLy8gU2luZ2xlLWxpbmUgY29tbWVudHMKLVNMX0NPTU1FTlQKLQk6CSIvLyIKLQkJKH4oJ1xuJ3wnXHInKSkqICgnXG4nfCdccicoJ1xuJyk/KQotCQl7JHNldFR5cGUoVG9rZW4uU0tJUCk7IG5ld2xpbmUoKTt9Ci0JOwotCi0vLyBtdWx0aXBsZS1saW5lIGNvbW1lbnRzCi1NTF9DT01NRU5UCi0JOgkiLyoiCi0JCSgJLyoJJ1xyJyAnXG4nIGNhbiBiZSBtYXRjaGVkIGluIG9uZSBhbHRlcm5hdGl2ZSBvciBieSBtYXRjaGluZwotCQkJCSdccicgaW4gb25lIGl0ZXJhdGlvbiBhbmQgJ1xuJyBpbiBhbm90aGVyLiAgSSBhbSB0cnlpbmcgdG8KLQkJCQloYW5kbGUgYW55IGZsYXZvciBvZiBuZXdsaW5lIHRoYXQgY29tZXMgaW4sIGJ1dCB0aGUgbGFuZ3VhZ2UKLQkJCQl0aGF0IGFsbG93cyBib3RoICJcclxuIiBhbmQgIlxyIiBhbmQgIlxuIiB0byBhbGwgYmUgdmFsaWQKLQkJCQluZXdsaW5lIGlzIGFtYmlndW91cy4gIENvbnNlcXVlbnRseSwgdGhlIHJlc3VsdGluZyBncmFtbWFyCi0JCQkJbXVzdCBiZSBhbWJpZ3VvdXMuICBJJ20gc2h1dHRpbmcgdGhpcyB3YXJuaW5nIG9mZi4KLQkJCSAqLwotCQkJb3B0aW9ucyB7Ci0JCQkJZ2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlOwotCQkJfQotCQk6Ci0JCQl7IExBKDIpIT0nLycgfT8gJyonCi0JCXwJJ1xyJyAnXG4nCQl7bmV3bGluZSgpO30KLQkJfAknXHInCQkJe25ld2xpbmUoKTt9Ci0JCXwJJ1xuJwkJCXtuZXdsaW5lKCk7fQotCQl8CX4oJyonfCdcbid8J1xyJykKLQkJKSoKLQkJIiovIgotCQl7JHNldFR5cGUoVG9rZW4uU0tJUCk7fQotCTsKLQotCi0vLyBjaGFyYWN0ZXIgbGl0ZXJhbHMKLUNIQVJfTElURVJBTAotCToJJ1wnJyAoIEVTQyB8IH4nXCcnICkgJ1wnJwotCTsKLQotLy8gc3RyaW5nIGxpdGVyYWxzCi1TVFJJTkdfTElURVJBTAotCToJJyInIChFU0N8fignIid8J1xcJykpKiAnIicKLQk7Ci0KLQotLy8gZXNjYXBlIHNlcXVlbmNlIC0tIG5vdGUgdGhhdCB0aGlzIGlzIHByb3RlY3RlZDsgaXQgY2FuIG9ubHkgYmUgY2FsbGVkCi0vLyAgIGZyb20gYW5vdGhlciBsZXhlciBydWxlIC0tIGl0IHdpbGwgbm90IGV2ZXIgZGlyZWN0bHkgcmV0dXJuIGEgdG9rZW4gdG8KLS8vICAgdGhlIHBhcnNlcgotLy8gVGhlcmUgYXJlIHZhcmlvdXMgYW1iaWd1aXRpZXMgaHVzaGVkIGluIHRoaXMgcnVsZS4gIFRoZSBvcHRpb25hbAotLy8gJzAnLi4uJzknIGRpZ2l0IG1hdGNoZXMgc2hvdWxkIGJlIG1hdGNoZWQgaGVyZSByYXRoZXIgdGhhbiBsZXR0aW5nCi0vLyB0aGVtIGdvIGJhY2sgdG8gU1RSSU5HX0xJVEVSQUwgdG8gYmUgbWF0Y2hlZC4gIEFOVExSIGRvZXMgdGhlCi0vLyByaWdodCB0aGluZyBieSBtYXRjaGluZyBpbW1lZGlhdGVseTsgaGVuY2UsIGl0J3Mgb2sgdG8gc2h1dCBvZmYKLS8vIHRoZSBGT0xMT1cgYW1iaWcgd2FybmluZ3MuCi1wcm90ZWN0ZWQKLUVTQwotCToJJ1xcJwotCQkoCSduJwotCQl8CSdyJwotCQl8CSd0JwotCQl8CSdiJwotCQl8CSdmJwotCQl8CSciJwotCQl8CSdcJycKLQkJfAknXFwnCi0JCXwJKCd1JykrIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVCAKLQkJfAkoJzAnLi4nMycpCi0JCQkoCi0JCQkJb3B0aW9ucyB7Ci0JCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKLQkJCQl9Ci0JCQk6CSgnMCcuLic3JykKLQkJCQkoCQotCQkJCQlvcHRpb25zIHsKLQkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKLQkJCQkJfQotCQkJCToJJzAnLi4nNycKLQkJCQkpPwotCQkJKT8KLQkJfAkoJzQnLi4nNycpCi0JCQkoCi0JCQkJb3B0aW9ucyB7Ci0JCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKLQkJCQl9Ci0JCQk6CSgnMCcuLic5JykKLQkJCSk/Ci0JCSkKLQk7Ci0KLQotLy8gaGV4YWRlY2ltYWwgZGlnaXQgKGFnYWluLCBub3RlIGl0J3MgcHJvdGVjdGVkISkKLXByb3RlY3RlZAotSEVYX0RJR0lUCi0JOgkoJzAnLi4nOSd8J0EnLi4nRid8J2EnLi4nZicpCi0JOwotCi0KLS8vIGEgZHVtbXkgcnVsZSB0byBmb3JjZSB2b2NhYnVsYXJ5IHRvIGJlIGFsbCBjaGFyYWN0ZXJzIChleGNlcHQgc3BlY2lhbAotLy8gICBvbmVzIHRoYXQgQU5UTFIgdXNlcyBpbnRlcm5hbGx5ICgwIHRvIDIpCi1wcm90ZWN0ZWQKLVZPQ0FCCi0JOgknXDMnLi4nXDM3NycKLQk7Ci0KLQotLy8gYW4gaWRlbnRpZmllci4gIE5vdGUgdGhhdCB0ZXN0TGl0ZXJhbHMgaXMgc2V0IHRvIHRydWUhICBUaGlzIG1lYW5zCi0vLyB0aGF0IGFmdGVyIHdlIG1hdGNoIHRoZSBydWxlLCB3ZSBsb29rIGluIHRoZSBsaXRlcmFscyB0YWJsZSB0byBzZWUKLS8vIGlmIGl0J3MgYSBsaXRlcmFsIG9yIHJlYWxseSBhbiBpZGVudGlmZXIKLUlERU5UCi0Jb3B0aW9ucyB7dGVzdExpdGVyYWxzPXRydWU7fQotCToJKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnJCcpICgnYScuLid6J3wnQScuLidaJ3wnXyd8JzAnLi4nOSd8JyQnKSoKLQk7Ci0KLQotLy8gYSBudW1lcmljIGxpdGVyYWwKLU5VTV9JTlQKLQl7Ym9vbGVhbiBpc0RlY2ltYWw9ZmFsc2U7fQotCToJJy4nIHtfdHR5cGUgPSBET1Q7fQotCQkJKCgnMCcuLic5JykrIChFWFBPTkVOVCk/IChGTE9BVF9TVUZGSVgpPyB7IF90dHlwZSA9IE5VTV9GTE9BVDsgfSk/Ci0JfAkoCScwJyB7aXNEZWNpbWFsID0gdHJ1ZTt9IC8vIHNwZWNpYWwgY2FzZSBmb3IganVzdCAnMCcKLQkJCSgJKCd4J3wnWCcpCi0JCQkJKAkJCQkJCQkJCQkJLy8gaGV4Ci0JCQkJCS8vIHRoZSAnZSd8J0UnIGFuZCBmbG9hdCBzdWZmaXggc3R1ZmYgbG9vawotCQkJCQkvLyBsaWtlIGhleCBkaWdpdHMsIGhlbmNlIHRoZSAoLi4uKSsgZG9lc24ndAotCQkJCQkvLyBrbm93IHdoZW4gdG8gc3RvcDogYW1iaWcuICBBTlRMUiByZXNvbHZlcwotCQkJCQkvLyBpdCBjb3JyZWN0bHkgYnkgbWF0Y2hpbmcgaW1tZWRpYXRlbHkuICBJdAotCQkJCQkvLyBpcyB0aGVyZWZvciBvayB0byBodXNoIHdhcm5pbmcuCi0JCQkJCW9wdGlvbnMgewotCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZz1mYWxzZTsKLQkJCQkJfQotCQkJCToJSEVYX0RJR0lUCi0JCQkJKSsKLQkJCXwJKCcwJy4uJzcnKSsJCQkJCQkJCQkvLyBvY3RhbAotCQkJKT8KLQkJfAkoJzEnLi4nOScpICgnMCcuLic5JykqICB7aXNEZWNpbWFsPXRydWU7fQkJLy8gbm9uLXplcm8gZGVjaW1hbAotCQkpCi0JCSgJKCdsJ3wnTCcpCi0JCQotCQkvLyBvbmx5IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGEgZmxvYXQgaWYgbG9va3MgbGlrZSBkZWNpbWFsIHNvIGZhcgotCQl8CXtpc0RlY2ltYWx9PwotCQkJKAknLicgKCcwJy4uJzknKSogKEVYUE9ORU5UKT8gKEZMT0FUX1NVRkZJWCk/Ci0JCQl8CUVYUE9ORU5UIChGTE9BVF9TVUZGSVgpPwotCQkJfAlGTE9BVF9TVUZGSVgKLQkJCSkKLQkJCXsgX3R0eXBlID0gTlVNX0ZMT0FUOyB9Ci0JCSk/Ci0JOwotCi0KLS8vIGEgY291cGxlIHByb3RlY3RlZCBtZXRob2RzIHRvIGFzc2lzdCBpbiBtYXRjaGluZyBmbG9hdGluZyBwb2ludCBudW1iZXJzCi1wcm90ZWN0ZWQKLUVYUE9ORU5UCi0JOgkoJ2UnfCdFJykgKCcrJ3wnLScpPyAoJzAnLi4nOScpKwotCTsKLQotCi1wcm90ZWN0ZWQKLUZMT0FUX1NVRkZJWAotCToJJ2YnfCdGJ3wnZCd8J0QnCi0JOwotCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9qYXZhLnRyZWUuZyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2phdmEudHJlZS5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I2ZDg4Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2phdmEudHJlZS5nCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKiBKYXZhIDEuMiBBU1QgUmVjb2duaXplciBHcmFtbWFyCi0gKgotICogQXV0aG9yOgotICoJVGVyZW5jZSBQYXJyCXBhcnJ0QGpndXJ1LmNvbQotICoKLSAqIFZlcnNpb24gdHJhY2tpbmcgbm93IGRvbmUgd2l0aCBmb2xsb3dpbmcgSUQ6Ci0gKgotICogJElkJAotICoKLSAqIFRoaXMgZ3JhbW1hciBpcyBpbiB0aGUgUFVCTElDIERPTUFJTgotICoKLSAqIEJVR1MKLSAqLwotY2xhc3MgSmF2YVRyZWVQYXJzZXIgZXh0ZW5kcyBUcmVlUGFyc2VyOwotCi1vcHRpb25zIHsKLQlpbXBvcnRWb2NhYiA9IEphdmE7Ci19Ci0KLWNvbXBpbGF0aW9uVW5pdAotCToJKHBhY2thZ2VEZWZpbml0aW9uKT8KLQkJKGltcG9ydERlZmluaXRpb24pKgotCQkodHlwZURlZmluaXRpb24pKgotCTsKLQotcGFja2FnZURlZmluaXRpb24KLQk6CSMoIFBBQ0tBR0VfREVGIGlkZW50aWZpZXIgKQotCTsKLQotaW1wb3J0RGVmaW5pdGlvbgotCToJIyggSU1QT1JUIGlkZW50aWZpZXJTdGFyICkKLQk7Ci0KLXR5cGVEZWZpbml0aW9uCi0JOgkjKENMQVNTX0RFRiBtb2RpZmllcnMgSURFTlQgZXh0ZW5kc0NsYXVzZSBpbXBsZW1lbnRzQ2xhdXNlIG9iakJsb2NrICkKLQl8CSMoSU5URVJGQUNFX0RFRiBtb2RpZmllcnMgSURFTlQgZXh0ZW5kc0NsYXVzZSBpbnRlcmZhY2VCbG9jayApCi0JOwotCi10eXBlU3BlYwotCToJIyhUWVBFIHR5cGVTcGVjQXJyYXkpCi0JOwotCi10eXBlU3BlY0FycmF5Ci0JOgkjKCBBUlJBWV9ERUNMQVJBVE9SIHR5cGVTcGVjQXJyYXkgKQotCXwJdHlwZQotCTsKLQotdHlwZToJaWRlbnRpZmllcgotCXwJYnVpbHRJblR5cGUKLQk7Ci0KLWJ1aWx0SW5UeXBlCi0gICAgOiAgICJ2b2lkIgotICAgIHwgICAiYm9vbGVhbiIKLSAgICB8ICAgImJ5dGUiCi0gICAgfCAgICJjaGFyIgotICAgIHwgICAic2hvcnQiCi0gICAgfCAgICJpbnQiCi0gICAgfCAgICJmbG9hdCIKLSAgICB8ICAgImxvbmciCi0gICAgfCAgICJkb3VibGUiCi0gICAgOwotCi1tb2RpZmllcnMKLQk6CSMoIE1PRElGSUVSUyAobW9kaWZpZXIpKiApCi0JOwotCi1tb2RpZmllcgotICAgIDogICAicHJpdmF0ZSIKLSAgICB8ICAgInB1YmxpYyIKLSAgICB8ICAgInByb3RlY3RlZCIKLSAgICB8ICAgInN0YXRpYyIKLSAgICB8ICAgInRyYW5zaWVudCIKLSAgICB8ICAgImZpbmFsIgotICAgIHwgICAiYWJzdHJhY3QiCi0gICAgfCAgICJuYXRpdmUiCi0gICAgfCAgICJ0aHJlYWRzYWZlIgotICAgIHwgICAic3luY2hyb25pemVkIgotICAgIHwgICAiY29uc3QiCi0gICAgfCAgICJ2b2xhdGlsZSIKLSAgICA7Ci0KLWV4dGVuZHNDbGF1c2UKLQk6CSMoRVhURU5EU19DTEFVU0UgKGlkZW50aWZpZXIpKiApCi0JOwotCi1pbXBsZW1lbnRzQ2xhdXNlCi0JOgkjKElNUExFTUVOVFNfQ0xBVVNFIChpZGVudGlmaWVyKSogKQotCTsKLQotCi1pbnRlcmZhY2VCbG9jawotCToJIygJT0JKQkxPQ0sKLQkJCSgJbWV0aG9kRGVjbAotCQkJfAl2YXJpYWJsZURlZgotCQkJKSoKLQkJKQotCTsKLQkKLW9iakJsb2NrCi0JOgkjKAlPQkpCTE9DSwotCQkJKAljdG9yRGVmCi0JCQl8CW1ldGhvZERlZgotCQkJfAl2YXJpYWJsZURlZgotCQkJfAl0eXBlRGVmaW5pdGlvbgotCQkJfAkjKFNUQVRJQ19JTklUIHNsaXN0KQotCQkJfAkjKElOU1RBTkNFX0lOSVQgc2xpc3QpCi0JCQkpKgotCQkpCi0JOwotCi1jdG9yRGVmCi0JOgkjKENUT1JfREVGIG1vZGlmaWVycyBtZXRob2RIZWFkIHNsaXN0KQotCTsKLQotbWV0aG9kRGVjbAotCToJIyhNRVRIT0RfREVGIG1vZGlmaWVycyB0eXBlU3BlYyBtZXRob2RIZWFkKQotCTsKLQotbWV0aG9kRGVmCi0JOgkjKE1FVEhPRF9ERUYgbW9kaWZpZXJzIHR5cGVTcGVjIG1ldGhvZEhlYWQgKHNsaXN0KT8pCi0JOwotCi12YXJpYWJsZURlZgotCToJIyhWQVJJQUJMRV9ERUYgbW9kaWZpZXJzIHR5cGVTcGVjIHZhcmlhYmxlRGVjbGFyYXRvciB2YXJJbml0aWFsaXplcikKLQk7Ci0KLXBhcmFtZXRlckRlZgotCToJIyhQQVJBTUVURVJfREVGIG1vZGlmaWVycyB0eXBlU3BlYyBJREVOVCApCi0JOwotCi1vYmplY3Rpbml0aWFsaXplcgotCToJIyhJTlNUQU5DRV9JTklUIHNsaXN0KQotCTsKLQotdmFyaWFibGVEZWNsYXJhdG9yCi0JOglJREVOVAotCXwJTEJSQUNLIHZhcmlhYmxlRGVjbGFyYXRvcgotCTsKLQotdmFySW5pdGlhbGl6ZXIKLQk6CSMoQVNTSUdOIGluaXRpYWxpemVyKQotCXwKLQk7Ci0KLWluaXRpYWxpemVyCi0JOglleHByZXNzaW9uCi0JfAlhcnJheUluaXRpYWxpemVyCi0JOwotCi1hcnJheUluaXRpYWxpemVyCi0JOgkjKEFSUkFZX0lOSVQgKGluaXRpYWxpemVyKSopCi0JOwotCi1tZXRob2RIZWFkCi0JOglJREVOVCAjKCBQQVJBTUVURVJTIChwYXJhbWV0ZXJEZWYpKiApICh0aHJvd3NDbGF1c2UpPwotCTsKLQotdGhyb3dzQ2xhdXNlCi0JOgkjKCAidGhyb3dzIiAoaWRlbnRpZmllcikqICkKLQk7Ci0KLWlkZW50aWZpZXIKLQk6CUlERU5UCi0JfAkjKCBET1QgaWRlbnRpZmllciBJREVOVCApCi0JOwotCi1pZGVudGlmaWVyU3RhcgotCToJSURFTlQKLQl8CSMoIERPVCBpZGVudGlmaWVyIChTVEFSfElERU5UKSApCi0JOwotCi1zbGlzdAotCToJIyggU0xJU1QgKHN0YXQpKiApCi0JOwotCi1zdGF0Ogl0eXBlRGVmaW5pdGlvbgotCXwJdmFyaWFibGVEZWYKLQl8CWV4cHJlc3Npb24KLQl8CSMoTEFCRUxFRF9TVEFUIElERU5UIHN0YXQpCi0JfAkjKCJpZiIgZXhwcmVzc2lvbiBzdGF0IChzdGF0KT8gKQotCXwJIygJImZvciIKLQkJCSMoRk9SX0lOSVQgKHZhcmlhYmxlRGVmIHwgZWxpc3QpPykKLQkJCSMoRk9SX0NPTkRJVElPTiAoZXhwcmVzc2lvbik/KQotCQkJIyhGT1JfSVRFUkFUT1IgKGVsaXN0KT8pCi0JCQlzdGF0Ci0JCSkKLQl8CSMoIndoaWxlIiBleHByZXNzaW9uIHN0YXQpCi0JfAkjKCJkbyIgc3RhdCBleHByZXNzaW9uKQotCXwJIygiYnJlYWsiIChJREVOVCk/ICkKLQl8CSMoImNvbnRpbnVlIiAoSURFTlQpPyApCi0JfAkjKCJyZXR1cm4iIChleHByZXNzaW9uKT8gKQotCXwJIygic3dpdGNoIiBleHByZXNzaW9uIChjYXNlR3JvdXApKikKLQl8CSMoInRocm93IiBleHByZXNzaW9uKQotCXwJIygic3luY2hyb25pemVkIiBleHByZXNzaW9uIHN0YXQpCi0JfAl0cnlCbG9jawotCXwJc2xpc3QgLy8gbmVzdGVkIFNMSVNUCi0JfAlFTVBUWV9TVEFUCi0JOwotCi1jYXNlR3JvdXAKLQk6CSMoQ0FTRV9HUk9VUCAoIygiY2FzZSIgZXhwcmVzc2lvbikgfCAiZGVmYXVsdCIpKyBzbGlzdCkKLQk7Ci0KLXRyeUJsb2NrCi0JOgkjKCAidHJ5IiBzbGlzdCAoaGFuZGxlcikqICgjKCJmaW5hbGx5IiBzbGlzdCkpPyApCi0JOwotCi1oYW5kbGVyCi0JOgkjKCAiY2F0Y2giIHBhcmFtZXRlckRlZiBzbGlzdCApCi0JOwotCi1lbGlzdAotCToJIyggRUxJU1QgKGV4cHJlc3Npb24pKiApCi0JOwotCi1leHByZXNzaW9uCi0JOgkjKEVYUFIgZXhwcikKLQk7Ci0KLWV4cHI6CSMoUVVFU1RJT04gZXhwciBleHByIGV4cHIpCS8vIHRyaW5hcnkgb3BlcmF0b3IKLQl8CSMoQVNTSUdOIGV4cHIgZXhwcikJCQkvLyBiaW5hcnkgb3BlcmF0b3JzLi4uCi0JfAkjKFBMVVNfQVNTSUdOIGV4cHIgZXhwcikKLQl8CSMoTUlOVVNfQVNTSUdOIGV4cHIgZXhwcikKLQl8CSMoU1RBUl9BU1NJR04gZXhwciBleHByKQotCXwJIyhESVZfQVNTSUdOIGV4cHIgZXhwcikKLQl8CSMoTU9EX0FTU0lHTiBleHByIGV4cHIpCi0JfAkjKFNSX0FTU0lHTiBleHByIGV4cHIpCi0JfAkjKEJTUl9BU1NJR04gZXhwciBleHByKQotCXwJIyhTTF9BU1NJR04gZXhwciBleHByKQotCXwJIyhCQU5EX0FTU0lHTiBleHByIGV4cHIpCi0JfAkjKEJYT1JfQVNTSUdOIGV4cHIgZXhwcikKLQl8CSMoQk9SX0FTU0lHTiBleHByIGV4cHIpCi0JfAkjKExPUiBleHByIGV4cHIpCi0JfAkjKExBTkQgZXhwciBleHByKQotCXwJIyhCT1IgZXhwciBleHByKQotCXwJIyhCWE9SIGV4cHIgZXhwcikKLQl8CSMoQkFORCBleHByIGV4cHIpCi0JfAkjKE5PVF9FUVVBTCBleHByIGV4cHIpCi0JfAkjKEVRVUFMIGV4cHIgZXhwcikKLQl8CSMoTFQgZXhwciBleHByKQotCXwJIyhHVCBleHByIGV4cHIpCi0JfAkjKExFIGV4cHIgZXhwcikKLQl8CSMoR0UgZXhwciBleHByKQotCXwJIyhTTCBleHByIGV4cHIpCi0JfAkjKFNSIGV4cHIgZXhwcikKLQl8CSMoQlNSIGV4cHIgZXhwcikKLQl8CSMoUExVUyBleHByIGV4cHIpCi0JfAkjKE1JTlVTIGV4cHIgZXhwcikKLQl8CSMoRElWIGV4cHIgZXhwcikKLQl8CSMoTU9EIGV4cHIgZXhwcikKLQl8CSMoU1RBUiBleHByIGV4cHIpCi0JfAkjKElOQyBleHByKQotCXwJIyhERUMgZXhwcikKLQl8CSMoUE9TVF9JTkMgZXhwcikKLQl8CSMoUE9TVF9ERUMgZXhwcikKLQl8CSMoQk5PVCBleHByKQotCXwJIyhMTk9UIGV4cHIpCi0JfAkjKCJpbnN0YW5jZW9mIiBleHByIGV4cHIpCi0JfAkjKFVOQVJZX01JTlVTIGV4cHIpCi0JfAkjKFVOQVJZX1BMVVMgZXhwcikKLQl8CXByaW1hcnlFeHByZXNzaW9uCi0JOwotCi1wcmltYXJ5RXhwcmVzc2lvbgotICAgIDogICBJREVOVAotICAgIHwgICAjKAlET1QKLQkJCSgJZXhwcgotCQkJCSgJSURFTlQKLQkJCQl8CWFycmF5SW5kZXgKLQkJCQl8CSJ0aGlzIgotCQkJCXwJImNsYXNzIgotCQkJCXwJIyggIm5ldyIgSURFTlQgZWxpc3QgKQotCQkJCSkKLQkJCXwJIyhBUlJBWV9ERUNMQVJBVE9SIHR5cGUpCi0JCQl8CWJ1aWx0SW5UeXBlICgiY2xhc3MiKT8KLQkJCSkKLQkJKQotCXwJYXJyYXlJbmRleAotCXwJIyhNRVRIT0RfQ0FMTCBwcmltYXJ5RXhwcmVzc2lvbiBlbGlzdCkKLQl8CSMoVFlQRUNBU1QgdHlwZVNwZWMgZXhwcikKLQl8ICAgbmV3RXhwcmVzc2lvbgotCXwgICBjb25zdGFudAotICAgIHwgICAic3VwZXIiCi0gICAgfCAgICJ0cnVlIgotICAgIHwgICAiZmFsc2UiCi0gICAgfCAgICJ0aGlzIgotICAgIHwgICAibnVsbCIKLQl8CXR5cGVTcGVjIC8vIHR5cGUgbmFtZSB1c2VkIHdpdGggaW5zdGFuY2VvZgotCTsKLQotYXJyYXlJbmRleAotCToJIyhJTkRFWF9PUCBwcmltYXJ5RXhwcmVzc2lvbiBleHByZXNzaW9uKQotCTsKLQotY29uc3RhbnQKLSAgICA6ICAgTlVNX0lOVAotICAgIHwgICBDSEFSX0xJVEVSQUwKLSAgICB8ICAgU1RSSU5HX0xJVEVSQUwKLSAgICB8ICAgTlVNX0ZMT0FUCi0gICAgOwotCi1uZXdFeHByZXNzaW9uCi0JOgkjKAkibmV3IiB0eXBlCi0JCQkoCW5ld0FycmF5RGVjbGFyYXRvciAoYXJyYXlJbml0aWFsaXplcik/Ci0JCQl8CWVsaXN0Ci0JCQkpCi0JCSkKLQkJCQotCTsKLQotbmV3QXJyYXlEZWNsYXJhdG9yCi0JOgkjKCBBUlJBWV9ERUNMQVJBVE9SIChuZXdBcnJheURlY2xhcmF0b3IpPyAoZXhwcmVzc2lvbik/ICkKLQk7CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wdmNzLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGNlNDJlLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InB2Y3MtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXNrZGVmIG5hbWU9InB2Y3MiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHZjcyIvPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxwdmNzLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPHB2Y3MgcHZjc2Jpbj0iL2hvbWUvdGMvcHJvamVjdHMvcHZjc2FudC9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcyIgcmVwb3NpdG9yeT0iL21udC9wdmNzIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDMiPgotICAgIDxwdmNzIHB2Y3NiaW49Ilxob21lXGN2c1xwdmNzYW50XHNyY1xldGNcdGVzdGNhc2VzXHRhc2tkZWZzIiByZXBvc2l0b3J5PSIvbW50L3B2Y3MiIHB2Y3Nwcm9qZWN0PSIvcXZpa25ldCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KLSAgICA8cHZjcyBwdmNzYmluPSJcaG9tZVxjdnNccHZjc2FudFxzcmNcZXRjXHRlc3RjYXNlc1x0YXNrZGVmcyIgcmVwb3NpdG9yeT0iL21udC9wdmNzIiBwdmNzcHJvamVjdD0iL3F2aWtuZXQiIHdvcmtzcGFjZT0iL0AvUHVibGljL2J1aWxkd3MiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NSIgZGVzY3JpcHRpb249IkdldCB0aGUgbGF0ZXN0IGZyb20gUFZDUyI+Ci0gICAgPHB2Y3MgcHZjc2Jpbj0iL2hvbWUvY3ZzL3B2Y3NhbnQvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMiIAotCQkJIHJlcG9zaXRvcnk9Ii8vY3Q0c2VydjIvcHZjcy9tb25pdG9yIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDYiIGRlc2NyaXB0aW9uPSJObyBwY2xpIHRvIGJlIGZvdW5kIj4KLSAgICA8cHZjcyBwdmNzYmluPSIvbmV2ZXIvaGVhcmQvb2YvYS9kaXJlY3Rvcnkvc3RydWN0dXJlL2xpa2UvdGhpcyIgCi0JCQkgcmVwb3NpdG9yeT0iLy9jdDRzZXJ2Mi9wdmNzL21vbml0b3IiLz4KLSAgPC90YXJnZXQ+Ci0KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveGFsYW4tcmVkaXJlY3QtaW4ueHNsIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveGFsYW4tcmVkaXJlY3QtaW4ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcxYjgxLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hhbGFuLXJlZGlyZWN0LWluLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldAl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotCXhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLQl4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi54c2x0LmV4dGVuc2lvbnMuUmVkaXJlY3QiCi0JZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KLTwhLS0KLVRoaXMgaXMgYSB0ZXN0IHRvIGVuc3VyZSB0aGF0IHN5c3RlbWlkIGlzIHNldCBjb3JyZWN0bHkKLWZvciBhIHhzbC4uLnRoZSBiZWhhdmlvciBtaWdodCBiZSBkZXBlbmRlbnQgb24gWGFsYW4xCi1hbmQgWGFsYW4yLi4udGhpcyB3aWxsIGJlIGEgcHJvYmxlbSB0byBlcmFzZSB0aGUgZmlsZXMgOigKLUNhbiB0YWtlIGFzIGEgc3lzdGVtaWQgdGhlIGJhc2UgZm9yIHRoZSB4c2wgZG9jdW1lbnQgb3IKLXRoZSBiYXNlIG9yIHRoZSBKVk0gd29ya2luZyBkaXIganVzdCBsaWtlOiBuZXcgRmlsZSgieGFsYW4tcmVkaXJlY3Qtb3V0LnRtcCIpCi0tLT4JCi08eHNsOnBhcmFtIG5hbWU9InhhbGFuLXZlcnNpb24iIHNlbGVjdD0iJ3gnIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotPHJlZGlyZWN0OndyaXRlIGZpbGU9Ii4veGFsYW57JHhhbGFuLXZlcnNpb259LXJlZGlyZWN0LW91dC50bXAiPgotCTx0ZXN0PlRoaXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGU8L3Rlc3Q+Ci08L3JlZGlyZWN0OndyaXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTVjZDY0Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWVuY29kaW5nLWluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPHJvb3Q+Ci0gICAgPG1lc3NhZ2U+6eDo7/k8L21lc3NhZ2U+Ci08L3Jvb3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54c2wgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNGJjMzYuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8cm9vdD4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Jvb3QvbWVzc2FnZSI+Ci0gICAgICAgIDxtZXNzYWdlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9tZXNzYWdlPgotICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwvcm9vdD4KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWI0NTYuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLSAgICA8IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAieHNsdGxpYWlzb24taW5jbHVkZS54bWwiPgotXT4KLTxwcm9qZWN0PgotICAgICZpbmNsdWRlOwotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueHNsIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODdkZTg4Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotPHhzbDppbmNsdWRlIGhyZWY9InhzbHRsaWFpc29uLWluY2x1ZGUueHNsIi8+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluY2x1ZGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW5jbHVkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjU1MjIuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW5jbHVkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTwhLS0gdG8gYmUgaW5jbHVkZWQgYnkgeHNsdGxpYWlzb24taW5jbHVkZS54c2wgLS0+Ci08dGFzay8+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbmNsdWRlLnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluY2x1ZGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA4MDk0Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluY2x1ZGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci08IS0tIHRvIGJlIGluY2x1ZGVkIGJ5IHhzbHRsaWFpc29uLWluLnhzbCAtLT4KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzNmYjc3Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJwcm9wZXJ0eS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJ0ZXN0ZW52Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cHJvcDEiIHZhbHVlPSJhYSIvPgotICAgIDxwcm9wZXJ0eSBmaWxlPSJwcm9wZXJ0eTEucHJvcGVydGllcyIvPgotICAgIDxlY2hvIG1lc3NhZ2U9InRlc3Rwcm9wMT0ke3Rlc3Rwcm9wMX0sIHRlc3Rwcm9wMz0ke3Rlc3Rwcm9wM30sIHRlc3Rwcm9wND0ke3Rlc3Rwcm9wNH0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gICAgPHByb3BlcnR5IGZpbGU9InByb3BlcnR5Mi5wcm9wZXJ0aWVzIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDQiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJodHRwLnBvcnQiIHZhbHVlPSI5OTkiIC8+Ci0gICAgPHByb3BlcnR5IGZpbGU9InByb3BlcnR5My5wcm9wZXJ0aWVzIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iaHR0cC51cmwgaXMgJHtodHRwLnVybH0iLz4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTEucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5MS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTNlY2M0Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5MS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi10ZXN0cHJvcDI9eHgKLXRlc3Rwcm9wMz0ke3Rlc3Rwcm9wMn15eQotdGVzdHByb3A0PSR7dGVzdHByb3AxfXp6CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTIucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5Mi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTc4OTlhLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5Mi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi10ZXN0cHJvcDE9YWEke3Rlc3Rwcm9wMn1iYgotdGVzdHByb3AyPWNjJHt0ZXN0cHJvcDF9ZGQKLQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkzLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiZjdjZS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotaHR0cC5wb3J0ID0gODAKLWh0dHAudXJsID0gaHR0cDovL2xvY2FsaG9zdDoke2h0dHAucG9ydH0KLQotCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZW5hbWUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVuYW1lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjYzNS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZW5hbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPHJlbmFtZS8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDxyZW5hbWUgc3JjPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gICAgPHJlbmFtZSBkZXN0PSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+Ci0gICAgPHJlbmFtZSBzcmM9InRlc3RkaXIiIAotICAgICAgICAgICAgZGVzdD0idGVzdGRpciIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KLSAgICA8cmVuYW1lIHNyYz0idGVtcGxhdGUueG1sIiAKLSAgICAgICAgICAgIGRlc3Q9Ii4iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+Ci0gICAgPHJlbmFtZSBzcmM9InRlbXBsYXRlLnhtbCIgCi0gICAgICAgICAgICBkZXN0PSJ0ZW1wbGF0ZS50bXAiLz4KLSAgICA8cmVuYW1lIHNyYz0idGVtcGxhdGUudG1wIiAKLSAgICAgICAgICAgIGRlc3Q9InRlbXBsYXRlLnhtbCIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVwbGFjZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjZjE5NS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ4eHgtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDxyZXBsYWNlLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPHJlcGxhY2UgZmlsZT0iIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDMiPgotICAgIDxyZXBsYWNlIGZpbGU9InRlbXBsYXRlLnhtbCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KLSAgICA8cmVwbGFjZSBmaWxlPSJ0ZW1wbGF0ZS54bWwiIHRva2VuPSIiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0NSI+Ci0gICAgPHJlcGxhY2UgZmlsZT0idGVtcGxhdGUueG1sIiAKLSAgICAgICAgICAgICB0b2tlbj0iZG9udF93YW50X3RvX3JlYWxseV9yZXBsYWNlX3NvbWV0aGluZyIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KLSAgICA8cmVwbGFjZSBmaWxlPSJ0ZW1wbGF0ZS54bWwiPgotICAgICAgPHJlcGxhY2VmaWx0ZXIgLz4KLSAgICA8L3JlcGxhY2U+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDciPgotICAgIDxyZXBsYWNlIGZpbGU9InRlbXBsYXRlLnhtbCI+Ci0gICAgICA8cmVwbGFjZWZpbHRlciB0b2tlbj0iIiAvPgotICAgIDwvcmVwbGFjZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0OCI+Ci0gICAgPHJlcGxhY2UgZmlsZT0idGVtcGxhdGUueG1sIj4KLSAgICAgIDxyZXBsYWNlZmlsdGVyIHRva2VuPSJkb250X3dhbnRfdG9fcmVhbGx5X3JlcGxhY2Vfc29tZXRoaW5nIiAvPgotICAgIDwvcmVwbGFjZT4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NsZWVwLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NsZWVwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1YjM5OC4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zbGVlcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJzbGVlcHRlc3QiIGRlZmF1bHQ9ImFsbCIgPgotCi0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgICAgIDxzbGVlcCAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjEwIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICAgICAgPHNsZWVwIHNlY29uZHM9IjIiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgotICAgICAgICA8c2xlZXAgaG91cnM9IjEiIG1pbnV0ZXM9Ii01OSIgc2Vjb25kcz0iLTU4Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KLSAgICAgICAgPHNsZWVwIG1pbnV0ZXM9Ii01OSIgc2Vjb25kcz0iLTU4Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KLSAgICAgICAgPHNsZWVwIG1pbnV0ZXM9Ii01OSIgc2Vjb25kcz0iLTU4IiBmYWlsb25lcnJvcj0ibm8iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iYWxsIgotICAgICAgICBkZXBlbmRzPSJ0ZXN0MSx0ZXN0Mix0ZXN0Myx0ZXN0NCx0ZXN0NSIgLz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDQ2OTIuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0YXItdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICAgIDx0YXIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KLSAgICA8dGFyIHRhcmZpbGU9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICA8dGFyIGJhc2VkaXI9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KLSAgICA8dG91Y2ggZmlsZT0idGVzdDQudGFyIi8+Ci0gICAgPHRhciB0YXJmaWxlPSJ0ZXN0NC50YXIiCi0gICAgICAgICBiYXNlZGlyPSIuIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDUiPgotICAgIDxta2RpciBkaXI9InRlc3Q1ZGlyIi8+Ci0gICAgPHRhciB0YXJmaWxlPSJ0ZXN0NS50YXIiCi0gICAgICAgICBiYXNlZGlyPSIuIgotICAgICAgICAgaW5jbHVkZXM9InRlc3Q1ZGlyIi8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4gCi0gICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0NC50YXIiLz4KLSAgICA8ZGVsZXRlIGZpbGU9InRlc3Q1LnRhciIvPgotICAgIDxkZWxldGUgZGlyPSJ0ZXN0NWRpciIvPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhc2tkZWYueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFza2RlZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzdmZGIuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFza2RlZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0ieHh4LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KLSAgICA8dGFza2RlZi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDIiPgotICAgIDx0YXNrZGVmIG5hbWU9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KLSAgICA8dGFza2RlZiBjbGFzc25hbWU9IiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KLSAgICA8dGFza2RlZiBuYW1lPSIiIGNsYXNzbmFtZT0ib29wcyIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KLSAgICA8dGFza2RlZiBuYW1lPSJ0ZXN0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QiIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDYiPgotICAgIDxlY2hvIG1lc3NhZ2U9IiR7YnVpbGQudGVzdH0iIC8+Ci0gICAgPHRhc2tkZWYgbmFtZT0idGVzdDYiCi0gICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UYXNrZGVmVGVzdFNpbXBsZVRhc2siIC8+Ci0gICAgPHRlc3Q2PgotICAgICAgPGVjaG8gbWVzc2FnZT0id29ya2VkIiAvPgotICAgIDwvdGVzdDY+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDciPgotICAgIDx0YXNrZGVmIG5hbWU9InRlc3Q3IgotICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFza2RlZlRlc3RDb250YWluZXJUYXNrIiAvPgotICAgIDx0ZXN0Nz4KLSAgICAgIDxlY2hvIG1lc3NhZ2U9IndvcmtlZCIgLz4KLSAgICA8L3Rlc3Q3PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVtcGxhdGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmFlZjNlLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RlbXBsYXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ4eHgtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDEiPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91bnppcC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91bnppcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDYyZGIuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdW56aXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+Ci0gICAgPHVuemlwLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPHVuemlwIHNyYz0iIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDMiPgotICAgIDx1bnppcCBkZXN0PSIiLz4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy96aXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWVkOWE1Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0iemlwLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KLSAgICA8emlwLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPHppcCB6aXBmaWxlPSJ6aXAudG1wIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGVzdCB3aGVuIHRoZSB6aXAgZmlsZSBpbmNsdWRlcyBpdHNlbGYKLSAgd2hlbiB0YXJnZXQgZmlsZSBleGlzdHMgYmVmb3JlIHRoZSB6aXAgdGFzayBpcyBydW4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdDMiPgotICAgIDx0b3VjaCBmaWxlPSJ0ZXN0My56aXAiLz4KLSAgICA8emlwIHppcGZpbGU9InRlc3QzLnppcCIKLSAgICAgICAgIGJhc2VkaXI9Ii4iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUZXN0IHdoZW4gdGhlIHppcCBmaWxlIGluY2x1ZGVzIGl0c2VsZgotICB3aGVuIHRhcmdldCBmaWxlIGRvZXMgbm90IGV4aXN0IGJlZm9yZSB0aGUgemlwIHRhc2sgaXMgcnVuIC0tPgotICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KLSAgICAgPHppcCB6aXBmaWxlPSJ0ZXN0NC56aXAiCi0gICAgICAgICBiYXNlZGlyPSIuIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDUiPgotICAgIDx6aXAgemlwZmlsZT0idGVzdDUuemlwIiBiYXNlZGlyPSIuIiA+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSJ0ZXN0NS56aXAiIC8+Ci0gICAgPC96aXA+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDYiPgotICAgIDx6aXAgemlwZmlsZT0idGVzdDYuemlwIiBiYXNlZGlyPSIuIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioueG1sIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iemlwLioiIC8+Ci0gICAgPC96aXA+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDciPgotICAgIDx6aXAgemlwZmlsZT0iaW5uZXI3LnppcCIgYmFzZWRpcj0iLiIgPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iaW5uZXI3LnppcCIgLz4KLSAgICA8L3ppcD4KLSAgICA8emlwIHppcGZpbGU9InRlc3Q3LnppcCIgYmFzZWRpcj0iLiI+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLioiIC8+Ci0gICAgICA8emlwZmlsZXNldCBzcmM9ImlubmVyNy56aXAiIC8+Ci0gICAgPC96aXA+Ci0gIDwvdGFyZ2V0PgotCi0KLQotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICAgIDxkZWxldGUgZmlsZT0idGVzdDMuemlwIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0NC56aXAiLz4KLSAgICA8ZGVsZXRlIGZpbGU9InRlc3Q1LnppcCIvPgotICAgIDxkZWxldGUgZmlsZT0idGVzdDYuemlwIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSJpbm5lcjcuemlwIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0Ny56aXAiLz4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjM2VjZi4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0ibmV3IiBiYXNlZGlyPSIuIj4KLSAgPGZpbHRlcnNldCBpZD0idGVzdHNldC5vbmUiPgotICAgIDxmaWx0ZXIgdG9rZW49ImFhYWEiIHZhbHVlPSIxMTExIi8+Ci0gICAgPGZpbHRlciB0b2tlbj0iYmJiYiIgdmFsdWU9IjIyMjIiLz4KLSAgPC9maWx0ZXJzZXQ+Ci0gIAotICA8ZmlsdGVyc2V0IGlkPSJ0ZXN0c2V0LnR3byIgYmVnaW5Ub2tlbj0iJSIgZW5kVG9rZW49Il4iPgotICAgIDxmaWx0ZXIgdG9rZW49ImNjY2MiIHZhbHVlPSIzMzMzIi8+Ci0gICAgPGZpbHRlciB0b2tlbj0iZGRkZCIgdmFsdWU9IjQ0NDQiLz4KLSAgPC9maWx0ZXJzZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KLSAgICA8ZGVsZXRlIGZpbGU9ImRlc3QxLnR4dCIvPgotICAgIDxjb3B5IGZpbGU9ImZpbHRlcnNldGEudHh0IiB0b2ZpbGU9ImRlc3QxLnR4dCI+Ci0gICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9InRlc3RzZXQub25lIi8+IAotICAgIDwvY29weT4KLSAgICA8Zml4Y3JsZiBlb2w9ImxmIiBzcmNkaXI9Ii4iIGluY2x1ZGVzPSJkZXN0MS50eHQiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+Ci0gICAgPGRlbGV0ZSBmaWxlPSJkZXN0Mi50eHQiLz4KLSAgICA8Y29weSBmaWxlPSJmaWx0ZXJzZXRiLnR4dCIgdG9maWxlPSJkZXN0Mi50eHQiPgotICAgICAgICA8ZmlsdGVyc2V0IHJlZmlkPSJ0ZXN0c2V0LnR3byIvPiAKLSAgICA8L2NvcHk+Ci0gICAgPGZpeGNybGYgZW9sPSJsZiIgc3JjZGlyPSIuIiBpbmNsdWRlcz0iZGVzdDIudHh0Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdDMiPgotICAgIDxkZWxldGUgZmlsZT0iZGVzdDMudHh0Ii8+Ci0gICAgPGNvcHkgZmlsZT0iZmlsdGVyc2V0Yy50eHQiIHRvZmlsZT0iZGVzdDMudHh0Ij4KLSAgICAgICAgPGZpbHRlcnNldCByZWZpZD0idGVzdHNldC5vbmUiLz4gCi0gICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9InRlc3RzZXQudHdvIi8+IAotICAgIDwvY29weT4KLSAgICA8Zml4Y3JsZiBlb2w9ImxmIiBzcmNkaXI9Ii4iIGluY2x1ZGVzPSJkZXN0My50eHQiLz4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2V0YS50eHQgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXRhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNDk5NS4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXRhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3QgZmlsZSBmb3IgZmlsdGVycyBAYWFhYUAKLUl0IGhhcyB0d28gbGluZXMgQGJiYmJACmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXRiLnR4dCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldGIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDk2NDBhLi4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldGIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1UaGlzIGlzIGEgdGVzdCBmaWxlIGZvciBmaWx0ZXJzIHdpdGggbm9uIGRlZmF1bHQgbWFya2VycwotQGNjY2NAIC0gc2hvdWxkIG5vdCBjaGFuZ2UKLSVjY2NjXiAtIHNob3VsZCBjaGFuZ2UKLV5kZGRkJSAtIHNob3VsZCBub3QgY2hhbmdlCi0lZGRkZF4gLSBzaG91bGQgY2hhbmdlCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXRjLnR4dCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldGMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTIyZDM1Li4wMDAwMDAwCi0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldGMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1Db21iaW5lZCBmaWx0ZXIgdGVzdAotQGFhYWFAIC0gc2hvdWxkIGNoYW5nZQotQGJiYmJAIC0gc2hvdWxkIGNoYW5nZQotQGNjY2NAIC0gc2hvdWxkIG5vdCBjaGFuZ2UKLSVjY2NjXiAtIHNob3VsZCBjaGFuZ2UKLV5kZGRkJSAtIHNob3VsZCBub3QgY2hhbmdlCi0lZGRkZF4gLSBzaG91bGQgY2hhbmdlCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDEudHh0IGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQxLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NDE2Zi4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGlzIGlzIGEgdGVzdCBmaWxlIGZvciBmaWx0ZXJzIDExMTEKLUl0IGhhcyB0d28gbGluZXMgMjIyMgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQyLnR4dCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2dvbGQvZmlsdGVyc2V0Mi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYWIwMjEuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3QgZmlsZSBmb3IgZmlsdGVycyB3aXRoIG5vbiBkZWZhdWx0IG1hcmtlcnMKLUBjY2NjQCAtIHNob3VsZCBub3QgY2hhbmdlCi0zMzMzIC0gc2hvdWxkIGNoYW5nZQotXmRkZGQlIC0gc2hvdWxkIG5vdCBjaGFuZ2UKLTQ0NDQgLSBzaG91bGQgY2hhbmdlCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDMudHh0IGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNmU2Mi4uMDAwMDAwMAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1Db21iaW5lZCBmaWx0ZXIgdGVzdAotMTExMSAtIHNob3VsZCBjaGFuZ2UKLTIyMjIgLSBzaG91bGQgY2hhbmdlCi1AY2NjY0AgLSBzaG91bGQgbm90IGNoYW5nZQotMzMzMyAtIHNob3VsZCBjaGFuZ2UKLV5kZGRkJSAtIHNob3VsZCBub3QgY2hhbmdlCi00NDQ0IC0gc2hvdWxkIGNoYW5nZQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YThlZWQuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJjb3B5LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KLSAgICA8ZGVsZXRlIGRpcj0iY29weXRlc3QiIC8+Ci0gICAgPG1rZGlyIGRpcj0iY29weXRlc3QiIC8+Ci0gICAgPGNvcHkgdG9kaXI9ImNvcHl0ZXN0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vbWFpbiI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL3Rhc2tkZWZzLyouamF2YSIgLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vdGVzdGNhc2VzIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovdGFza2RlZnMvKi5qYXZhIiAvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIiAvPgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzUyYzJmLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotLyoqCi0gKiBVc2VkIHRvIGxvYWQgY2xhc3NlcyB3aXRoaW4gYW50IHdpdGggYSBkaWZmZXJlbnQgY2xhc3BhdGggZnJvbSB0aGF0IHVzZWQgdG8gc3RhcnQgYW50LgotICogTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGZvcmNlIGEgY2xhc3MgaW50byB0aGlzIGxvYWRlciBldmVuIHdoZW4gdGhhdCBjbGFzcyBpcyBvbiB0aGUKLSAqIHN5c3RlbSBjbGFzc3BhdGggYnkgdXNpbmcgdGhlIGZvcmNlTG9hZENsYXNzIG1ldGhvZC4gQW55IHN1YnNlcXVlbnQgY2xhc3NlcyBsb2FkZWQgYnkgdGhhdAotICogY2xhc3Mgd2lsbCB0aGVuIHVzZSB0aGlzIGxvYWRlciByYXRoZXIgdGhhbiB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1Ij5Db25vciBNYWNOZWlsbDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOkplc3NlLkdsaWNrQG5ldGJlYW5zLmNvbSI+SmVzc2UgR2xpY2s8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBbnRDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbnVtZXJhdGlvbiBvZiBhbGwgcmVzb3VyY2VzIG9mIGEgZ2l2ZW4gbmFtZSBmb3VuZCB3aXRoaW4gdGhlCi0gICAgICogY2xhc3NwYXRoIG9mIHRoaXMgY2xhc3MgbG9hZGVyLiBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgYnkgdGhlCi0gICAgICoge0BsaW5rICNmaW5kUmVzb3VyY2VzKFN0cmluZykgZmluZFJlc291cmNlc30gbWV0aG9kLCB3aGljaCBpcyBpbgotICAgICAqIHR1cm4gdXNlZCBieSB0aGUKLSAgICAgKiB7QGxpbmsgQ2xhc3NMb2FkZXIjZ2V0UmVzb3VyY2VzIENsYXNzTG9hZGVyLmdldFJlc291cmNlc30gbWV0aG9kLgotICAgICAqCi0gICAgICogQHNlZSBBbnRDbGFzc0xvYWRlciNmaW5kUmVzb3VyY2VzKFN0cmluZykKLSAgICAgKiBAc2VlIGphdmEubGFuZy5DbGFzc0xvYWRlciNnZXRSZXNvdXJjZXMoU3RyaW5nKQotICAgICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmhlcm1hbmRAYWx1bW5pLmdyaW5uZWxsLmVkdSI+RGF2aWQgQS4gSGVybWFuPC9hPgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgUmVzb3VyY2VFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJlaW5nIHNlYXJjaGVkIGZvci4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBuZXh0IGNsYXNzcGF0aCBlbGVtZW50IHRvIHNlYXJjaC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgaW50IHBhdGhFbGVtZW50c0luZGV4OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBuZXh0IHJlc291cmNlIHRvIHJldHVybiBpbiB0aGUgZW51bWVyYXRpb24uIElmIHRoaXMKLSAgICAgICAgICogZmllbGQgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGUgZW51bWVyYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLAotICAgICAgICAgKiBpLmUuLCB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyB0byByZXR1cm4uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFVSTCBuZXh0UmVzb3VyY2U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdCBhIG5ldyBlbnVtZXJhdGlvbiBvZiByZXNvdXJjZXMgb2YgdGhlIGdpdmVuIG5hbWUgZm91bmQKLSAgICAgICAgICogd2l0aGluIHRoaXMgY2xhc3MgbG9hZGVyJ3MgY2xhc3NwYXRoLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gc2VhcmNoIGZvci4KLSAgICAgICAgICovCi0gICAgICAgIFJlc291cmNlRW51bWVyYXRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHRoaXMucmVzb3VyY2VOYW1lID0gbmFtZTsKLSAgICAgICAgICAgIHRoaXMucGF0aEVsZW1lbnRzSW5kZXggPSAwOwotICAgICAgICAgICAgZmluZE5leHRSZXNvdXJjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGluIHRoZSBlbnVtZXJhdGlvbiB0bwotICAgICAgICAgKiByZXR1cm4uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgaW4gdGhlCi0gICAgICAgICAqICAgICAgICAgZW51bWVyYXRpb247IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHRoaXMubmV4dFJlc291cmNlICE9IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIG5leHQgcmVzb3VyY2UgaW4gdGhlIGVudW1lcmF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHJlc291cmNlIGluIHRoZSBlbnVtZXJhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0gICAgICAgICAgICBVUkwgcmV0ID0gdGhpcy5uZXh0UmVzb3VyY2U7Ci0gICAgICAgICAgICBmaW5kTmV4dFJlc291cmNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExvY2F0ZXMgdGhlIG5leHQgcmVzb3VyY2Ugb2YgdGhlIGNvcnJlY3QgbmFtZSBpbiB0aGUgY2xhc3NwYXRoIGFuZAotICAgICAgICAgKiBzZXRzIDxjb2RlPm5leHRSZXNvdXJjZTwvY29kZT4gdG8gdGhlIFVSTCBvZiB0aGF0IHJlc291cmNlLiBJZiBubwotICAgICAgICAgKiBtb3JlIHJlc291cmNlcyBjYW4gYmUgZm91bmQsIDxjb2RlPm5leHRSZXNvdXJjZTwvY29kZT4gaXMgc2V0IHRvCi0gICAgICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmROZXh0UmVzb3VyY2UoKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlICgocGF0aEVsZW1lbnRzSW5kZXggPCBwYXRoQ29tcG9uZW50cy5zaXplKCkpICYmCi0gICAgICAgICAgICAgICAgICAgKHVybCA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBwYXRoQ29tcG9uZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgPSAoRmlsZSlwYXRoQ29tcG9uZW50cy5lbGVtZW50QXQocGF0aEVsZW1lbnRzSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cmwgPSBnZXRSZXNvdXJjZVVSTChwYXRoQ29tcG9uZW50LCB0aGlzLnJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhFbGVtZW50c0luZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBwYXRoIGVsZW1lbnRzIHdoaWNoIGFyZSBub3QgdmFsaWQgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLm5leHRSZXNvdXJjZSA9IHVybDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzaXplIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZCBpbiB0aGlzIGNsYXNzbG9hZGVyLgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDgxOTI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNvbXBvbmVudHMgb2YgdGhlIGNsYXNzcGF0aCB0aGF0IHRoZSBjbGFzc2xvYWRlciBzZWFyY2hlcyBmb3IgY2xhc3NlcwotICAgICAqLwotICAgIFZlY3RvciBwYXRoQ29tcG9uZW50cyAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgYmVsb25ncy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIHNob3VsZCBiZSAKLSAgICAgKiBjb25zdWx0ZWQgYmVmb3JlIHRyeWluZyB0byBsb2FkIHdpdGggdGhpcyBjbGFzcyBsb2FkZXIuIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXJlbnRGaXJzdCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGVzZSBhcmUgdGhlIHBhY2thZ2Ugcm9vdHMgdGhhdCBhcmUgdG8gYmUgbG9hZGVkIGJ5IHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyCi0gICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIGlzIGJlaW5nIHNlYXJjaGVkIGZpcnN0IG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciBzeXN0ZW1QYWNrYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGVzZSBhcmUgdGhlIHBhY2thZ2Ugcm9vdHMgdGhhdCBhcmUgdG8gYmUgbG9hZGVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyCi0gICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIGlzIGJlaW5nIHNlYXJjaGVkIGZpcnN0IG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciBsb2FkZXJQYWNrYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGNsYXNzbG9hZGVyIHdpbGwgaWdub3JlIHRoZSBiYXNlCi0gICAgICogY2xhc3Nsb2FkZXIgaWYgaXQgY2FuJ3QgZmluZCBhIGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVCYXNlID0gZmFsc2U7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIHBhcmVudCBjbGFzcyBsb2FkZXIsIGlmIG9uZSBpcyBnaXZlbiBvciBjYW4gYmUgZGV0ZXJtaW5lZAotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgcGFyZW50ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEEgaGFzaHRhYmxlIG9mIHppcCBmaWxlcyBvcGVuZWQgYnkgdGhlIGNsYXNzbG9hZGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgemlwRmlsZXMgPSBuZXcgSGFzaHRhYmxlKCk7ICAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY29udGV4dCBsb2FkZXIgc2F2ZWQgd2hlbiBzZXR0aW5nIHRoZSB0aHJlYWQncyBjdXJyZW50IGNvbnRleHQgbG9hZGVyLgotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgc2F2ZWRDb250ZXh0TG9hZGVyID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb250ZXh0TG9hZGVyU2F2ZWQgPSBmYWxzZTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0UHJvdGVjdGlvbkRvbWFpbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGRlZmluZUNsYXNzUHJvdGVjdGlvbkRvbWFpbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIHNldENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFByb3RlY3Rpb25Eb21haW4gPSBDbGFzcy5jbGFzcy5nZXRNZXRob2QoImdldFByb3RlY3Rpb25Eb21haW4iLCBuZXcgQ2xhc3NbMF0pOwotICAgICAgICAgICAgQ2xhc3MgcHJvdGVjdGlvbkRvbWFpbiA9IENsYXNzLmZvck5hbWUoImphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbiIpOwotICAgICAgICAgICAgQ2xhc3NbXSBhcmdzID0gbmV3IENsYXNzW10ge1N0cmluZy5jbGFzcywgYnl0ZVtdLmNsYXNzLCBJbnRlZ2VyLlRZUEUsIEludGVnZXIuVFlQRSwgcHJvdGVjdGlvbkRvbWFpbn07Ci0gICAgICAgICAgICBkZWZpbmVDbGFzc1Byb3RlY3Rpb25Eb21haW4gPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZGVmaW5lQ2xhc3MiLCBhcmdzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0Q29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmNsYXNzLmdldE1ldGhvZCgiZ2V0Q29udGV4dENsYXNzTG9hZGVyIiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgICAgIGFyZ3MgPSBuZXcgQ2xhc3NbXSB7Q2xhc3NMb2FkZXIuY2xhc3N9OwotICAgICAgICAgICAgc2V0Q29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmNsYXNzLmdldE1ldGhvZCgic2V0Q29udGV4dENsYXNzTG9hZGVyIiwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNsYXNzbG9hZGVyIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCB1c2luZyB0aGUgY2xhc3NwYXRoIGdpdmVuLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBjbGFzc2xvYWRlciBpcyB0byBiZWxvbmcuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB0byBsb2FkIHRoZSBjbGFzc2VzLiAgVGhpcwotICAgICAqICAgICAgICAgICAgICAgIGlzIGNvbWJpbmVkIHdpdGggdGhlIHN5c3RlbSBjbGFzc3BhdGggaW4gYSBtYW5uZXIKLSAgICAgKiAgICAgICAgICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZSBvZiAke2J1aWxkLnN5c2NsYXNzcGF0aH0KLSAgICAgKi8KLSAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoUHJvamVjdCBwcm9qZWN0LCBQYXRoIGNsYXNzcGF0aCkgewotICAgICAgICBwYXJlbnQgPSBBbnRDbGFzc0xvYWRlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgUGF0aCBhY3R1YWxDbGFzc3BhdGggPSBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhFbGVtZW50cyA9IGFjdHVhbENsYXNzcGF0aC5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhFbGVtZW50cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFBhdGhFbGVtZW50KChTdHJpbmcpcGF0aEVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHBhdGggZWxlbWVudHMgd2hpY2ggYXJlIGludmFsaWQgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgY2xhc3Nsb2FkZXIgZm9yIHRoZSBnaXZlbiBwcm9qZWN0IHVzaW5nIHRoZSBjbGFzc3BhdGggZ2l2ZW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY2xhc3Nsb2FkZXIgdG8gd2hpY2ggdW5zYXRpc2ZpZWQgbG9hZGluZyBhdHRlbXB0cwotICAgICAqICAgICAgICAgICAgICAgYXJlIGRlbGdhdGVkCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBjbGFzc2xvYWRlciBpcyB0byBiZWxvbmcuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB0byBsb2FkIHRoZSBjbGFzc2VzLgotICAgICAqIEBwYXJhbSBwYXJlbnRGaXJzdCBpZiB0cnVlIGluZGljYXRlcyB0aGF0IHRoZSBwYXJlbnQgY2xhc3Nsb2FkZXIgc2hvdWxkIGJlIGNvbnN1bHRlZAotICAgICAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdHJ5aW5nIHRvIGxvYWQgdGhlIGEgY2xhc3MgdGhyb3VnaCB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50LCBQcm9qZWN0IHByb2plY3QsIFBhdGggY2xhc3NwYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYXJlbnRGaXJzdCkgewotICAgICAgICB0aGlzKHByb2plY3QsIGNsYXNzcGF0aCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wYXJlbnRGaXJzdCA9IHBhcmVudEZpcnN0OwotICAgICAgICBhZGRTeXN0ZW1QYWNrYWdlUm9vdCgiamF2YSIpOwotICAgICAgICBhZGRTeXN0ZW1QYWNrYWdlUm9vdCgiamF2YXgiKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNsYXNzbG9hZGVyIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCB1c2luZyB0aGUgY2xhc3NwYXRoIGdpdmVuLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBjbGFzc2xvYWRlciBpcyB0byBiZWxvbmcuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB0byBsb2FkIHRoZSBjbGFzc2VzLgotICAgICAqIEBwYXJhbSBwYXJlbnRGaXJzdCBpZiB0cnVlIGluZGljYXRlcyB0aGF0IHRoZSBwYXJlbnQgY2xhc3Nsb2FkZXIgc2hvdWxkIGJlIGNvbnN1bHRlZAotICAgICAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdHJ5aW5nIHRvIGxvYWQgdGhlIGEgY2xhc3MgdGhyb3VnaCB0aGlzIGxvYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoUHJvamVjdCBwcm9qZWN0LCBQYXRoIGNsYXNzcGF0aCwgYm9vbGVhbiBwYXJlbnRGaXJzdCkgewotICAgICAgICB0aGlzKG51bGwsIHByb2plY3QsIGNsYXNzcGF0aCwgcGFyZW50Rmlyc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBlbXB0eSBjbGFzcyBsb2FkZXIuIFRoZSBjbGFzc2xvYWRlciBzaG91bGQgYmUgY29uZmlndXJlZCB3aXRoIHBhdGggZWxlbWVudHMKLSAgICAgKiB0byBzcGVjaWZ5IHdoZXJlIHRoZSBsb2FkZXIgaXMgdG8gbG9vayBmb3IgY2xhc3Nlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjbGFzc2xvYWRlciB0byB3aGljaCB1bnNhdGlzZmllZCBsb2FkaW5nIGF0dGVtcHRzCi0gICAgICogICAgICAgICAgICAgICBhcmUgZGVsZ2F0ZWQKLSAgICAgKiBAcGFyYW0gcGFyZW50Rmlyc3QgaWYgdHJ1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFyZW50IGNsYXNzbG9hZGVyIHNob3VsZCBiZSBjb25zdWx0ZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHRyeWluZyB0byBsb2FkIHRoZSBhIGNsYXNzIHRocm91Z2ggdGhpcyBsb2FkZXIuCi0gICAgICovCi0gICAgcHVibGljIEFudENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCwgYm9vbGVhbiBwYXJlbnRGaXJzdCkgewotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcGFyZW50ID0gQW50Q2xhc3NMb2FkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgfQotICAgICAgICBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy5wYXJlbnRGaXJzdCA9IHBhcmVudEZpcnN0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2cgYSBtZXNzYWdlIHRocm91Z2ggdGhlIHByb2plY3Qgb2JqZWN0IGlmIG9uZSBoYXMgYmVlbiBwcm92aWRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwcmlvcml0eSB0aGUgbG9nZ2luZyBwcmlvcml0eSBvZiB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KSB7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2plY3QubG9nKG1lc3NhZ2UsIHByaW9yaXR5KTsKLSAgICAgICAgfQotLy8gICAgICAgICBlbHNlIHsKLS8vICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLS8vICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY3VycmVudCB0aHJlYWQncyBjb250ZXh0IGxvYWRlciB0byB0aGlzIGNsYXNzbG9hZGVyLCBzdG9yaW5nIHRoZSBjdXJyZW50Ci0gICAgICogbG9hZGVyIHZhbHVlIGZvciBsYXRlciByZXNldHRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRDb250ZXh0TG9hZGVyKCkgewotICAgICAgICBpZiAoaXNDb250ZXh0TG9hZGVyU2F2ZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ29udGV4dCBsb2FkZXIgaGFzIG5vdCBiZWVuIHJlc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldENvbnRleHRDbGFzc0xvYWRlciAhPSBudWxsICYmIHNldENvbnRleHRDbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNhdmVkQ29udGV4dExvYWRlciAKLSAgICAgICAgICAgICAgICAgICAgPSAoQ2xhc3NMb2FkZXIpZ2V0Q29udGV4dENsYXNzTG9hZGVyLmludm9rZShUaHJlYWQuY3VycmVudFRocmVhZCgpLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHt0aGlzfTsKLSAgICAgICAgICAgICAgICBzZXRDb250ZXh0Q2xhc3NMb2FkZXIuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCksIGFyZ3MpOwotICAgICAgICAgICAgICAgIGlzQ29udGV4dExvYWRlclNhdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgICAgIFRocm93YWJsZSB0ID0gaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbnRleHQgbG9hZGVyIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0VGhyZWFkQ29udGV4dExvYWRlcigpIHsKLSAgICAgICAgaWYgKGlzQ29udGV4dExvYWRlclNhdmVkICYmCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dENsYXNzTG9hZGVyICE9IG51bGwgJiYgc2V0Q29udGV4dENsYXNzTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7c2F2ZWRDb250ZXh0TG9hZGVyfTsKLSAgICAgICAgICAgICAgICBzZXRDb250ZXh0Q2xhc3NMb2FkZXIuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCksIGFyZ3MpOwotICAgICAgICAgICAgICAgIHNhdmVkQ29udGV4dExvYWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaXNDb250ZXh0TG9hZGVyU2F2ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgICAgIFRocm93YWJsZSB0ID0gaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBjbGFzc3BhdGggdG8gYmUgc2VhcmNoZWQKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhdGhFbGVtZW50KFN0cmluZyBwYXRoRWxlbWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBwYXRoQ29tcG9uZW50IAotICAgICAgICAgICAgPSBwcm9qZWN0ICE9IG51bGwgPyBwcm9qZWN0LnJlc29sdmVGaWxlKHBhdGhFbGVtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRmlsZShwYXRoRWxlbWVudCk7Ci0gICAgICAgIHBhdGhDb21wb25lbnRzLmFkZEVsZW1lbnQocGF0aENvbXBvbmVudCk7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBjbGFzc2xvYWRlciB0byBydW4gaW4gaXNvbGF0ZWQgbW9kZS4gSW4gaXNvbGF0ZWQgbW9kZSwgY2xhc3NlcyBub3QKLSAgICAgKiBmb3VuZCBvbiB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHdpbGwgbm90IGJlIHJlZmVycmVkIHRvIHRoZSBiYXNlIGNsYXNzIGxvYWRlcgotICAgICAqIGJ1dCB3aWxsIGNhdXNlIGEgY2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc29sYXRlZChib29sZWFuIGlzb2xhdGVkKSB7Ci0gICAgICAgIGlnbm9yZUJhc2UgPSBpc29sYXRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZSBpbml0aWFsaXphdGlvbiBvZiBhIGNsYXNzIGluIGEgSkRLIDEuMSBjb21wYXRpYmxlLCBhbGJlaXQgaGFja3kgCi0gICAgICogd2F5IAotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBpbml0aWFsaXplQ2xhc3MoQ2xhc3MgdGhlQ2xhc3MpIHsKLSAgICAgICAgLy8gKioqSEFDSyoqKiBXZSB0cnkgdG8gY3JlYXRlIGFuIGluc3RhbmNlIHRvIGZvcmNlIHRoZSBWTSB0byBydW4gdGhlCi0gICAgICAgIC8vIGNsYXNzJyBzdGF0aWMgaW5pdGlhbGl6ZXIuIFdlIGRvbid0IGNhcmUgaWYgdGhlIGluc3RhbmNlIGNhbid0IAotICAgICAgICAvLyBiZSBjcmVhdGVkIC0gd2UgYXJlIGp1c3QgaW50ZXJlc3RlZCBpbiB0aGUgc2lkZSBlZmZlY3QuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgLy9pZ25vcmUgLSBvdXIgd29yayBpcyBkb25lCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGEgcGFja2FnZSByb290IHRvIHRoZSBsaXN0IG9mIHBhY2thZ2VzIHdoaWNoIG11c3QgYmUgbG9hZGVkIG9uIHRoZSAKLSAgICAgKiBwYXJlbnQgbG9hZGVyLgotICAgICAqCi0gICAgICogQWxsIHN1YnBhY2thZ2VzIGFyZSBhbHNvIGluY2x1ZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VSb290IHRoZSByb290IG9mIGFsbCBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTeXN0ZW1QYWNrYWdlUm9vdChTdHJpbmcgcGFja2FnZVJvb3QpIHsKLSAgICAgICAgc3lzdGVtUGFja2FnZXMuYWRkRWxlbWVudChwYWNrYWdlUm9vdCArICIuIik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhIHBhY2thZ2Ugcm9vdCB0byB0aGUgbGlzdCBvZiBwYWNrYWdlcyB3aGljaCBtdXN0IGJlIGxvYWRlZCB1c2luZwotICAgICAqIHRoaXMgbG9hZGVyLgotICAgICAqCi0gICAgICogQWxsIHN1YnBhY2thZ2VzIGFyZSBhbHNvIGluY2x1ZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VSb290IHRoZSByb290IG9mIGFrbGwgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTG9hZGVyUGFja2FnZVJvb3QoU3RyaW5nIHBhY2thZ2VSb290KSB7Ci0gICAgICAgIGxvYWRlclBhY2thZ2VzLmFkZEVsZW1lbnQocGFja2FnZVJvb3QgKyAiLiIpOwotICAgIH0KLSAgICAKLQotCi0gICAgLyoqCi0gICAgICogTG9hZCBhIGNsYXNzIHRocm91Z2ggdGhpcyBjbGFzcyBsb2FkZXIgZXZlbiBpZiB0aGF0IGNsYXNzIGlzIGF2YWlsYWJsZSBvbiB0aGUKLSAgICAgKiBwYXJlbnQgY2xhc3NwYXRoLgotICAgICAqCi0gICAgICogVGhpcyBlbnN1cmVzIHRoYXQgYW55IGNsYXNzZXMgd2hpY2ggYXJlIGxvYWRlZCBieSB0aGUgcmV0dXJuZWQgY2xhc3Mgd2lsbCB1c2UgdGhpcwotICAgICAqIGNsYXNzbG9hZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgY2xhc3NuYW1lIHRvIGJlIGxvYWRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBDbGFzcyBvYmplY3QKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdGVkIGNsYXNzIGRvZXMgbm90IGV4aXN0IG9uCi0gICAgICogdGhpcyBsb2FkZXIncyBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGZvcmNlTG9hZENsYXNzKFN0cmluZyBjbGFzc25hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nKCJmb3JjZSBsb2FkaW5nICIgKyBjbGFzc25hbWUsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgCi0gICAgICAgIENsYXNzIHRoZUNsYXNzID0gZmluZExvYWRlZENsYXNzKGNsYXNzbmFtZSk7Ci0KLSAgICAgICAgaWYgKHRoZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoZUNsYXNzID0gZmluZENsYXNzKGNsYXNzbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIGEgY2xhc3MgdGhyb3VnaCB0aGlzIGNsYXNzIGxvYWRlciBidXQgZGVmZXIgdG8gdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIKLSAgICAgKgotICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IGluc3RhbmNlcyBvZiB0aGUgcmV0dXJuZWQgY2xhc3Mgd2lsbCBiZSBjb21wYXRpYmxlIHdpdGggaW5zdGFuY2VzIHdoaWNoCi0gICAgICogd2hpY2ggaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkIG9uIHRoZSBwYXJlbnQgbG9hZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgY2xhc3NuYW1lIHRvIGJlIGxvYWRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBDbGFzcyBvYmplY3QKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdGVkIGNsYXNzIGRvZXMgbm90IGV4aXN0IG9uCi0gICAgICogdGhpcyBsb2FkZXIncyBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGZvcmNlTG9hZFN5c3RlbUNsYXNzKFN0cmluZyBjbGFzc25hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nKCJmb3JjZSBzeXN0ZW0gbG9hZGluZyAiICsgY2xhc3NuYW1lLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgIAotICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGZpbmRMb2FkZWRDbGFzcyhjbGFzc25hbWUpOwotCi0gICAgICAgIGlmICh0aGVDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGVDbGFzcyA9IGZpbmRCYXNlQ2xhc3MoY2xhc3NuYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRoZUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmVhbSB0byByZWFkIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggYSBzdHJlYW0gaXMgcmVxdWlyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIHRvIHRoZSByZXF1aXJlZCByZXNvdXJjZSBvciBudWxsIGlmIHRoZSByZXNvdXJjZSBjYW5ub3QgYmUKLSAgICAgKiBmb3VuZCBvbiB0aGUgbG9hZGVyJ3MgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBuYW1lKSB7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gcmVzb3VyY2VTdHJlYW0gPSBudWxsOwotICAgICAgICBpZiAoaXNQYXJlbnRGaXJzdChuYW1lKSkgewotICAgICAgICAgICAgcmVzb3VyY2VTdHJlYW0gPSBsb2FkQmFzZVJlc291cmNlKG5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coIlJlc291cmNlU3RyZWFtIGZvciAiICsgbmFtZQotICAgICAgICAgICAgICAgICAgICArICIgbG9hZGVkIGZyb20gcGFyZW50IGxvYWRlciIsIFByb2plY3QuTVNHX0RFQlVHKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZVN0cmVhbSA9IGxvYWRSZXNvdXJjZShuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlJlc291cmNlU3RyZWFtIGZvciAiICsgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGxvYWRlZCBmcm9tIGFudCBsb2FkZXIiLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVzb3VyY2VTdHJlYW0gPSBsb2FkUmVzb3VyY2UobmFtZSk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZygiUmVzb3VyY2VTdHJlYW0gZm9yICIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBsb2FkZWQgZnJvbSBhbnQgbG9hZGVyIiwgUHJvamVjdC5NU0dfREVCVUcpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc291cmNlU3RyZWFtID0gbG9hZEJhc2VSZXNvdXJjZShuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlJlc291cmNlU3RyZWFtIGZvciAiICsgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGxvYWRlZCBmcm9tIHBhcmVudCBsb2FkZXIiLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKHJlc291cmNlU3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZygiQ291bGRuJ3QgbG9hZCBSZXNvdXJjZVN0cmVhbSBmb3IgIiArIG5hbWUsIAotICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXNvdXJjZVN0cmVhbTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyZWFtIHRvIHJlYWQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBuYW1lIGZyb20gdGhpcyBsb2FkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIGEgc3RyZWFtIGlzIHJlcXVpcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmVhbSB0byB0aGUgcmVxdWlyZWQgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgY2Fubm90IGJlCi0gICAgICogZm91bmQgb24gdGhlIGxvYWRlcidzIGNsYXNzcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGxvYWRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotICAgICAgICAvLyB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgY29tcG9uZW50cyBvZiB0aGUgcGF0aCB0byBzZWUgaWYgd2UgY2FuIGZpbmQgdGhlIAotICAgICAgICAvLyBjbGFzcyB3ZSB3YW50LiAKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcGF0aENvbXBvbmVudHMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKSAmJiBzdHJlYW0gPT0gbnVsbDsgKSB7Ci0gICAgICAgICAgICBGaWxlIHBhdGhDb21wb25lbnQgPSAoRmlsZSllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBzdHJlYW0gPSBnZXRSZXNvdXJjZVN0cmVhbShwYXRoQ29tcG9uZW50LCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYSBzeXN0ZW0gcmVzb3VyY2UgKHdoaWNoIHNob3VsZCBiZSBsb2FkZWQgZnJvbSB0aGUgcGFyZW50IGNsYXNzbG9hZGVyKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGxvYWRCYXNlUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbiBpbnB1dHN0cmVhbSB0byBhIGdpdmVuIHJlc291cmNlIGluIHRoZSBnaXZlbiBmaWxlIHdoaWNoIG1heQotICAgICAqIGVpdGhlciBiZSBhIGRpcmVjdG9yeSBvciBhIHppcCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgKGRpcmVjdG9yeSBvciBqYXIpIGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIHJlc291cmNlLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCBhIHN0cmVhbSBpcyByZXF1aXJlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzdHJlYW0gdG8gdGhlIHJlcXVpcmVkIHJlc291cmNlIG9yIG51bGwgaWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZQotICAgICAqIGZvdW5kIGluIHRoZSBnaXZlbiBmaWxlIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VTdHJlYW0oRmlsZSBmaWxlLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIEZpbGUgcmVzb3VyY2UgPSBuZXcgRmlsZShmaWxlLCByZXNvdXJjZU5hbWUpOyAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlzIHRoZSB6aXAgZmlsZSBpbiB0aGUgY2FjaGUKLSAgICAgICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSAoWmlwRmlsZSl6aXBGaWxlcy5nZXQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHppcEZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHppcEZpbGVzLnB1dChmaWxlLCB6aXBGaWxlKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nKCJJZ25vcmluZyBFeGNlcHRpb24gIiArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAKLSAgICAgICAgICAgICAgICAiIHJlYWRpbmcgcmVzb3VyY2UgIiArIHJlc291cmNlTmFtZSArICIgZnJvbSAiICsgZmlsZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7ICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7ICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGFyZW50Rmlyc3QoU3RyaW5nIHJlc291cmNlTmFtZSkgewotICAgICAgICAvLyBkZWZhdWx0IHRvIHRoZSBnbG9iYWwgc2V0dGluZyBhbmQgdGhlbiBzZWUKLSAgICAgICAgLy8gaWYgdGhpcyBjbGFzcyBiZWxvbmdzIHRvIGEgcGFja2FnZSB3aGljaCBoYXMgYmVlbgotICAgICAgICAvLyBkZXNpZ25hdGVkIHRvIHVzZSBhIHNwZWNpZmljIGxvYWRlciBmaXJzdCAodGhpcyBvbmUgb3IgdGhlIHBhcmVudCBvbmUpCi0gICAgICAgIGJvb2xlYW4gdXNlUGFyZW50Rmlyc3QgPSBwYXJlbnRGaXJzdDsgCi0KLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gc3lzdGVtUGFja2FnZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZS5zdGFydHNXaXRoKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHVzZVBhcmVudEZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGxvYWRlclBhY2thZ2VzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWUuc3RhcnRzV2l0aChwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB1c2VQYXJlbnRGaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdXNlUGFyZW50Rmlyc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIEEgcmVzb3VyY2UgaXMgCi0gICAgICogc29tZSBkYXRhIChpbWFnZXMsIGF1ZGlvLCB0ZXh0LCBldGMpCi0gICAgICogdGhhdCBjYW4gYmUgYWNjZXNzZWQgYnkgY2xhc3MKLSAgICAgKiBjb2RlIGluIGEgd2F5IHRoYXQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCBhIHN0cmVhbSBpcyByZXF1aXJlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBVUkwgZm9yIHJlYWRpbmcgdGhlIHJlc291cmNlLCBvciBudWxsIGlmIHRoZSByZXNvdXJjZSAKLSAgICAgKiAgICAgICAgIGNvdWxkIG5vdCBiZSBmb3VuZCBvciB0aGUgY2FsbGVyCi0gICAgICogZG9lc24ndCBoYXZlIGFkZXF1YXRlIHByaXZpbGVnZXMgdG8gZ2V0IHRoZSByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBjb21wb25lbnRzIG9mIHRoZSBwYXRoIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCB0aGUKLSAgICAgICAgLy8gY2xhc3Mgd2Ugd2FudC4KLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIGlmIChpc1BhcmVudEZpcnN0KG5hbWUpKSB7Ci0gICAgICAgICAgICB1cmwgPSAocGFyZW50ID09IG51bGwpID8gc3VwZXIuZ2V0UmVzb3VyY2UobmFtZSkgOiBwYXJlbnQuZ2V0UmVzb3VyY2UobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZygiUmVzb3VyY2UgIiArIG5hbWUgKyAiIGxvYWRlZCBmcm9tIHBhcmVudCBsb2FkZXIiLCAKLSAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRyeSBhbmQgbG9hZCBmcm9tIHRoaXMgbG9hZGVyIGlmIHRoZSBwYXJlbnQgZWl0aGVyIGRpZG4ndCBmaW5kIAotICAgICAgICAgICAgLy8gaXQgb3Igd2Fzbid0IGNvbnN1bHRlZC4KLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHBhdGhDb21wb25lbnRzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCkgJiYgdXJsID09IG51bGw7ICkgewotICAgICAgICAgICAgICAgIEZpbGUgcGF0aENvbXBvbmVudCA9IChGaWxlKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB1cmwgPSBnZXRSZXNvdXJjZVVSTChwYXRoQ29tcG9uZW50LCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJSZXNvdXJjZSAiICsgbmFtZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBsb2FkZWQgZnJvbSBhbnQgbG9hZGVyIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAodXJsID09IG51bGwgJiYgIWlzUGFyZW50Rmlyc3QobmFtZSkpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgbG9hZGVyIHdhcyBmaXJzdCBidXQgaXQgZGlkbid0IGZpbmQgaXQgLSB0cnkgdGhlIHBhcmVudAotICAgICAgICAgICAgCi0gICAgICAgICAgICB1cmwgPSAocGFyZW50ID09IG51bGwpID8gc3VwZXIuZ2V0UmVzb3VyY2UobmFtZSkgOiBwYXJlbnQuZ2V0UmVzb3VyY2UobmFtZSk7Ci0gICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coIlJlc291cmNlICIgKyBuYW1lICsgIiBsb2FkZWQgZnJvbSBwYXJlbnQgbG9hZGVyIiwgCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCJDb3VsZG4ndCBsb2FkIFJlc291cmNlICIgKyBuYW1lLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgVVJMcyByZXByZXNlbnRpbmcgYWxsIHRoZSByZXNvdXJjZXMgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lIGJ5IHNlYXJjaGluZyB0aGUgY2xhc3MgbG9hZGVyJ3MgY2xhc3NwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHJlc291cmNlIG5hbWUuCi0gICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBVUkxzIGZvciB0aGUgcmVzb3VyY2VzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgSS9PIGVycm9ycyBvY2N1cnMgKGNhbid0IGhhcHBlbikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRW51bWVyYXRpb24gZmluZFJlc291cmNlcyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUVudW1lcmF0aW9uKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbiBpbnB1dHN0cmVhbSB0byBhIGdpdmVuIHJlc291cmNlIGluIHRoZSBnaXZlbiBmaWxlIHdoaWNoIG1heQotICAgICAqIGVpdGhlciBiZSBhIGRpcmVjdG9yeSBvciBhIHppcCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgKGRpcmVjdG9yeSBvciBqYXIpIGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgCi0gICAgICogICAgICAgICAgICAgdGhlIHJlc291cmNlLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCBhIHN0cmVhbSAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGlzIHJlcXVpcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmVhbSB0byB0aGUgcmVxdWlyZWQgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgCi0gICAgICogICAgICAgICByZXNvdXJjZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGdpdmVuIGZpbGUgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBVUkwgZ2V0UmVzb3VyY2VVUkwoRmlsZSBmaWxlLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIEZpbGUgcmVzb3VyY2UgPSBuZXcgRmlsZShmaWxlLCByZXNvdXJjZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCgiZmlsZToiK3Jlc291cmNlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgWmlwRmlsZSB6aXBGaWxlID0gKFppcEZpbGUpemlwRmlsZXMuZ2V0KGZpbGUpOwotICAgICAgICAgICAgICAgIGlmICh6aXBGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICB6aXBGaWxlcy5wdXQoZmlsZSwgemlwRmlsZSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoImphcjpmaWxlOiIrZmlsZS50b1N0cmluZygpKyIhLyIrZW50cnkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTG9hZCBhIGNsYXNzIHdpdGggdGhpcyBjbGFzcyBsb2FkZXIuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGxvYWQgYSBjbGFzcy4gCi0gICAgICoKLSAgICAgKiBUaGlzIGNsYXNzIGF0dGVtcHRzIHRvIGxvYWQgdGhlIGNsYXNzIGZpcnN0bHkgdXNpbmcgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIuIEZvcgotICAgICAqIEpESyAxLjEgY29tcGF0YWJpbGl0eSwgdGhpcyB1c2VzIHRoZSBmaW5kU3lzdGVtQ2xhc3MgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbG9hZGVkLgotICAgICAqIEBwYXJhbSByZXNvbHZlIHRydWUgaWYgYWxsIGNsYXNzZXMgdXBvbiB3aGljaCB0aGlzIGNsYXNzIGRlcGVuZHMgYXJlIHRvIGJlIGxvYWRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBDbGFzcyBvYmplY3QKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdGVkIGNsYXNzIGRvZXMgbm90IGV4aXN0IG9uCi0gICAgICogdGhlIHN5c3RlbSBjbGFzc3BhdGggb3IgdGhpcyBsb2FkZXIncyBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NuYW1lLCBib29sZWFuIHJlc29sdmUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGZpbmRMb2FkZWRDbGFzcyhjbGFzc25hbWUpOwotICAgICAgICBpZiAodGhlQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRoZUNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzUGFyZW50Rmlyc3QoY2xhc3NuYW1lKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aGVDbGFzcyA9IGZpbmRCYXNlQ2xhc3MoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICBsb2coIkNsYXNzICIgKyBjbGFzc25hbWUgKyAiIGxvYWRlZCBmcm9tIHBhcmVudCBsb2FkZXIiLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0gICAgICAgICAgICAgICAgdGhlQ2xhc3MgPSBmaW5kQ2xhc3MoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICBsb2coIkNsYXNzICIgKyBjbGFzc25hbWUgKyAiIGxvYWRlZCBmcm9tIGFudCBsb2FkZXIiLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gZmluZENsYXNzKGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICAgICAgbG9nKCJDbGFzcyAiICsgY2xhc3NuYW1lICsgIiBsb2FkZWQgZnJvbSBhbnQgbG9hZGVyIiwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgICAgIGlmIChpZ25vcmVCYXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGNuZmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gZmluZEJhc2VDbGFzcyhjbGFzc25hbWUpOwotICAgICAgICAgICAgICAgIGxvZygiQ2xhc3MgIiArIGNsYXNzbmFtZSArICIgbG9hZGVkIGZyb20gcGFyZW50IGxvYWRlciIsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIGlmIChyZXNvbHZlKSB7Ci0gICAgICAgICAgICByZXNvbHZlQ2xhc3ModGhlQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgdGhlIGNsYXNzIGRvdCBub3RhdGlvbiB0byBhIGZpbGVzeXN0ZW0gZXF1aXZhbGVudCBmb3IKLSAgICAgKiBzZWFyY2hpbmcgcHVycG9zZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBjbGFzcyBuYW1lIGluIGRvdCBmb3JtYXQgKGllIGphdmEubGFuZy5JbnRlZ2VyKQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2xhc3NuYW1lIGluIGZpbGVzeXN0ZW0gZm9ybWF0IChpZSBqYXZhL2xhbmcvSW50ZWdlci5jbGFzcykKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDbGFzc0ZpbGVuYW1lKFN0cmluZyBjbGFzc25hbWUpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYSBjbGFzcyBkZWZpbml0aW9uIGZyb20gYSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyZWFtIHRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgY2xhc3MgaXMgdG8gYmUgcmVhZC4KLSAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyBpbiB0aGUgc3RyZWFtLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQ2xhc3Mgb2JqZWN0IHJlYWQgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgY2xhc3MgZnJvbSB0aGUKLSAgICAgKiBzdHJlYW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBnZXRDbGFzc0Zyb21TdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgY2xhc3NuYW1lKSAKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgaW50IGJ5dGVzUmVhZCA9IC0xOwotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBzdHJlYW0ucmVhZChidWZmZXIsIDAsIEJVRkZFUl9TSVpFKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGJhb3Mud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBieXRlW10gY2xhc3NEYXRhID0gYmFvcy50b0J5dGVBcnJheSgpOwotCi0gICAgICAgIC8vIFNpbXBseSBwdXQ6Ci0gICAgICAgIC8vIGRlZmluZUNsYXNzKGNsYXNzbmFtZSwgY2xhc3NEYXRhLCAwLCBjbGFzc0RhdGEubGVuZ3RoLCBQcm9qZWN0LmNsYXNzLmdldFByb3RlY3Rpb25Eb21haW4oKSk7Ci0gICAgICAgIC8vIE1hZGUgbW9yZSBlbGFib3JhdGUgdG8gYmUgMS4xLXNhZmUuCi0gICAgICAgIGlmIChkZWZpbmVDbGFzc1Byb3RlY3Rpb25Eb21haW4gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZG9tYWluID0gZ2V0UHJvdGVjdGlvbkRvbWFpbi5pbnZva2UoUHJvamVjdC5jbGFzcywgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7Y2xhc3NuYW1lLCBjbGFzc0RhdGEsIG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcihjbGFzc0RhdGEubGVuZ3RoKSwgZG9tYWlufTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKENsYXNzKWRlZmluZUNsYXNzUHJvdGVjdGlvbkRvbWFpbi5pbnZva2UodGhpcywgYXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIENsYXNzRm9ybWF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzRm9ybWF0RXJyb3IpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbih0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKGNsYXNzbmFtZSwgY2xhc3NEYXRhLCAwLCBjbGFzc0RhdGEubGVuZ3RoKTsgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggZm9yIGFuZCBsb2FkIGEgY2xhc3Mgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIGNsYXNzIGxvYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBjbGFzc25hbWUgdG8gYmUgbG9hZGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlcXVpcmVkIENsYXNzIG9iamVjdAotICAgICAqCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgY2xhc3MgZG9lcyBub3QgZXhpc3Qgb24KLSAgICAgKiB0aGlzIGxvYWRlcidzIGNsYXNzcGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZygiRmluZGluZyBjbGFzcyAiICsgbmFtZSwgUHJvamVjdC5NU0dfREVCVUcpOwotCi0gICAgICAgIHJldHVybiBmaW5kQ2xhc3NJbkNvbXBvbmVudHMobmFtZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBGaW5kIGEgY2xhc3Mgb24gdGhlIGdpdmVuIGNsYXNzcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIENsYXNzIGZpbmRDbGFzc0luQ29tcG9uZW50cyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgY29tcG9uZW50cyBvZiB0aGUgcGF0aCB0byBzZWUgaWYgd2UgY2FuIGZpbmQgdGhlIAotICAgICAgICAvLyBjbGFzcyB3ZSB3YW50LiAKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNsYXNzRmlsZW5hbWUgPSBnZXRDbGFzc0ZpbGVuYW1lKG5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcGF0aENvbXBvbmVudHMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBwYXRoQ29tcG9uZW50ID0gKEZpbGUpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IGdldFJlc291cmNlU3RyZWFtKHBhdGhDb21wb25lbnQsIGNsYXNzRmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDbGFzc0Zyb21TdHJlYW0oc3RyZWFtLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiRXhjZXB0aW9uIHJlYWRpbmcgY29tcG9uZW50ICIgKyBwYXRoQ29tcG9uZW50ICwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhIHN5c3RlbSBjbGFzcyAod2hpY2ggc2hvdWxkIGJlIGxvYWRlZCBmcm9tIHRoZSBzYW1lIGNsYXNzbG9hZGVyIGFzIHRoZSBBbnQgY29yZSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBmaW5kQmFzZUNsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbmRTeXN0ZW1DbGFzcyhuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQubG9hZENsYXNzKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgcGF0aENvbXBvbmVudHMgPSBudWxsOwotICAgICAgICBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gemlwRmlsZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSAoWmlwRmlsZSllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB6aXBGaWxlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgY2xlYW51cCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV2ZW50LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OWMxZmYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgQnVpbGRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFRhcmdldCB0YXJnZXQ7Ci0gICAgcHJpdmF0ZSBUYXNrIHRhc2s7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIGludCBwcmlvcml0eSA9IFByb2plY3QuTVNHX1ZFUkJPU0U7Ci0gICAgcHJpdmF0ZSBUaHJvd2FibGUgZXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgQnVpbGRFdmVudCBmb3IgYSBwcm9qZWN0IGxldmVsIGV2ZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEV2ZW50KFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzdXBlcihwcm9qZWN0KTsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgdGhpcy50YXJnZXQgPSBudWxsOwotICAgICAgICB0aGlzLnRhc2sgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBCdWlsZEV2ZW50IGZvciBhIHRhcmdldCBsZXZlbCBldmVudAotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXZlbnQoVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBzdXBlcih0YXJnZXQpOwotICAgICAgICB0aGlzLnByb2plY3QgPSB0YXJnZXQuZ2V0UHJvamVjdCgpOwotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgdGhpcy50YXNrID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgQnVpbGRFdmVudCBmb3IgYSB0YXNrIGxldmVsIGV2ZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFzayB0aGUgdGFzayB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEV2ZW50KFRhc2sgdGFzaykgewotICAgICAgICBzdXBlcih0YXNrKTsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gdGFzay5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFzay5nZXRPd25pbmdUYXJnZXQoKTsKLSAgICAgICAgdGhpcy50YXNrID0gdGFzazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgcHJpb3JpdHkpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGZpcmVkIHRoaXMgZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHRhcmdldCB0aGF0IGZpcmVkIHRoaXMgZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIFRhcmdldCBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB0YXNrIHRoYXQgZmlyZWQgdGhpcyBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFzayBnZXRUYXNrKCkgewotICAgICAgICByZXR1cm4gdGFzazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbG9nZ2luZyBtZXNzYWdlLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBzZXQKLSAgICAgKiAgZm9yICJtZXNzYWdlTG9nZ2VkIiBldmVudHMuCi0gICAgICoKLSAgICAgKiAgQHNlZSBCdWlsZExpc3RlbmVyI21lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBwcmlvcml0eSBvZiB0aGUgbG9nZ2luZyBtZXNzYWdlLiBUaGlzIGZpZWxkIHdpbGwgb25seQotICAgICAqICBiZSBzZXQgZm9yICJtZXNzYWdlTG9nZ2VkIiBldmVudHMuCi0gICAgICoKLSAgICAgKiAgQHNlZSBCdWlsZExpc3RlbmVyI21lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFByaW9yaXR5KCl7Ci0gICAgICAgIHJldHVybiBwcmlvcml0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93biwgaWYgYW55LiBUaGlzIGZpZWxkIHdpbGwgb25seQotICAgICAqICBiZSBzZXQgZm9yICJ0YXNrRmluaXNoZWQiLCAidGFyZ2V0RmluaXNoZWQiLCBhbmQgImJ1aWxkRmluaXNoZWQiIGV2ZW50cy4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQpCi0gICAgICogIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50KQotICAgICAqICBAc2VlIEJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGIyNjliLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFNpZ25hbHMgYW4gZXJyb3IgY29uZGl0aW9uIGR1cmluZyBhIGJ1aWxkLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0gICAgLyoqIEV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIGNhdXNlOwotCi0gICAgLyoqIExvY2F0aW9uIGluIHRoZSBidWlsZCBmaWxlIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJlZCAqLwotICAgIHByaXZhdGUgTG9jYXRpb24gbG9jYXRpb24gPSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGJ1aWxkIGV4Y2VwdGlvbiB3aXRoIG5vIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdGl2ZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtc2cgRGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRFeGNlcHRpb24oU3RyaW5nIG1zZykgewotICAgICAgICBzdXBlcihtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBhcwotICAgICAqIGEgcm9vdCBjYXVzZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGNhdXNlIFRocm93YWJsZSB0aGF0IG1pZ2h0IGhhdmUgY2F1c2UgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtc2cpOwotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGFzCi0gICAgICogYSByb290IGNhdXNlIGFuZCBhIGxvY2F0aW9uIGluIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2UgdGhpcyBvbmUuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSwgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcyhtc2csIGNhdXNlKTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGV4Y2VwdGlvbiBhcyBhIHJvb3QgY2F1c2UuCi0gICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdGl2ZSBtZXNzYWdlIGFuZCBhIGxvY2F0aW9uCi0gICAgICogaW4gYSBmaWxlLgotICAgICAqIEBwYXJhbSBtc2cgRGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gTG9jYXRpb24gaW4gdGhlIHByb2plY3QgZmlsZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRFeGNlcHRpb24oU3RyaW5nIG1zZywgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGV4Y2VwdGlvbiBhcwotICAgICAqIGEgcm9vdCBjYXVzZSBhbmQgYSBsb2NhdGlvbiBpbiBhIGZpbGUuCi0gICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2UgdGhpcyBvbmUuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSwgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcyhjYXVzZSk7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXN0ZWQgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gY2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yIGFuZCB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbG9jYXRpb24udG9TdHJpbmcoKSArIGdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8vIE92ZXJyaWRlIHN0YWNrIHRyYWNlIG1ldGhvZHMgdG8gc2hvdyBvcmlnaW5hbCBjYXVzZToKLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0gICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHBzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocHMpIHsKLSAgICAgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShwcyk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBzLnByaW50bG4oIi0tLSBOZXN0ZWQgRXhjZXB0aW9uIC0tLSIpOwotICAgICAgICAgICAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZShwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHB3KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocHcpIHsKLSAgICAgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIi0tLSBOZXN0ZWQgRXhjZXB0aW9uIC0tLSIpOwotICAgICAgICAgICAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGY1OTEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiAgQ2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLSAqICB0aGluZ3MgaGFwcGVuZCBkdXJpbmcgYSBidWlsZC4KLSAqCi0gKiAgQHNlZSBCdWlsZEV2ZW50Ci0gKiAgQHNlZSBQcm9qZWN0I2FkZEJ1aWxkTGlzdGVuZXIoQnVpbGRMaXN0ZW5lcikKLSAqLwotcHVibGljIGludGVyZmFjZSBCdWlsZExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZWQgYmVmb3JlIGFueSB0YXJnZXRzIGFyZSBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KTsKLQotICAgIC8qKgotICAgICAqICBGaXJlZCBhZnRlciB0aGUgbGFzdCB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50Ci0gICAgICogIHdpbGwgc3RpbGwgYmUgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpOwotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIHdoZW4gYSB0YXJnZXQgaXMgc3RhcnRlZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFyZ2V0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpOwotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIHdoZW4gYSB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50IHdpbGwKLSAgICAgKiAgc3RpbGwgYmUgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KTsKLQotICAgIC8qKgotICAgICAqICBGaXJlZCB3aGVuIGEgdGFzayBpcyBzdGFydGVkLgotICAgICAqCi0gICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRUYXNrKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KTsKLQotICAgIC8qKgotICAgICAqICBGaXJlZCB3aGVuIGEgdGFzayBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQgd2lsbCBzdGlsbAotICAgICAqICBiZSB0aHJvdyBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgYnVpbGQuCi0gICAgICoKLSAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldEV4Y2VwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpOwotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIHdoZW5ldmVyIGEgbWVzc2FnZSBpcyBsb2dnZWQuCi0gICAgICoKLSAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldE1lc3NhZ2UoKQotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0UHJpb3JpdHkoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExvZ2dlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjOGFkYi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgYnkgQW50IHRvIGxvZyB0aGUgYnVpbGQgb3V0cHV0LiAKLSAqCi0gKiBBIGJ1aWxkIGxvZ2dlciBpcyBhIGJ1aWxkIGxpc3RlbmVyIHdoaWNoIGhhcyB0aGUgJ3JpZ2h0JyB0byBzZW5kIG91dHB1dCB0byB0aGUKLSAqIGFudCBsb2csIHdoaWNoIGlzIHVzdWFsbHkgU3lzdGVtLm91dCB1bmxlcyByZWRpcmVjdGVkIGJ5IHRoZSAtbG9nZmlsZSBvcHRpb24uCi0gKgotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJ1aWxkTG9nZ2VyIGV4dGVuZHMgQnVpbGRMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogU2V0IHRoZSBtc2dPdXRwdXRMZXZlbCB0aGlzIGxvZ2dlciBpcyB0byByZXNwb25kIHRvLgotICAgICAqCi0gICAgICogT25seSBtZXNzYWdlcyB3aXRoIGEgbWVzc2FnZSBsZXZlbCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBsZXZlbCBhcmUgCi0gICAgICogb3V0cHV0IHRvIHRoZSBsb2cuCi0gICAgICogPFA+Ci0gICAgICogQ29uc3RhbnRzIGZvciB0aGUgbWVzc2FnZSBsZXZlbHMgYXJlIGluIFByb2plY3QuamF2YS4gVGhlIG9yZGVyIG9mCi0gICAgICogdGhlIGxldmVscywgZnJvbSBsZWFzdCB0byBtb3N0IHZlcmJvc2UsIGlzIE1TR19FUlIsIE1TR19XQVJOLAotICAgICAqIE1TR19JTkZPLCBNU0dfVkVSQk9TRSwgTVNHX0RFQlVHLgotICAgICAqCi0gICAgICogQHBhcmFtIGxldmVsIHRoZSBsb2dnaW5nIGxldmVsIGZvciB0aGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQgbGV2ZWwpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGlzIGxvZ2dlciBpcyB0byBzZW5kIGl0cyBvdXRwdXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgc3RyZWFtIGZvciB0aGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dFByaW50U3RyZWFtKFByaW50U3RyZWFtIG91dHB1dCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgbG9nZ2VyIHRvIHByb2R1Y2UgZW1hY3MgKGFuZCBvdGhlciBlZGl0b3IpIGZyaWVuZGx5IG91dHB1dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbWFjc01vZGUgdHJ1ZSBpZiBvdXRwdXQgaXMgdG8gYmUgdW5hZG9ybmVkIHNvIHRoYXQgZW1hY3MgYW5kIG90aGVyCi0gICAgICogZWRpdG9ycyBjYW4gcGFyc2UgZmlsZXMgbmFtZXMsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFjc01vZGUoYm9vbGVhbiBlbWFjc01vZGUpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoaXMgbG9nZ2VyIGlzIHRvIHNlbmQgZXJyb3IgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXJyIHRoZSBlcnJvciBzdHJlYW0gZm9yIHRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQ29uc3RhbnRzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkYTAzNS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFIGZpbGUuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLS8qKgotICogQWJzdHJhY3QgaW50ZXJmYWNlIHRvIGhvbGQgY29uc3RhbnRzLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotaW50ZXJmYWNlIENvbnN0YW50cyB7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZWZhdWx0TG9nZ2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZWZhdWx0TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTkwZmUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGVmYXVsdExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogIFdyaXRlcyBidWlsZCBldmVudCB0byBhIFByaW50U3RyZWFtLiBDdXJyZW50bHksIGl0Ci0gKiAgb25seSB3cml0ZXMgd2hpY2ggdGFyZ2V0cyBhcmUgYmVpbmcgZXhlY3V0ZWQsIGFuZAotICogIGFueSBtZXNzYWdlcyB0aGF0IGdldCBsb2dnZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TG9nZ2VyIGltcGxlbWVudHMgQnVpbGRMb2dnZXIgewotICAgIHByaXZhdGUgc3RhdGljIGludCBMRUZUX0NPTFVNTl9TSVpFID0gMTI7Ci0KLSAgICBwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gb3V0OwotICAgIHByb3RlY3RlZCBQcmludFN0cmVhbSBlcnI7Ci0gICAgcHJvdGVjdGVkIGludCBtc2dPdXRwdXRMZXZlbCA9IFByb2plY3QuTVNHX0VSUjsKLSAgICBwcml2YXRlIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBsU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZW1hY3NNb2RlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1zZ091dHB1dExldmVsIHRoaXMgbG9nZ2VyIGlzIHRvIHJlc3BvbmQgdG8uCi0gICAgICoKLSAgICAgKiBPbmx5IG1lc3NhZ2VzIHdpdGggYSBtZXNzYWdlIGxldmVsIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIGxldmVsIGFyZSAKLSAgICAgKiBvdXRwdXQgdG8gdGhlIGxvZy4KLSAgICAgKiA8UD4KLSAgICAgKiBDb25zdGFudHMgZm9yIHRoZSBtZXNzYWdlIGxldmVscyBhcmUgaW4gUHJvamVjdC5qYXZhLiBUaGUgb3JkZXIgb2YKLSAgICAgKiB0aGUgbGV2ZWxzLCBmcm9tIGxlYXN0IHRvIG1vc3QgdmVyYm9zZSwgaXMgTVNHX0VSUiwgTVNHX1dBUk4sCi0gICAgICogTVNHX0lORk8sIE1TR19WRVJCT1NFLCBNU0dfREVCVUcuCi0gICAgICoKLSAgICAgKiBUaGUgZGVmYXVsdCBtZXNzYWdlIGxldmVsIGZvciBEZWZhdWx0TG9nZ2VyIGlzIFByb2plY3QuTVNHX0VSUi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZXZlbCB0aGUgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKSB7Ci0gICAgICAgIHRoaXMubXNnT3V0cHV0TGV2ZWwgPSBsZXZlbDsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhpcyBsb2dnZXIgaXMgdG8gc2VuZCBpdHMgb3V0cHV0LgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IHN0cmVhbSBmb3IgdGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcmludFN0cmVhbShQcmludFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoaXMgbG9nZ2VyIGlzIHRvIHNlbmQgZXJyb3IgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXJyIHRoZSBlcnJvciBzdHJlYW0gZm9yIHRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpIHsKLSAgICAgICAgdGhpcy5lcnIgPSBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgbG9nZ2VyIHRvIHByb2R1Y2UgZW1hY3MgKGFuZCBvdGhlciBlZGl0b3IpIGZyaWVuZGx5IG91dHB1dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbWFjc01vZGUgdHJ1ZSBpZiBvdXRwdXQgaXMgdG8gYmUgdW5hZG9ybmVkIHNvIHRoYXQgZW1hY3MgYW5kIG90aGVyCi0gICAgICogZWRpdG9ycyBjYW4gcGFyc2UgZmlsZXMgbmFtZXMsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFjc01vZGUoYm9vbGVhbiBlbWFjc01vZGUpIHsKLSAgICAgICAgdGhpcy5lbWFjc01vZGUgPSBlbWFjc01vZGU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUHJpbnRzIHdoZXRoZXIgdGhlIGJ1aWxkIHN1Y2NlZWRlZCBvciBmYWlsZWQsIGFuZAotICAgICAqICBhbnkgZXJyb3JzIHRoZSBvY2N1cmVkIGR1cmluZyB0aGUgYnVpbGQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFRocm93YWJsZSBlcnJvciA9IGV2ZW50LmdldEV4Y2VwdGlvbigpOwotCi0gICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihsU2VwICsgIkJVSUxEIFNVQ0NFU1NGVUwiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGVyci5wcmludGxuKGxTZXAgKyAiQlVJTEQgRkFJTEVEIiArIGxTZXApOwotCi0gICAgICAgICAgICBpZiAoUHJvamVjdC5NU0dfVkVSQk9TRSA8PSBtc2dPdXRwdXRMZXZlbCB8fAotICAgICAgICAgICAgICAgICEoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICBlcnJvci5wcmludFN0YWNrVHJhY2UoZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGVyci5wcmludGxuKGVycm9yLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQucHJpbnRsbihsU2VwICsgIlRvdGFsIHRpbWU6ICIgKyBmb3JtYXRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChQcm9qZWN0Lk1TR19JTkZPIDw9IG1zZ091dHB1dExldmVsKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihsU2VwICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpICsgIjoiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQotICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQotCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0KLSAgICAgICAgUHJpbnRTdHJlYW0gbG9nVG8gPSBldmVudC5nZXRQcmlvcml0eSgpID09IFByb2plY3QuTVNHX0VSUiA/IGVyciA6IG91dDsKLQotICAgICAgICAvLyBGaWx0ZXIgb3V0IG1lc3NhZ2VzIGJhc2VkIG9uIHByaW9yaXR5Ci0gICAgICAgIGlmIChldmVudC5nZXRQcmlvcml0eSgpIDw9IG1zZ091dHB1dExldmVsKSB7Ci0KLSAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgbmFtZSBvZiB0aGUgdGFzayBpZiB3ZSdyZSBpbiBvbmUKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRUYXNrKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWVtYWNzTW9kZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlsiICsgbmFtZSArICJdICI7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKExFRlRfQ09MVU1OX1NJWkUgLSBtc2cubGVuZ3RoKCkpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1RvLnByaW50KCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nVG8ucHJpbnQobXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByaW50IHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBsb2dUby5wcmludGxuKGV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXRUaW1lKGxvbmcgbWlsbGlzKSB7Ci0gICAgICAgIGxvbmcgc2Vjb25kcyA9IG1pbGxpcyAvIDEwMDA7Ci0gICAgICAgIGxvbmcgbWludXRlcyA9IHNlY29uZHMgLyA2MDsKLQotCi0gICAgICAgIGlmIChtaW51dGVzID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcobWludXRlcykgKyAiIG1pbnV0ZSIKLSAgICAgICAgICAgICAgICArIChtaW51dGVzID09IDEgPyAiICIgOiAicyAiKQotICAgICAgICAgICAgICAgICsgTG9uZy50b1N0cmluZyhzZWNvbmRzJTYwKSArICIgc2Vjb25kIgotICAgICAgICAgICAgICAgICsgKHNlY29uZHMlNjAgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHNlY29uZHMpICsgIiBzZWNvbmQiCi0gICAgICAgICAgICAgICAgKyAoc2Vjb25kcyU2MCA9PSAxID8gIiIgOiAicyIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlbXV4T3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZW11eE91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY4ZTdmLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlbXV4T3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotCi0vKioKLSAqIExvZ3MgY29udGVudCB3cml0dGVuIGJ5IGEgdGhyZWFkIGFuZCBmb3J3YXJkcyB0aGUgYnVmZmVycyBvbnRvIHRoZQotICogcHJvamVjdCBvYmplY3Qgd2hpY2ggd2lsbCBmb3J3YXJkIHRoZSBjb250ZW50IHRvIHRoZSBhcHByb3ByaWF0ZQotICogdGFzayAKLSAqCi0gKiBAYXV0aG9yIENvbm9yIE1hY05laWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBEZW11eE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJWkUgPSAxMDI0OwotICAgIAotICAgIHByaXZhdGUgSGFzaHRhYmxlIGJ1ZmZlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0vLyAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXAgPSBmYWxzZTsKLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFcnJvclN0cmVhbTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFzayB0aGUgdGFzayBmb3Igd2hvbSB0byBsb2cKLSAgICAgKiBAcGFyYW0gbGV2ZWwgbG9nbGV2ZWwgdXNlZCB0byBsb2cgZGF0YSB3cml0dGVuIHRvIHRoaXMgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBEZW11eE91dHB1dFN0cmVhbShQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNFcnJvclN0cmVhbSkgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLmlzRXJyb3JTdHJlYW0gPSBpc0Vycm9yU3RyZWFtOwotICAgIH0KLQotICAgIHByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGdldEJ1ZmZlcigpIHsKLSAgICAgICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gKEJ5dGVBcnJheU91dHB1dFN0cmVhbSlidWZmZXJzLmdldChjdXJyZW50KTsKLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBidWZmZXJzLnB1dChjdXJyZW50LCBidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0QnVmZmVyKCkgeyAgICAKLSAgICAgICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgICAgICBidWZmZXJzLnJlbW92ZShjdXJyZW50KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgZmx1c2ggdGhlIGJ1ZmZlciwgaWYgYSBsaW5lCi0gICAgICogc2VwYXJhdG9yIGlzIGRldGVjdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNjIGRhdGEgdG8gbG9nIChieXRlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgY2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGJ5dGUgYyA9IChieXRlKWNjOwotICAgICAgICBpZiAoKGMgPT0gJ1xuJykgfHwgKGMgPT0gJ1xyJykpIHsKLSAgICAgICAgICAgIGlmICghc2tpcCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NCdWZmZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBnZXRCdWZmZXIoKTsKLSAgICAgICAgICAgIGJ1ZmZlci53cml0ZShjYyk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyLnNpemUoKSA+IE1BWF9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0J1ZmZlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNraXAgPSAoYyA9PSAnXHInKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBidWZmZXIgdG8gYSBzdHJpbmcgYW5kIHNlbmRzIGl0IHRvIDxjb2RlPnByb2Nlc3NMaW5lPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCdWZmZXIoKSB7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBnZXRCdWZmZXIoKS50b1N0cmluZygpOwotICAgICAgICBwcm9qZWN0LmRlbXV4T3V0cHV0KG91dHB1dCwgaXNFcnJvclN0cmVhbSk7Ci0gICAgICAgIHJlc2V0QnVmZmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFsbCByZW1haW5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZsdXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFsbCByZW1haW5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRCdWZmZXIoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBwcm9jZXNzQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZXNpcmFibGVGaWx0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0Rlc2lyYWJsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjY3MmFkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0Rlc2lyYWJsZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovIAotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBGaWx0ZXJzIGZpbGVuYW1lcyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGZpbGUgaXMgZGVzaXJhYmxlLgotICoKLSAqIEBhdXRob3IgSmFzb24gSHVudGVyIFtqaHVudGVyQHNlcnZsZXRzLmNvbV0KLSAqIEBhdXRob3IgamFtZXNAeDE4MC5jb20KLSAqLwotcHVibGljIGNsYXNzIERlc2lyYWJsZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGdpdmVuIGZpbGVuYW1lIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBpdCdzIGRlc2lyYWJsZS4KLSAgICAgKiBUaGlzIGhlbHBzIHRhc2tzIGZpbHRlciB0ZW1wIGZpbGVzIGFuZCBmaWxlcyB1c2VkIGJ5IENWUy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIGVtYWNzIHNhdmUgZmlsZQotICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgifiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlbWFjcyBhdXRvc2F2ZSBmaWxlCi0gICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIiMiKSAmJiBuYW1lLmVuZHNXaXRoKCIjIikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG9wZW53aW5kb3dzIHRleHQgZWRpdG9yIGRvZXMgdGhpcyBJIHRoaW5rCi0gICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSAmJiBuYW1lLmVuZHNXaXRoKCIlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENWUyBzdHVmZiAtLSBob3BlZnVsbHkgdGhlcmUgd29uJ3QgYmUgYSBjYXNlIHdpdGgKLSAgICAgICAgICogYW4gYWxsIGNhcCBmaWxlL2RpciBuYW1lZCAiQ1ZTIiB0aGF0IHNvbWVib2R5IHdhbnRzCi0gICAgICAgICAqIHRvIGtlZXAgYXJvdW5kLi4uCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJDVlMiKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gaWdub3JlIENWUyBtaWdodCBhcyB3ZWxsIGlnbm9yZSAKLSAgICAgICAgICogdGhpcyBvbmUgYXMgd2VsbC4uLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCIuY3ZzaWdub3JlIikpewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ1ZTIG1lcmdlIGF1dG9zYXZlcy4KLSAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiLiMiKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU0NDUy9DU1NDL1RlYW1XYXJlOgotICAgICAgICBpZiAobmFtZS5lcXVhbHMoIlNDQ1MiKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8vIFZpc3VhbCBTb3VyY2UgU2F2ZQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoInZzc3Zlci5zY2MiKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpcmVjdG9yeVNjYW5uZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpcmVjdG9yeVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2ZDllNy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBDbGFzcyBmb3Igc2Nhbm5pbmcgYSBkaXJlY3RvcnkgZm9yIGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQgbWF0Y2ggYSBjZXJ0YWluCi0gKiBjcml0ZXJpYS4KLSAqIDxwPgotICogVGhlc2UgY3JpdGVyaWEgY29uc2lzdCBvZiBhIHNldCBvZiBpbmNsdWRlIGFuZCBleGNsdWRlIHBhdHRlcm5zLiBXaXRoIHRoZXNlCi0gKiBwYXR0ZXJucywgeW91IGNhbiBzZWxlY3Qgd2hpY2ggZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCwgYW5kIHdoaWNoCi0gKiBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLgotICogPHA+Ci0gKiBUaGUgaWRlYSBpcyBzaW1wbGUuIEEgZ2l2ZW4gZGlyZWN0b3J5IGlzIHJlY3Vyc2l2ZWx5IHNjYW5uZWQgZm9yIGFsbCBmaWxlcwotICogYW5kIGRpcmVjdG9yaWVzLiBFYWNoIGZpbGUvZGlyZWN0b3J5IGlzIG1hdGNoZWQgYWdhaW5zdCBhIHNldCBvZiBpbmNsdWRlCi0gKiBhbmQgZXhjbHVkZSBwYXR0ZXJucy4gT25seSBmaWxlcy9kaXJlY3RvcmllcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZQotICogcGF0dGVybiBvZiB0aGUgaW5jbHVkZSBwYXR0ZXJuIGxpc3QsIGFuZCBkb24ndCBtYXRjaCBhIHBhdHRlcm4gb2YgdGhlCi0gKiBleGNsdWRlIHBhdHRlcm4gbGlzdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgbGlzdCBvZiBmaWxlcy9kaXJlY3RvcmllcyBmb3VuZC4KLSAqIDxwPgotICogV2hlbiBubyBsaXN0IG9mIGluY2x1ZGUgcGF0dGVybnMgaXMgc3VwcGxpZWQsICIqKiIgd2lsbCBiZSB1c2VkLCB3aGljaAotICogbWVhbnMgdGhhdCBldmVyeXRoaW5nIHdpbGwgYmUgbWF0Y2hlZC4gV2hlbiBubyBsaXN0IG9mIGV4Y2x1ZGUgcGF0dGVybnMgaXMKLSAqIHN1cHBsaWVkLCBhbiBlbXB0eSBsaXN0IGlzIHVzZWQsIHN1Y2ggdGhhdCBub3RoaW5nIHdpbGwgYmUgZXhjbHVkZWQuCi0gKiA8cD4KLSAqIFRoZSBwYXR0ZXJuIG1hdGNoaW5nIGlzIGRvbmUgYXMgZm9sbG93czoKLSAqIFRoZSBuYW1lIHRvIGJlIG1hdGNoZWQgaXMgc3BsaXQgdXAgaW4gcGF0aCBzZWdtZW50cy4gQSBwYXRoIHNlZ21lbnQgaXMgdGhlCi0gKiBuYW1lIG9mIGEgZGlyZWN0b3J5IG9yIGZpbGUsIHdoaWNoIGlzIGJvdW5kZWQgYnkKLSAqIDxjb2RlPkZpbGUuc2VwYXJhdG9yPC9jb2RlPiAoJy8nIHVuZGVyIFVOSVgsICdcJyB1bmRlciBXaW5kb3dzKS4KLSAqIEUuZy4gImFiYy9kZWYvZ2hpL3h5ei5qYXZhIiBpcyBzcGxpdCB1cCBpbiB0aGUgc2VnbWVudHMgImFiYyIsICJkZWYiLCAiZ2hpIgotICogYW5kICJ4eXouamF2YSIuCi0gKiBUaGUgc2FtZSBpcyBkb25lIGZvciB0aGUgcGF0dGVybiBhZ2FpbnN0IHdoaWNoIHNob3VsZCBiZSBtYXRjaGVkLgotICogPHA+Ci0gKiBUaGVuIHRoZSBzZWdtZW50cyBvZiB0aGUgbmFtZSBhbmQgdGhlIHBhdHRlcm4gd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgZWFjaAotICogb3RoZXIuIFdoZW4gJyoqJyBpcyB1c2VkIGZvciBhIHBhdGggc2VnbWVudCBpbiB0aGUgcGF0dGVybiwgdGhlbiBpdCBtYXRjaGVzCi0gKiB6ZXJvIG9yIG1vcmUgcGF0aCBzZWdtZW50cyBvZiB0aGUgbmFtZS4KLSAqIDxwPgotICogVGhlcmUgYXJlIHNwZWNpYWwgY2FzZSByZWdhcmRpbmcgdGhlIHVzZSBvZiA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT5zIGF0Ci0gKiB0aGUgYmVnaW5uaW5nb2YgdGhlIHBhdHRlcm4gYW5kIHRoZSBzdHJpbmcgdG8gbWF0Y2g6PGJyPgotICogV2hlbiBhIHBhdHRlcm4gc3RhcnRzIHdpdGggYSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT4sIHRoZSBzdHJpbmcKLSAqIHRvIG1hdGNoIG11c3QgYWxzbyBzdGFydCB3aXRoIGEgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+LgotICogV2hlbiBhIHBhdHRlcm4gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIDxjb2RlPkZpbGUuc2VwYXJhdG9yPC9jb2RlPiwgdGhlCi0gKiBzdHJpbmcgdG8gbWF0Y2ggbWF5IG5vdCBzdGFydCB3aXRoIGEgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+LgotICogV2hlbiBvbmUgb2YgdGhlc2UgcnVsZXMgaXMgbm90IG9iZXllZCwgdGhlIHN0cmluZyB3aWxsIG5vdAotICogbWF0Y2guCi0gKiA8cD4KLSAqIFdoZW4gYSBuYW1lIHBhdGggc2VnbWVudCBpcyBtYXRjaGVkIGFnYWluc3QgYSBwYXR0ZXJuIHBhdGggc2VnbWVudCwgdGhlCi0gKiBmb2xsb3dpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzIGNhbiBiZSB1c2VkOgotICogJyonIG1hdGNoZXMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMsCi0gKiAnPycgbWF0Y2hlcyBvbmUgY2hhcmFjdGVyLgotICogPHA+Ci0gKiBFeGFtcGxlczoKLSAqIDxwPgotICogIioqXCouY2xhc3MiIG1hdGNoZXMgYWxsIC5jbGFzcyBmaWxlcy9kaXJzIGluIGEgZGlyZWN0b3J5IHRyZWUuCi0gKiA8cD4KLSAqICJ0ZXN0XGE/Py5qYXZhIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHdoaWNoIHN0YXJ0IHdpdGggYW4gJ2EnLCB0aGVuIHR3bwotICogbW9yZSBjaGFyYWN0ZXJzIGFuZCB0aGVuICIuamF2YSIsIGluIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0LgotICogPHA+Ci0gKiAiKioiIG1hdGNoZXMgZXZlcnl0aGluZyBpbiBhIGRpcmVjdG9yeSB0cmVlLgotICogPHA+Ci0gKiAiKipcdGVzdFwqKlxYWVoqIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHRoYXQgc3RhcnQgd2l0aCAiWFlaIiBhbmQgd2hlcmUKLSAqIHRoZXJlIGlzIGEgcGFyZW50IGRpcmVjdG9yeSBjYWxsZWQgdGVzdCAoZS5nLiAiYWJjXHRlc3RcZGVmXGdoaVxYWVoxMjMiKS4KLSAqIDxwPgotICogRXhhbXBsZSBvZiB1c2FnZToKLSAqIDxwcmU+Ci0gKiAgIFN0cmluZ1tdIGluY2x1ZGVzID0geyIqKlxcKi5jbGFzcyJ9OwotICogICBTdHJpbmdbXSBleGNsdWRlcyA9IHsibW9kdWxlc1xcKlxcKioifTsKLSAqICAgZHMuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotICogICBkcy5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0gKiAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoInRlc3QiKSk7Ci0gKiAgIGRzLnNjYW4oKTsKLSAqCi0gKiAgIFN5c3RlbS5vdXQucHJpbnRsbigiRklMRVM6Iik7Ci0gKiAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDtpKyspIHsKLSAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZXNbaV0pOwotICogICB9Ci0gKiA8L3ByZT4KLSAqIFRoaXMgd2lsbCBzY2FuIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0IGZvciAuY2xhc3MgZmlsZXMsIGJ1dCBleGNsdWRlcyBhbGwKLSAqIC5jbGFzcyBmaWxlcyBpbiBhbGwgZGlyZWN0b3JpZXMgdW5kZXIgYSBkaXJlY3RvcnkgY2FsbGVkICJtb2R1bGVzIgotICoKLSAqIEBhdXRob3IgQXJub3V0IEouIEt1aXBlciA8YSBocmVmPSJtYWlsdG86YWprdWlwZXJAd3hzLm5sIj5hamt1aXBlckB3eHMubmw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlTY2FubmVyIGltcGxlbWVudHMgRmlsZVNjYW5uZXIgewotCi0gICAgLyoqCi0gICAgICogUGF0dGVybnMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgYnkgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEBzZWUgI2FkZERlZmF1bHRFeGNsdWRlcygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBERUZBVUxURVhDTFVERVMgPSB7Ci0gICAgICAgICIqKi8qfiIsCi0gICAgICAgICIqKi8jKiMiLAotICAgICAgICAiKiovLiMqIiwKLSAgICAgICAgIioqLyUqJSIsCi0gICAgICAgICIqKi9DVlMiLAotICAgICAgICAiKiovQ1ZTLyoqIiwKLSAgICAgICAgIioqLy5jdnNpZ25vcmUiLAotICAgICAgICAiKiovU0NDUyIsCi0gICAgICAgICIqKi9TQ0NTLyoqIiwKLSAgICAgICAgIioqL3Zzc3Zlci5zY2MiCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIFRoZSBiYXNlIGRpcmVjdG9yeSB3aGljaCBzaG91bGQgYmUgc2Nhbm5lZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBiYXNlZGlyOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhdHRlcm5zIGZvciB0aGUgZmlsZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGluY2x1ZGVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhdHRlcm5zIGZvciB0aGUgZmlsZXMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4Y2x1ZGVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGluY2x1ZGVzLCBhbmQgbWF0Y2hlZAotICAgICAqIG5vIGV4Y2x1ZGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNJbmNsdWRlZDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaWxlcyB0aGF0IHdoZXJlIGZvdW5kIGFuZCBkaWQgbm90IG1hdGNoIGFueSBpbmNsdWRlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzTm90SW5jbHVkZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlsZXMgdGhhdCB3aGVyZSBmb3VuZCBhbmQgbWF0Y2hlZCBhdCBsZWFzdCBvbmUgaW5jbHVkZXMsIGFuZCBhbHNvCi0gICAgICogbWF0Y2hlZCBhdCBsZWFzdCBvbmUgZXhjbHVkZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZlY3RvciBmaWxlc0V4Y2x1ZGVkOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yaWVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGluY2x1ZGVzLCBhbmQKLSAgICAgKiBtYXRjaGVkIG5vIGV4Y2x1ZGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBWZWN0b3IgZGlyc0luY2x1ZGVkOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yaWVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIGRpZCBub3QgbWF0Y2ggYW55IGluY2x1ZGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBWZWN0b3IgZGlyc05vdEluY2x1ZGVkOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGluY2x1ZGVzLCBhbmQgYWxzbwotICAgICAqIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGV4Y2x1ZGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBWZWN0b3IgZGlyc0V4Y2x1ZGVkOwotCi0gICAgLyoqCi0gICAgICogSGF2ZSB0aGUgVmVjdG9ycyBob2xkaW5nIG91ciByZXN1bHRzIGJlZW4gYnVpbHQgYnkgYSBzbG93IHNjYW4/Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGF2ZVNsb3dSZXN1bHRzID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGlyZWN0b3J5U2Nhbm5lcigpIHsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIERvZXMgdGhlIHBhdGggbWF0Y2ggdGhlIHN0YXJ0IG9mIHRoaXMgcGF0dGVybiB1cCB0byB0aGUgZmlyc3QgIioqIi4KLSAgICAgKwotICAgICAqIDxwPlRoaXMgaXMgbm90IGEgZ2VuZXJhbCBwdXJwb3NlIHRlc3QgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91Ci0gICAgICogY2FuIGxpdmUgd2l0aCBmYWxzZSBwb3NpdGl2ZXMuPC9wPgotICAgICAqCi0gICAgICogPHA+PGNvZGU+cGF0dGVybj0qKlxcYTwvY29kZT4gYW5kIDxjb2RlPnN0cj1iPC9jb2RlPiB3aWxsIHlpZWxkIHRydWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgKG5vbi1udWxsKSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gc3RyICAgICB0aGUgKG5vbi1udWxsKSBzdHJpbmcgKHBhdGgpIHRvIG1hdGNoCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoUGF0dGVyblN0YXJ0KFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyKSB7Ci0gICAgICAgIC8vIFdoZW4gc3RyIHN0YXJ0cyB3aXRoIGEgRmlsZS5zZXBhcmF0b3IsIHBhdHRlcm4gaGFzIHRvIHN0YXJ0IHdpdGggYQotICAgICAgICAvLyBGaWxlLnNlcGFyYXRvci4KLSAgICAgICAgLy8gV2hlbiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgRmlsZS5zZXBhcmF0b3IsIHN0ciBoYXMgdG8gc3RhcnQgd2l0aCBhCi0gICAgICAgIC8vIEZpbGUuc2VwYXJhdG9yLgotICAgICAgICBpZiAoc3RyLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpICE9Ci0gICAgICAgICAgICBwYXR0ZXJuLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBWZWN0b3IgcGF0RGlycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXR0ZXJuLEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgcGF0RGlycy5hZGRFbGVtZW50KHN0Lm5leHRUb2tlbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZlY3RvciBzdHJEaXJzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgc3RyRGlycy5hZGRFbGVtZW50KHN0Lm5leHRUb2tlbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBwYXRJZHhTdGFydCA9IDA7Ci0gICAgICAgIGludCBwYXRJZHhFbmQgICA9IHBhdERpcnMuc2l6ZSgpLTE7Ci0gICAgICAgIGludCBzdHJJZHhTdGFydCA9IDA7Ci0gICAgICAgIGludCBzdHJJZHhFbmQgICA9IHN0ckRpcnMuc2l6ZSgpLTE7Ci0KLSAgICAgICAgLy8gdXAgdG8gZmlyc3QgJyoqJwotICAgICAgICB3aGlsZSAocGF0SWR4U3RhcnQgPD0gcGF0SWR4RW5kICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgewotICAgICAgICAgICAgU3RyaW5nIHBhdERpciA9IChTdHJpbmcpcGF0RGlycy5lbGVtZW50QXQocGF0SWR4U3RhcnQpOwotICAgICAgICAgICAgaWYgKHBhdERpci5lcXVhbHMoIioqIikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbWF0Y2gocGF0RGlyLChTdHJpbmcpc3RyRGlycy5lbGVtZW50QXQoc3RySWR4U3RhcnQpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7Ci0gICAgICAgICAgICBzdHJJZHhTdGFydCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICAvLyBTdHJpbmcgaXMgZXhoYXVzdGVkCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXRJZHhTdGFydCA+IHBhdElkeEVuZCkgewotICAgICAgICAgICAgLy8gU3RyaW5nIG5vdCBleGhhdXN0ZWQsIGJ1dCBwYXR0ZXJuIGlzLiBGYWlsdXJlLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcGF0dGVybiBub3cgaG9sZHMgKiogd2hpbGUgc3RyaW5nIGlzIG5vdCBleGhhdXN0ZWQKLSAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBnZW5lcmF0ZSBmYWxzZSBwb3NpdGl2ZXMgYnV0IHdlIGNhbiBsaXZlIHdpdGggdGhhdC4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWF0Y2hlcyBhIHBhdGggYWdhaW5zdCBhIHBhdHRlcm4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgKG5vbi1udWxsKSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gc3RyICAgICB0aGUgKG5vbi1udWxsKSBzdHJpbmcgKHBhdGgpIHRvIG1hdGNoCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIHBhdHRlcm4gbWF0Y2hlcyBhZ2FpbnN0IHRoZSBzdHJpbmcuCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtYXRjaFBhdGgoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIpIHsKLSAgICAgICAgLy8gV2hlbiBzdHIgc3RhcnRzIHdpdGggYSBGaWxlLnNlcGFyYXRvciwgcGF0dGVybiBoYXMgdG8gc3RhcnQgd2l0aCBhCi0gICAgICAgIC8vIEZpbGUuc2VwYXJhdG9yLgotICAgICAgICAvLyBXaGVuIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBGaWxlLnNlcGFyYXRvciwgc3RyIGhhcyB0byBzdGFydCB3aXRoIGEKLSAgICAgICAgLy8gRmlsZS5zZXBhcmF0b3IuCi0gICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikgIT0KLSAgICAgICAgICAgIHBhdHRlcm4uc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFZlY3RvciBwYXREaXJzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdHRlcm4sRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBwYXREaXJzLmFkZEVsZW1lbnQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVjdG9yIHN0ckRpcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBzdHJEaXJzLmFkZEVsZW1lbnQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKLSAgICAgICAgaW50IHBhdElkeEVuZCAgID0gcGF0RGlycy5zaXplKCktMTsKLSAgICAgICAgaW50IHN0cklkeFN0YXJ0ID0gMDsKLSAgICAgICAgaW50IHN0cklkeEVuZCAgID0gc3RyRGlycy5zaXplKCktMTsKLQotICAgICAgICAvLyB1cCB0byBmaXJzdCAnKionCi0gICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCA8PSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0RGlyID0gKFN0cmluZylwYXREaXJzLmVsZW1lbnRBdChwYXRJZHhTdGFydCk7Ci0gICAgICAgICAgICBpZiAocGF0RGlyLmVxdWFscygiKioiKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtYXRjaChwYXREaXIsKFN0cmluZylzdHJEaXJzLmVsZW1lbnRBdChzdHJJZHhTdGFydCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKLSAgICAgICAgICAgIHN0cklkeFN0YXJ0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICAvLyBTdHJpbmcgaXMgZXhoYXVzdGVkCi0gICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBhdERpcnMuZWxlbWVudEF0KGkpLmVxdWFscygiKioiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGF0SWR4U3RhcnQgPiBwYXRJZHhFbmQpIHsKLSAgICAgICAgICAgICAgICAvLyBTdHJpbmcgbm90IGV4aGF1c3RlZCwgYnV0IHBhdHRlcm4gaXMuIEZhaWx1cmUuCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXAgdG8gbGFzdCAnKionCi0gICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCA8PSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0RGlyID0gKFN0cmluZylwYXREaXJzLmVsZW1lbnRBdChwYXRJZHhFbmQpOwotICAgICAgICAgICAgaWYgKHBhdERpci5lcXVhbHMoIioqIikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbWF0Y2gocGF0RGlyLChTdHJpbmcpc3RyRGlycy5lbGVtZW50QXQoc3RySWR4RW5kKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRJZHhFbmQtLTsKLSAgICAgICAgICAgIHN0cklkeEVuZC0tOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgewotICAgICAgICAgICAgLy8gU3RyaW5nIGlzIGV4aGF1c3RlZAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwYXREaXJzLmVsZW1lbnRBdChpKS5lcXVhbHMoIioqIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0ICE9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIGludCBwYXRJZHhUbXAgPSAtMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydCsxOyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdERpcnMuZWxlbWVudEF0KGkpLmVxdWFscygiKioiKSkgewotICAgICAgICAgICAgICAgICAgICBwYXRJZHhUbXAgPSBpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGF0SWR4VG1wID09IHBhdElkeFN0YXJ0KzEpIHsKLSAgICAgICAgICAgICAgICAvLyAnKiovKionIHNpdHVhdGlvbiwgc28gc2tpcCBvbmUKLSAgICAgICAgICAgICAgICBwYXRJZHhTdGFydCsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRmluZCB0aGUgcGF0dGVybiBiZXR3ZWVuIHBhZElkeFN0YXJ0ICYgcGFkSWR4VG1wIGluIHN0ciBiZXR3ZWVuCi0gICAgICAgICAgICAvLyBzdHJJZHhTdGFydCAmIHN0cklkeEVuZAotICAgICAgICAgICAgaW50IHBhdExlbmd0aCA9IChwYXRJZHhUbXAtcGF0SWR4U3RhcnQtMSk7Ci0gICAgICAgICAgICBpbnQgc3RyTGVuZ3RoID0gKHN0cklkeEVuZC1zdHJJZHhTdGFydCsxKTsKLSAgICAgICAgICAgIGludCBmb3VuZElkeCAgPSAtMTsKLXN0ckxvb3A6Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHJMZW5ndGggLSBwYXRMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGF0TGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlBhdCA9IChTdHJpbmcpcGF0RGlycy5lbGVtZW50QXQocGF0SWR4U3RhcnQraisxKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlN0ciA9IChTdHJpbmcpc3RyRGlycy5lbGVtZW50QXQoc3RySWR4U3RhcnQraStqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaChzdWJQYXQsc3ViU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc3RyTG9vcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvdW5kSWR4ID0gc3RySWR4U3RhcnQraTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvdW5kSWR4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYXRJZHhTdGFydCA9IHBhdElkeFRtcDsKLSAgICAgICAgICAgIHN0cklkeFN0YXJ0ID0gZm91bmRJZHgrcGF0TGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIXBhdERpcnMuZWxlbWVudEF0KGkpLmVxdWFscygiKioiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBNYXRjaGVzIGEgc3RyaW5nIGFnYWluc3QgYSBwYXR0ZXJuLiBUaGUgcGF0dGVybiBjb250YWlucyB0d28gc3BlY2lhbAotICAgICAqIGNoYXJhY3RlcnM6Ci0gICAgICogJyonIHdoaWNoIG1lYW5zIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLAotICAgICAqICc/JyB3aGljaCBtZWFucyBvbmUgYW5kIG9ubHkgb25lIGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSAobm9uLW51bGwpIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdAotICAgICAqIEBwYXJhbSBzdHIgICAgIHRoZSAobm9uLW51bGwpIHN0cmluZyB0aGF0IG11c3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZQotICAgICAqICAgICAgICAgICAgICAgIHBhdHRlcm4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgc3RyaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGF0dGVybiwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGNoYXJbXSBwYXRBcnIgPSBwYXR0ZXJuLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGNoYXJbXSBzdHJBcnIgPSBzdHIudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKLSAgICAgICAgaW50IHBhdElkeEVuZCAgID0gcGF0QXJyLmxlbmd0aC0xOwotICAgICAgICBpbnQgc3RySWR4U3RhcnQgPSAwOwotICAgICAgICBpbnQgc3RySWR4RW5kICAgPSBzdHJBcnIubGVuZ3RoLTE7Ci0gICAgICAgIGNoYXIgY2g7Ci0KLSAgICAgICAgYm9vbGVhbiBjb250YWluc1N0YXIgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRBcnIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNTdGFyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29udGFpbnNTdGFyKSB7Ci0gICAgICAgICAgICAvLyBObyAnKidzLCBzbyB3ZSBtYWtlIGEgc2hvcnRjdXQKLSAgICAgICAgICAgIGlmIChwYXRJZHhFbmQgIT0gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBQYXR0ZXJuIGFuZCBzdHJpbmcgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaCA9IHBhdEFycltpXTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz8nICYmIGNoICE9IHN0ckFycltpXSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIENoYXJhY3RlciBtaXNtYXRjaAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBTdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHBhdHRlcm4KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXRJZHhFbmQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFBhdHRlcm4gY29udGFpbnMgb25seSAnKicsIHdoaWNoIG1hdGNoZXMgYW55dGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgY2hhcmFjdGVycyBiZWZvcmUgZmlyc3Qgc3RhcgotICAgICAgICB3aGlsZSgoY2ggPSBwYXRBcnJbcGF0SWR4U3RhcnRdKSAhPSAnKicgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICBpZiAoY2ggIT0gJz8nICYmIGNoICE9IHN0ckFycltzdHJJZHhTdGFydF0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRJZHhTdGFydCsrOwotICAgICAgICAgICAgc3RySWR4U3RhcnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIC8vIEFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVzZWQuIENoZWNrIGlmIG9ubHkgJyoncyBhcmUKLSAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSAhPSAnKicpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBjaGFyYWN0ZXJzIGFmdGVyIGxhc3Qgc3RhcgotICAgICAgICB3aGlsZSgoY2ggPSBwYXRBcnJbcGF0SWR4RW5kXSkgIT0gJyonICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgewotICAgICAgICAgICAgaWYgKGNoICE9ICc/JyAmJiBjaCAhPSBzdHJBcnJbc3RySWR4RW5kXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdElkeEVuZC0tOwotICAgICAgICAgICAgc3RySWR4RW5kLS07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlCi0gICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSBwYXR0ZXJuLiBJZiBzbywgd2Ugc3VjY2VlZGVkLiBPdGhlcndpc2UgZmFpbHVyZS4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gIT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByb2Nlc3MgcGF0dGVybiBiZXR3ZWVuIHN0YXJzLiBwYWRJZHhTdGFydCBhbmQgcGF0SWR4RW5kIHBvaW50Ci0gICAgICAgIC8vIGFsd2F5cyB0byBhICcqJy4KLSAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0ICE9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgIGludCBwYXRJZHhUbXAgPSAtMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydCsxOyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0SWR4VG1wID0gaTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhdElkeFRtcCA9PSBwYXRJZHhTdGFydCsxKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHdvIHN0YXJzIG5leHQgdG8gZWFjaCBvdGhlciwgc2tpcCB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSBwYXR0ZXJuIGJldHdlZW4gcGFkSWR4U3RhcnQgJiBwYWRJZHhUbXAgaW4gc3RyIGJldHdlZW4KLSAgICAgICAgICAgIC8vIHN0cklkeFN0YXJ0ICYgc3RySWR4RW5kCi0gICAgICAgICAgICBpbnQgcGF0TGVuZ3RoID0gKHBhdElkeFRtcC1wYXRJZHhTdGFydC0xKTsKLSAgICAgICAgICAgIGludCBzdHJMZW5ndGggPSAoc3RySWR4RW5kLXN0cklkeFN0YXJ0KzEpOwotICAgICAgICAgICAgaW50IGZvdW5kSWR4ICA9IC0xOwotc3RyTG9vcDoKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ckxlbmd0aCAtIHBhdExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXRMZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBjaCA9IHBhdEFycltwYXRJZHhTdGFydCtqKzFdOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz8nICYmIGNoICE9IHN0ckFycltzdHJJZHhTdGFydCtpK2pdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzdHJMb29wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm91bmRJZHggPSBzdHJJZHhTdGFydCtpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm91bmRJZHggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhdElkeFN0YXJ0ID0gcGF0SWR4VG1wOwotICAgICAgICAgICAgc3RySWR4U3RhcnQgPSBmb3VuZElkeCtwYXRMZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlIGxlZnQKLSAgICAgICAgLy8gaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgotICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gIT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBiYXNlZGlyIGZvciBzY2FubmluZy4gVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHRoYXQgaXMgc2Nhbm5lZAotICAgICAqIHJlY3Vyc2l2ZWx5LiBBbGwgJy8nIGFuZCAnXCcgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgYnkKLSAgICAgKiA8Y29kZT5GaWxlLnNlcGFyYXRvckNoYXI8L2NvZGU+LiBTbyB0aGUgc2VwYXJhdG9yIHVzZWQgbmVlZCBub3QgbWF0Y2gKLSAgICAgKiA8Y29kZT5GaWxlLnNlcGFyYXRvckNoYXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIChub24tbnVsbCkgYmFzZWRpciBmb3Igc2Nhbm5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKFN0cmluZyBiYXNlZGlyKSB7Ci0gICAgICAgIHNldEJhc2VkaXIobmV3IEZpbGUoYmFzZWRpci5yZXBsYWNlKCcvJyxGaWxlLnNlcGFyYXRvckNoYXIpLnJlcGxhY2UoJ1xcJyxGaWxlLnNlcGFyYXRvckNoYXIpKSk7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJhc2VkaXIgZm9yIHNjYW5uaW5nLiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdCBpcyBzY2FubmVkCi0gICAgICogcmVjdXJzaXZlbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgYmFzZWRpciBmb3Igc2Nhbm5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKEZpbGUgYmFzZWRpcikgewotICAgICAgICB0aGlzLmJhc2VkaXIgPSBiYXNlZGlyOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBiYXNlZGlyIHRoYXQgaXMgdXNlZCBmb3Igc2Nhbm5pbmcuIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB0aGF0Ci0gICAgICogaXMgc2Nhbm5lZCByZWN1cnNpdmVseS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGJhc2VkaXIgdGhhdCBpcyB1c2VkIGZvciBzY2FubmluZwotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEJhc2VkaXIoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlZGlyOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucyB0byB1c2UuIEFsbCAnLycgYW5kICdcJyBjaGFyYWN0ZXJzIGFyZQotICAgICAqIHJlcGxhY2VkIGJ5IDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uIFNvIHRoZSBzZXBhcmF0b3IgdXNlZCBuZWVkCi0gICAgICogbm90IG1hdGNoIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBhIHBhdHRlcm4gZW5kcyB3aXRoIGEgJy8nIG9yICdcJywgIioqIiBpcyBhcHBlbmRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmNsdWRlcyBsaXN0IG9mIGluY2x1ZGUgcGF0dGVybnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmdbXSBpbmNsdWRlcykgewotICAgICAgICBpZiAoaW5jbHVkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gbmV3IFN0cmluZ1tpbmNsdWRlcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuOwotICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBpbmNsdWRlc1tpXS5yZXBsYWNlKCcvJyxGaWxlLnNlcGFyYXRvckNoYXIpLnJlcGxhY2UoJ1xcJyxGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICs9ICIqKiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuaW5jbHVkZXNbaV0gPSBwYXR0ZXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zIHRvIHVzZS4gQWxsICcvJyBhbmQgJ1wnIGNoYXJhY3RlcnMgYXJlCi0gICAgICogcmVwbGFjZWQgYnkgPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4gU28gdGhlIHNlcGFyYXRvciB1c2VkIG5lZWQKLSAgICAgKiBub3QgbWF0Y2ggPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIGEgcGF0dGVybiBlbmRzIHdpdGggYSAnLycgb3IgJ1wnLCAiKioiIGlzIGFwcGVuZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVzIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzKFN0cmluZ1tdIGV4Y2x1ZGVzKSB7Ci0gICAgICAgIGlmIChleGNsdWRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuZXhjbHVkZXMgPSBuZXcgU3RyaW5nW2V4Y2x1ZGVzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm47Ci0gICAgICAgICAgICAgICAgcGF0dGVybiA9IGV4Y2x1ZGVzW2ldLnJlcGxhY2UoJy8nLEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnXFwnLEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gKz0gIioqIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlc1tpXSA9IHBhdHRlcm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogU2NhbnMgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBmaWxlcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbmNsdWRlCi0gICAgICogcGF0dGVybiwgYW5kIGRvbid0IG1hdGNoIGFueSBleGNsdWRlIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2hlbiBiYXNlZGlyIHdhcyBzZXQgaW5jb3JyZWNseQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjYW4oKSB7Ci0gICAgICAgIGlmIChiYXNlZGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGJhc2VkaXIgc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiYXNlZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJiYXNlZGlyICIgKyBiYXNlZGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYmFzZWRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJiYXNlZGlyICIgKyBiYXNlZGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBkaXJlY3RvcnkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmNsdWRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBObyBpbmNsdWRlcyBzdXBwbGllZCwgc28gc2V0IGl0IHRvICdtYXRjaGVzIGFsbCcKLSAgICAgICAgICAgIGluY2x1ZGVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgICAgICAgIGluY2x1ZGVzWzBdID0gIioqIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhjbHVkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXhjbHVkZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlsZXNJbmNsdWRlZCAgICA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZmlsZXNOb3RJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZmlsZXNFeGNsdWRlZCAgICA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZGlyc0luY2x1ZGVkICAgICA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZGlyc05vdEluY2x1ZGVkICA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZGlyc0V4Y2x1ZGVkICAgICA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBpZiAoaXNJbmNsdWRlZCgiIikpIHsKLSAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZCgiIikpIHsKLSAgICAgICAgICAgICAgICBkaXJzSW5jbHVkZWQuYWRkRWxlbWVudCgiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGRFbGVtZW50KCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRpcnNOb3RJbmNsdWRlZC5hZGRFbGVtZW50KCIiKTsKLSAgICAgICAgfQotICAgICAgICBzY2FuZGlyKGJhc2VkaXIsICIiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUb3BsZXZlbCBpbnZvY2F0aW9uIGZvciB0aGUgc2Nhbi4KLSAgICAgKgotICAgICAqIDxwPlJldHVybnMgaW1tZWRpYXRlbHkgaWYgYSBzbG93IHNjYW4gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2xvd1NjYW4oKSB7Ci0gICAgICAgIGlmIChoYXZlU2xvd1Jlc3VsdHMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGV4Y2wgPSBuZXcgU3RyaW5nW2RpcnNFeGNsdWRlZC5zaXplKCldOwotICAgICAgICBkaXJzRXhjbHVkZWQuY29weUludG8oZXhjbCk7Ci0KLSAgICAgICAgU3RyaW5nW10gbm90SW5jbCA9IG5ldyBTdHJpbmdbZGlyc05vdEluY2x1ZGVkLnNpemUoKV07Ci0gICAgICAgIGRpcnNOb3RJbmNsdWRlZC5jb3B5SW50byhub3RJbmNsKTsKLQotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXhjbC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFjb3VsZEhvbGRJbmNsdWRlZChleGNsW2ldKSkgewotICAgICAgICAgICAgICAgIHNjYW5kaXIobmV3IEZpbGUoYmFzZWRpciwgZXhjbFtpXSksIAotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbFtpXStGaWxlLnNlcGFyYXRvciwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpPTA7IGk8bm90SW5jbC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFjb3VsZEhvbGRJbmNsdWRlZChub3RJbmNsW2ldKSkgewotICAgICAgICAgICAgICAgIHNjYW5kaXIobmV3IEZpbGUoYmFzZWRpciwgbm90SW5jbFtpXSksIAotICAgICAgICAgICAgICAgICAgICAgICAgbm90SW5jbFtpXStGaWxlLnNlcGFyYXRvciwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaGF2ZVNsb3dSZXN1bHRzICA9IHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTY2FucyB0aGUgcGFzc2VkIGRpciBmb3IgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiBGb3VuZCBmaWxlcyBhbmQKLSAgICAgKiBkaXJlY3RvcmllcyBhcmUgcGxhY2VkIGluIHRoZWlyIHJlc3BlY3RpdmUgY29sbGVjdGlvbnMsIGJhc2VkIG9uIHRoZQotICAgICAqIG1hdGNoaW5nIG9mIGluY2x1ZGVzIGFuZCBleGNsdWRlcy4gV2hlbiBhIGRpcmVjdG9yeSBpcyBmb3VuZCwgaXQgaXMKLSAgICAgKiBzY2FubmVkIHJlY3Vyc2l2ZWx5LgotICAgICAqCi0gICAgICogQHBhcmFtIGRpciAgIHRoZSBkaXJlY3RvcnkgdG8gc2NhbgotICAgICAqIEBwYXJhbSB2cGF0aCB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgYmFzZWRpciAobmVlZGVkIHRvIHByZXZlbnQKLSAgICAgKiAgICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIHdoZW4gdXNpbmcgZGlyKQotICAgICAqCi0gICAgICogQHNlZSAjZmlsZXNJbmNsdWRlZAotICAgICAqIEBzZWUgI2ZpbGVzTm90SW5jbHVkZWQKLSAgICAgKiBAc2VlICNmaWxlc0V4Y2x1ZGVkCi0gICAgICogQHNlZSAjZGlyc0luY2x1ZGVkCi0gICAgICogQHNlZSAjZGlyc05vdEluY2x1ZGVkCi0gICAgICogQHNlZSAjZGlyc0V4Y2x1ZGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NhbmRpcihGaWxlIGRpciwgU3RyaW5nIHZwYXRoLCBib29sZWFuIGZhc3QpIHsKLSAgICAgICAgU3RyaW5nW10gbmV3ZmlsZXMgPSBkaXIubGlzdCgpOwotCi0gICAgICAgIGlmIChuZXdmaWxlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogdHdvIHJlYXNvbnMgYXJlIG1lbnRpb25lZCBpbiB0aGUgQVBJIGRvY3MgZm9yIEZpbGUubGlzdAotICAgICAgICAgICAgICogKDEpIGRpciBpcyBub3QgYSBkaXJlY3RvcnkuIFRoaXMgaXMgaW1wb3NzaWJsZSBhcwotICAgICAgICAgICAgICogICAgIHdlIHdvdWxkbid0IGdldCBoZXJlIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAqICgyKSBhbiBJTyBlcnJvciBvY2N1cnJlZCAod2h5IGRvZXNuJ3QgaXQgdGhyb3cgYW4gZXhjZXB0aW9uIAotICAgICAgICAgICAgICogICAgIHRoZW4/Pz8pCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSU8gZXJyb3Igc2Nhbm5pbmcgZGlyZWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld2ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHZwYXRoK25ld2ZpbGVzW2ldOwotICAgICAgICAgICAgRmlsZSAgIGZpbGUgPSBuZXcgRmlsZShkaXIsbmV3ZmlsZXNbaV0pOwotICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlyc0luY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIoZmlsZSwgbmFtZStGaWxlLnNlcGFyYXRvciwgZmFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJzRXhjbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0ICYmIGNvdWxkSG9sZEluY2x1ZGVkKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lK0ZpbGUuc2VwYXJhdG9yLCBmYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpcnNOb3RJbmNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdCAmJiBjb3VsZEhvbGRJbmNsdWRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lK0ZpbGUuc2VwYXJhdG9yLCBmYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWZhc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lK0ZpbGUuc2VwYXJhdG9yLCBmYXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRXhjbHVkZWQobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzSW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzRXhjbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVzTm90SW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciBhIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZSBpbmNsdWRlIHBhdHRlcm4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBtYXRjaAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgbmFtZSBtYXRjaGVzIGFnYWluc3QgYXQgbGVhc3Qgb25lCi0gICAgICogICAgICAgICBpbmNsdWRlIHBhdHRlcm4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlZChTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobWF0Y2hQYXRoKGluY2x1ZGVzW2ldLG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgYSBuYW1lIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIGF0IGxlYXN0IG9uZSBpbmNsdWRlIHBhdHRlcm4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBtYXRjaAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgbmFtZSBtYXRjaGVzIGFnYWluc3QgYXQgbGVhc3Qgb25lCi0gICAgICogICAgICAgICBpbmNsdWRlIHBhdHRlcm4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY291bGRIb2xkSW5jbHVkZWQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG1hdGNoUGF0dGVyblN0YXJ0KGluY2x1ZGVzW2ldLG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgYSBuYW1lIG1hdGNoZXMgYWdhaW5zdCBhdCBsZWFzdCBvbmUgZXhjbHVkZSBwYXR0ZXJuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gbWF0Y2gKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZQotICAgICAqICAgICAgICAgZXhjbHVkZSBwYXR0ZXJuLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG1hdGNoUGF0aChleGNsdWRlc1tpXSxuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlIGluY2x1ZGUKLSAgICAgKiBwYXR0ZXJucywgYW5kIG1hdGNoZWQgbm9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KLSAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkRmlsZXMoKSB7Ci0gICAgICAgIGludCBjb3VudCA9IGZpbGVzSW5jbHVkZWQuc2l6ZSgpOwotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbY291bnRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbGVzW2ldID0gKFN0cmluZylmaWxlc0luY2x1ZGVkLmVsZW1lbnRBdChpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsZXM7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgbWF0Y2hlZCBhdCBub25lIG9mIHRoZSBpbmNsdWRlIHBhdHRlcm5zLgotICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Tm90SW5jbHVkZWRGaWxlcygpIHsKLSAgICAgICAgc2xvd1NjYW4oKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXNOb3RJbmNsdWRlZC5zaXplKCk7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1tjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmlsZXNbaV0gPSAoU3RyaW5nKWZpbGVzTm90SW5jbHVkZWQuZWxlbWVudEF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWxlczsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdGhhdCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5jbHVkZQotICAgICAqIHBhdHRlcm5zLCBhbiBtYXRjaGVkIGFsc28gYXQgbGVhc3Qgb25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgotICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWRGaWxlcygpIHsKLSAgICAgICAgc2xvd1NjYW4oKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXNFeGNsdWRlZC5zaXplKCk7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1tjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmlsZXNbaV0gPSAoU3RyaW5nKWZpbGVzRXhjbHVkZWQuZWxlbWVudEF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWxlczsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5jbHVkZQotICAgICAqIHBhdHRlcm5zLCBhbiBtYXRjaGVkIG5vbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCi0gICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZWRpci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkgewotICAgICAgICBpbnQgY291bnQgPSBkaXJzSW5jbHVkZWQuc2l6ZSgpOwotICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IG5ldyBTdHJpbmdbY291bnRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGRpcmVjdG9yaWVzW2ldID0gKFN0cmluZylkaXJzSW5jbHVkZWQuZWxlbWVudEF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXJlY3RvcmllczsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaGVkIGF0IG5vbmUgb2YgdGhlIGluY2x1ZGUKLSAgICAgKiBwYXR0ZXJucy4KLSAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE5vdEluY2x1ZGVkRGlyZWN0b3JpZXMoKSB7Ci0gICAgICAgIHNsb3dTY2FuKCk7Ci0gICAgICAgIGludCBjb3VudCA9IGRpcnNOb3RJbmNsdWRlZC5zaXplKCk7Ci0gICAgICAgIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gbmV3IFN0cmluZ1tjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZGlyZWN0b3JpZXNbaV0gPSAoU3RyaW5nKWRpcnNOb3RJbmNsdWRlZC5lbGVtZW50QXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCi0gICAgICogcGF0dGVybnMsIGFuIG1hdGNoZWQgYWxzbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCi0gICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZWRpci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZERpcmVjdG9yaWVzKCkgewotICAgICAgICBzbG93U2NhbigpOwotICAgICAgICBpbnQgY291bnQgPSBkaXJzRXhjbHVkZWQuc2l6ZSgpOwotICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IG5ldyBTdHJpbmdbY291bnRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGRpcmVjdG9yaWVzW2ldID0gKFN0cmluZylkaXJzRXhjbHVkZWQuZWxlbWVudEF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXJlY3RvcmllczsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgYXJyYXkgd2l0aCBkZWZhdWx0IGV4Y2x1c2lvbnMgdG8gdGhlIGN1cnJlbnQgZXhjbHVzaW9ucyBzZXQuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0RXhjbHVkZXMoKSB7Ci0gICAgICAgIGludCBleGNsdWRlc0xlbmd0aCA9IGV4Y2x1ZGVzID09IG51bGwgPyAwIDogZXhjbHVkZXMubGVuZ3RoOwotICAgICAgICBTdHJpbmdbXSBuZXdFeGNsdWRlczsKLSAgICAgICAgbmV3RXhjbHVkZXMgPSBuZXcgU3RyaW5nW2V4Y2x1ZGVzTGVuZ3RoICsgREVGQVVMVEVYQ0xVREVTLmxlbmd0aF07Ci0gICAgICAgIGlmIChleGNsdWRlc0xlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZXhjbHVkZXMsMCxuZXdFeGNsdWRlcywwLGV4Y2x1ZGVzTGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IERFRkFVTFRFWENMVURFUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbmV3RXhjbHVkZXNbaStleGNsdWRlc0xlbmd0aF0gPSBERUZBVUxURVhDTFVERVNbaV0ucmVwbGFjZSgnLycsRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCdcXCcsRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgfQotICAgICAgICBleGNsdWRlcyA9IG5ld0V4Y2x1ZGVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXhpdEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXhpdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBjMTcxLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4aXRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi0vKioKLSAqIFVzZWQgdG8gcmVwb3J0IGV4aXQgc3RhdHVzIG9mIGNsYXNzZXMgd2hpY2ggY2FsbCBTeXN0ZW0uZXhpdCgpCi0gKgotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgY2xhc3MgRXhpdEV4Y2VwdGlvbiBleHRlbmRzIFNlY3VyaXR5RXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgaW50IHN0YXR1czsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4aXQgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBFeGl0RXhjZXB0aW9uKGludCBzdGF0dXMpIHsKLSAgICAgICAgc3VwZXIoIkV4aXRFeGNlcHRpb246IHN0YXR1cyAiICsgc3RhdHVzKTsKLSAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRmlsZVNjYW5uZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0ZpbGVTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzNhYzAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRmlsZVNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdXNlZCB0byBkZXNjcmliZSB0aGUgYWN0aW9ucyByZXF1aXJlZCBieSBhbnkgdHlwZSBvZiAKLSAqIGRpcmVjdG9yeSBzY2FubmVyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGVTY2FubmVyIHsKLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGFycmF5IHdpdGggZGVmYXVsdCBleGNsdXNpb25zIHRvIHRoZSBjdXJyZW50IGV4Y2x1c2lvbnMgc2V0LgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGVmYXVsdEV4Y2x1ZGVzKCk7Ci0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYmFzZWRpciB0aGF0IGlzIHVzZWQgZm9yIHNjYW5uaW5nLiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdAotICAgICAqIGlzIHNjYW5uZWQgcmVjdXJzaXZlbHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBiYXNlZGlyIHRoYXQgaXMgdXNlZCBmb3Igc2Nhbm5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRCYXNlZGlyKCk7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5jbHVkZQotICAgICAqIHBhdHRlcm5zLCBhbiBtYXRjaGVkIGFsc28gYXQgbGVhc3Qgb25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgotICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWREaXJlY3RvcmllcygpOwotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlIGluY2x1ZGUKLSAgICAgKiBwYXR0ZXJucywgYW4gbWF0Y2hlZCBhbHNvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KLSAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVkRmlsZXMoKTsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCi0gICAgICogcGF0dGVybnMsIGFuIG1hdGNoZWQgbm9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KLSAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCi0gICAgICogcGF0dGVybnMsIGFuIG1hdGNoZWQgbm9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KLSAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IG1hdGNoZWQgYXQgbm9uZSBvZiB0aGUgaW5jbHVkZQotICAgICAqIHBhdHRlcm5zLgotICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Tm90SW5jbHVkZWREaXJlY3RvcmllcygpOwotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgbWF0Y2hlZCBhdCBub25lIG9mIHRoZSBpbmNsdWRlIHBhdHRlcm5zLgotICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Tm90SW5jbHVkZWRGaWxlcygpOwotICAgIC8qKgotICAgICAqIFNjYW5zIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgZmlsZXMgdGhhdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5jbHVkZQotICAgICAqIHBhdHRlcm4sIGFuZCBkb24ndCBtYXRjaCBhbnkgZXhjbHVkZSBwYXR0ZXJucy4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gYmFzZWRpciB3YXMgc2V0IGluY29ycmVjbHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzY2FuKCk7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYmFzZWRpciBmb3Igc2Nhbm5pbmcuIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB0aGF0IGlzIHNjYW5uZWQKLSAgICAgKiByZWN1cnNpdmVseS4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgKG5vbi1udWxsKSBiYXNlZGlyIGZvciBzY2FubmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VkaXIoU3RyaW5nIGJhc2VkaXIpOwotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJhc2VkaXIgZm9yIHNjYW5uaW5nLiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdCBpcyBzY2FubmVkCi0gICAgICogcmVjdXJzaXZlbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgYmFzZWRpciBmb3Igc2Nhbm5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKEZpbGUgYmFzZWRpcik7Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMgdG8gdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVzIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzKFN0cmluZ1tdIGV4Y2x1ZGVzKTsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucyB0byB1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXMgbGlzdCBvZiBpbmNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nW10gaW5jbHVkZXMpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvSW50cm9zcGVjdGlvbkhlbHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvSW50cm9zcGVjdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDI5NDc4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgY29sbGVjdHMgdGhlIG1ldGhvZHMgYSB0YXNrIG9yIG5lc3RlZCBlbGVtZW50Ci0gKiBob2xkcyB0byBzZXQgYXR0cmlidXRlcywgY3JlYXRlIG5lc3RlZCBlbGVtZW50cyBvciBob2xkIFBDREFUQQotICogZWxlbWVudHMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSW50cm9zcGVjdGlvbkhlbHBlciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogaG9sZHMgdGhlIHR5cGVzIG9mIHRoZSBhdHRyaWJ1dGVzIHRoYXQgY291bGQgYmUgc2V0LgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGF0dHJpYnV0ZVR5cGVzOwotCi0gICAgLyoqCi0gICAgICogaG9sZHMgdGhlIGF0dHJpYnV0ZSBzZXR0ZXIgbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSBhdHRyaWJ1dGVTZXR0ZXJzOwotCi0gICAgLyoqCi0gICAgICogSG9sZHMgdGhlIHR5cGVzIG9mIG5lc3RlZCBlbGVtZW50cyB0aGF0IGNvdWxkIGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgbmVzdGVkVHlwZXM7Ci0KLSAgICAvKioKLSAgICAgKiBIb2xkcyBtZXRob2RzIHRvIGNyZWF0ZSBuZXN0ZWQgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgbmVzdGVkQ3JlYXRvcnM7Ci0KLSAgICAvKioKLSAgICAgKiBIb2xkcyBtZXRob2RzIHRvIHN0b3JlIGNvbmZpZ3VyZWQgbmVzdGVkIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIG5lc3RlZFN0b3JlcnM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIHRvIGFkZCBQQ0RBVEEgc3R1ZmYuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXRob2QgYWRkVGV4dCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgdGhhdCdzIGJlZW4gaW50cm9zcGVjdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3MgYmVhbjsKLQotICAgIC8qKgotICAgICAqIGluc3RhbmNlcyB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgaGVscGVycyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHByaXZhdGUgSW50cm9zcGVjdGlvbkhlbHBlcihmaW5hbCBDbGFzcyBiZWFuKSB7Ci0gICAgICAgIGF0dHJpYnV0ZVR5cGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBhdHRyaWJ1dGVTZXR0ZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBuZXN0ZWRUeXBlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgbmVzdGVkQ3JlYXRvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIG5lc3RlZFN0b3JlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwotCi0gICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBiZWFuLmdldE1ldGhvZHMoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtID0gbWV0aG9kc1tpXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gbS5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICBDbGFzc1tdIGFyZ3MgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLSAgICAgICAgICAgIC8vIG5vdCByZWFsbHkgdXNlciBzZXR0YWJsZSBwcm9wZXJ0aWVzIG9uIHRhc2tzCi0gICAgICAgICAgICBpZiAob3JnLmFwYWNoZS50b29scy5hbnQuVGFzay5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJlYW4pIAotICAgICAgICAgICAgICAgICYmIGFyZ3MubGVuZ3RoID09IDEgJiYKLSAgICAgICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgICJzZXRMb2NhdGlvbiIuZXF1YWxzKG5hbWUpICYmIG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uLmNsYXNzLmVxdWFscyhhcmdzWzBdKQotICAgICAgICAgICAgICAgICAgKSB8fCAoCi0gICAgICAgICAgICAgICAgICAgInNldFRhc2tUeXBlIi5lcXVhbHMobmFtZSkgJiYgamF2YS5sYW5nLlN0cmluZy5jbGFzcy5lcXVhbHMoYXJnc1swXSkKLSAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBoaWRlIGFkZFRhc2sgZm9yIFRhc2tDb250YWluZXJzCi0gICAgICAgICAgICBpZiAob3JnLmFwYWNoZS50b29scy5hbnQuVGFza0NvbnRhaW5lci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJlYW4pIAotICAgICAgICAgICAgICAgICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgImFkZFRhc2siLmVxdWFscyhuYW1lKSAKLSAgICAgICAgICAgICAgICAmJiBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrLmNsYXNzLmVxdWFscyhhcmdzWzBdKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIGlmICgiYWRkVGV4dCIuZXF1YWxzKG5hbWUpCi0gICAgICAgICAgICAgICAgJiYgamF2YS5sYW5nLlZvaWQuVFlQRS5lcXVhbHMocmV0dXJuVHlwZSkKLSAgICAgICAgICAgICAgICAmJiBhcmdzLmxlbmd0aCA9PSAxCi0gICAgICAgICAgICAgICAgJiYgamF2YS5sYW5nLlN0cmluZy5jbGFzcy5lcXVhbHMoYXJnc1swXSkpIHsKLQotICAgICAgICAgICAgICAgIGFkZFRleHQgPSBtZXRob2RzW2ldOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgic2V0IikKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgamF2YS5sYW5nLlZvaWQuVFlQRS5lcXVhbHMocmV0dXJuVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgYXJncy5sZW5ndGggPT0gMQotICAgICAgICAgICAgICAgICAgICAgICAmJiAhYXJnc1swXS5pc0FycmF5KCkpIHsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IGdldFByb3BlcnR5TmFtZShuYW1lLCAic2V0Iik7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlU2V0dGVyIGFzID0gY3JlYXRlQXR0cmlidXRlU2V0dGVyKG0sIGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgIGlmIChhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGVzLnB1dChwcm9wTmFtZSwgYXJnc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVNldHRlcnMucHV0KHByb3BOYW1lLCBhcyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiY3JlYXRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgIXJldHVyblR5cGUuaXNBcnJheSgpCi0gICAgICAgICAgICAgICAgICAgICAgICYmICFyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgYXJncy5sZW5ndGggPT0gMCkgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gZ2V0UHJvcGVydHlOYW1lKG5hbWUsICJjcmVhdGUiKTsKLSAgICAgICAgICAgICAgICBuZXN0ZWRUeXBlcy5wdXQocHJvcE5hbWUsIHJldHVyblR5cGUpOwotICAgICAgICAgICAgICAgIG5lc3RlZENyZWF0b3JzLnB1dChwcm9wTmFtZSwgbmV3IE5lc3RlZENyZWF0b3IoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKE9iamVjdCBwYXJlbnQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7fSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiYWRkQ29uZmlndXJlZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICYmIGphdmEubGFuZy5Wb2lkLlRZUEUuZXF1YWxzKHJldHVyblR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICYmIGFyZ3MubGVuZ3RoID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgIWphdmEubGFuZy5TdHJpbmcuY2xhc3MuZXF1YWxzKGFyZ3NbMF0pCi0gICAgICAgICAgICAgICAgICAgICAgICYmICFhcmdzWzBdLmlzQXJyYXkoKQotICAgICAgICAgICAgICAgICAgICAgICAmJiAhYXJnc1swXS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yIGMgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0uZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge30pOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUobmFtZSwgImFkZENvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgbmVzdGVkVHlwZXMucHV0KHByb3BOYW1lLCBhcmdzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ3JlYXRvcnMucHV0KHByb3BOYW1lLCBuZXcgTmVzdGVkQ3JlYXRvcigpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKE9iamVjdCBwYXJlbnQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGMubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHt9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgbmVzdGVkU3RvcmVycy5wdXQocHJvcE5hbWUsIG5ldyBOZXN0ZWRTdG9yZXIoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZShPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc2UpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiYWRkIikKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgamF2YS5sYW5nLlZvaWQuVFlQRS5lcXVhbHMocmV0dXJuVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgYXJncy5sZW5ndGggPT0gMQotICAgICAgICAgICAgICAgICAgICAgICAmJiAhamF2YS5sYW5nLlN0cmluZy5jbGFzcy5lcXVhbHMoYXJnc1swXSkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgIWFyZ3NbMF0uaXNBcnJheSgpCi0gICAgICAgICAgICAgICAgICAgICAgICYmICFhcmdzWzBdLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3IgYyA9IAotICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7fSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IGdldFByb3BlcnR5TmFtZShuYW1lLCAiYWRkIik7Ci0gICAgICAgICAgICAgICAgICAgIG5lc3RlZFR5cGVzLnB1dChwcm9wTmFtZSwgYXJnc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIG5lc3RlZENyZWF0b3JzLnB1dChwcm9wTmFtZSwgbmV3IE5lc3RlZENyZWF0b3IoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZShPYmplY3QgcGFyZW50KSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBjLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7fSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHtvfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgaGVscGVyIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSW50cm9zcGVjdGlvbkhlbHBlciBnZXRIZWxwZXIoQ2xhc3MgYykgewotICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gKEludHJvc3BlY3Rpb25IZWxwZXIpIGhlbHBlcnMuZ2V0KGMpOwotICAgICAgICBpZiAoaWggPT0gbnVsbCkgewotICAgICAgICAgICAgaWggPSBuZXcgSW50cm9zcGVjdGlvbkhlbHBlcihjKTsKLSAgICAgICAgICAgIGhlbHBlcnMucHV0KGMsIGloKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZWQgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShQcm9qZWN0IHAsIE9iamVjdCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQXR0cmlidXRlU2V0dGVyIGFzID0gKEF0dHJpYnV0ZVNldHRlcikgYXR0cmlidXRlU2V0dGVycy5nZXQoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgIGlmIChhcyA9PSBudWxsKSB7Ci0JICAgIFN0cmluZyBtc2cgPSBnZXRFbGVtZW50TmFtZShwLCBlbGVtZW50KSArCi0gICAgICAgICAgICAvL1N0cmluZyBtc2cgPSAiQ2xhc3MgIiArIGVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICIgZG9lc24ndCBzdXBwb3J0IHRoZSBcIiIgKyBhdHRyaWJ1dGVOYW1lICsgIlwiIGF0dHJpYnV0ZS4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzLnNldChwLCBlbGVtZW50LCB2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIFBDREFUQSBhcmVhcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFByb2plY3QgcHJvamVjdCwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGlmIChhZGRUZXh0ID09IG51bGwpIHsKLQkgICBTdHJpbmcgbXNnID0gZ2V0RWxlbWVudE5hbWUocHJvamVjdCwgZWxlbWVudCkgKwotICAgICAgICAgICAvL1N0cmluZyBtc2cgPSAiQ2xhc3MgIiArIGVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICIgZG9lc24ndCBzdXBwb3J0IG5lc3RlZCB0ZXh0IGRhdGEuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGRUZXh0Lmludm9rZShlbGVtZW50LCBuZXcgU3RyaW5nW10ge3RleHR9KTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBnZXRNZXRob2RzIHNob3VsZCBvbmx5IHJldHVybiBwdWJsaWMgbWV0aG9kcwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGllKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuYW1lZCBuZXN0ZWQgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUVsZW1lbnQoUHJvamVjdCBwcm9qZWN0LCBPYmplY3QgZWxlbWVudCwgU3RyaW5nIGVsZW1lbnROYW1lKSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgTmVzdGVkQ3JlYXRvciBuYyA9IChOZXN0ZWRDcmVhdG9yKSBuZXN0ZWRDcmVhdG9ycy5nZXQoZWxlbWVudE5hbWUpOwotICAgICAgICBpZiAobmMgPT0gbnVsbCkgewotCSAgICBTdHJpbmcgbXNnID0gZ2V0RWxlbWVudE5hbWUocHJvamVjdCwgZWxlbWVudCkgKwotICAgICAgICAgICAgLy9TdHJpbmcgbXNnID0gIkNsYXNzICIgKyBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAiIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVzdGVkIFwiIiArIGVsZW1lbnROYW1lICsgIlwiIGVsZW1lbnQuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3QgbmVzdGVkRWxlbWVudCA9IG5jLmNyZWF0ZShlbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChuZXN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRGF0YVR5cGUpIHsKLSAgICAgICAgICAgICAgICAoKERhdGFUeXBlKW5lc3RlZEVsZW1lbnQpLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmVzdGVkRWxlbWVudDsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBnZXRNZXRob2RzIHNob3VsZCBvbmx5IHJldHVybiBwdWJsaWMgbWV0aG9kcwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGllKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpbmUpIHsKLSAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpbmUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSB0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5hbWVkIG5lc3RlZCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3JlRWxlbWVudChQcm9qZWN0IHByb2plY3QsIE9iamVjdCBlbGVtZW50LCBPYmplY3QgY2hpbGQsIFN0cmluZyBlbGVtZW50TmFtZSkgCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChlbGVtZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTmVzdGVkU3RvcmVyIG5zID0gKE5lc3RlZFN0b3JlciluZXN0ZWRTdG9yZXJzLmdldChlbGVtZW50TmFtZSk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5zLnN0b3JlKGVsZW1lbnQsIGNoaWxkKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBnZXRNZXRob2RzIHNob3VsZCBvbmx5IHJldHVybiBwdWJsaWMgbWV0aG9kcwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGllKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpbmUpIHsKLSAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpbmUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSB0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0aGUgdHlwZSBvZiBhIG5hbWVkIG5lc3RlZCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRFbGVtZW50VHlwZShTdHJpbmcgZWxlbWVudE5hbWUpIAotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBudCA9IChDbGFzcykgbmVzdGVkVHlwZXMuZ2V0KGVsZW1lbnROYW1lKTsKLSAgICAgICAgaWYgKG50ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ2xhc3MgIiArIGJlYW4uZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAiIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVzdGVkIFwiIiArIGVsZW1lbnROYW1lICsgIlwiIGVsZW1lbnQuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSB0eXBlIG9mIGEgbmFtZWQgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgYXQgPSAoQ2xhc3MpIGF0dHJpYnV0ZVR5cGVzLmdldChhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgaWYgKGF0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ2xhc3MgIiArIGJlYW4uZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAiIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgXCIiICsgYXR0cmlidXRlTmFtZSArICJcIiBhdHRyaWJ1dGUuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3Mgc3VwcG9ydCBQQ0RBVEE/Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDaGFyYWN0ZXJzKCkgewotICAgICAgICByZXR1cm4gYWRkVGV4dCAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbGwgYXR0cmlidWVzIHN1cHBvcnRlZCBieSB0aGUgaW50cm9zcGVjdGVkIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gYXR0cmlidXRlU2V0dGVycy5rZXlzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCBuZXN0ZWQgZWxlbWVudHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE5lc3RlZEVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gbmVzdGVkVHlwZXMua2V5cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByb3BlciBpbXBsZW1lbnRhdGlvbiBvZiBBdHRyaWJ1dGVTZXR0ZXIgZm9yIHRoZSBnaXZlbgotICAgICAqIGF0dHJpYnV0ZSB0eXBlLiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSBBdHRyaWJ1dGVTZXR0ZXIgY3JlYXRlQXR0cmlidXRlU2V0dGVyKGZpbmFsIE1ldGhvZCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhcmcpIHsKLQotICAgICAgICAvLyBzaW1wbGVzdCBjYXNlIC0gc2V0QXR0cmlidXRlIGV4cGVjdHMgU3RyaW5nCi0gICAgICAgIGlmIChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IFN0cmluZ1tdIHt2YWx1ZX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAvLyBub3cgZm9yIHRoZSBwcmltaXRpdmUgdHlwZXMsIHVzZSB0aGVpciB3cmFwcGVycwotICAgICAgICB9IGVsc2UgaWYgKGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MuZXF1YWxzKGFyZykKLSAgICAgICAgICAgICAgICAgICB8fCBqYXZhLmxhbmcuQ2hhcmFjdGVyLlRZUEUuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoUHJvamVjdCBwLCBPYmplY3QgcGFyZW50LCBTdHJpbmcgdmFsdWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgQ2hhcmFjdGVyW10ge25ldyBDaGFyYWN0ZXIodmFsdWUuY2hhckF0KDApKX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICB9IGVsc2UgaWYgKGphdmEubGFuZy5CeXRlLlRZUEUuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoUHJvamVjdCBwLCBPYmplY3QgcGFyZW50LCBTdHJpbmcgdmFsdWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgQnl0ZVtdIHtuZXcgQnl0ZSh2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgfSBlbHNlIGlmIChqYXZhLmxhbmcuU2hvcnQuVFlQRS5lcXVhbHMoYXJnKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBTaG9ydFtdIHtuZXcgU2hvcnQodmFsdWUpfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIH0gZWxzZSBpZiAoamF2YS5sYW5nLkludGVnZXIuVFlQRS5lcXVhbHMoYXJnKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBJbnRlZ2VyW10ge25ldyBJbnRlZ2VyKHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICB9IGVsc2UgaWYgKGphdmEubGFuZy5Mb25nLlRZUEUuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoUHJvamVjdCBwLCBPYmplY3QgcGFyZW50LCBTdHJpbmcgdmFsdWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgTG9uZ1tdIHtuZXcgTG9uZyh2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgfSBlbHNlIGlmIChqYXZhLmxhbmcuRmxvYXQuVFlQRS5lcXVhbHMoYXJnKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBGbG9hdFtdIHtuZXcgRmxvYXQodmFsdWUpfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIH0gZWxzZSBpZiAoamF2YS5sYW5nLkRvdWJsZS5UWVBFLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IERvdWJsZVtdIHtuZXcgRG91YmxlKHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgIC8vIGJvb2xlYW4gZ2V0cyBhbiBleHRyYSB0cmVhdG1lbnQsIGJlY2F1c2Ugd2UgaGF2ZSBhIG5pY2UgbWV0aG9kIAotICAgICAgICAvLyBpbiBQcm9qZWN0Ci0gICAgICAgIH0gZWxzZSBpZiAoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZXF1YWxzKGFyZykgCi0gICAgICAgICAgICAgICAgICAgfHwgamF2YS5sYW5nLkJvb2xlYW4uVFlQRS5lcXVhbHMoYXJnKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW5bXSB7bmV3IEJvb2xlYW4oUHJvamVjdC50b0Jvb2xlYW4odmFsdWUpKX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgIC8vIENsYXNzIGRvZXNuJ3QgaGF2ZSBhIFN0cmluZyBjb25zdHJ1Y3RvciBidXQgYSBkZWNlbnQgZmFjdG9yeSBtZXRob2QKLSAgICAgICAgfSBlbHNlIGlmIChqYXZhLmxhbmcuQ2xhc3MuY2xhc3MuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoUHJvamVjdCBwLCBPYmplY3QgcGFyZW50LCBTdHJpbmcgdmFsdWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgQ2xhc3NbXSB7Q2xhc3MuZm9yTmFtZSh2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAvLyByZXNvbHZlIHJlbGF0aXZlIHBhdGhzIHRocm91Z2ggUHJvamVjdAotICAgICAgICB9IGVsc2UgaWYgKGphdmEuaW8uRmlsZS5jbGFzcy5lcXVhbHMoYXJnKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBGaWxlW10ge3AucmVzb2x2ZUZpbGUodmFsdWUpfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgLy8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRocyB0aHJvdWdoIFByb2plY3QKLSAgICAgICAgfSBlbHNlIGlmIChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoLmNsYXNzLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IFBhdGhbXSB7bmV3IFBhdGgocCwgdmFsdWUpfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgLy8gRW51bWVyYXRlZEF0dHJpYnV0ZXMgaGF2ZSB0aGVpciBvd24gaGVscGVyIGNsYXNzCi0gICAgICAgIH0gZWxzZSBpZiAob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGFyZykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoUHJvamVjdCBwLCBPYmplY3QgcGFyZW50LCBTdHJpbmcgdmFsdWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZSBlYSA9IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlKWFyZy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBFbnVtZXJhdGVkQXR0cmlidXRlW10ge2VhfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGllKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIAotCi0gICAgICAgIC8vIHdvcnN0IGNhc2UuIGxvb2sgZm9yIGEgcHVibGljIFN0cmluZyBjb25zdHJ1Y3RvciBhbmQgdXNlIGl0Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3IgYyA9IAotICAgICAgICAgICAgICAgICAgICBhcmcuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhdHRyaWJ1dGUgPSBjLm5ld0luc3RhbmNlKG5ldyBTdHJpbmdbXSB7dmFsdWV9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIERhdGFUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERhdGFUeXBlKWF0dHJpYnV0ZSkuc2V0UHJvamVjdChwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7YXR0cmlidXRlfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBubWUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZShQcm9qZWN0IHByb2plY3QsIE9iamVjdCBlbGVtZW50KQotICAgIHsKLQlIYXNodGFibGUgZWxlbWVudHMgPSBwcm9qZWN0LmdldFRhc2tEZWZpbml0aW9ucygpOwotCVN0cmluZyB0eXBlTmFtZSA9ICJ0YXNrIjsKLQlpZiAoIWVsZW1lbnRzLmNvbnRhaW5zKCBlbGVtZW50LmdldENsYXNzKCkgKSkKLQl7Ci0JICAgIGVsZW1lbnRzID0gcHJvamVjdC5nZXREYXRhVHlwZURlZmluaXRpb25zKCk7Ci0JICAgIHR5cGVOYW1lID0gImRhdGEgdHlwZSI7Ci0JICAgIGlmICghZWxlbWVudHMuY29udGFpbnMoIGVsZW1lbnQuZ2V0Q2xhc3MoKSApKQotCSAgICB7Ci0JCWVsZW1lbnRzID0gbnVsbDsKLQkgICAgfQotCX0KLQotCWlmIChlbGVtZW50cyAhPSBudWxsKQotCXsKLQkgICAgRW51bWVyYXRpb24gZSA9IGVsZW1lbnRzLmtleXMoKTsKLQkgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0JICAgIHsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQlDbGFzcyBlbGVtZW50Q2xhc3MgPSAoQ2xhc3MpIGVsZW1lbnRzLmdldCggZWxlbWVudE5hbWUgKTsKLQkJaWYgKCBlbGVtZW50LmdldENsYXNzKCkuZXF1YWxzKCBlbGVtZW50Q2xhc3MgKSApCi0JCXsKLQkJICAgIHJldHVybiAiVGhlIDwiICsgZWxlbWVudE5hbWUgKyAiPiAiICsgdHlwZU5hbWU7Ci0JCX0KLQkgICAgfQotCX0KLQkKLQlyZXR1cm4gIkNsYXNzICIgKyBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGV4dHJhY3QgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBmcm9tIGEgbWV0aG9kIG5hbWUgLSBzdWJ0cmFjdGluZwotICAgICAqIGEgZ2l2ZW4gcHJlZml4LiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIGludCBzdGFydCA9IHByZWZpeC5sZW5ndGgoKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWUuc3Vic3RyaW5nKHN0YXJ0KS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50ZXJmYWNlIE5lc3RlZENyZWF0b3IgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZShPYmplY3QgcGFyZW50KSAKLSAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludGVyZmFjZSBOZXN0ZWRTdG9yZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZShPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIAotICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50ZXJmYWNlIEF0dHJpYnV0ZVNldHRlciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCAKLSAgICAgICAgICAgICAgICAgICBCdWlsZEV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkge30KLSAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgYXR0cmlidXRlVHlwZXMuY2xlYXIoKTsKLSAgICAgICAgYXR0cmlidXRlU2V0dGVycy5jbGVhcigpOwotICAgICAgICBuZXN0ZWRUeXBlcy5jbGVhcigpOwotICAgICAgICBuZXN0ZWRDcmVhdG9ycy5jbGVhcigpOwotICAgICAgICBhZGRUZXh0ID0gbnVsbDsKLSAgICAgICAgaGVscGVycy5jbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkge30KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQotICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9Ci0gICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9Ci0gICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTGF1bmNoZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0xhdW5jaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTRiOTguLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTGF1bmNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBBbnQgY29tbWFuZCBsaW5lIGZyb250IGVuZCB0byBlbmQuIFRoaXMgZnJvbnQgZW5kCi0gKiB3b3JrcyBvdXQgd2hlcmUgYW50IGlzIGluc3RhbGxlZCBhbmQgbG9hZHMgdGhlIGFudCBsaWJyYXJpZXMgYmVmb3JlCi0gKiBzdGFydGluZyBBbnQgcHJvcGVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovIAotcHVibGljIGNsYXNzIExhdW5jaGVyIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBGaWxlIGRldGVybWluZUFudEhvbWUxMSgpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzcGF0aCwgU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpKTsKLSAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoImFudC5qYXIiKSkgewotICAgICAgICAgICAgICAgIEZpbGUgYW50SmFyRmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotICAgICAgICAgICAgICAgIEZpbGUgbGliRGlyZWN0b3J5ID0gbmV3IEZpbGUoYW50SmFyRmlsZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgRmlsZSBhbnRIb21lID0gbmV3IEZpbGUobGliRGlyZWN0b3J5LmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYW50SG9tZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBGaWxlIGRldGVybWluZUFudEhvbWUoQ2xhc3NMb2FkZXIgc3lzdGVtQ2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBMYXVuY2hlci5jbGFzcy5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKLSAgICAgICAgICAgIFVSTCBjbGFzc1Jlc291cmNlID0gc3lzdGVtQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlQ29tcG9uZW50ID0gY2xhc3NSZXNvdXJjZS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NSZXNvdXJjZS5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xhc3MgY29tZXMgZnJvbSBhIGRpcmVjdG9yeSBvZiBjbGFzcyBmaWxlcyByYXRoZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vIGZyb20gYSBqYXIuIAotICAgICAgICAgICAgICAgIGludCBjbGFzc0ZpbGVJbmRleCA9IGZpbGVDb21wb25lbnQubGFzdEluZGV4T2YoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NGaWxlSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZUNvbXBvbmVudCA9IGZpbGVDb21wb25lbnQuc3Vic3RyaW5nKDAsIGNsYXNzRmlsZUluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRmlsZSBjbGFzc0ZpbGVzRGlyID0gbmV3IEZpbGUoZmlsZUNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBidWlsZERpciA9IG5ldyBGaWxlKGNsYXNzRmlsZXNEaXIuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgICAgIEZpbGUgZGV2QW50SG9tZSA9IG5ldyBGaWxlKGJ1aWxkRGlyLmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGV2QW50SG9tZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNsYXNzUmVzb3VyY2UuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImphciIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xhc3MgaXMgY29taW5nIGZyb20gYSBqYXIuIFRoZSBmaWxlIGNvbXBvbmVudCBvZiB0aGUgVVJMCi0gICAgICAgICAgICAgICAgLy8gaXMgYWN0dWFsbHkgdGhlIFVSTCBvZiB0aGUgamFyIGZpbGUKLSAgICAgICAgICAgICAgICBpbnQgY2xhc3NTZXBhcmF0b3JJbmRleCA9IGZpbGVDb21wb25lbnQubGFzdEluZGV4T2YoIiEiKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NTZXBhcmF0b3JJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlQ29tcG9uZW50ID0gZmlsZUNvbXBvbmVudC5zdWJzdHJpbmcoMCwgY2xhc3NTZXBhcmF0b3JJbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFVSTCBhbnRKYXJVUkwgPSBuZXcgVVJMKGZpbGVDb21wb25lbnQpOwotICAgICAgICAgICAgICAgIEZpbGUgYW50SmFyRmlsZSA9IG5ldyBGaWxlKGFudEphclVSTC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgIEZpbGUgbGliRGlyZWN0b3J5ID0gbmV3IEZpbGUoYW50SmFyRmlsZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgRmlsZSBhbnRIb21lID0gbmV3IEZpbGUobGliRGlyZWN0b3J5LmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYW50SG9tZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBwcml2YXRlIHZvaWQgYWRkRGlySmFycyhBbnRDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgRmlsZSBqYXJEaXIpIHsKLSAgICAgICAgU3RyaW5nW10gZmlsZUxpc3QgPSBqYXJEaXIubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKCIuamFyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICBpZiAoZmlsZUxpc3QgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIEZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGphckRpciwgZmlsZUxpc3RbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5hZGRQYXRoRWxlbWVudChqYXJGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHJpdmF0ZSB2b2lkIGFkZFRvb2xzSmFyKEFudENsYXNzTG9hZGVyIGFudExvYWRlcikgewotICAgICAgICBTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOwotICAgICAgICBpZiAoamF2YUhvbWUuZW5kc1dpdGgoImpyZSIpKSB7Ci0gICAgICAgICAgICBqYXZhSG9tZSA9IGphdmFIb21lLnN1YnN0cmluZygwLCBqYXZhSG9tZS5sZW5ndGgoKSAtIDQpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSmF2YSBob21lIGlzICIgKyBqYXZhSG9tZSk7Ci0gICAgICAgIEZpbGUgdG9vbHNKYXIgPSBuZXcgRmlsZShqYXZhSG9tZSwgImxpYi90b29scy5qYXIiKTsKLSAgICAgICAgaWYgKCF0b29sc0phci5leGlzdHMoKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZmluZCB0b29scy5qYXIgYXQgIiArIHRvb2xzSmFyLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhbnRMb2FkZXIuYWRkUGF0aEVsZW1lbnQodG9vbHNKYXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBGaWxlIGFudEhvbWUgPSBudWxsOwotICAgICAgICBDbGFzc0xvYWRlciBzeXN0ZW1DbGFzc0xvYWRlciA9IExhdW5jaGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGlmIChzeXN0ZW1DbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbnRIb21lID0gZGV0ZXJtaW5lQW50SG9tZTExKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhbnRIb21lID0gZGV0ZXJtaW5lQW50SG9tZShzeXN0ZW1DbGFzc0xvYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFudEhvbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gZGV0ZXJtaW5lIEFOVF9IT01FIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFOVF9IT01FIGlzICIgKyBhbnRIb21lKTsKLQotICAgICAgICAvLyBXZSBub3cgY3JlYXRlIHRoZSBjbGFzcyBsb2FkZXIgd2l0aCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gbGF1bmNoIGFudAotICAgICAgICBBbnRDbGFzc0xvYWRlciBhbnRMb2FkZXIgPSBuZXcgQW50Q2xhc3NMb2FkZXIoc3lzdGVtQ2xhc3NMb2FkZXIsIGZhbHNlKTsKLQotICAgICAgICAvLyBuZWVkIHRvIGZpbmQgdG9vbHMuamFyCi0gICAgICAgIGFkZFRvb2xzSmFyKGFudExvYWRlcik7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCBldmVyeXRoaW5nIGluIHRoZSBsaWIgZGlyZWN0b3J5IHRvIHRoaXMgY2xhc3Nsb2FkZXIKLSAgICAgICAgRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShhbnRIb21lLCAibGliIik7Ci0gICAgICAgIGFkZERpckphcnMoYW50TG9hZGVyLCBsaWJEaXIpOwotICAgICAgICAKLSAgICAgICAgRmlsZSBvcHRpb25hbERpciA9IG5ldyBGaWxlKGFudEhvbWUsICJsaWIvb3B0aW9uYWwiKTsKLSAgICAgICAgYWRkRGlySmFycyhhbnRMb2FkZXIsIG9wdGlvbmFsRGlyKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIGxhdW5jaFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBsYXVuY2hQcm9wZXJ0aWVzLnB1dCgiYW50LmhvbWUiLCBhbnRIb21lLmdldEFic29sdXRlUGF0aCgpKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIG1haW5DbGFzcyA9IGFudExvYWRlci5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4iKTsKLSAgICAgICAgICAgIGFudExvYWRlci5pbml0aWFsaXplQ2xhc3MobWFpbkNsYXNzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgQ2xhc3NbXSBwYXJhbSA9IHtDbGFzcy5mb3JOYW1lKCJbTGphdmEubGFuZy5TdHJpbmc7IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMuY2xhc3MsIENsYXNzTG9hZGVyLmNsYXNzfTsKLSAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBzdGFydE1ldGhvZCA9IG1haW5DbGFzcy5nZXRNZXRob2QoInN0YXJ0IiwgcGFyYW0pOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gYXJndW1lbnQgPSB7YXJncywgbGF1bmNoUHJvcGVydGllcywgc3lzdGVtQ2xhc3NMb2FkZXJ9OwotICAgICAgICAgICAgc3RhcnRNZXRob2QuaW52b2tlKG51bGwsIGFyZ3VtZW50KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHJ1bm5pbmcgQW50OiAiICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2NhdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2MmNhMy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLS8qKgotICogU3RvcmVzIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGluIGEgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIExvY2F0aW9uIHsKLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLSAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyOwotICAgIHByaXZhdGUgaW50IGNvbHVtbk51bWJlcjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYXRpb24gVU5LTk9XTl9MT0NBVElPTiA9IG5ldyBMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiAidW5rbm93biIgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBMb2NhdGlvbigpIHsKLSAgICAgICAgdGhpcyhudWxsLCAwLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9jYXRpb24gY29uc2lzdGluZyBvZiBhIGZpbGUgbmFtZSBidXQgbm8gbGluZSBudW1iZXIuCi0gICAgICovCi0gICAgcHVibGljIExvY2F0aW9uKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB0aGlzKGZpbGVOYW1lLCAwLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9jYXRpb24gY29uc2lzdGluZyBvZiBhIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuCi0gICAgICovCi0gICAgcHVibGljIExvY2F0aW9uKFN0cmluZyBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIpIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgICAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIG5hbWUsIGxpbmUgbnVtYmVyIGFuZCBhIHRyYWlsaW5nIHNwYWNlLiBBbiBlcnJvcgotICAgICAqIG1lc3NhZ2UgY2FuIGJlIGFwcGVuZGVkIGVhc2lseS4gRm9yIHVua25vd24gbG9jYXRpb25zLCByZXR1cm5zCi0gICAgICogYW4gZW1wdHkgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZmlsZU5hbWUpOwotCi0gICAgICAgICAgICBpZiAobGluZU51bWJlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiOiIpOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZU51bWJlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjogIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTWFpbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQwYmM4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIENvbW1hbmQgbGluZSBlbnRyeSBwb2ludCBpbnRvIEFudC4gVGhpcyBjbGFzcyBpcyBlbnRlcmVkIHZpYSB0aGUKLSAqIGNhbm5vbmljYWwgYHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluYCBlbnRyeSBwb2ludCBhbmQgcmVhZHMgdGhlCi0gKiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBJdCB0aGVuIGFzc2VtYmxlcyBhbmQgZXhlY3V0ZXMgYW4gQW50Ci0gKiBwcm9qZWN0LgotICogPHA+Ci0gKiBJZiB5b3UgaW50ZWdyYXRpbmcgQW50IGludG8gc29tZSBvdGhlciB0b29sLCB0aGlzIGlzIG5vdCB0aGUgY2xhc3MKLSAqIHRvIHVzZSBhcyBhbiBlbnRyeSBwb2ludC4gUGxlYXNlIHNlZSB0aGUgc291cmNlIGNvZGUgb2YgdGhpcwotICogY2xhc3MgdG8gc2VlIGhvdyBpdCBtYW5pcHVsYXRlcyB0aGUgQW50IHByb2plY3QgY2xhc3Nlcy4KLSAqCi0gKiBAYXV0aG9yIGR1bmNhbkB4MTgwLmNvbQotICovCi1wdWJsaWMgY2xhc3MgTWFpbiB7Ci0KLSAgICAvKiogVGhlIGRlZmF1bHQgYnVpbGQgZmlsZSBuYW1lICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CVUlMRF9GSUxFTkFNRSA9ICJidWlsZC54bWwiOwotCi0gICAgLyoqIE91ciBjdXJyZW50IG1lc3NhZ2Ugb3V0cHV0IHN0YXR1cy4gRm9sbG93cyBQcm9qZWN0Lk1TR19YWFggKi8KLSAgICBwcml2YXRlIGludCBtc2dPdXRwdXRMZXZlbCA9IFByb2plY3QuTVNHX0lORk87Ci0KLSAgICAvKiogRmlsZSB0aGF0IHdlIGFyZSB1c2luZyBmb3IgY29uZmlndXJhdGlvbiAqLwotICAgIHByaXZhdGUgRmlsZSBidWlsZEZpbGU7IC8qKiBudWxsICovCi0KLSAgICAvKiogU3RyZWFtIHRoYXQgd2UgYXJlIHVzaW5nIGZvciBsb2dnaW5nICovCi0gICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQgPSBTeXN0ZW0ub3V0OwotCi0gICAgLyoqIFN0cmVhbSB0aGF0IHdlIGFyZSB1c2luZyBmb3IgbG9nZ2luZyBlcnJvciBtZXNzYWdlcyAqLwotICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKLQotICAgIC8qKiBUaGUgYnVpbGQgdGFyZ2V0cyAqLwotICAgIHByaXZhdGUgVmVjdG9yIHRhcmdldHMgPSBuZXcgVmVjdG9yKDUpOwotCi0gICAgLyoqIFNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGFza3MgKi8KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgZGVmaW5lZFByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgIC8qKiBOYW1lcyBvZiBjbGFzc2VzIHRvIGFkZCBhcyBsaXN0ZW5lcnMgdG8gcHJvamVjdCAqLwotICAgIHByaXZhdGUgVmVjdG9yIGxpc3RlbmVycyA9IG5ldyBWZWN0b3IoNSk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQW50IGxvZ2dlciBjbGFzcy4gVGhlcmUgbWF5IGJlIG9ubHkgb25lIGxvZ2dlci4gSXQgd2lsbCBoYXZlIHRoZQotICAgICAqIHJpZ2h0IHRvIHVzZSB0aGUgJ291dCcgUHJpbnRTdHJlYW0uIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudHMgdGhlIEJ1aWxkTG9nZ2VyCi0gICAgICogaW50ZXJmYWNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9nZ2VyQ2xhc3NuYW1lID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG91dHB1dCB0byB0aGUgbG9nIGlzIHRvIGJlIHVuYWRvcm5lZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZW1hY3NNb2RlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBhbnQgc2hvdWxkIGJlIHJ1bi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVhZHlUb1J1biA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdlIHNob3VsZCBvbmx5IHBhcnNlIGFuZCBkaXNwbGF5IHRoZSBwcm9qZWN0IGhlbHAgaW5mb3JtYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJvamVjdEhlbHAgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgbWVzc2FnZSBvZiB0aGUgVGhyb3dhYmxlIGlmIGl0J3Mgbm90IG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludE1lc3NhZ2UoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB0LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW50cnkgcG9pbnQgYWxsb3dpbmcgZm9yIG1vcmUgb3B0aW9ucyBmcm9tIG90aGVyIGZyb250IGVuZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnQoU3RyaW5nW10gYXJncywgUHJvcGVydGllcyBhZGRpdGlvbmFsVXNlclByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNvcmVMb2FkZXIpIHsKLSAgICAgICAgTWFpbiBtID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbSA9IG5ldyBNYWluKGFyZ3MpOwotICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBleGMpIHsKLSAgICAgICAgICAgIHByaW50TWVzc2FnZShleGMpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWRkaXRpb25hbFVzZXJQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGFkZGl0aW9uYWxVc2VyUHJvcGVydGllcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gYWRkaXRpb25hbFVzZXJQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAgICAgbS5kZWZpbmVkUHJvcHMucHV0KGtleSwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgbS5ydW5CdWlsZChjb3JlTG9hZGVyKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgaWYgKG0uZXJyICE9IFN5c3RlbS5lcnIpIHsKLSAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoYmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGV4YykgewotICAgICAgICAgICAgcHJpbnRNZXNzYWdlKGV4Yyk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIENvbW1hbmQgbGluZSBlbnRyeSBwb2ludC4gVGhpcyBtZXRob2Qga2lja3Mgb2ZmIHRoZSBidWlsZGluZwotICAgICAqIG9mIGEgcHJvamVjdCBvYmplY3QgYW5kIGV4ZWN1dGVzIGEgYnVpbGQgdXNpbmcgZWl0aGVyIGEgZ2l2ZW4KLSAgICAgKiB0YXJnZXQgb3IgdGhlIGRlZmF1bHQgdGFyZ2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBzdGFydChhcmdzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBzZWFyY2hGb3JUaGlzID0gbnVsbDsKLQotICAgICAgICAvLyBjeWNsZSB0aHJvdWdoIGdpdmVuIGFyZ3MKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBhcmcgPSBhcmdzW2ldOwotCi0gICAgICAgICAgICBpZiAoYXJnLmVxdWFscygiLWhlbHAiKSkgewotICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi12ZXJzaW9uIikpIHsKLSAgICAgICAgICAgICAgICBwcmludFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1xdWlldCIpIHx8IGFyZy5lcXVhbHMoIi1xIikpIHsKLSAgICAgICAgICAgICAgICBtc2dPdXRwdXRMZXZlbCA9IFByb2plY3QuTVNHX1dBUk47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi12ZXJib3NlIikgfHwgYXJnLmVxdWFscygiLXYiKSkgewotICAgICAgICAgICAgICAgIHByaW50VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIG1zZ091dHB1dExldmVsID0gUHJvamVjdC5NU0dfVkVSQk9TRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLWRlYnVnIikpIHsKLSAgICAgICAgICAgICAgICBwcmludFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICBtc2dPdXRwdXRMZXZlbCA9IFByb2plY3QuTVNHX0RFQlVHOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItbG9nZmlsZSIpIHx8IGFyZy5lcXVhbHMoIi1sIikpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGxvZ0ZpbGUgPSBuZXcgRmlsZShhcmdzW2krMV0pOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IG91dDsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLnNldE91dChvdXQpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKG91dCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ2Fubm90IHdyaXRlIG9uIHRoZSBzcGVjaWZpZWQgbG9nIGZpbGUuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIk1ha2Ugc3VyZSB0aGUgcGF0aCBleGlzdHMgYW5kIHlvdSBoYXZlIHdyaXRlIHBlcm1pc3Npb25zLiI7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIllvdSBtdXN0IHNwZWNpZnkgYSBsb2cgZmlsZSB3aGVuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHRoZSAtbG9nIGFyZ3VtZW50IjsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1idWlsZGZpbGUiKSB8fCBhcmcuZXF1YWxzKCItZmlsZSIpIHx8IGFyZy5lcXVhbHMoIi1mIikpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBidWlsZEZpbGUgPSBuZXcgRmlsZShhcmdzW2krMV0pOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIllvdSBtdXN0IHNwZWNpZnkgYSBidWlsZGZpbGUgd2hlbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyB0aGUgLWJ1aWxkZmlsZSBhcmd1bWVudCI7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItbGlzdGVuZXIiKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5hZGRFbGVtZW50KGFyZ3NbaSsxXSk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiWW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzbmFtZSB3aGVuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHRoZSAtbGlzdGVuZXIgYXJndW1lbnQiOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoIi1EIikpIHsKLQotICAgICAgICAgICAgICAgIC8qIEludGVyZXN0aW5nbHkgZW5vdWdoLCB3ZSBnZXQgdG8gaGVyZSB3aGVuIGEgdXNlcgotICAgICAgICAgICAgICAgICAqIHVzZXMgLURuYW1lPXZhbHVlLiBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCB0aGUgSkRLCi0gICAgICAgICAgICAgICAgICogZ29lcyBhaGVhZCAqIGFuZCBwYXJzZXMgdGhpcyBvdXQgdG8gYXJncwotICAgICAgICAgICAgICAgICAqICAgeyItRG5hbWUiLCAidmFsdWUifQotICAgICAgICAgICAgICAgICAqIHNvIGluc3RlYWQgb2YgcGFyc2luZyBvbiAiPSIsIHdlIGp1c3QgbWFrZSB0aGUgIi1EIgotICAgICAgICAgICAgICAgICAqIGNoYXJhY3RlcnMgZ28gYXdheSBhbmQgc2tpcCBvbmUgYXJndW1lbnQgZm9yd2FyZC4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIEkgZG9uJ3Qga25vdyBob3cgdG8gcHJlZGljdCB3aGVuIHRoZSBKREsgaXMgZ29pbmcKLSAgICAgICAgICAgICAgICAgKiB0byBoZWxwIG9yIG5vdCwgc28gd2Ugc2ltcGx5IGxvb2sgZm9yIHRoZSBlcXVhbHMgc2lnbi4KLSAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXJnLnN1YnN0cmluZygyLCBhcmcubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaW50IHBvc0VxID0gbmFtZS5pbmRleE9mKCI9Iik7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc0VxID4gMCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5hbWUuc3Vic3RyaW5nKHBvc0VxKzEpOwotICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgcG9zRXEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGFyZ3MubGVuZ3RoLTEpCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnc1srK2ldOwotCi0gICAgICAgICAgICAgICAgZGVmaW5lZFByb3BzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1sb2dnZXIiKSkgewotICAgICAgICAgICAgICAgIGlmIChsb2dnZXJDbGFzc25hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9ubHkgb25lIGxvZ2dlciBjbGFzcyBtYXkgYmUgc3BlY2lmaWVkLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlckNsYXNzbmFtZSA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiWW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzbmFtZSB3aGVuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHRoZSAtbG9nZ2VyIGFyZ3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1lbWFjcyIpKSB7Ci0gICAgICAgICAgICAgICAgZW1hY3NNb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLXByb2plY3RoZWxwIikpIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGZsYWcgdG8gZGlzcGxheSB0aGUgdGFyZ2V0cyBhbmQgcXVpdAotICAgICAgICAgICAgICAgIHByb2plY3RIZWxwID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLWZpbmQiKSkgewotICAgICAgICAgICAgICAgIC8vIGVhdCB1cCBuZXh0IGFyZyBpZiBwcmVzZW50LCBkZWZhdWx0IHRvIGJ1aWxkLnhtbAotICAgICAgICAgICAgICAgIGlmIChpIDwgYXJncy5sZW5ndGgtMSkgewotICAgICAgICAgICAgICAgICAgICBzZWFyY2hGb3JUaGlzID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlYXJjaEZvclRoaXMgPSBERUZBVUxUX0JVSUxEX0ZJTEVOQU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgYXJncyB0byByZWNvZ25pemUhCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJVbmtub3duIGFyZ3VtZW50OiAiICsgYXJnOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlmIGl0J3Mgbm8gb3RoZXIgYXJnLCBpdCBtYXkgYmUgdGhlIHRhcmdldAotICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkRWxlbWVudChhcmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBidWlsZEZpbGUgd2FzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwKLSAgICAgICAgaWYgKGJ1aWxkRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBidXQgLWZpbmQgdGhlbiBzZWFyY2ggZm9yIGl0Ci0gICAgICAgICAgICBpZiAoc2VhcmNoRm9yVGhpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRGaWxlID0gZmluZEJ1aWxkRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRm9yVGhpcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkRmlsZSA9IG5ldyBGaWxlKERFRkFVTFRfQlVJTERfRklMRU5BTUUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIGJ1aWxkZmlsZSBleGlzdHMKLSAgICAgICAgaWYgKCFidWlsZEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGRmaWxlOiAiICsgYnVpbGRGaWxlICsgIiBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQnVpbGQgZmFpbGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgaXQncyBub3QgYSBkaXJlY3RvcnkgKHRoaXMgZmFsbHMgaW50byB0aGUgdWx0cmEKLSAgICAgICAgLy8gcGFyYW5vaWQgbGV0cyBjaGVjayBldmVyeXRoaW5nIGNhdGFnb3J5Ci0KLSAgICAgICAgaWYgKGJ1aWxkRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXQ/IEJ1aWxkZmlsZTogIiArIGJ1aWxkRmlsZSArICIgaXMgYSBkaXIhIik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkJ1aWxkIGZhaWxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZHlUb1J1biA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRvIGdldCB0aGUgcGFyZW50IGZpbGUgZm9yIGEgZ2l2ZW4gZmlsZS4KLSAgICAgKgotICAgICAqIDxQPkFkZGVkIHRvIHNpbXVsYXRlIEZpbGUuZ2V0UGFyZW50RmlsZSgpIGZyb20gSkRLIDEuMi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlICAgRmlsZQotICAgICAqIEByZXR1cm4gICAgICAgUGFyZW50IGZpbGUgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGdldFBhcmVudEZpbGUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0gICAgICAgIGZpbGVuYW1lID0gZmlsZS5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAoZmlsZW5hbWUgIT0gbnVsbCAmJiBtc2dPdXRwdXRMZXZlbCA+PSBQcm9qZWN0Lk1TR19WRVJCT1NFKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlYXJjaGluZyBpbiAiK2ZpbGVuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoZmlsZW5hbWUgPT0gbnVsbCkgPyBudWxsIDogbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaCBwYXJlbnQgZGlyZWN0b3JpZXMgZm9yIHRoZSBidWlsZCBmaWxlLgotICAgICAqCi0gICAgICogPFA+VGFrZXMgdGhlIGdpdmVuIHRhcmdldCBhcyBhIHN1ZmZpeCB0byBhcHBlbmQgdG8gZWFjaAotICAgICAqICAgIHBhcmVudCBkaXJlY3RvcnkgaW4gc2VhY2ggb2YgYSBidWlsZCBmaWxlLiAgT25jZSB0aGUKLSAgICAgKiAgICByb290IG9mIHRoZSBmaWxlLXN5c3RlbSBoYXMgYmVlbiByZWFjaGVkIGFuIGV4Y2VwdGlvbgotICAgICAqICAgIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdWZmaXggICAgU3VmZml4IGZpbGVuYW1lIHRvIGxvb2sgZm9yIGluIHBhcmVudHMuCi0gICAgICogQHJldHVybiAgICAgICAgICBBIGhhbmRsZSB0byB0aGUgYnVpbGQgZmlsZQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiAgICBGYWlsZWQgdG8gbG9jYXRlIGEgYnVpbGQgZmlsZQotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBmaW5kQnVpbGRGaWxlKFN0cmluZyBzdGFydCwgU3RyaW5nIHN1ZmZpeCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1zZ091dHB1dExldmVsID49IFByb2plY3QuTVNHX0lORk8pIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoaW5nIGZvciAiICsgc3VmZml4ICsgIiAuLi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgcGFyZW50ID0gbmV3IEZpbGUobmV3IEZpbGUoc3RhcnQpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGFyZW50LCBzdWZmaXgpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRhcmdldCBmaWxlIGV4aXN0cyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKLSAgICAgICAgd2hpbGUgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAvLyBjaGFuZ2UgdG8gcGFyZW50IGRpcmVjdG9yeQotICAgICAgICAgICAgcGFyZW50ID0gZ2V0UGFyZW50RmlsZShwYXJlbnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZiBwYXJlbnQgaXMgbnVsbCwgdGhlbiB3ZSBhcmUgYXQgdGhlIHJvb3Qgb2YgdGhlIGZzLAotICAgICAgICAgICAgLy8gY29tcGxhaW4gdGhhdCB3ZSBjYW4ndCBmaW5kIHRoZSBidWlsZCBmaWxlLgotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9jYXRlIGEgYnVpbGQgZmlsZSEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gcmVmcmVzaCBvdXIgZmlsZSBoYW5kbGUKLSAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShwYXJlbnQsIHN1ZmZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBidWlsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcnVuQnVpbGQoQ2xhc3NMb2FkZXIgY29yZUxvYWRlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIXJlYWR5VG9SdW4pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRyYWNrIHdoZW4gd2Ugc3RhcnRlZAotCi0gICAgICAgIGlmIChtc2dPdXRwdXRMZXZlbCA+PSBQcm9qZWN0Lk1TR19JTkZPKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkZmlsZTogIiArIGJ1aWxkRmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LnNldENvcmVMb2FkZXIoY29yZUxvYWRlcik7Ci0gICAgICAgIAotICAgICAgICBUaHJvd2FibGUgZXJyb3IgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGRCdWlsZExpc3RlbmVycyhwcm9qZWN0KTsKLQotICAgICAgICAgICAgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKLSAgICAgICAgICAgIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7Ci0gICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldE91dChuZXcgUHJpbnRTdHJlYW0obmV3IERlbXV4T3V0cHV0U3RyZWFtKHByb2plY3QsIGZhbHNlKSkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKG5ldyBEZW11eE91dHB1dFN0cmVhbShwcm9qZWN0LCB0cnVlKSkpOwotICAgICAgICAgICAgICAgIHByb2plY3QuZmlyZUJ1aWxkU3RhcnRlZCgpOwotICAgICAgICAgICAgICAgIHByb2plY3QuaW5pdCgpOwotICAgICAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KCJhbnQudmVyc2lvbiIsIGdldEFudFZlcnNpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXQgdXNlci1kZWZpbmUgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBkZWZpbmVkUHJvcHMua2V5cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZylkZWZpbmVkUHJvcHMuZ2V0KGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KGFyZywgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eSgiYW50LmZpbGUiICwgYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgdXNlIHRoZSBQcm9qZWN0SGVscGVyIHRvIGNyZWF0ZSB0aGUgcHJvamVjdCBvYmplY3QKLSAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBnaXZlbiBidWlsZCBmaWxlLgotICAgICAgICAgICAgICAgIFN0cmluZyBub1BhcnNlck1lc3NhZ2UgPSAKLSAgICAgICAgICAgICAgICAgICAgIk5vIEpBWFAgY29tcGxpYW50IFhNTCBwYXJzZXIgZm91bmQuIFBsZWFzZSB2aXNpdCBodHRwOi8veG1sLmFwYWNoZS5vcmcgZm9yIGEgc3VpdGFibGUgcGFyc2VyIjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Iik7Ci0gICAgICAgICAgICAgICAgICAgIFByb2plY3RIZWxwZXIuY29uZmlndXJlUHJvamVjdChwcm9qZWN0LCBidWlsZEZpbGUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihub1BhcnNlck1lc3NhZ2UsIG5jZGZlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG5vUGFyc2VyTWVzc2FnZSwgY25mZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihub1BhcnNlck1lc3NhZ2UsIG5wZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB0YXJnZXQgdG8gZXhlY3V0ZQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkRWxlbWVudChwcm9qZWN0LmdldERlZmF1bHRUYXJnZXQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdEhlbHApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0cyh0YXJnZXRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KG91dCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldEVycihlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb2plY3RIZWxwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnREZXNjcmlwdGlvbihwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBwcmludFRhcmdldHMocHJvamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIGVycm9yID0gZXhjOwotICAgICAgICAgICAgdGhyb3cgZXhjOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEVycm9yIGVycikgewotICAgICAgICAgICAgZXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICB0aHJvdyBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmZpcmVCdWlsZEZpbmlzaGVkKGVycm9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEJ1aWxkTGlzdGVuZXJzKFByb2plY3QgcHJvamVjdCkgewotCi0gICAgICAgIC8vIEFkZCB0aGUgZGVmYXVsdCBsaXN0ZW5lcgotICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIoY3JlYXRlTG9nZ2VyKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgbGlzdGVuZXJzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgICAgIChCdWlsZExpc3RlbmVyKSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goVGhyb3dhYmxlIGV4YykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGxpc3RlbmVyICIgKyBjbGFzc05hbWUsIGV4Yyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyB0aGUgZGVmYXVsdCBidWlsZCBsb2dnZXIgZm9yIHNlbmRpbmcgYnVpbGQgZXZlbnRzIHRvIHRoZSBhbnQgbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgQnVpbGRMb2dnZXIgY3JlYXRlTG9nZ2VyKCkgewotICAgICAgICBCdWlsZExvZ2dlciBsb2dnZXIgPSBudWxsOwotICAgICAgICBpZiAobG9nZ2VyQ2xhc3NuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyID0gKEJ1aWxkTG9nZ2VyKShDbGFzcy5mb3JOYW1lKGxvZ2dlckNsYXNzbmFtZSkubmV3SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBzcGVjaWZpZWQgbG9nZ2VyIGNsYXNzICIgKyBsb2dnZXJDbGFzc25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGltcGxlbWVudCB0aGUgQnVpbGRMb2dnZXIgaW50ZXJmYWNlIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIHNwZWNpZmllZCBsb2dnZXIgY2xhc3MgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyQ2xhc3NuYW1lICsgIiA6ICIgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ2dlci5zZXRNZXNzYWdlT3V0cHV0TGV2ZWwobXNnT3V0cHV0TGV2ZWwpOwotICAgICAgICBsb2dnZXIuc2V0T3V0cHV0UHJpbnRTdHJlYW0ob3V0KTsKLSAgICAgICAgbG9nZ2VyLnNldEVycm9yUHJpbnRTdHJlYW0oZXJyKTsKLSAgICAgICAgbG9nZ2VyLnNldEVtYWNzTW9kZShlbWFjc01vZGUpOwotCi0gICAgICAgIHJldHVybiBsb2dnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSB1c2FnZSBvZiBob3cgdG8gdXNlIHRoaXMgY2xhc3MgdG8gU3lzdGVtLm91dAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKLSAgICAgICAgU3RyaW5nIGxTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIG1zZy5hcHBlbmQoImFudCBbb3B0aW9uc10gW3RhcmdldCBbdGFyZ2V0MiBbdGFyZ2V0M10gLi4uXV0iICsgbFNlcCk7Ci0gICAgICAgIG1zZy5hcHBlbmQoIk9wdGlvbnM6ICIgKyBsU2VwKTsKLSAgICAgICAgbXNnLmFwcGVuZCgiICAtaGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSIgKyBsU2VwKTsKLSAgICAgICAgbXNnLmFwcGVuZCgiICAtcHJvamVjdGhlbHAgICAgICAgICAgIHByaW50IHByb2plY3QgaGVscCBpbmZvcm1hdGlvbiIgKyBsU2VwKTsKLSAgICAgICAgbXNnLmFwcGVuZCgiICAtdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IiArIGxTZXApOwotICAgICAgICBtc2cuYXBwZW5kKCIgIC1xdWlldCAgICAgICAgICAgICAgICAgYmUgZXh0cmEgcXVpZXQiICsgbFNlcCk7Ci0gICAgICAgIG1zZy5hcHBlbmQoIiAgLXZlcmJvc2UgICAgICAgICAgICAgICBiZSBleHRyYSB2ZXJib3NlIiArIGxTZXApOwotICAgICAgICBtc2cuYXBwZW5kKCIgIC1kZWJ1ZyAgICAgICAgICAgICAgICAgcHJpbnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIiArIGxTZXApOwotICAgICAgICBtc2cuYXBwZW5kKCIgIC1lbWFjcyAgICAgICAgICAgICAgICAgcHJvZHVjZSBsb2dnaW5nIGluZm9ybWF0aW9uIHdpdGhvdXQgYWRvcm5tZW50cyIgKyBsU2VwKTsKLSAgICAgICAgbXNnLmFwcGVuZCgiICAtbG9nZmlsZSA8ZmlsZT4gICAgICAgIHVzZSBnaXZlbiBmaWxlIGZvciBsb2ciICsgbFNlcCk7Ci0gICAgICAgIG1zZy5hcHBlbmQoIiAgLWxvZ2dlciA8Y2xhc3NuYW1lPiAgICB0aGUgY2xhc3Mgd2hpY2ggaXMgdG8gcGVyZm9ybSBsb2dnaW5nIiArIGxTZXApOwotICAgICAgICBtc2cuYXBwZW5kKCIgIC1saXN0ZW5lciA8Y2xhc3NuYW1lPiAgYWRkIGFuIGluc3RhbmNlIG9mIGNsYXNzIGFzIGEgcHJvamVjdCBsaXN0ZW5lciIgKyBsU2VwKTsKLSAgICAgICAgbXNnLmFwcGVuZCgiICAtYnVpbGRmaWxlIDxmaWxlPiAgICAgIHVzZSBnaXZlbiBidWlsZGZpbGUiICsgbFNlcCk7Ci0gICAgICAgIG1zZy5hcHBlbmQoIiAgLUQ8cHJvcGVydHk+PTx2YWx1ZT4gICB1c2UgdmFsdWUgZm9yIGdpdmVuIHByb3BlcnR5IiArIGxTZXApOwotICAgICAgICBtc2cuYXBwZW5kKCIgIC1maW5kIDxmaWxlPiAgICAgICAgICAgc2VhcmNoIGZvciBidWlsZGZpbGUgdG93YXJkcyB0aGUgcm9vdCBvZiB0aGUiICsgbFNlcCk7Ci0gICAgICAgIG1zZy5hcHBlbmQoIiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc3lzdGVtIGFuZCB1c2UgaXQiICsgbFNlcCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFZlcnNpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QW50VmVyc2lvbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYW50VmVyc2lvbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHJpbmcgZ2V0QW50VmVyc2lvbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhbnRWZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPQotICAgICAgICAgICAgICAgICAgICBNYWluLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oIi9vcmcvYXBhY2hlL3Rvb2xzL2FudC92ZXJzaW9uLnR4dCIpOwotICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCJBbnQgdmVyc2lvbiAiKTsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKHByb3BzLmdldFByb3BlcnR5KCJWRVJTSU9OIikpOwotICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIiBjb21waWxlZCBvbiAiKTsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKHByb3BzLmdldFByb3BlcnR5KCJEQVRFIikpOwotICAgICAgICAgICAgICAgIGFudFZlcnNpb24gPSBtc2cudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb246IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW50VmVyc2lvbjsKLSAgICB9Ci0KLSAgICAgLyoqCi0gICAgICAqIFByaW50IHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uLCBpZiBhbnkKLSAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludERlc2NyaXB0aW9uKFByb2plY3QgcHJvamVjdCkgewotICAgICAgIGlmIChwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBvdXQgYSBsaXN0IG9mIGFsbCB0YXJnZXRzIGluIHRoZSBjdXJyZW50IGJ1aWxkZmlsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRUYXJnZXRzKFByb2plY3QgcHJvamVjdCkgewotICAgICAgICAvLyBmaW5kIHRoZSB0YXJnZXQgd2l0aCB0aGUgbG9uZ2VzdCBuYW1lCi0gICAgICAgIGludCBtYXhMZW5ndGggPSAwOwotICAgICAgICBFbnVtZXJhdGlvbiBwdGFyZ2V0cyA9IHByb2plY3QuZ2V0VGFyZ2V0cygpLmVsZW1lbnRzKCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lOwotICAgICAgICBTdHJpbmcgdGFyZ2V0RGVzY3JpcHRpb247Ci0gICAgICAgIFRhcmdldCBjdXJyZW50VGFyZ2V0OwotICAgICAgICAvLyBzcGxpdCB0aGUgdGFyZ2V0cyBpbiB0b3AtbGV2ZWwgYW5kIHN1Yi10YXJnZXRzIGRlcGVuZGluZwotICAgICAgICAvLyBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBkZXNjcmlwdGlvbgotICAgICAgICBWZWN0b3IgdG9wTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFZlY3RvciB0b3BEZXNjcmlwdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFZlY3RvciBzdWJOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICB3aGlsZSAocHRhcmdldHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSAoVGFyZ2V0KXB0YXJnZXRzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB0YXJnZXROYW1lID0gY3VycmVudFRhcmdldC5nZXROYW1lKCk7Ci0gICAgICAgICAgICB0YXJnZXREZXNjcmlwdGlvbiA9IGN1cnJlbnRUYXJnZXQuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIC8vIG1haW50YWluIGEgc29ydGVkIGxpc3Qgb2YgdGFyZ2V0cwotICAgICAgICAgICAgaWYgKHRhcmdldERlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgcG9zID0gZmluZFRhcmdldFBvc2l0aW9uKHN1Yk5hbWVzLCB0YXJnZXROYW1lKTsKLSAgICAgICAgICAgICAgICBzdWJOYW1lcy5pbnNlcnRFbGVtZW50QXQodGFyZ2V0TmFtZSwgcG9zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvcyA9IGZpbmRUYXJnZXRQb3NpdGlvbih0b3BOYW1lcywgdGFyZ2V0TmFtZSk7Ci0gICAgICAgICAgICAgICAgdG9wTmFtZXMuaW5zZXJ0RWxlbWVudEF0KHRhcmdldE5hbWUsIHBvcyk7Ci0gICAgICAgICAgICAgICAgdG9wRGVzY3JpcHRpb25zLmluc2VydEVsZW1lbnRBdCh0YXJnZXREZXNjcmlwdGlvbiwgcG9zKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZS5sZW5ndGgoKSA+IG1heExlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGggPSB0YXJnZXROYW1lLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkZWZhdWx0VGFyZ2V0ID0gcHJvamVjdC5nZXREZWZhdWx0VGFyZ2V0KCk7Ci0gICAgICAgIGlmIChkZWZhdWx0VGFyZ2V0ICE9IG51bGwgJiYgISIiLmVxdWFscyhkZWZhdWx0VGFyZ2V0KSkgeyAvLyBzaG91bGRuJ3QgbmVlZCB0byBjaGVjayBidXQuLi4KLSAgICAgICAgICAgIFZlY3RvciBkZWZhdWx0TmFtZSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIFZlY3RvciBkZWZhdWx0RGVzYyA9IG51bGw7Ci0gICAgICAgICAgICBkZWZhdWx0TmFtZS5hZGRFbGVtZW50KGRlZmF1bHRUYXJnZXQpOwotCi0gICAgICAgICAgICBpbnQgaW5kZXhPZkRlZkRlc2MgPSB0b3BOYW1lcy5pbmRleE9mKGRlZmF1bHRUYXJnZXQpOwotICAgICAgICAgICAgaWYgKGluZGV4T2ZEZWZEZXNjID49IDApIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0RGVzYyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0RGVzYy5hZGRFbGVtZW50KHRvcERlc2NyaXB0aW9ucy5lbGVtZW50QXQoaW5kZXhPZkRlZkRlc2MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50VGFyZ2V0cyhkZWZhdWx0TmFtZSwgZGVmYXVsdERlc2MsICJEZWZhdWx0IHRhcmdldDoiLCBtYXhMZW5ndGgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwcmludFRhcmdldHModG9wTmFtZXMsIHRvcERlc2NyaXB0aW9ucywgIk1haW4gdGFyZ2V0czoiLCBtYXhMZW5ndGgpOwotICAgICAgICBwcmludFRhcmdldHMoc3ViTmFtZXMsIG51bGwsICJTdWJ0YXJnZXRzOiIsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaCBmb3IgdGhlIGluc2VydCBwb3NpdGlvbiB0byBrZWVwIG5hbWVzIGEgc29ydGVkIGxpc3Qgb2YgU3RyaW5ncwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kVGFyZ2V0UG9zaXRpb24oVmVjdG9yIG5hbWVzLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpbnQgcmVzID0gbmFtZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bmFtZXMuc2l6ZSgpICYmIHJlcyA9PSBuYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG5hbWUuY29tcGFyZVRvKChTdHJpbmcpbmFtZXMuZWxlbWVudEF0KGkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXMgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3V0cHV0IGEgZm9ybWF0dGVkIGxpc3Qgb2YgdGFyZ2V0IG5hbWVzIHdpdGggYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VGFyZ2V0cyhWZWN0b3IgbmFtZXMsIFZlY3RvciBkZXNjcmlwdGlvbnMsIFN0cmluZyBoZWFkaW5nLCBpbnQgbWF4bGVuKSB7Ci0gICAgICAgIC8vIG5vdywgc3RhcnQgcHJpbnRpbmcgdGhlIHRhcmdldHMgYW5kIHRoZWlyIGRlc2NyaXB0aW9ucwotICAgICAgICBTdHJpbmcgbFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgLy8gZ290IGEgYml0IGFubm95ZWQgdGhhdCBJIGNvdWxkbid0IGZpbmQgYSBwYWQgZnVuY3Rpb24KLSAgICAgICAgU3RyaW5nIHNwYWNlcyA9ICIgICAgIjsKLSAgICAgICAgd2hpbGUgKHNwYWNlcy5sZW5ndGgoKTxtYXhsZW4pIHsKLSAgICAgICAgICAgIHNwYWNlcyArPSBzcGFjZXM7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgbXNnLmFwcGVuZChoZWFkaW5nICsgbFNlcCArIGxTZXApOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1zZy5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgIG1zZy5hcHBlbmQobmFtZXMuZWxlbWVudEF0KGkpKTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoc3BhY2VzLnN1YnN0cmluZygwLCBtYXhsZW4gLSAoKFN0cmluZyluYW1lcy5lbGVtZW50QXQoaSkpLmxlbmd0aCgpICsgMikpOwotICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoZGVzY3JpcHRpb25zLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cuYXBwZW5kKGxTZXApOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTm9CYW5uZXJMb2dnZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L05vQmFubmVyTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNGNiZjQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTm9CYW5uZXJMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLS8qKgotICogRXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHRvIHN0cmlwIG91dCBlbXB0eSB0YXJnZXRzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTm9CYW5uZXJMb2dnZXIgZXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZTsKLQotICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICB0YXJnZXROYW1lID0gZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgdGFyZ2V0TmFtZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0KLSAgICAgICAgaWYoIGV2ZW50LmdldFByaW9yaXR5KCkgPiBtc2dPdXRwdXRMZXZlbCB8fAotICAgICAgICAgICAgICAgIG51bGwgPT0gZXZlbnQuZ2V0TWVzc2FnZSgpIHx8IAotICAgICAgICAgICAgIiIuZXF1YWxzKCBldmVudC5nZXRNZXNzYWdlKCkudHJpbSgpICkgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbnVsbCAhPSB0YXJnZXROYW1lICkgewotICAgICAgICAgICAgb3V0LnByaW50bG4obFNlcCArIHRhcmdldE5hbWUgKyAiOiIpOwotICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5tZXNzYWdlTG9nZ2VkKCBldmVudCApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1BhdGhUb2tlbml6ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1BhdGhUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkYWVhOS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9QYXRoVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogQSBQYXRoIHRva2VuaXplciB0YWtlcyBhIHBhdGggYW5kIHJldHVybnMgdGhlIGNvbXBvbmVudHMgdGhhdCBtYWtlIHVwCi0gKiB0aGF0IHBhdGguCi0gKgotICogVGhlIHBhdGggY2FuIHVzZSBwYXRoIHNlcGFyYXRvcnMgb2YgZWl0aGVyICc6JyBvciAnOycgYW5kIGZpbGUgc2VwYXJhdG9ycwotICogb2YgZWl0aGVyICcvJyBvciAnXCcKLSAqCi0gKiBAYXV0aG9yIENvbm9yIE1hY05laWxsIChjb25vckBpZWVlLm9yZykKLSAqCi0gKi8gCi1wdWJsaWMgY2xhc3MgUGF0aFRva2VuaXplciB7Ci0gICAgLyoqCi0gICAgICogQSB0b2tlbml6ZXIgdG8gYnJlYWsgdGhlIHN0cmluZyB1cCBiYXNlZCBvbiB0aGUgJzonIG9yICc7JyBzZXBhcmF0b3JzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIFN0cmluZyB3aGljaCBzdG9yZXMgYW55IHBhdGggY29tcG9uZW50cyB3aGljaCBoYXZlIGJlZW4gcmVhZCBhaGVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb29rYWhlYWQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBydW5uaW5nIG9uIGEgcGxhdGZvcm0gd2l0aCBhIERPUyBzdHlsZQotICAgICAqIGZpbGVzeXN0ZW0KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9zU3R5bGVGaWxlc3lzdGVtOwotCi0gICAgcHVibGljIFBhdGhUb2tlbml6ZXIoU3RyaW5nIHBhdGgpIHsKLSAgICAgICB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgsICI6OyIsIGZhbHNlKTsKLSAgICAgICBkb3NTdHlsZUZpbGVzeXN0ZW0gPSBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyID09ICc7JzsgCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLSAgICAgICAgaWYgKGxvb2thaGVhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgbmV4dFRva2VuKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdG9rZW4gPSBudWxsOwotICAgICAgICBpZiAobG9va2FoZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRva2VuID0gbG9va2FoZWFkOwotICAgICAgICAgICAgbG9va2FoZWFkID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgIGlmICh0b2tlbi5sZW5ndGgoKSA9PSAxICYmIENoYXJhY3Rlci5pc0xldHRlcih0b2tlbi5jaGFyQXQoMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRvc1N0eWxlRmlsZXN5c3RlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAvLyB3ZSBhcmUgb24gYSBkb3Mgc3R5bGUgc3lzdGVtIHNvIHRoaXMgcGF0aCBjb3VsZCBiZSBhIGRyaXZlCi0gICAgICAgICAgICAvLyBzcGVjLiBXZSBsb29rIGF0IHRoZSBuZXh0IHRva2VuCi0gICAgICAgICAgICBTdHJpbmcgbmV4dFRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChuZXh0VG9rZW4uc3RhcnRzV2l0aCgiXFwiKSB8fCBuZXh0VG9rZW4uc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2Uga25vdyB3ZSBhcmUgb24gYSBET1Mgc3R5bGUgcGxhdGZvcm0gYW5kIHRoZSBuZXh0IHBhdGggc3RhcnRzIHdpdGggYQotICAgICAgICAgICAgICAgIC8vIHNsYXNoIG9yIGJhY2tzbGFzaCwgc28gd2Uga25vdyB0aGlzIGlzIGEgZHJpdmUgc3BlYwotICAgICAgICAgICAgICAgIHRva2VuICs9ICI6IiArIG5leHRUb2tlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSB0b2tlbiBqdXN0IHJlYWQgZm9yIG5leHQgdGltZQotICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IG5leHRUb2tlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLX0KLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzYwNTAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0OyAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJTZXRDb2xsZWN0aW9uOyAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsgCi0KLS8qKgotICogQ2VudHJhbCByZXByZXNlbnRhdGlvbiBvZiBhbiBBbnQgcHJvamVjdC4gVGhpcyBjbGFzcyBkZWZpbmVzIGEKLSAqIEFudCBwcm9qZWN0IHdpdGggYWxsIG9mIGl0J3MgdGFyZ2V0cyBhbmQgdGFza3MuIEl0IGFsc28gcHJvdmlkZXMKLSAqIHRoZSBtZWNoYW5pc20gdG8ga2ljayBvZmYgYSBidWlsZCB1c2luZyBhIHBhcnRpY3VsYXIgdGFyZ2V0IG5hbWUuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgYWxzbyBlbmNhcHN1bGF0ZXMgbWV0aG9kcyB3aGljaCBhbGxvdyBGaWxlcyB0byBiZSByZWZlcmVkCi0gKiB0byB1c2luZyBhYnN0cmFjdCBwYXRoIG5hbWVzIHdoaWNoIGFyZSB0cmFuc2xhdGVkIHRvIG5hdGl2ZSBzeXN0ZW0KLSAqIGZpbGUgcGF0aHMgYXQgcnVudGltZSBhcyB3ZWxsIGFzIGRlZmluaW5nIHZhcmlvdXMgcHJvamVjdCBwcm9wZXJ0aWVzLgotICoKLSAqIEBhdXRob3IgZHVuY2FuQHgxODAuY29tCi0gKi8KLQotcHVibGljIGNsYXNzIFByb2plY3QgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0VSUiA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1dBUk4gPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19JTkZPID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfVkVSQk9TRSA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFQlVHID0gNDsKLQotICAgIC8vIHByaXZhdGUgc2V0IG9mIGNvbnN0YW50cyB0byByZXByZXNlbnQgdGhlIHN0YXRlCi0gICAgLy8gb2YgYSBERlMgb2YgdGhlIFRhcmdldCBkZXBlbmRlbmNpZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRJTkcgPSAiVklTSVRJTkciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVEVEID0gIlZJU0lURUQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGphdmFWZXJzaW9uOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzAgPSAiMS4wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBXzFfMSA9ICIxLjEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfMV8yID0gIjEuMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzMgPSAiMS4zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBXzFfNCA9ICIxLjQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fU1RBUlQgPSBGaWx0ZXJTZXQuREVGQVVMVF9UT0tFTl9TVEFSVDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9FTkQgPSBGaWx0ZXJTZXQuREVGQVVMVF9UT0tFTl9FTkQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgcHJvcGVydGllcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwcml2YXRlIEhhc2h0YWJsZSB1c2VyUHJvcGVydGllcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwcml2YXRlIEhhc2h0YWJsZSByZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRUYXJnZXQ7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgZGF0YUNsYXNzRGVmaW5pdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFza0NsYXNzRGVmaW5pdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFyZ2V0cyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwcml2YXRlIEZpbHRlclNldCBnbG9iYWxGaWx0ZXJTZXQgPSBuZXcgRmlsdGVyU2V0KCk7Ci0gICAgcHJpdmF0ZSBGaWx0ZXJTZXRDb2xsZWN0aW9uIGdsb2JhbEZpbHRlcnMgPSBuZXcgRmlsdGVyU2V0Q29sbGVjdGlvbihnbG9iYWxGaWx0ZXJTZXQpOwotICAgIHByaXZhdGUgRmlsZSBiYXNlRGlyOwotCi0gICAgcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyoqIFRoZSBBbnQgY29yZSBjbGFzc2xvYWRlciAtIG1heSBiZSBudWxsIGlmIHVzaW5nIHN5c3RlbSBsb2FkZXIgKi8gICAgCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjb3JlTG9hZGVyID0gbnVsbDsKLQotICAgIC8qKiBSZWNvcmRzIHRoZSBsYXRlc3QgdGFzayBvbiBhIHRocmVhZCAqLyAKLSAgICBwcml2YXRlIEhhc2h0YWJsZSB0aHJlYWRUYXNrcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICBzdGF0aWMgewotCi0gICAgICAgIC8vIERldGVybWluZSB0aGUgSmF2YSB2ZXJzaW9uIGJ5IGxvb2tpbmcgYXQgYXZhaWxhYmxlIGNsYXNzZXMKLSAgICAgICAgLy8gamF2YS5sYW5nLlN0cmljdE1hdGggd2FzIGludHJvZHVjZWQgaW4gSkRLIDEuMwotICAgICAgICAvLyBqYXZhLmxhbmcuVGhyZWFkTG9jYWwgd2FzIGludHJvZHVjZWQgaW4gSkRLIDEuMgotICAgICAgICAvLyBqYXZhLmxhbmcuVm9pZCB3YXMgaW50cm9kdWNlZCBpbiBKREsgMS4xCi0gICAgICAgIC8vIENvdW50IHVwIHZlcnNpb24gdW50aWwgYSBOb0NsYXNzRGVmRm91bmRFcnJvciBlbmRzIHRoZSB0cnkKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YVZlcnNpb24gPSBKQVZBXzFfMDsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5Wb2lkIik7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV8xOwotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlRocmVhZExvY2FsIik7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV8yOwotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlN0cmljdE1hdGgiKTsKLSAgICAgICAgICAgIGphdmFWZXJzaW9uID0gSkFWQV8xXzM7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIik7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV80OwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgIC8vIHN3YWxsb3cgYXMgd2UndmUgaGl0IHRoZSBtYXggY2xhc3MgdmVyc2lvbiB0aGF0Ci0gICAgICAgICAgICAvLyB3ZSBoYXZlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGVVdGlscyBmaWxlVXRpbHM7Ci0KLSAgICBwdWJsaWMgUHJvamVjdCgpIHsKLSAgICAgICAgZmlsZVV0aWxzID0gRmlsZVV0aWxzLm5ld0ZpbGVVdGlscygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpc2UgdGhlIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBUaGlzIGludm9sdmVzIHNldHRpbmcgdGhlIGRlZmF1bHQgdGFzayBkZWZpbml0aW9ucyBhbmQgbG9hZGluZyB0aGUKLSAgICAgKiBzeXN0ZW0gcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0SmF2YVZlcnNpb25Qcm9wZXJ0eSgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGRlZnMgPSAiL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZGVmcyk7Ci0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeyAKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IGxvYWQgZGVmYXVsdCB0YXNrIGxpc3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLQotICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIHRhc2tDbGFzcyA9IENsYXNzLmZvck5hbWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBhZGRUYXNrRGVmaW5pdGlvbihrZXksIHRhc2tDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgbmNkZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLi4uCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZS4uLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IGxvYWQgZGVmYXVsdCB0YXNrIGxpc3QiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkYXRhRGVmcyA9ICIvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdHMucHJvcGVydGllcyI7Ci0KLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGRhdGFEZWZzKTsKLSAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7IAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCBkZWZhdWx0IGRhdGF0eXBlIGxpc3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLQotICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGRhdGFDbGFzcyA9IENsYXNzLmZvck5hbWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBhZGREYXRhVHlwZURlZmluaXRpb24oa2V5LCBkYXRhQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZS4uLgotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUuLi4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4ndCBsb2FkIGRlZmF1bHQgZGF0YXR5cGUgbGlzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0U3lzdGVtUHJvcGVydGllcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvcmVMb2FkZXIoQ2xhc3NMb2FkZXIgY29yZUxvYWRlcikgewotICAgICAgICB0aGlzLmNvcmVMb2FkZXIgPSBjb3JlTG9hZGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q29yZUxvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIGNvcmVMb2FkZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZEJ1aWxkTGlzdGVuZXIoQnVpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMuYWRkRWxlbWVudChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQnVpbGRMaXN0ZW5lcihCdWlsZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVycy5yZW1vdmVFbGVtZW50KGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldEJ1aWxkTGlzdGVuZXJzKCkgewotICAgICAgICByZXR1cm4gbGlzdGVuZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhtc2csIE1TR19JTkZPKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZywgaW50IG1zZ0xldmVsKSB7Ci0gICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkKHRoaXMsIG1zZywgbXNnTGV2ZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvZyhUYXNrIHRhc2ssIFN0cmluZyBtc2csIGludCBtc2dMZXZlbCkgewotICAgICAgICBmaXJlTWVzc2FnZUxvZ2dlZCh0YXNrLCBtc2csIG1zZ0xldmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2coVGFyZ2V0IHRhcmdldCwgU3RyaW5nIG1zZywgaW50IG1zZ0xldmVsKSB7Ci0gICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkKHRhcmdldCwgbXNnLCBtc2dMZXZlbCk7Ci0gICAgfQotCi0gIAotICAgIHB1YmxpYyBGaWx0ZXJTZXQgZ2V0R2xvYmFsRmlsdGVyU2V0KCkgewotICAgICAgICByZXR1cm4gZ2xvYmFsRmlsdGVyU2V0OwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIC8vIGNvbW1hbmQgbGluZSBwcm9wZXJ0aWVzIHRha2UgcHJlY2VkZW5jZQotICAgICAgICBpZiAobnVsbCAhPSB1c2VyUHJvcGVydGllcy5nZXQobmFtZSkpIHsKLSAgICAgICAgICAgIGxvZygiT3ZlcnJpZGUgaWdub3JlZCBmb3IgdXNlciBwcm9wZXJ0eSAiICsgbmFtZSwgTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxvZygiU2V0dGluZyBwcm9qZWN0IHByb3BlcnR5OiAiICsgbmFtZSArICIgLT4gIiArCi0gICAgICAgICAgICB2YWx1ZSwgTVNHX0RFQlVHKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGxvZygiU2V0dGluZyBybyBwcm9qZWN0IHByb3BlcnR5OiAiICsgbmFtZSArICIgLT4gIiArCi0gICAgICAgICAgICB2YWx1ZSwgTVNHX0RFQlVHKTsKLSAgICAgICAgdXNlclByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VyUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpIHVzZXJQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2h0YWJsZSBnZXRVc2VyUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHVzZXJQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXJnZXQoU3RyaW5nIGRlZmF1bHRUYXJnZXQpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0VGFyZ2V0ID0gZGVmYXVsdFRhcmdldDsKLSAgICB9Ci0KLSAgICAvLyBkZXByZWNhdGVkLCB1c2Ugc2V0RGVmYXVsdAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRUYXJnZXQ7Ci0gICAgfQotCi0gICAgLy8gbWF0Y2ggdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgZGVmYXVsdFRhcmdldCkgewotICAgICAgICB0aGlzLmRlZmF1bHRUYXJnZXQgPSBkZWZhdWx0VGFyZ2V0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc2V0VXNlclByb3BlcnR5KCJhbnQucHJvamVjdC5uYW1lIiwgIG5hbWUpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgIC8vIFdpbGwgcmV0dXJuIG51bGwgaWYgbm8gZGVzY3JpcHRpb24gaGFzIGJlZW4gc2V0Ci0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKiBAZGVwcmVjYXRlZCAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihTdHJpbmcgdG9rZW4sIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBnbG9iYWxGaWx0ZXJTZXQuYWRkRmlsdGVyKG5ldyBGaWx0ZXJTZXQuRmlsdGVyKHRva2VuLCB2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKiBAZGVwcmVjYXRlZCAqLwotICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RmlsdGVycygpIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBidWlsZCB0aGUgaGFzaHRhYmxlIGR5bmFtaWNhbGx5Ci0gICAgICAgIHJldHVybiBnbG9iYWxGaWx0ZXJTZXQuZ2V0RmlsdGVySGFzaCgpOwotICAgIH0KLQotICAgIC8vIG1hdGNoIGJhc2VkaXIgYXR0cmlidXRlIGluIHhtbAotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VkaXIoU3RyaW5nIGJhc2VEKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBzZXRCYXNlRGlyKG5ldyBGaWxlKGJhc2VEKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZURpcihGaWxlIGJhc2VEaXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJhc2VEaXIgPSBmaWxlVXRpbHMubm9ybWFsaXplKGJhc2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBpZiAoIWJhc2VEaXIuZXhpc3RzKCkpIAotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCYXNlZGlyICIgKyBiYXNlRGlyLmdldEFic29sdXRlUGF0aCgpICsgIiBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICBpZiAoIWJhc2VEaXIuaXNEaXJlY3RvcnkoKSkgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkJhc2VkaXIgIiArIGJhc2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeSIpOwotICAgICAgICB0aGlzLmJhc2VEaXIgPSBiYXNlRGlyOwotICAgICAgICBzZXRQcm9wZXJ0eSggImJhc2VkaXIiLCB0aGlzLmJhc2VEaXIuZ2V0UGF0aCgpKTsKLSAgICAgICAgU3RyaW5nIG1zZyA9ICJQcm9qZWN0IGJhc2UgZGlyIHNldCB0bzogIiArIHRoaXMuYmFzZURpcjsKLSAgICAgICAgbG9nKG1zZywgTVNHX1ZFUkJPU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEJhc2VEaXIoKSB7Ci0gICAgICAgIGlmIChiYXNlRGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2V0QmFzZWRpcigiLiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZURpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXZhVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGphdmFWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFWZXJzaW9uUHJvcGVydHkoKSB7Ci0gICAgICAgIHNldFByb3BlcnR5KCJhbnQuamF2YS52ZXJzaW9uIiwgamF2YVZlcnNpb24pOwotCi0gICAgICAgIC8vIHNhbml0eSBjaGVjawotICAgICAgICBpZiAoamF2YVZlcnNpb24gPT0gSkFWQV8xXzApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQW50IGNhbm5vdCB3b3JrIG9uIEphdmEgMS4wIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2coIkRldGVjdGVkIEphdmEgdmVyc2lvbjogIiArIGphdmFWZXJzaW9uICsgIiBpbjogIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIiksIE1TR19WRVJCT1NFKTsKLQotICAgICAgICBsb2coIkRldGVjdGVkIE9TOiAiICsgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIiksIE1TR19WRVJCT1NFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0aWVzKCkgewotICAgICAgICBQcm9wZXJ0aWVzIHN5c3RlbVAgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOwotICAgICAgICBFbnVtZXJhdGlvbiBlID0gc3lzdGVtUC5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbmFtZSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHN5c3RlbVAuZ2V0KG5hbWUpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aGlzLnNldFByb3BlcnR5KG5hbWUudG9TdHJpbmcoKSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVGFza0RlZmluaXRpb24oU3RyaW5nIHRhc2tOYW1lLCBDbGFzcyB0YXNrQ2xhc3MpIHsKLSAgICAgICAgU3RyaW5nIG1zZyA9ICIgK1VzZXIgdGFzazogIiArIHRhc2tOYW1lICsgIiAgICAgIiArIHRhc2tDbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgIGxvZyhtc2csIE1TR19ERUJVRyk7Ci0gICAgICAgIHRhc2tDbGFzc0RlZmluaXRpb25zLnB1dCh0YXNrTmFtZSwgdGFza0NsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldFRhc2tEZWZpbml0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tDbGFzc0RlZmluaXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZERhdGFUeXBlRGVmaW5pdGlvbihTdHJpbmcgdHlwZU5hbWUsIENsYXNzIHR5cGVDbGFzcykgewotICAgICAgICBTdHJpbmcgbXNnID0gIiArVXNlciBkYXRhdHlwZTogIiArIHR5cGVOYW1lICsgIiAgICAgIiArIHR5cGVDbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgIGxvZyhtc2csIE1TR19ERUJVRyk7Ci0gICAgICAgIGRhdGFDbGFzc0RlZmluaXRpb25zLnB1dCh0eXBlTmFtZSwgdHlwZUNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldERhdGFUeXBlRGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhQ2xhc3NEZWZpbml0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNhbGwgZXhwZWN0cyB0byBhZGQgYSA8ZW0+bmV3PC9lbT4gVGFyZ2V0LgotICAgICAqIEBwYXJhbSB0YXJnZXQgaXMgdGhlIFRhcmdldCB0byBiZSBhZGRlZCB0byB0aGUgY3VycmVudAotICAgICAqIFByb2plY3QuCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgVGFyZ2V0IGFscmVhZHkgZXhpc3RzCi0gICAgICogaW4gdGhlIHByb2plY3QuCi0gICAgICogQHNlZSBQcm9qZWN0I2FkZE9yUmVwbGFjZVRhcmdldCB0byByZXBsYWNlIGV4aXN0aW5nIFRhcmdldHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGFyZ2V0KFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB0YXJnZXQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAodGFyZ2V0cy5nZXQobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEdXBsaWNhdGUgdGFyZ2V0OiBgIituYW1lKyInIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkT3JSZXBsYWNlVGFyZ2V0KG5hbWUsIHRhcmdldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjYWxsIGV4cGVjdHMgdG8gYWRkIGEgPGVtPm5ldzwvZW0+IFRhcmdldC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IGlzIHRoZSBUYXJnZXQgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQKLSAgICAgKiBQcm9qZWN0LgotICAgICAqIEBwYXJhbSB0YXJnZXROYW1lIGlzIHRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIFRhcmdldAotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIFRhcmdldCBhbHJlYWR5IGV4aXN0cwotICAgICAqIGluIHRoZSBwcm9qZWN0LgotICAgICAqIEBzZWUgUHJvamVjdCNhZGRPclJlcGxhY2VUYXJnZXQgdG8gcmVwbGFjZSBleGlzdGluZyBUYXJnZXRzLgotICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBhZGRUYXJnZXQoU3RyaW5nIHRhcmdldE5hbWUsIFRhcmdldCB0YXJnZXQpCi0gICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgaWYgKHRhcmdldHMuZ2V0KHRhcmdldE5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkR1cGxpY2F0ZSB0YXJnZXQ6IGAiK3RhcmdldE5hbWUrIiciKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGFkZE9yUmVwbGFjZVRhcmdldCh0YXJnZXROYW1lLCB0YXJnZXQpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IGlzIHRoZSBUYXJnZXQgdG8gYmUgYWRkZWQgb3IgcmVwbGFjZWQgaW4KLSAgICAgKiB0aGUgY3VycmVudCBQcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZVRhcmdldChUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGFkZE9yUmVwbGFjZVRhcmdldCh0YXJnZXQuZ2V0TmFtZSgpLCB0YXJnZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0YXJnZXQgaXMgdGhlIFRhcmdldCB0byBiZSBhZGRlZC9yZXBsYWNlZCBpbgotICAgICAqIHRoZSBjdXJyZW50IFByb2plY3QuCi0gICAgICogQHBhcmFtIHRhcmdldE5hbWUgaXMgdGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgVGFyZ2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT3JSZXBsYWNlVGFyZ2V0KFN0cmluZyB0YXJnZXROYW1lLCBUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSAiICtUYXJnZXQ6ICIgKyB0YXJnZXROYW1lOwotICAgICAgICBsb2cobXNnLCBNU0dfREVCVUcpOwotICAgICAgICB0YXJnZXQuc2V0UHJvamVjdCh0aGlzKTsKLSAgICAgICAgdGFyZ2V0cy5wdXQodGFyZ2V0TmFtZSwgdGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldFRhcmdldHMoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXRzOwotICAgIH0KLQotICAgIHB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soU3RyaW5nIHRhc2tUeXBlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjID0gKENsYXNzKSB0YXNrQ2xhc3NEZWZpbml0aW9ucy5nZXQodGFza1R5cGUpOwotCi0gICAgICAgIGlmIChjID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gYy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgVGFzayB0YXNrID0gbnVsbDsKLSAgICAgICAgICAgIGlmKCBvIGluc3RhbmNlb2YgVGFzayApIHsKLSAgICAgICAgICAgICAgIHRhc2s9KFRhc2spbzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gIkdlbmVyaWMiIEJlYW4gLSB1c2UgdGhlIHNldHRlciBwYXR0ZXJuCi0gICAgICAgICAgICAgICAgLy8gYW5kIGFuIEFkYXB0ZXIKLSAgICAgICAgICAgICAgICBUYXNrQWRhcHRlciB0YXNrQT1uZXcgVGFza0FkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgICB0YXNrQS5zZXRQcm94eSggbyApOwotICAgICAgICAgICAgICAgIHRhc2s9dGFza0E7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXNrLnNldFByb2plY3QodGhpcyk7Ci0gICAgICAgICAgICB0YXNrLnNldFRhc2tUeXBlKHRhc2tUeXBlKTsKLQotICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgdmFsdWUsIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyCi0gICAgICAgICAgICB0YXNrLnNldFRhc2tOYW1lKHRhc2tUeXBlKTsKLQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICIgICArVGFzazogIiArIHRhc2tUeXBlOwotICAgICAgICAgICAgbG9nIChtc2csIE1TR19ERUJVRyk7Ci0gICAgICAgICAgICByZXR1cm4gdGFzazsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ291bGQgbm90IGNyZWF0ZSB0YXNrIG9mIHR5cGU6ICIKLSAgICAgICAgICAgICAgICAgKyB0YXNrVHlwZSArICIgZHVlIHRvICIgKyB0OwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZURhdGFUeXBlKFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgYyA9IChDbGFzcykgZGF0YUNsYXNzRGVmaW5pdGlvbnMuZ2V0KHR5cGVOYW1lKTsKLQotICAgICAgICBpZiAoYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGN0b3IgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBub0FyZyA9IGZhbHNlOwotICAgICAgICAgICAgLy8gRGF0YVR5cGUgY2FuIGhhdmUgYSAibm8gYXJnIiBjb25zdHJ1Y3RvciBvciB0YWtlIGEgc2luZ2xlIAotICAgICAgICAgICAgLy8gUHJvamVjdCBhcmd1bWVudC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY3RvciA9IGMuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzWzBdKTsKLSAgICAgICAgICAgICAgICBub0FyZyA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNlKSB7Ci0gICAgICAgICAgICAgICAgY3RvciA9IGMuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge2dldENsYXNzKCl9KTsKLSAgICAgICAgICAgICAgICBub0FyZyA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3QgbyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobm9BcmcpIHsKLSAgICAgICAgICAgICAgICAgbyA9IGN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFswXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICBvID0gY3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge3RoaXN9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgUHJvamVjdENvbXBvbmVudCkgewotICAgICAgICAgICAgICAgICgoUHJvamVjdENvbXBvbmVudClvKS5zZXRQcm9qZWN0KHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICIgICArRGF0YVR5cGU6ICIgKyB0eXBlTmFtZTsKLSAgICAgICAgICAgIGxvZyAobXNnLCBNU0dfREVCVUcpOwotICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ291bGQgbm90IGNyZWF0ZSBkYXRhdHlwZSBvZiB0eXBlOiAiCi0gICAgICAgICAgICAgICAgICsgdHlwZU5hbWUgKyAiIGR1ZSB0byAiICsgdDsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDb3VsZCBub3QgY3JlYXRlIGRhdGF0eXBlIG9mIHR5cGU6ICIKLSAgICAgICAgICAgICAgICAgKyB0eXBlTmFtZSArICIgZHVlIHRvICIgKyB0OwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0cyhWZWN0b3IgdGFyZ2V0TmFtZXMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRocm93YWJsZSBlcnJvciA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXROYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgoU3RyaW5nKXRhcmdldE5hbWVzLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZW11eE91dHB1dChTdHJpbmcgbGluZSwgYm9vbGVhbiBpc0Vycm9yKSB7Ci0gICAgICAgIFRhc2sgdGFzayA9IChUYXNrKXRocmVhZFRhc2tzLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLSAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkgewotICAgICAgICAgICAgZmlyZU1lc3NhZ2VMb2dnZWQodGhpcywgbGluZSwgaXNFcnJvciA/IE1TR19FUlIgOiBNU0dfSU5GTyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXNFcnJvcikgewotICAgICAgICAgICAgICAgIHRhc2suaGFuZGxlRXJyb3JPdXRwdXQobGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YXNrLmhhbmRsZU91dHB1dChsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0KFN0cmluZyB0YXJnZXROYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIHNhbml0eSBjaGVjayBvdXJzZWx2ZXMsIGlmIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYnVpbGQgbm90aGluZwotICAgICAgICAvLyB0aGVuIHdlIHNob3VsZCBjb21wbGFpbgotCi0gICAgICAgIGlmICh0YXJnZXROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiTm8gdGFyZ2V0IHNwZWNpZmllZCI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNvcnQgdGhlIGRlcGVuZGVuY3kgdHJlZSwgYW5kIHJ1biBldmVyeXRoaW5nIGZyb20gdGhlCi0gICAgICAgIC8vIGJlZ2lubmluZyB1bnRpbCB3ZSBoaXQgb3VyIHRhcmdldE5hbWUuCi0gICAgICAgIC8vIFNvcnRpbmcgY2hlY2tzIGlmIGFsbCB0aGUgdGFyZ2V0cyAoYW5kIGRlcGVuZGVuY2llcykKLSAgICAgICAgLy8gZXhpc3QsIGFuZCBpZiB0aGVyZSBpcyBhbnkgY3ljbGUgaW4gdGhlIGRlcGVuZGVuY3kKLSAgICAgICAgLy8gZ3JhcGguCi0gICAgICAgIFZlY3RvciBzb3J0ZWRUYXJnZXRzID0gdG9wb1NvcnQodGFyZ2V0TmFtZSwgdGFyZ2V0cyk7Ci0KLSAgICAgICAgaW50IGN1cmlkeCA9IDA7Ci0gICAgICAgIFRhcmdldCBjdXJ0YXJnZXQ7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgY3VydGFyZ2V0ID0gKFRhcmdldCkgc29ydGVkVGFyZ2V0cy5lbGVtZW50QXQoY3VyaWR4KyspOwotICAgICAgICAgICAgY3VydGFyZ2V0LnBlcmZvcm1UYXNrcygpOwotICAgICAgICB9IHdoaWxlICghY3VydGFyZ2V0LmdldE5hbWUoKS5lcXVhbHModGFyZ2V0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2Fub25pY2FsIGZvcm0gb2YgZmlsZU5hbWUgYXMgYW4gYWJzb2x1dGUgcGF0aC4KLSAgICAgKgotICAgICAqIDxwPklmIGZpbGVOYW1lIGlzIGEgcmVsYXRpdmUgZmlsZSBuYW1lLCByZXNvbHZlIGl0IHJlbGF0aXZlIHRvCi0gICAgICogcm9vdERpci48L3A+Ci0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIHJlc29sdmVGaWxlKFN0cmluZyBmaWxlTmFtZSwgRmlsZSByb290RGlyKSB7Ci0gICAgICAgIHJldHVybiBmaWxlVXRpbHMucmVzb2x2ZUZpbGUocm9vdERpciwgZmlsZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIHJlc29sdmVGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICByZXR1cm4gZmlsZVV0aWxzLnJlc29sdmVGaWxlKGJhc2VEaXIsIGZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2xhdGUgYSBwYXRoIGludG8gaXRzIG5hdGl2ZSAocGxhdGZvcm0gc3BlY2lmaWMpIGZvcm1hdC4gCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgUGF0aFRva2VuaXplciBjbGFzcyB0byBzZXBhcmF0ZSB0aGUgaW5wdXQgcGF0aAotICAgICAqIGludG8gaXRzIGNvbXBvbmVudHMuIFRoaXMgaGFuZGxlcyBET1Mgc3R5bGUgcGF0aHMgaW4gYSByZWxhdGl2ZWx5Ci0gICAgICogc2Vuc2libGUgd2F5LiBUaGUgZmlsZSBzZXBhcmF0b3JzIGFyZSB0aGVuIGNvbnZlcnRlZCB0byB0aGVpciBwbGF0Zm9ybQotICAgICAqIHNwZWNpZmljIHZlcnNpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIHRvX3Byb2Nlc3MgdGhlIHBhdGggdG8gYmUgY29udmVydGVkICAgCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgdmVyc2lvbiBvZiB0b19wcm9jZXNzIG9yIAotICAgICAqICAgICAgICAgYW4gZW1wdHkgc3RyaW5nIGlmIHRvX3Byb2Nlc3MgaXMgbnVsbCBvciBlbXB0eQotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIHRyYW5zbGF0ZVBhdGgoU3RyaW5nIHRvX3Byb2Nlc3MpIHsKLSAgICAgICAgaWYgKCB0b19wcm9jZXNzID09IG51bGwgfHwgdG9fcHJvY2Vzcy5sZW5ndGgoKSA9PSAwICkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKHRvX3Byb2Nlc3MubGVuZ3RoKCkgKyA1MCk7Ci0gICAgICAgIFBhdGhUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFBhdGhUb2tlbml6ZXIodG9fcHJvY2Vzcyk7Ci0gICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aENvbXBvbmVudCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIHBhdGhDb21wb25lbnQgPSBwYXRoQ29tcG9uZW50LnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgcGF0aENvbXBvbmVudCA9IHBhdGhDb21wb25lbnQucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0aC5hcHBlbmQocGF0aENvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmllbmVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYSBkZXN0aW5hdGlvbi4KLSAgICAgKiBObyBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaWxlVXRpbHMuY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZpZW5lbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEgZGVzdGluYXRpb24KLSAgICAgKiBzcGVjaWZ5aW5nIGlmIHRva2VuIGZpbHRlcmluZyBtdXN0IGJlIHVzZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgZGVzdEZpbGUsIGJvb2xlYW4gZmlsdGVyaW5nKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaWxlVXRpbHMuY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsIGZpbHRlcmluZyA/IGdsb2JhbEZpbHRlcnMgOiBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhCi0gICAgICogZGVzdGluYXRpb24gc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkIGFuZCBpZgotICAgICAqIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNvdXJjZUZpbGUsIFN0cmluZyBkZXN0RmlsZSwgYm9vbGVhbiBmaWx0ZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbGVVdGlscy5jb3B5RmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSwgZmlsdGVyaW5nID8gZ2xvYmFsRmlsdGVycyA6IG51bGwsIG92ZXJ3cml0ZSk7Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIENvbnZpZW5lbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEKLSAgICAgKiBkZXN0aW5hdGlvbiBzcGVjaWZ5aW5nIGlmIHRva2VuIGZpbHRlcmluZyBtdXN0IGJlIHVzZWQsIGlmCi0gICAgICogc291cmNlIGZpbGVzIG1heSBvdmVyd3JpdGUgbmV3ZXIgZGVzdGluYXRpb24gZmlsZXMgYW5kIHRoZQotICAgICAqIGxhc3QgbW9kaWZpZWQgdGltZSBvZiA8Y29kZT5kZXN0RmlsZTwvY29kZT4gZmlsZSBzaG91bGQgYmUgbWFkZSBlcXVhbAotICAgICAqIHRvIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgPGNvZGU+c291cmNlRmlsZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlLCBib29sZWFuIGZpbHRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmlsZVV0aWxzLmNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlLCBmaWx0ZXJpbmcgPyBnbG9iYWxGaWx0ZXJzIDogbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGUsIHByZXNlcnZlTGFzdE1vZGlmaWVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uLgotICAgICAqIE5vIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmlsZVV0aWxzLmNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uCi0gICAgICogc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUsIGJvb2xlYW4gZmlsdGVyaW5nKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaWxlVXRpbHMuY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsIGZpbHRlcmluZyA/IGdsb2JhbEZpbHRlcnMgOiBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhCi0gICAgICogZGVzdGluYXRpb24gc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkIGFuZCBpZgotICAgICAqIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlLCBib29sZWFuIGZpbHRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmlsZVV0aWxzLmNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlLCBmaWx0ZXJpbmcgPyBnbG9iYWxGaWx0ZXJzIDogbnVsbCwgb3ZlcndyaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhCi0gICAgICogZGVzdGluYXRpb24gc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLCBpZgotICAgICAqIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzIGFuZCB0aGUKLSAgICAgKiBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgPGNvZGU+ZGVzdEZpbGU8L2NvZGU+IGZpbGUgc2hvdWxkIGJlIG1hZGUgZXF1YWwKLSAgICAgKiB0byB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIDxjb2RlPnNvdXJjZUZpbGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlLCBib29sZWFuIGZpbHRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmlsZVV0aWxzLmNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlLCBmaWx0ZXJpbmcgPyBnbG9iYWxGaWx0ZXJzIDogbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGUsIHByZXNlcnZlTGFzdE1vZGlmaWVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxscyBGaWxlLnNldExhc3RNb2RpZmllZChsb25nIHRpbWUpIGluIGEgSmF2YSAxLjEgY29tcGF0aWJsZSB3YXkuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVMYXN0TW9kaWZpZWQoRmlsZSBmaWxlLCBsb25nIHRpbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRKYXZhVmVyc2lvbigpID09IEpBVkFfMV8xKSB7Ci0gICAgICAgICAgICBsb2coIkNhbm5vdCBjaGFuZ2UgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mICIgKyBmaWxlCi0gICAgICAgICAgICAgICAgKyAiIGluIEpESyAxLjEiLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaWxlVXRpbHMuc2V0RmlsZUxhc3RNb2RpZmllZChmaWxlLCB0aW1lKTsKLSAgICAgICAgbG9nKCJTZXR0aW5nIG1vZGlmaWNhdGlvbiB0aW1lIGZvciAiICsgZmlsZSwgTVNHX1ZFUkJPU0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgdGhlIGJvb2xlYW4gZXF1aXZhbGVudCBvZiBhIHN0cmluZywgd2hpY2ggaXMgY29uc2lkZXJlZCB0cnVlCi0gICAgICogaWYgZWl0aGVyICJvbiIsICJ0cnVlIiwgb3IgInllcyIgaXMgZm91bmQsIGlnbm9yaW5nIGNhc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRvQm9vbGVhbihTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gKHMuZXF1YWxzSWdub3JlQ2FzZSgib24iKSB8fAotICAgICAgICAgICAgICAgIHMuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIHx8Ci0gICAgICAgICAgICAgICAgcy5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG9wb2xvZ2ljYWxseSBzb3J0IGEgc2V0IG9mIFRhcmdldHMuCi0gICAgICogQHBhcmFtIHJvb3QgaXMgdGhlIChTdHJpbmcpIG5hbWUgb2YgdGhlIHJvb3QgVGFyZ2V0LiBUaGUgc29ydCBpcwotICAgICAqIGNyZWF0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBzZXF1ZW5jZSBvZiBUYXJnZXRzIHVwdGlsIHRoZSByb290Ci0gICAgICogdGFyZ2V0IGlzIHRoZSBtaW5pbXVtIHBvc3NpYmxlIHN1Y2ggc2VxdWVuY2UuCi0gICAgICogQHBhcmFtIHRhcmdldHMgaXMgYSBIYXNodGFibGUgcmVwcmVzZW50aW5nIGEgIm5hbWUgdG8gVGFyZ2V0IiBtYXBwaW5nCi0gICAgICogQHJldHVybiBhIFZlY3RvciBvZiBTdHJpbmdzIHdpdGggdGhlIG5hbWVzIG9mIHRoZSB0YXJnZXRzIGluCi0gICAgICogc29ydGVkIG9yZGVyLgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBjeWNsaWMgZGVwZW5kZW5jeSBhbW9uZyB0aGUKLSAgICAgKiBUYXJnZXRzLCBvciBpZiBhIFRhcmdldCBkb2VzIG5vdCBleGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgVmVjdG9yIHRvcG9Tb3J0KFN0cmluZyByb290LCBIYXNodGFibGUgdGFyZ2V0cykKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgVmVjdG9yIHJldCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgSGFzaHRhYmxlIHN0YXRlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBTdGFjayB2aXNpdGluZyA9IG5ldyBTdGFjaygpOwotCi0gICAgICAgIC8vIFdlIGZpcnN0IHJ1biBhIERGUyBiYXNlZCBzb3J0IHVzaW5nIHRoZSByb290IGFzIHRoZSBzdGFydGluZyBub2RlLgotICAgICAgICAvLyBUaGlzIGNyZWF0ZXMgdGhlIG1pbmltdW0gc2VxdWVuY2Ugb2YgVGFyZ2V0cyB0byB0aGUgcm9vdCBub2RlLgotICAgICAgICAvLyBXZSB0aGVuIGRvIGEgc29ydCBvbiBhbnkgcmVtYWluaW5nIHVuVklTSVRFRCB0YXJnZXRzLgotICAgICAgICAvLyBUaGlzIGlzIHVubmVjZXNzYXJ5IGZvciBkb2luZyBvdXIgYnVpbGQsIGJ1dCBpdCBjYXRjaGVzCi0gICAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBvciBtaXNzaW5nIFRhcmdldHMgb24gdGhlIGVudGlyZQotICAgICAgICAvLyBkZXBlbmRlbmN5IHRyZWUsIG5vdCBqdXN0IG9uIHRoZSBUYXJnZXRzIHRoYXQgZGVwZW5kIG9uIHRoZQotICAgICAgICAvLyBidWlsZCBUYXJnZXQuCi0KLSAgICAgICAgdHNvcnQocm9vdCwgdGFyZ2V0cywgc3RhdGUsIHZpc2l0aW5nLCByZXQpOwotICAgICAgICBsb2coIkJ1aWxkIHNlcXVlbmNlIGZvciB0YXJnZXQgYCIrcm9vdCsiJyBpcyAiK3JldCwgTVNHX1ZFUkJPU0UpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGVuPXRhcmdldHMua2V5cygpOyBlbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBjdXJUYXJnZXQgPSAoU3RyaW5nKShlbi5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgIFN0cmluZyBzdCA9IChTdHJpbmcpIHN0YXRlLmdldChjdXJUYXJnZXQpOwotICAgICAgICAgICAgaWYgKHN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0c29ydChjdXJUYXJnZXQsIHRhcmdldHMsIHN0YXRlLCB2aXNpdGluZywgcmV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0ID09IFZJU0lUSU5HKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbm9kZSBpbiB2aXNpdGluZyBzdGF0ZTogIitjdXJUYXJnZXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvZygiQ29tcGxldGUgYnVpbGQgc2VxdWVuY2UgaXMgIityZXQsIE1TR19WRVJCT1NFKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBvbmUgc3RlcCBpbiBhIHJlY3Vyc2l2ZSBERlMgdHJhdmVyc2FsIG9mIHRoZSBUYXJnZXQgZGVwZW5kZW5jeSB0cmVlLgotICAgIC8vIC0gVGhlIEhhc2h0YWJsZSAic3RhdGUiIGNvbnRhaW5zIHRoZSBzdGF0ZSAoVklTSVRFRCBvciBWSVNJVElORyBvciBudWxsKQotICAgIC8vIG9mIGFsbCB0aGUgdGFyZ2V0IG5hbWVzLgotICAgIC8vIC0gVGhlIFN0YWNrICJ2aXNpdGluZyIgY29udGFpbnMgYSBzdGFjayBvZiB0YXJnZXQgbmFtZXMgdGhhdCBhcmUKLSAgICAvLyBjdXJyZW50bHkgb24gdGhlIERGUyBzdGFjay4gKE5COiB0aGUgdGFyZ2V0IG5hbWVzIGluICJ2aXNpdGluZyIgYXJlCi0gICAgLy8gZXhhY3RseSB0aGUgdGFyZ2V0IG5hbWVzIGluICJzdGF0ZSIgdGhhdCBhcmUgaW4gdGhlIFZJU0lUSU5HIHN0YXRlLikKLSAgICAvLyAxLiBTZXQgdGhlIGN1cnJlbnQgdGFyZ2V0IHRvIHRoZSBWSVNJVElORyBzdGF0ZSwgYW5kIHB1c2ggaXQgb250bwotICAgIC8vIHRoZSAidmlzaXRpbmciIHN0YWNrLgotICAgIC8vIDIuIFRocm93IGEgQnVpbGRFeGNlcHRpb24gaWYgYW55IGNoaWxkIG9mIHRoZSBjdXJyZW50IG5vZGUgaXMKLSAgICAvLyBpbiB0aGUgVklTSVRJTkcgc3RhdGUgKGltcGxpZXMgdGhlcmUgaXMgYSBjeWNsZS4pIEl0IHVzZXMgdGhlCi0gICAgLy8gInZpc2l0aW5nIiBTdGFjayB0byBjb25zdHJ1Y3QgdGhlIGN5Y2xlLgotICAgIC8vIDMuIElmIGFueSBjaGlsZHJlbiBoYXZlIG5vdCBiZWVuIFZJU0lURUQsIHRzb3J0KCkgdGhlIGNoaWxkLgotICAgIC8vIDQuIEFkZCB0aGUgY3VycmVudCB0YXJnZXQgdG8gdGhlIFZlY3RvciAicmV0IiBhZnRlciB0aGUgY2hpbGRyZW4KLSAgICAvLyAgIGhhdmUgYmVlbiB2aXNpdGVkLiBNb3ZlIHRoZSBjdXJyZW50IHRhcmdldCB0byB0aGUgVklTSVRFRCBzdGF0ZS4KLSAgICAvLyAgICJyZXQiIG5vdyBjb250YWlucyB0aGUgc29ydGVkIHNlcXVlbmNlIG9mIFRhcmdldHMgdXB0byB0aGUgY3VycmVudAotICAgIC8vICAgVGFyZ2V0LgotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHRzb3J0KFN0cmluZyByb290LCBIYXNodGFibGUgdGFyZ2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIHN0YXRlLCBTdGFjayB2aXNpdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIHJldCkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgc3RhdGUucHV0KHJvb3QsIFZJU0lUSU5HKTsKLSAgICAgICAgdmlzaXRpbmcucHVzaChyb290KTsKLQotICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldCkodGFyZ2V0cy5nZXQocm9vdCkpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBleGlzdAotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlRhcmdldCBgIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocm9vdCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIicgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBwcm9qZWN0LiAiKTsKLSAgICAgICAgICAgIHZpc2l0aW5nLnBvcCgpOwotICAgICAgICAgICAgaWYgKCF2aXNpdGluZy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudCA9IChTdHJpbmcpdmlzaXRpbmcucGVlaygpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiSXQgaXMgdXNlZCBmcm9tIHRhcmdldCBgIik7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCInLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obmV3IFN0cmluZyhzYikpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlbj10YXJnZXQuZ2V0RGVwZW5kZW5jaWVzKCk7IGVuLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgU3RyaW5nIGN1ciA9IChTdHJpbmcpIGVuLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbT0oU3RyaW5nKXN0YXRlLmdldChjdXIpOwotICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIE5vdCBiZWVuIHZpc2l0ZWQKLSAgICAgICAgICAgICAgICB0c29ydChjdXIsIHRhcmdldHMsIHN0YXRlLCB2aXNpdGluZywgcmV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG0gPT0gVklTSVRJTkcpIHsKLSAgICAgICAgICAgICAgICAvLyBDdXJyZW50bHkgdmlzaXRpbmcgdGhpcyBub2RlLCBzbyBoYXZlIGEgY3ljbGUKLSAgICAgICAgICAgICAgICB0aHJvdyBtYWtlQ2lyY3VsYXJFeGNlcHRpb24oY3VyLCB2aXNpdGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcCA9IChTdHJpbmcpIHZpc2l0aW5nLnBvcCgpOwotICAgICAgICBpZiAocm9vdCAhPSBwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvcjogZXhwZWN0ZWQgdG8gcG9wICIrcm9vdCsiIGJ1dCBnb3QgIitwKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZS5wdXQocm9vdCwgVklTSVRFRCk7Ci0gICAgICAgIHJldC5hZGRFbGVtZW50KHRhcmdldCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVpbGRFeGNlcHRpb24gbWFrZUNpcmN1bGFyRXhjZXB0aW9uKFN0cmluZyBlbmQsIFN0YWNrIHN0aykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJDaXJjdWxhciBkZXBlbmRlbmN5OiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKGVuZCk7Ci0gICAgICAgIFN0cmluZyBjOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBjID0gKFN0cmluZylzdGsucG9wKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiA8LSAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgfSB3aGlsZSghYy5lcXVhbHMoZW5kKSk7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24obmV3IFN0cmluZyhzYikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChudWxsICE9IHJlZmVyZW5jZXMuZ2V0KG5hbWUpKSB7Ci0gICAgICAgICAgICBsb2coIk92ZXJyaWRpbmcgcHJldmlvdXMgZGVmaW5pdGlvbiBvZiByZWZlcmVuY2UgdG8gIiArIG5hbWUsIAotICAgICAgICAgICAgICAgIE1TR19XQVJOKTsKLSAgICAgICAgfQotICAgICAgICBsb2coIkFkZGluZyByZWZlcmVuY2U6ICIgKyBuYW1lICsgIiAtPiAiICsgdmFsdWUsIE1TR19ERUJVRyk7Ci0gICAgICAgIHJlZmVyZW5jZXMucHV0KG5hbWUsdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0UmVmZXJlbmNlcygpIHsKLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZUJ1aWxkU3RhcnRlZCgpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRoaXMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IChCdWlsZExpc3RlbmVyKSBsaXN0ZW5lcnMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgbGlzdGVuZXIuYnVpbGRTdGFydGVkKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVCdWlsZEZpbmlzaGVkKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRoaXMpOwotICAgICAgICBldmVudC5zZXRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgbGlzdGVuZXJzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLmJ1aWxkRmluaXNoZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVRhcmdldFN0YXJ0ZWQoVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBCdWlsZEV2ZW50IGV2ZW50ID0gbmV3IEJ1aWxkRXZlbnQodGFyZ2V0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgbGlzdGVuZXJzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLnRhcmdldFN0YXJ0ZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVRhcmdldEZpbmlzaGVkKFRhcmdldCB0YXJnZXQsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRhcmdldCk7Ci0gICAgICAgIGV2ZW50LnNldEV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IChCdWlsZExpc3RlbmVyKSBsaXN0ZW5lcnMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgbGlzdGVuZXIudGFyZ2V0RmluaXNoZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVRhc2tTdGFydGVkKFRhc2sgdGFzaykgewotICAgICAgICAvLyByZWdpc3RlciB0aGlzIGFzIHRoZSBjdXJyZW50IHRhc2sgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgotICAgICAgICB0aHJlYWRUYXNrcy5wdXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgdGFzayk7Ci0gICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0YXNrKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgbGlzdGVuZXJzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLnRhc2tTdGFydGVkKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVUYXNrRmluaXNoZWQoVGFzayB0YXNrLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRocmVhZFRhc2tzLnJlbW92ZShUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICBTeXN0ZW0uZXJyLmZsdXNoKCk7Ci0gICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0YXNrKTsKLSAgICAgICAgZXZlbnQuc2V0RXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0gKEJ1aWxkTGlzdGVuZXIpIGxpc3RlbmVycy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBsaXN0ZW5lci50YXNrRmluaXNoZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVNZXNzYWdlTG9nZ2VkRXZlbnQoQnVpbGRFdmVudCBldmVudCwgU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSkgewotICAgICAgICBldmVudC5zZXRNZXNzYWdlKG1lc3NhZ2UsIHByaW9yaXR5KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgbGlzdGVuZXJzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLm1lc3NhZ2VMb2dnZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZU1lc3NhZ2VMb2dnZWQoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KSB7Ci0gICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudChwcm9qZWN0KTsKLSAgICAgICAgZmlyZU1lc3NhZ2VMb2dnZWRFdmVudChldmVudCwgbWVzc2FnZSwgcHJpb3JpdHkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVNZXNzYWdlTG9nZ2VkKFRhcmdldCB0YXJnZXQsIFN0cmluZyBtZXNzYWdlLCBpbnQgcHJpb3JpdHkpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRhcmdldCk7Ci0gICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkRXZlbnQoZXZlbnQsIG1lc3NhZ2UsIHByaW9yaXR5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlTWVzc2FnZUxvZ2dlZChUYXNrIHRhc2ssIFN0cmluZyBtZXNzYWdlLCBpbnQgcHJpb3JpdHkpIHsKLSAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRhc2spOwotICAgICAgICBmaXJlTWVzc2FnZUxvZ2dlZEV2ZW50KGV2ZW50LCBtZXNzYWdlLCBwcmlvcml0eSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTNmZDZlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGNvbXBvbmVudHMgb2YgYSBwcm9qZWN0LCBpbmNsdWRpbmcgdGFza3MgYW5kIGRhdGEgdHlwZXMuIFByb3ZpZGVzCi0gKiBjb21tb24gZmFjaWxpdGllcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdENvbXBvbmVudCB7Ci0KLSAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByb2plY3Qgb2JqZWN0IG9mIHRoaXMgY29tcG9uZW50LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5Ci0gICAgICogcHJvamVjdCB3aGVuIGEgY29tcG9uZW50IGlzIGFkZGVkIHRvIGl0IHNvIHRoYXQgdGhlIGNvbXBvbmVudCBoYXMKLSAgICAgKiBhY2Nlc3MgdG8gdGhlIGZ1bmN0aW9ucyBvZiB0aGUgcHJvamVjdC4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkCi0gICAgICogZm9yIGFueSBvdGhlciBwdXJwb3NlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgUHJvamVjdCBpbiB3aG9zZSBzY29wZSB0aGlzIGNvbXBvbmVudCBiZWxvbmdzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBQcm9qZWN0IHRvIHdoaWNoIHRoaXMgY29tcG9uZW50IGJlbG9uZ3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudHMncyBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2cgYSBtZXNzYWdlIHdpdGggdGhlIGRlZmF1bHQgKElORk8pIHByaW9yaXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2cgYSBtZXNhZ2Ugd2l0aCB0aGUgZ2l2ZSBwcmlvcml0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuCi0gICAgICogQHBhcmFtIG1zZ0xldmVsIHRoZSBtZXNzYWdlIHByaW9yaXR5IGF0IHdoaWNoIHRoaXMgbWVzc2FnZSBpcyB0byBiZSBsb2dnZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2csIGludCBtc2dMZXZlbCkgewotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZyhtc2csIG1zZ0xldmVsKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdEhlbHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmJiMTI1Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLS8qKgotICogQ29uZmlndXJlcyBhIFByb2plY3QgKGNvbXBsZXRlIHdpdGggVGFyZ2V0cyBhbmQgVGFza3MpIGJhc2VkIG9uCi0gKiBhIFhNTCBidWlsZCBmaWxlLgotICoKLSAqIEBhdXRob3IgZHVuY2FuQHgxODAuY29tCi0gKi8KLQotcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0gbnVsbDsKLQotICAgIHByaXZhdGUgb3JnLnhtbC5zYXguUGFyc2VyIHBhcnNlcjsKLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIEZpbGUgYnVpbGRGaWxlOwotICAgIHByaXZhdGUgRmlsZSBidWlsZEZpbGVQYXJlbnQ7Ci0gICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoZSBQcm9qZWN0IHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgWE1MIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZVByb2plY3QoUHJvamVjdCBwcm9qZWN0LCBGaWxlIGJ1aWxkRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IFByb2plY3RIZWxwZXIocHJvamVjdCwgYnVpbGRGaWxlKS5wYXJzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQW50IHBhcnNlciBmb3IgdGhlIHNwZWNpZmllZCBYTUwgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFByb2plY3RIZWxwZXIoUHJvamVjdCBwcm9qZWN0LCBGaWxlIGJ1aWxkRmlsZSkgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLmJ1aWxkRmlsZSA9IG5ldyBGaWxlKGJ1aWxkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIGJ1aWxkRmlsZVBhcmVudCA9IG5ldyBGaWxlKHRoaXMuYnVpbGRGaWxlLmdldFBhcmVudCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHByb2plY3QgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2UoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IGdldFBhcnNlckZhY3RvcnkoKS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICAgIHBhcnNlciA9IHNheFBhcnNlci5nZXRQYXJzZXIoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJmaWxlOiIgKyBidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpOwotICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSB1cmkuaW5kZXhPZignIycpOyBpbmRleCAhPSAtMTsgaW5kZXggPSB1cmkuaW5kZXhPZignIycpKSB7Ci0gICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZygwLCBpbmRleCkgKyAiJTIzIiArIHVyaS5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShidWlsZEZpbGUpOwotICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQodXJpKTsKLSAgICAgICAgICAgIHByb2plY3QubG9nKCJwYXJzaW5nIGJ1aWxkZmlsZSAiICsgYnVpbGRGaWxlICsgIiB3aXRoIFVSSSA9ICIgKyB1cmksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgc2F4UGFyc2VyLnBhcnNlKGlucHV0U291cmNlLCBuZXcgUm9vdEhhbmRsZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGFyc2VyIGhhcyBub3QgYmVlbiBjb25maWd1cmVkIGNvcnJlY3RseSIsIGV4Yyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU0FYUGFyc2VFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKGJ1aWxkRmlsZS50b1N0cmluZygpLCBleGMuZ2V0TGluZU51bWJlcigpLCBleGMuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV4Yy5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBCdWlsZEV4Y2VwdGlvbiBiZSA9IChCdWlsZEV4Y2VwdGlvbikgdDsKLSAgICAgICAgICAgICAgICBpZiAoYmUuZ2V0TG9jYXRpb24oKSA9PSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgYmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCB0LCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU0FYRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBleGMuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSB0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCksIHQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIHByb2plY3QgZmlsZSIsIGV4Yyk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29tbW9uIHN1cGVyY2xhc3MgZm9yIGFsbCBzYXggZXZlbnQgaGFuZGxlcnMgaW4gQW50LiBCYXNpY2FsbHkKLSAgICAgKiB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGVhY2ggbWV0aG9kLCBzbyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQotICAgICAqIHdoYXQgdGhleSBjYW4gaGFuZGxlLgotICAgICAqCi0gICAgICogRWFjaCB0eXBlIG9mIHhtbCBlbGVtZW50ICh0YXNrLCB0YXJnZXQsIGV0YykgaW4gYW50IHdpbGwKLSAgICAgKiBoYXZlIGl0cyBvd24gc3ViY2xhc3Mgb2YgQWJzdHJhY3RIYW5kbGVyLgotICAgICAqCi0gICAgICogSW4gdGhlIGNvbnN0cnVjdG9yLCB0aGlzIGNsYXNzICAgIHRha2VzIG92ZXIgdGhlIGhhbmRsaW5nIG9mIHNheAotICAgICAqIGV2ZW50cyBmcm9tIHRoZSBwYXJlbnQgaGFuZGxlciwgYW5kIHJldHVybnMKLSAgICAgKiBjb250cm9sIGJhY2sgdG8gdGhlIHBhcmVudCBpbiB0aGUgZW5kRWxlbWVudCBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBBYnN0cmFjdEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyQmFzZSB7Ci0gICAgICAgIHByb3RlY3RlZCBEb2N1bWVudEhhbmRsZXIgcGFyZW50SGFuZGxlcjsKLQotICAgICAgICBwdWJsaWMgQWJzdHJhY3RIYW5kbGVyKERvY3VtZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudEhhbmRsZXIgPSBwYXJlbnRIYW5kbGVyOwotCi0gICAgICAgICAgICAvLyBTdGFydCBoYW5kbGluZyBTQVggZXZlbnRzCi0gICAgICAgICAgICBwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB0YWcsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZWxlbWVudCBcIiIgKyB0YWcgKyAiXCIiLCBsb2NhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1Ziwgc3RhcnQsIGVuZCkudHJpbSgpOwotCi0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGV4dCBcIiIgKyBzICsgIlwiIiwgbG9jYXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhpcyBlbGVtZW50IGFuZCBhbGwgZWxlbWVudHMgbmVzdGVkIGludG8gaXQgaGF2ZSBiZWVuCi0gICAgICAgICAqIGhhbmRsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHt9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGZpbmlzaGVkKCk7Ci0gICAgICAgICAgICAvLyBMZXQgcGFyZW50IHJlc3VtZSBoYW5kbGluZyBTQVggZXZlbnRzCi0gICAgICAgICAgICBwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKHBhcmVudEhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciBmb3IgdGhlIHJvb3QgZWxlbWVudC4gSXQncyBvbmx5IGNoaWxkIG11c3QgYmUgdGhlICJwcm9qZWN0IiBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgUm9vdEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyQmFzZSB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHJlc29sdmUgZmlsZTogVVJJcyBhcyByZWxhdGl2ZSB0byB0aGUgYnVpbGQgZmlsZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkKSB7Ci0gICAgICAgIAotICAgICAgICAgICAgcHJvamVjdC5sb2coInJlc29sdmluZyBzeXN0ZW1JZDogIiArIHN5c3RlbUlkLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgCi0gICAgICAgICAgICBpZiAoc3lzdGVtSWQuc3RhcnRzV2l0aCgiZmlsZToiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gc3lzdGVtSWQuc3Vic3RyaW5nKDUpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHBhdGguaW5kZXhPZigiZmlsZToiKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGhhdmUgdG8gaGFuZGxlIHRoZXNlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgICAgICAgICAgLy8gc2luY2UgdGhleSBhcmUgaW4gdGhlIEZBUS4KLSAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KSArIHBhdGguc3Vic3RyaW5nKGluZGV4ICsgNSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKCJmaWxlOiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5U3lzdGVtSWQgPSBwYXRoOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKCIlMjMiKTsKLSAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZXNlIHRvICMKLSAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KSArICIjIiArIHBhdGguc3Vic3RyaW5nKGluZGV4ICsgMyk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKCIlMjMiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShidWlsZEZpbGVQYXJlbnQsIHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoImZpbGU6IiArIGVudGl0eVN5c3RlbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0U291cmNlOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSsiIGNvdWxkIG5vdCBiZSBmb3VuZCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBpZiBub3QgZmlsZSBvciBmaWxlIG5vdCBmb3VuZAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHRhZywgQXR0cmlidXRlTGlzdCBhdHRycykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICh0YWcuZXF1YWxzKCJwcm9qZWN0IikpIHsKLSAgICAgICAgICAgICAgICBuZXcgUHJvamVjdEhhbmRsZXIodGhpcykuaW5pdCh0YWcsIGF0dHJzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJDb25maWcgZmlsZSBpcyBub3Qgb2YgZXhwZWN0ZWQgWE1MIHR5cGUiLCBsb2NhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKLSAgICAgICAgICAgIFByb2plY3RIZWxwZXIudGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgZm9yIHRoZSB0b3AgbGV2ZWwgInByb2plY3QiIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBQcm9qZWN0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBQcm9qZWN0SGFuZGxlcihEb2N1bWVudEhhbmRsZXIgcGFyZW50SGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIocGFyZW50SGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpbml0KFN0cmluZyB0YWcsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVmID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhdHRycy5nZXROYW1lKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoImRlZmF1bHQiKSkgewotICAgICAgICAgICAgICAgICAgICBkZWYgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoIm5hbWUiKSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJpZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJiYXNlZGlyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZURpciA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBhdHRyaWJ1dGUgXCIiICsgYXR0cnMuZ2V0TmFtZShpKSArICJcIiIsIGxvY2F0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJUaGUgZGVmYXVsdCBhdHRyaWJ1dGUgb2YgcHJvamVjdCBpcyByZXF1aXJlZCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICBwcm9qZWN0LnNldERlZmF1bHRUYXJnZXQoZGVmKTsKLQotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2plY3Quc2V0TmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZShuYW1lLCBwcm9qZWN0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHByb2plY3QuYWRkUmVmZXJlbmNlKGlkLCBwcm9qZWN0KTsKLQotICAgICAgICAgICAgaWYgKHByb2plY3QuZ2V0UHJvcGVydHkoImJhc2VkaXIiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKHByb2plY3QuZ2V0UHJvcGVydHkoImJhc2VkaXIiKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChiYXNlRGlyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKGJ1aWxkRmlsZVBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGFuIGFic29sdXRlIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgaWYgKChuZXcgRmlsZShiYXNlRGlyKSkuaXNBYnNvbHV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoYmFzZURpcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VEaXIocHJvamVjdC5yZXNvbHZlRmlsZShiYXNlRGlyLCBidWlsZEZpbGVQYXJlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJ0YXNrZGVmIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUYXNrZGVmKG5hbWUsIGF0dHJzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInByb3BlcnR5IikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eShuYW1lLCBhdHRycyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJ0YXJnZXQiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVRhcmdldChuYW1lLCBhdHRycyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2plY3QuZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpLmdldChuYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRGF0YVR5cGUobmFtZSwgYXR0cnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZWxlbWVudCBcIiIgKyBuYW1lICsgIlwiIiwgbG9jYXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVGFza2RlZihTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRycykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIChuZXcgVGFza0hhbmRsZXIodGhpcywgbnVsbCwgbnVsbCkpLmluaXQobmFtZSwgYXR0cnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByb3BlcnR5KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgKG5ldyBUYXNrSGFuZGxlcih0aGlzLCBudWxsLCBudWxsKSkuaW5pdChuYW1lLCBhdHRycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVGFyZ2V0KFN0cmluZyB0YWcsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBuZXcgVGFyZ2V0SGFuZGxlcih0aGlzKS5pbml0KHRhZywgYXR0cnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURhdGFUeXBlKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgbmV3IERhdGFUeXBlSGFuZGxlcih0aGlzKS5pbml0KG5hbWUsIGF0dHJzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciBmb3IgInRhcmdldCIgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBUYXJnZXRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBUYXJnZXQgdGFyZ2V0OwotCi0gICAgICAgIHB1YmxpYyBUYXJnZXRIYW5kbGVyKERvY3VtZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnRIYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGluaXQoU3RyaW5nIHRhZywgQXR0cmlidXRlTGlzdCBhdHRycykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBkZXBlbmRzID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgaWZDb25kID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyB1bmxlc3NDb25kID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gYXR0cnMuZ2V0TmFtZShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKLQotICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJuYW1lIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiZGVwZW5kcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZHMgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoImlmIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWZDb25kID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJ1bmxlc3MiKSkgewotICAgICAgICAgICAgICAgICAgICB1bmxlc3NDb25kID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJpZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJkZXNjcmlwdGlvbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGF0dHJpYnV0ZSBcIiIgKyBrZXkgKyAiXCIiLCBsb2NhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oInRhcmdldCBlbGVtZW50IGFwcGVhcnMgd2l0aG91dCBhIG5hbWUgYXR0cmlidXRlIiwgbG9jYXRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhcmdldCA9IG5ldyBUYXJnZXQoKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXROYW1lKG5hbWUpOwotICAgICAgICAgICAgdGFyZ2V0LnNldElmKGlmQ29uZCk7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0VW5sZXNzKHVubGVzc0NvbmQpOwotICAgICAgICAgICAgdGFyZ2V0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIHByb2plY3QuYWRkVGFyZ2V0KG5hbWUsIHRhcmdldCk7Ci0KLSAgICAgICAgICAgIGlmIChpZCAhPSBudWxsICYmICFpZC5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKGlkLCB0YXJnZXQpOwotCi0gICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgZGVwZW5kZW5jaWVzCi0KLSAgICAgICAgICAgIGlmIChkZXBlbmRzLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGRlcGVuZHMsICIsIiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGREZXBlbmRlbmN5KHRvay5uZXh0VG9rZW4oKS50cmltKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRycykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0LmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKS5nZXQobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5ldyBEYXRhVHlwZUhhbmRsZXIodGhpcywgdGFyZ2V0KS5pbml0KG5hbWUsIGF0dHJzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3IFRhc2tIYW5kbGVyKHRoaXMsIHRhcmdldCwgdGFyZ2V0KS5pbml0KG5hbWUsIGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgZm9yIGFsbCB0YXNrIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVGFza0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIFRhcmdldCB0YXJnZXQ7Ci0gICAgICAgIHByaXZhdGUgVGFza0NvbnRhaW5lciBjb250YWluZXI7Ci0gICAgICAgIHByaXZhdGUgVGFzayB0YXNrOwotICAgICAgICBwcml2YXRlIFJ1bnRpbWVDb25maWd1cmFibGUgd3JhcHBlciA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIFRhc2tIYW5kbGVyKERvY3VtZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBUYXNrQ29udGFpbmVyIGNvbnRhaW5lciwgVGFyZ2V0IHRhcmdldCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50SGFuZGxlcik7Ci0gICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLSAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5pdChTdHJpbmcgdGFnLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0YXNrID0gcHJvamVjdC5jcmVhdGVUYXNrKHRhZyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3dhbGxvdyBoZXJlLCB3aWxsIGJlIHRocm93biBhZ2FpbiBpbiAKLSAgICAgICAgICAgICAgICAvLyBVbmtub3duRWxlbWVudC5tYXliZUNvbmZpZ3VyZSBpZiB0aGUgcHJvYmxlbSBwZXJzaXN0cy4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhc2sgPSBuZXcgVW5rbm93bkVsZW1lbnQodGFnKTsKLSAgICAgICAgICAgICAgICB0YXNrLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgdGFzay5zZXRUYXNrVHlwZSh0YWcpOwotICAgICAgICAgICAgICAgIHRhc2suc2V0VGFza05hbWUodGFnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGFzay5zZXRMb2NhdGlvbihuZXcgTG9jYXRpb24oYnVpbGRGaWxlLnRvU3RyaW5nKCksIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLCBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKSk7Ci0gICAgICAgICAgICBjb25maWd1cmVJZCh0YXNrLCBhdHRycyk7Ci0KLSAgICAgICAgICAgIC8vIFRvcCBsZXZlbCB0YXNrcyBkb24ndCBoYXZlIGFzc29jaWF0ZWQgdGFyZ2V0cwotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFzay5zZXRPd25pbmdUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkVGFzayh0YXNrKTsKLSAgICAgICAgICAgICAgICB0YXNrLmluaXQoKTsKLSAgICAgICAgICAgICAgICB3cmFwcGVyID0gdGFzay5nZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcigpOwotICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlcyhhdHRycyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRhc2suaW5pdCgpOwotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSh0YXNrLCBhdHRycywgcHJvamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLSAgICAgICAgICAgIGlmICh0YXNrICE9IG51bGwgJiYgdGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0YXNrLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFRleHQocHJvamVjdCwgdGFzaywgYnVmLCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCksIGxvY2F0b3IsIGV4Yyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyLmFkZFRleHQoYnVmLCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRycykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICh0YXNrIGluc3RhbmNlb2YgVGFza0NvbnRhaW5lcikgewotICAgICAgICAgICAgICAgIC8vIHRhc2sgY2FuIGNvbnRhaW4gb3RoZXIgdGFza3MgLSBubyBvdGhlciBuZXN0ZWQgZWxlbWVudHMgcG9zc2libGUKLSAgICAgICAgICAgICAgICBuZXcgVGFza0hhbmRsZXIodGhpcywgKFRhc2tDb250YWluZXIpdGFzaywgdGFyZ2V0KS5pbml0KG5hbWUsIGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG5ldyBOZXN0ZWRFbGVtZW50SGFuZGxlcih0aGlzLCB0YXNrLCB3cmFwcGVyLCB0YXJnZXQpLmluaXQobmFtZSwgYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciBmb3IgYWxsIG5lc3RlZCBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgTmVzdGVkRWxlbWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0IGNoaWxkOwotICAgICAgICBwcml2YXRlIFJ1bnRpbWVDb25maWd1cmFibGUgcGFyZW50V3JhcHBlcjsKLSAgICAgICAgcHJpdmF0ZSBSdW50aW1lQ29uZmlndXJhYmxlIGNoaWxkV3JhcHBlciA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgVGFyZ2V0IHRhcmdldDsKLQotICAgICAgICBwdWJsaWMgTmVzdGVkRWxlbWVudEhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyIHBhcmVudEhhbmRsZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgcGFyZW50V3JhcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudEhhbmRsZXIpOwotCi0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVGFza0FkYXB0ZXIpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCA9ICgoVGFza0FkYXB0ZXIpIHBhcmVudCkuZ2V0UHJveHkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXIgPSBwYXJlbnRXcmFwcGVyOwotICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpbml0KFN0cmluZyBwcm9wVHlwZSwgQXR0cmlidXRlTGlzdCBhdHRycykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIENsYXNzIHBhcmVudENsYXNzID0gcGFyZW50LmdldENsYXNzKCk7Ci0gICAgICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gCi0gICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIocGFyZW50Q2xhc3MpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IG5ldyBVbmtub3duRWxlbWVudChwcm9wVHlwZS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgKChVbmtub3duRWxlbWVudCkgcGFyZW50KS5hZGRDaGlsZCgoVW5rbm93bkVsZW1lbnQpIGNoaWxkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGloLmNyZWF0ZUVsZW1lbnQocHJvamVjdCwgcGFyZW50LCBwcm9wVHlwZS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb25maWd1cmVJZChjaGlsZCwgYXR0cnMpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmVudFdyYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZFdyYXBwZXIgPSBuZXcgUnVudGltZUNvbmZpZ3VyYWJsZShjaGlsZCwgcHJvcFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZFdyYXBwZXIuc2V0QXR0cmlidXRlcyhhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudFdyYXBwZXIuYWRkQ2hpbGQoY2hpbGRXcmFwcGVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUoY2hpbGQsIGF0dHJzLCBwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWguc3RvcmVFbGVtZW50KHByb2plY3QsIHBhcmVudCwgY2hpbGQsIHByb3BUeXBlLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCBsb2NhdG9yLCBleGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50V3JhcHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYWRkVGV4dChwcm9qZWN0LCBjaGlsZCwgYnVmLCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCksIGxvY2F0b3IsIGV4Yyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGlsZFdyYXBwZXIuYWRkVGV4dChidWYsIHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFza0NvbnRhaW5lcikgewotICAgICAgICAgICAgICAgIC8vIHRhc2tjb250YWluZXIgbmVzdGVkIGVsZW1lbnQgY2FuIGNvbnRhaW4gb3RoZXIgdGFza3MgLSBubyBvdGhlciAKLSAgICAgICAgICAgICAgICAvLyBuZXN0ZWQgZWxlbWVudHMgcG9zc2libGUKLSAgICAgICAgICAgICAgICBuZXcgVGFza0hhbmRsZXIodGhpcywgKFRhc2tDb250YWluZXIpY2hpbGQsIHRhcmdldCkuaW5pdChuYW1lLCBhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXcgTmVzdGVkRWxlbWVudEhhbmRsZXIodGhpcywgY2hpbGQsIGNoaWxkV3JhcHBlciwgdGFyZ2V0KS5pbml0KG5hbWUsIGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgZm9yIGFsbCBkYXRhIHR5cGVzIGF0IGdsb2JhbCBsZXZlbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIERhdGFUeXBlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgVGFyZ2V0IHRhcmdldDsKLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgZWxlbWVudDsKLSAgICAgICAgcHJpdmF0ZSBSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXIgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBEYXRhVHlwZUhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyIHBhcmVudEhhbmRsZXIpIHsKLSAgICAgICAgICAgIHRoaXMocGFyZW50SGFuZGxlciwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGF0YVR5cGVIYW5kbGVyKERvY3VtZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnRIYW5kbGVyKTsKLSAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5pdChTdHJpbmcgcHJvcFR5cGUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBwcm9qZWN0LmNyZWF0ZURhdGFUeXBlKHByb3BUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5rbm93biBkYXRhIHR5cGUgIitwcm9wVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3cmFwcGVyID0gbmV3IFJ1bnRpbWVDb25maWd1cmFibGUoZWxlbWVudCwgcHJvcFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnNldEF0dHJpYnV0ZXMoYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkRGF0YVR5cGUod3JhcHBlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlKGVsZW1lbnQsIGF0dHJzLCBwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlSWQoZWxlbWVudCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCBsb2NhdG9yLCBleGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFkZFRleHQocHJvamVjdCwgZWxlbWVudCwgYnVmLCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCBsb2NhdG9yLCBleGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgbmV3IE5lc3RlZEVsZW1lbnRIYW5kbGVyKHRoaXMsIGVsZW1lbnQsIHdyYXBwZXIsIHRhcmdldCkuaW5pdChuYW1lLCBhdHRycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlKE9iamVjdCB0YXJnZXQsIEF0dHJpYnV0ZUxpc3QgYXR0cnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiggdGFyZ2V0IGluc3RhbmNlb2YgVGFza0FkYXB0ZXIgKQotICAgICAgICAgICAgdGFyZ2V0PSgoVGFza0FkYXB0ZXIpdGFyZ2V0KS5nZXRQcm94eSgpOwotCi0gICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaWggPSAKLSAgICAgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKHRhcmdldC5nZXRDbGFzcygpKTsKLQotICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIoaWgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgLy8gcmVmbGVjdCB0aGVzZSBpbnRvIHRoZSB0YXJnZXQKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZT1yZXBsYWNlUHJvcGVydGllcyhwcm9qZWN0LCBhdHRycy5nZXRWYWx1ZShpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkgKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHByb2plY3QsIHRhcmdldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldE5hbWUoaSkudG9Mb3dlckNhc2UoKSwgdmFsdWUpOwotCi0gICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgICAgIC8vIGlkIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBleHRlcm5hbGx5Ci0gICAgICAgICAgICAgICAgaWYgKCFhdHRycy5nZXROYW1lKGkpLmVxdWFscygiaWQiKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBiZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBjb250ZW50IG9mICNQQ0RBVEEgc2VjdGlvbnMgdG8gYW4gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGV4dChQcm9qZWN0IHByb2plY3QsIE9iamVjdCB0YXJnZXQsIGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGVuZCkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgYWRkVGV4dChwcm9qZWN0LCB0YXJnZXQsIG5ldyBTdHJpbmcoYnVmLCBzdGFydCwgZW5kKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgY29udGVudCBvZiAjUENEQVRBIHNlY3Rpb25zIHRvIGFuIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFRleHQoUHJvamVjdCBwcm9qZWN0LCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgdGV4dCkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldCBpbnN0YW5jZW9mIFRhc2tBZGFwdGVyKQotICAgICAgICAgICAgdGFyZ2V0ID0gKChUYXNrQWRhcHRlcikgdGFyZ2V0KS5nZXRQcm94eSgpOwotCi0gICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKHRhcmdldC5nZXRDbGFzcygpKS5hZGRUZXh0KHByb2plY3QsIHRhcmdldCwgdGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmVzIGEgY29uZmlndXJlZCBjaGlsZCBlbGVtZW50IGludG8gaXRzIHBhcmVudCBvYmplY3QgCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlQ2hpbGQoUHJvamVjdCBwcm9qZWN0LCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQsIFN0cmluZyB0YWcpIHsKLSAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKHBhcmVudC5nZXRDbGFzcygpKTsKLSAgICAgICAgaWguc3RvcmVFbGVtZW50KHByb2plY3QsIHBhcmVudCwgY2hpbGQsIHRhZyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlcGxhY2UgJHt9IHN0eWxlIGNvbnN0cnVjdGlvbnMgaW4gdGhlIGdpdmVuIHZhbHVlIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZgotICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgdHlwZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB0byBiZSBzY2FubmVkIGZvciBwcm9wZXJ0eSByZWZlcmVuY2VzLgotICAgICAqLwotICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlUHJvcGVydGllcyhQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YWx1ZSwgSGFzaHRhYmxlIGtleXMpCi0gICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBWZWN0b3IgZnJhZ21lbnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBWZWN0b3IgcHJvcGVydHlSZWZzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBwYXJzZVByb3BlcnR5U3RyaW5nKHZhbHVlLCBmcmFnbWVudHMsIHByb3BlcnR5UmVmcyk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBFbnVtZXJhdGlvbiBpID0gZnJhZ21lbnRzLmVsZW1lbnRzKCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGogPSBwcm9wZXJ0eVJlZnMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBmcmFnbWVudCA9IChTdHJpbmcpaS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGZyYWdtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZylqLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFrZXlzLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIlByb3BlcnR5ICR7IiArIHByb3BlcnR5TmFtZSArICJ9IGhhcyBub3QgYmVlbiBzZXQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSAoa2V5cy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSA/IChTdHJpbmcpIGtleXMuZ2V0KHByb3BlcnR5TmFtZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIkeyIgKyBwcm9wZXJ0eU5hbWUgKyAifSI7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKGZyYWdtZW50KTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBwYXJzZSBhIHN0cmluZyBjb250YWluaW5nICR7dmFsdWV9IHN0eWxlIAotICAgICAqIHByb3BlcnR5IHZhbHVlcyBpbnRvIHR3byBsaXN0cy4gVGhlIGZpcnN0IGxpc3QgaXMgYSBjb2xsZWN0aW9uCi0gICAgICogb2YgdGV4dCBmcmFnbWVudHMsIHdoaWxlIHRoZSBvdGhlciBpcyBhIHNldCBvZiBzdHJpbmcgcHJvcGVydHkgbmFtZXMKLSAgICAgKiBudWxsIGVudHJpZXMgaW4gdGhlIGZpcnN0IGxpc3QgaW5kaWNhdGUgYSBwcm9wZXJ0eSByZWZlcmVuY2UgZnJvbSB0aGUKLSAgICAgKiBzZWNvbmQgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2VQcm9wZXJ0eVN0cmluZyhTdHJpbmcgdmFsdWUsIFZlY3RvciBmcmFnbWVudHMsIFZlY3RvciBwcm9wZXJ0eVJlZnMpIAotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpbnQgcHJldiA9IDA7Ci0gICAgICAgIGludCBwb3M7Ci0gICAgICAgIHdoaWxlICgocG9zID0gdmFsdWUuaW5kZXhPZigiJCIsIHByZXYpKSA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAocG9zID4gMCkgewotICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KHZhbHVlLnN1YnN0cmluZyhwcmV2LCBwb3MpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBvcyA9PSAodmFsdWUubGVuZ3RoKCkgLSAxKSkgewotICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KCIkIik7Ci0gICAgICAgICAgICAgICAgcHJldiA9IHBvcyArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5jaGFyQXQocG9zICsgMSkgIT0gJ3snICkgewotICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KHZhbHVlLnN1YnN0cmluZyhwb3MgKyAxLCBwb3MgKyAyKSk7Ci0gICAgICAgICAgICAgICAgcHJldiA9IHBvcyArIDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBlbmROYW1lID0gdmFsdWUuaW5kZXhPZignfScsIHBvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZE5hbWUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3ludGF4IGVycm9yIGluIHByb3BlcnR5OiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHZhbHVlLnN1YnN0cmluZyhwb3MgKyAyLCBlbmROYW1lKTsKLSAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkRWxlbWVudChudWxsKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVJlZnMuYWRkRWxlbWVudChwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgIHByZXYgPSBlbmROYW1lICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmV2IDwgdmFsdWUubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KHZhbHVlLnN1YnN0cmluZyhwcmV2KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IGdldFBhcnNlckZhY3RvcnkoKSB7Ci0gICAgICAgIGlmIChwYXJzZXJGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyc2VyRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FuIEF0dHJpYnV0ZUxpc3QgZm9yIHRoZSBpZCBhdHRyaWJ1dGUgYW5kIG1heWJlIGFkZCBhCi0gICAgICogcmVmZXJlbmNlIHRvIHByb2plY3QuICAKLSAgICAgKgotICAgICAqIDxwPk1vdmVkIG91dCBvZiB7QGxpbmsgI2NvbmZpZ3VyZSBjb25maWd1cmV9IHRvIG1ha2UgaXQgaGFwcGVuCi0gICAgICogYXQgcGFyc2VyIHRpbWUuPC9wPiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlSWQoT2JqZWN0IHRhcmdldCwgQXR0cmlidXRlTGlzdCBhdHRyKSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGF0dHIuZ2V0VmFsdWUoImlkIik7Ci0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZShpZCwgdGFyZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUnVudGltZUNvbmZpZ3VyYWJsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUnVudGltZUNvbmZpZ3VyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTM4ODNlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1J1bnRpbWVDb25maWd1cmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZUxpc3RJbXBsOwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgdGhhdCBob2xkcyB0aGUgYXR0cmlidXRlcyBvZiBhIFRhc2sgKG9yIGVsZW1lbnRzCi0gKiBuZXN0ZWQgYmVsb3cgdGhhdCBsZXZlbCkgYW5kIHRha2VzIGNhcmUgb2YgY29uZmlndXJpbmcgdGhhdCBlbGVtZW50Ci0gKiBhdCBydW50aW1lLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDb25maWd1cmFibGUgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWxlbWVudFRhZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgY2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBPYmplY3Qgd3JhcHBlZE9iamVjdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBdHRyaWJ1dGVMaXN0IGF0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcm94eSBUaGUgZWxlbWVudCB0byB3cmFwLgotICAgICAqLwotICAgIHB1YmxpYyBSdW50aW1lQ29uZmlndXJhYmxlKE9iamVjdCBwcm94eSwgU3RyaW5nIGVsZW1lbnRUYWcpIHsKLSAgICAgICAgd3JhcHBlZE9iamVjdCA9IHByb3h5OwotICAgICAgICB0aGlzLmVsZW1lbnRUYWcgPSBlbGVtZW50VGFnOwotICAgIH0KLQotICAgIHZvaWQgc2V0UHJveHkoT2JqZWN0IHByb3h5KSB7Ci0gICAgICAgIHdyYXBwZWRPYmplY3QgPSBwcm94eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQncyB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIHdyYXBwZWQgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZUxpc3QgYXR0cmlidXRlcykgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlTGlzdEltcGwoYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQXR0cmlidXRlTGlzdCBvZiB0aGUgd3JhcHBlZCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBBdHRyaWJ1dGVMaXN0IGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgY2hpbGQgZWxlbWVudHMgdG8gdGhlIHdyYXBwZWQgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChSdW50aW1lQ29uZmlndXJhYmxlIGNoaWxkKSB7Ci0gICAgICAgIGNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkIHdpdGggaW5kZXggPGNvZGU+aW5kZXg8L2NvZGU+LgotICAgICAqLwotICAgIFJ1bnRpbWVDb25maWd1cmFibGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiAoUnVudGltZUNvbmZpZ3VyYWJsZSkgY2hpbGRyZW4uZWxlbWVudEF0KGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgY2hhcmFjdGVycyBmcm9tICNQQ0RBVEEgYXJlYXMgdG8gdGhlIHdyYXBwZWQgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIGNoYXJhY3RlcnMuYXBwZW5kKGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBjaGFyYWN0ZXJzIGZyb20gI1BDREFUQSBhcmVhcyB0byB0aGUgd3JhcHBlZCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGFkZFRleHQobmV3IFN0cmluZyhidWYsIHN0YXJ0LCBlbmQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50VGFnOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgdGhlIHdyYXBwZWQgZWxlbWVudCBhbmQgYWxsIGNoaWxkcmVuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1heWJlQ29uZmlndXJlKFByb2plY3QgcCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQlTdHJpbmcgaWQgPSBudWxsOwotCQotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNvbmZpZ3VyZSh3cmFwcGVkT2JqZWN0LCBhdHRyaWJ1dGVzLCBwKTsKLSAgICAgICAgICAgIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFyYWN0ZXJzLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIFByb2plY3RIZWxwZXIuYWRkVGV4dChwLCB3cmFwcGVkT2JqZWN0LCBjaGFyYWN0ZXJzLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgY2hhcmFjdGVycy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgRW51bWVyYXRpb24gZW51bSA9IGNoaWxkcmVuLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIGNoaWxkID0gKFJ1bnRpbWVDb25maWd1cmFibGUpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGNoaWxkLm1heWJlQ29uZmlndXJlKHApOwotICAgICAgICAgICAgUHJvamVjdEhlbHBlci5zdG9yZUNoaWxkKHAsIHdyYXBwZWRPYmplY3QsIGNoaWxkLndyYXBwZWRPYmplY3QsIGNoaWxkLmdldEVsZW1lbnRUYWcoKS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwLmFkZFJlZmVyZW5jZShpZCwgd3JhcHBlZE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1RhcmdldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZDcyZGMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHRhcmdldCBvYmplY3Qgd2l0aCByZXF1aXJlZCBwYXJhbWV0ZXJzLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRGF2aWRzb24gPGEgaHJlZj0ibWFpbHRvOmR1bmNhbkB4MTgwLmNvbSI+ZHVuY2FuQHgxODAuY29tPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBUYXJnZXQgaW1wbGVtZW50cyBUYXNrQ29udGFpbmVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWZDb25kaXRpb24gPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyB1bmxlc3NDb25kaXRpb24gPSAiIjsKLSAgICBwcml2YXRlIFZlY3RvciBkZXBlbmRlbmNpZXMgPSBuZXcgVmVjdG9yKDIpOwotICAgIHByaXZhdGUgVmVjdG9yIGNoaWxkcmVuID0gbmV3IFZlY3Rvcig1KTsKLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlcGVuZHMoU3RyaW5nIGRlcFMpIHsKLSAgICAgICAgaWYgKGRlcFMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0KLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGRlcFMsICIsIiwgZmFsc2UpOwotICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICBhZGREZXBlbmRlbmN5KHRvay5uZXh0VG9rZW4oKS50cmltKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIHRhc2spIHsKLSAgICAgICAgY2hpbGRyZW4uYWRkRWxlbWVudCh0YXNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREYXRhVHlwZShSdW50aW1lQ29uZmlndXJhYmxlIHIpIHsKLSAgICAgICAgY2hpbGRyZW4uYWRkRWxlbWVudChyKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHNldCBvZiB0YXNrcyB0byBiZSBleGVjdXRlZCBieSB0aGlzIHRhcmdldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldCBvZiB0YXNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza1tdIGdldFRhc2tzKCkgewotICAgICAgICBWZWN0b3IgdGFza3MgPSBuZXcgVmVjdG9yKGNoaWxkcmVuLnNpemUoKSk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBjaGlsZHJlbi5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBlbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhc2spIHsKLSAgICAgICAgICAgICAgICB0YXNrcy5hZGRFbGVtZW50KG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUYXNrW10gcmV0dmFsID0gbmV3IFRhc2tbdGFza3Muc2l6ZSgpXTsKLSAgICAgICAgdGFza3MuY29weUludG8ocmV0dmFsKTsKLSAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmRlbmN5KFN0cmluZyBkZXBlbmRlbmN5KSB7Ci0gICAgICAgIGRlcGVuZGVuY2llcy5hZGRFbGVtZW50KGRlcGVuZGVuY3kpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXREZXBlbmRlbmNpZXMoKSB7Ci0gICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXMuZWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZihTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgdGhpcy5pZkNvbmRpdGlvbiA9IChwcm9wZXJ0eSA9PSBudWxsKSA/ICIiIDogcHJvcGVydHk7Ci0gICAgfQotIAotICAgIHB1YmxpYyB2b2lkIHNldFVubGVzcyhTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgdGhpcy51bmxlc3NDb25kaXRpb24gPSAocHJvcGVydHkgPT0gbnVsbCkgPyAiIiA6IHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAodGVzdElmQ29uZGl0aW9uKCkgJiYgdGVzdFVubGVzc0NvbmRpdGlvbigpKSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gY2hpbGRyZW4uZWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBlbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhc2sgdGFzayA9IChUYXNrKSBvOwotICAgICAgICAgICAgICAgICAgICB0YXNrLnBlcmZvcm0oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIHIgPSAoUnVudGltZUNvbmZpZ3VyYWJsZSkgbzsKLSAgICAgICAgICAgICAgICAgICAgci5tYXliZUNvbmZpZ3VyZShwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXRlc3RJZkNvbmRpdGlvbigpKSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZyh0aGlzLCAiU2tpcHBlZCBiZWNhdXNlIHByb3BlcnR5ICciICsgdGhpcy5pZkNvbmRpdGlvbiArICInIG5vdCBzZXQuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb2plY3QubG9nKHRoaXMsICJTa2lwcGVkIGJlY2F1c2UgcHJvcGVydHkgJyIgKyB0aGlzLnVubGVzc0NvbmRpdGlvbiArICInIHNldC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBwZXJmb3JtVGFza3MoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmZpcmVUYXJnZXRTdGFydGVkKHRoaXMpOwotICAgICAgICAgICAgZXhlY3V0ZSgpOwotICAgICAgICAgICAgcHJvamVjdC5maXJlVGFyZ2V0RmluaXNoZWQodGhpcywgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHByb2plY3QuZmlyZVRhcmdldEZpbmlzaGVkKHRoaXMsIGV4Yyk7Ci0gICAgICAgICAgICB0aHJvdyBleGM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZXBsYWNlVGFzayhVbmtub3duRWxlbWVudCBlbCwgVGFzayB0KSB7Ci0gICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICB3aGlsZSAoKGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbCkpID49IDApIHsKLSAgICAgICAgICAgIGNoaWxkcmVuLnNldEVsZW1lbnRBdCh0LCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdGVzdElmQ29uZGl0aW9uKCkgewotICAgICAgICBpZiAoIiIuZXF1YWxzKGlmQ29uZGl0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0ZXN0ID0gUHJvamVjdEhlbHBlci5yZXBsYWNlUHJvcGVydGllcyhnZXRQcm9qZWN0KCksIGlmQ29uZGl0aW9uLCBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0UHJvcGVydHkodGVzdCkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdGVzdFVubGVzc0NvbmRpdGlvbigpIHsKLSAgICAgICAgaWYgKCIiLmVxdWFscyh1bmxlc3NDb25kaXRpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdGVzdCA9IFByb2plY3RIZWxwZXIucmVwbGFjZVByb3BlcnRpZXMoZ2V0UHJvamVjdCgpLCB1bmxlc3NDb25kaXRpb24sIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRQcm9wZXJ0eSh0ZXN0KSA9PSBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzN2EwNy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgdGFza3MuCi0gKgotICogPHA+VXNlIHtAbGluayBQcm9qZWN0I2NyZWF0ZVRhc2sgUHJvamVjdC5jcmVhdGVUYXNrfSB0byBjcmVhdGUgYSBuZXcgVGFzay4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFzayBleHRlbmRzIFByb2plY3RDb21wb25lbnQgewotCi0gICAgcHJvdGVjdGVkIFRhcmdldCB0YXJnZXQgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb249bnVsbDsKLSAgICBwcm90ZWN0ZWQgTG9jYXRpb24gbG9jYXRpb24gPSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGFza05hbWUgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGFza1R5cGUgPSBudWxsOwotICAgIHByb3RlY3RlZCBSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0YXJnZXQgb2JqZWN0IG9mIHRoaXMgdGFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IGluIHdob3NlIHNjb3BlIHRoaXMgdGFzayBiZWxvbmdzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE93bmluZ1RhcmdldChUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgVGFyZ2V0IHRvIHdoaWNoIHRoaXMgdGFzayBiZWxvbmdzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0YXNrJ3MgdGFyZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBUYXJnZXQgZ2V0T3duaW5nVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG5hbWUgdG8gdXNlIGluIGxvZ2dpbmcgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byB1c2UgaW4gbG9nZ2luZyBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLnRhc2tOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgdG8gdXNlIGluIGxvZ2dpbmcgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIHRvIHVzZSBpbiBsb2dnaW5nIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFza05hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0YXNrTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG5hbWUgd2l0aCB3aGljaCB0aGUgdGFzayBoYXMgYmVlbiBpbnZva2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIG5hbWUgdGhlIHRhc2sgaGFzIGJlZW4gaW52b2tlZCBhcy4KLSAgICAgKi8KLSAgICB2b2lkIHNldFRhc2tUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudGFza1R5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKiBTZXRzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgYWN0aW9uLiBJdCB3aWxsIGJlIHVzZWZ1bGwgaW4gY29tbWVudGluZwotICAgICAqICB3aGF0IHdlIGFyZSBkb2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbiggU3RyaW5nIGRlc2MgKSB7Ci0gICAgICAgIGRlc2NyaXB0aW9uPWRlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgcHJvamVjdCB0byBsZXQgdGhlIHRhc2sgaW5pdGlhbGl6ZSBwcm9wZXJseS4gCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIHByb2plY3QgdG8gbGV0IHRoZSB0YXNrIGRvIGl0J3Mgd29yay4gVGhpcyBtZXRob2QgbWF5IGJlIAotICAgICAqIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaWYgdGhlIHRhc2sgaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZS4gRm9yIGV4YW1wbGUsIAotICAgICAqIGlmIHRhcmdldDEgYW5kIHRhcmdldDIgYm90aCBkZXBlbmQgb24gdGFyZ2V0MywgdGhlbiBydW5uaW5nIAotICAgICAqICJhbnQgdGFyZ2V0MSB0YXJnZXQyIiB3aWxsIHJ1biBhbGwgdGFza3MgaW4gdGFyZ2V0MyB0d2ljZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZXRpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24ge30KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgbG9jYXRpb24gd2hlcmUgdGhpcyB0YXNrIHdhcyBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGUgbG9jYXRpb24gd2hlcmUgdGhpcyB0YXNrIHdhcyBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVyIGNsYXNzIGZvciBydW50aW1lIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFJ1bnRpbWVDb25maWd1cmFibGUgZ2V0UnVudGltZUNvbmZpZ3VyYWJsZVdyYXBwZXIoKSB7Ci0gICAgICAgIGlmICh3cmFwcGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHdyYXBwZXIgPSBuZXcgUnVudGltZUNvbmZpZ3VyYWJsZSh0aGlzLCBnZXRUYXNrTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3JhcHBlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcihSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXIpIHsKLSAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgdGhpcyB0YXNrIC0gaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1heWJlQ29uZmlndXJlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JhcHBlci5tYXliZUNvbmZpZ3VyZShwcm9qZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dChTdHJpbmcgbGluZSkgewotICAgICAgICBsb2cobGluZSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yT3V0cHV0KFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGxvZyhsaW5lLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKiogICAKLSAgICAgKiBMb2cgYSBtZXNzYWdlIHdpdGggdGhlIGRlZmF1bHQgKElORk8pIHByaW9yaXR5LiAgIAotICAgICAqICAgCi0gICAgICogQHBhcmFtIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4gICAKLSAgICAgKi8gICAKLSAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeyAgIAotICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19JTkZPKTsgICAKLSAgICB9ICAgCi0gICAgCi0gICAgLyoqICAgCi0gICAgICogTG9nIGEgbWVzYWdlIHdpdGggdGhlIGdpdmUgcHJpb3JpdHkuICAgCi0gICAgICogICAKLSAgICAgKiBAcGFyYW0gdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiAgIAotICAgICAqIEBwYXJhbSBtc2dMZXZlbCB0aGUgbWVzc2FnZSBwcmlvcml0eSBhdCB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgdG8gYmUgbG9nZ2VkLiAgIAotICAgICAqLyAgIAotICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBpbnQgbXNnTGV2ZWwpIHsgICAKLSAgICAgICAgcHJvamVjdC5sb2codGhpcywgbXNnLCBtc2dMZXZlbCk7ICAgCi0gICAgfSAgIAotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhpcyB0YXNrCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcGVyZm9ybSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2plY3QuZmlyZVRhc2tTdGFydGVkKHRoaXMpOwotICAgICAgICAgICAgbWF5YmVDb25maWd1cmUoKTsKLSAgICAgICAgICAgIGV4ZWN1dGUoKTsKLSAgICAgICAgICAgIHByb2plY3QuZmlyZVRhc2tGaW5pc2hlZCh0aGlzLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChSdW50aW1lRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgaWYgKGV4YyBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQnVpbGRFeGNlcHRpb24gYmUgPSAoQnVpbGRFeGNlcHRpb24pIGV4YzsKLSAgICAgICAgICAgICAgICBpZiAoYmUuZ2V0TG9jYXRpb24oKSA9PSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlLnNldExvY2F0aW9uKGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2plY3QuZmlyZVRhc2tGaW5pc2hlZCh0aGlzLCBleGMpOwotICAgICAgICAgICAgdGhyb3cgZXhjOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlNDA5OC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqICBVc2UgaW50cm9zcGVjdGlvbiB0byAiYWRhcHQiIGFuIGFyYml0cmFyeSBCZWFuICggbm90IGV4dGVuZGluZyBUYXNrLCBidXQgd2l0aCBzaW1pbGFyCi0gKiAgcGF0dGVybnMpLgotICoKLSAqIEBhdXRob3IgY29zdGluQGRudC5ybwotICovCi1wdWJsaWMgY2xhc3MgVGFza0FkYXB0ZXIgZXh0ZW5kcyBUYXNrIHsKLQotICAgIE9iamVjdCBwcm94eTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEbyB0aGUgZXhlY3V0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBNZXRob2Qgc2V0UHJvamVjdE0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYyA9IHByb3h5LmdldENsYXNzKCk7Ci0gICAgICAgICAgICBzZXRQcm9qZWN0TSA9IAotICAgICAgICAgICAgICAgIGMuZ2V0TWV0aG9kKCAic2V0UHJvamVjdCIsIG5ldyBDbGFzc1tdIHtQcm9qZWN0LmNsYXNzfSk7Ci0gICAgICAgICAgICBpZihzZXRQcm9qZWN0TSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0UHJvamVjdE0uaW52b2tlKHByb3h5LCBuZXcgT2JqZWN0W10ge3Byb2plY3R9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgewotICAgICAgICAgICAgbG9nKCJFcnJvciBzZXR0aW5nIHByb2plY3QgaW4gIiArIHByb3h5LmdldENsYXNzKCksIAotICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIGV4ICk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIE1ldGhvZCBleGVjdXRlTT1udWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYz1wcm94eS5nZXRDbGFzcygpOwotICAgICAgICAgICAgZXhlY3V0ZU09Yy5nZXRNZXRob2QoICJleGVjdXRlIiwgbmV3IENsYXNzWzBdICk7Ci0gICAgICAgICAgICBpZiggZXhlY3V0ZU0gPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBsb2coIk5vIGV4ZWN1dGUgaW4gIiArIHByb3h5LmdldENsYXNzKCksIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBleGVjdXRlIGluICIgKyBwcm94eS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4ZWN1dGVNLmludm9rZShwcm94eSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm47IAotICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7Ci0gICAgICAgICAgICBsb2coIkVycm9yIGluICIgKyBwcm94eS5nZXRDbGFzcygpLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCBleCApOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB0YXJnZXQgb2JqZWN0IGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJveHkoT2JqZWN0IG8pIHsKLSAgICAgICAgdGhpcy5wcm94eSA9IG87Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm94eSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJveHkgOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbnRhaW5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NhN2RhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHdoaWNoIGNhbiBjb250YWluIHRhc2tzIAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tDb250YWluZXIgewotICAgIC8qKgotICAgICAqIEFkZCBhIHRhc2sgdG8gdGhpcyB0YXNrIGNvbnRhaW5lcgotICAgICAqCi0gICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2sgdG8gYmUgYWRkZWQgdG8gdGhpcyBjb250YWluZXIKLSAgICAgKi8KLSAgICB2b2lkIGFkZFRhc2soVGFzayB0YXNrKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVW5rbm93bkVsZW1lbnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vua25vd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NmNiN2QuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVW5rbm93bkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBXcmFwcGVyIGNsYXNzIHRoYXQgaG9sZHMgYWxsIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSB0YXNrCi0gKiB0aGF0IGRpZCBub3QgZXhpc3Qgd2hlbiBBbnQgc3RhcnRlZC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duRWxlbWVudCBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWU7Ci0gICAgcHJpdmF0ZSBUYXNrIHJlYWxUYXNrOwotICAgIHByaXZhdGUgVmVjdG9yIGNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIHB1YmxpYyBVbmtub3duRWxlbWVudCAoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFhNTCB0YWcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtYXliZUNvbmZpZ3VyZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWxUYXNrID0gbWFrZVRhc2sodGhpcywgd3JhcHBlcik7Ci0KLSAgICAgICAgd3JhcHBlci5zZXRQcm94eShyZWFsVGFzayk7Ci0gICAgICAgIHJlYWxUYXNrLnNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKHdyYXBwZXIpOwotCi0gICAgICAgIGhhbmRsZUNoaWxkcmVuKHJlYWxUYXNrLCB3cmFwcGVyKTsKLQotICAgICAgICByZWFsVGFzay5tYXliZUNvbmZpZ3VyZSgpOwotICAgICAgICB0YXJnZXQucmVwbGFjZVRhc2sodGhpcywgcmVhbFRhc2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSByZWFsIHRhc2sgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgaWYgKHJlYWxUYXNrID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHBsYWluIGltcG9zc2libGUgdG8gZ2V0IGhlcmUsIG1heWJlQ29uZmlndXJlIHNob3VsZCAKLSAgICAgICAgICAgIC8vIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSB0YXNrIG9mIHR5cGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnROYW1lLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVhbFRhc2suZXhlY3V0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKFVua25vd25FbGVtZW50IGNoaWxkKSB7Ci0gICAgICAgIGNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUNoaWxkcmVuKE9iamVjdCBwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgcGFyZW50V3JhcHBlcikgCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhc2tBZGFwdGVyKSB7Ci0gICAgICAgICAgICBwYXJlbnQgPSAoKFRhc2tBZGFwdGVyKSBwYXJlbnQpLmdldFByb3h5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyBwYXJlbnRDbGFzcyA9IHBhcmVudC5nZXRDbGFzcygpOwotICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIocGFyZW50Q2xhc3MpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIGNoaWxkV3JhcHBlciA9IHBhcmVudFdyYXBwZXIuZ2V0Q2hpbGQoaSk7Ci0gICAgICAgICAgICBVbmtub3duRWxlbWVudCBjaGlsZCA9IChVbmtub3duRWxlbWVudCkgY2hpbGRyZW4uZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgT2JqZWN0IHJlYWxDaGlsZCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVGFza0NvbnRhaW5lcikgewotICAgICAgICAgICAgICAgIHJlYWxDaGlsZCA9IG1ha2VUYXNrKGNoaWxkLCBjaGlsZFdyYXBwZXIpOwotICAgICAgICAgICAgICAgICgoVGFza0NvbnRhaW5lcikgcGFyZW50KS5hZGRUYXNrKChUYXNrKSByZWFsQ2hpbGQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFsQ2hpbGQgPSBpaC5jcmVhdGVFbGVtZW50KHByb2plY3QsIHBhcmVudCwgY2hpbGQuZ2V0VGFnKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjaGlsZFdyYXBwZXIuc2V0UHJveHkocmVhbENoaWxkKTsKLSAgICAgICAgICAgIGlmIChyZWFsQ2hpbGQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0gICAgICAgICAgICAgICAgKChUYXNrKSByZWFsQ2hpbGQpLnNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKGNoaWxkV3JhcHBlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGlsZC5oYW5kbGVDaGlsZHJlbihyZWFsQ2hpbGQsIGNoaWxkV3JhcHBlcik7Ci0gICAgICAgICAgICBpZiAocmVhbENoaWxkIGluc3RhbmNlb2YgVGFzaykgewotICAgICAgICAgICAgICAgICgoVGFzaykgcmVhbENoaWxkKS5tYXliZUNvbmZpZ3VyZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmFtZWQgdGFzayBhbmQgY29uZmlndXJlIGl0IHVwIHRvIHRoZSBpbml0KCkgc3RhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhc2sgbWFrZVRhc2soVW5rbm93bkVsZW1lbnQgdWUsIFJ1bnRpbWVDb25maWd1cmFibGUgdykgewotICAgICAgICBUYXNrIHRhc2sgPSBwcm9qZWN0LmNyZWF0ZVRhc2sodWUuZ2V0VGFnKCkpOwotICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBjcmVhdGUgdGFzayBvZiB0eXBlOiAiICsgZWxlbWVudE5hbWUgKyAiIENvbW1vbiBzb2x1dGlvbnMiICsKLSAgICAgICAgICAgICAgICAiIGFyZSBhZGRpbmcgdGhlIHRhc2sgdG8gZGVmYXVsdHMucHJvcGVydGllcyBhbmQgZXhlY3V0aW5nIGJpbi9ib290c3RyYXAiLAotICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSB0YXNrIG9mIHR5cGU6ICIgKyBlbGVtZW50TmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gQ29tbW9uIHNvbHV0aW9ucyBhcmUgdG8gdXNlIHRhc2tkZWYgdG8gZGVjbGFyZSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgeW91ciB0YXNrLCBvciwgaWYgdGhpcyBpcyBhbiBvcHRpb25hbCB0YXNrLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gcHV0IHRoZSBvcHRpb25hbC5qYXIgaW4gdGhlIGxpYiBkaXJlY3Rvcnkgb2YiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHlvdXIgYW50IGluc3RhbGxhdGlvbiAoQU5UX0hPTUUpLiIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRhc2suc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIFN0cmluZyBpZCA9IHcuZ2V0QXR0cmlidXRlcygpLmdldFZhbHVlKCJpZCIpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoaWQsIHRhc2spOwotICAgICAgICB9Ci0gICAgICAgIC8vIFVua25vd25FbGVtZW50IGFsd2F5cyBoYXMgYW4gYXNzb2NpYXRlZCB0YXJnZXQKLSAgICAgICAgdGFzay5zZXRPd25pbmdUYXJnZXQodGFyZ2V0KTsKLQotICAgICAgICB0YXNrLmluaXQoKTsKLSAgICAgICAgcmV0dXJuIHRhc2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lIHRvIHVzZSBpbiBsb2dnaW5nIG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSB0byB1c2UgaW4gbG9nZ2luZyBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhc2tOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVhbFRhc2sgPT0gbnVsbCA/IHN1cGVyLmdldFRhc2tOYW1lKCkgOiByZWFsVGFzay5nZXRUYXNrTmFtZSgpOwotICAgIH0KLQotfS8vIFVua25vd25FbGVtZW50CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9YbWxMb2dnZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1htbExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2Q1NzNkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1htbExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NRWxlbWVudFdyaXRlcjsKLQotLyoqCi0gKiAgR2VuZXJhdGVzIGEgImxvZy54bWwiIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpdGgKLSAqICBhbiBYTUwgZGVzY3JpcHRpb24gb2Ygd2hhdCBoYXBwZW5lZCBkdXJpbmcgYSBidWlsZC4KLSAqCi0gKiAgQHNlZSBQcm9qZWN0I2FkZEJ1aWxkTGlzdGVuZXIoQnVpbGRMaXN0ZW5lcikKLSAqLwotcHVibGljIGNsYXNzIFhtbExvZ2dlciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBnZXREb2N1bWVudEJ1aWxkZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IoZXhjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFhNTCBjb25zdGFudHMgZm9yIHRhZyBuYW1lcyBhbmQgYXR0cmlidXRlIG5hbWVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1RBRyA9ICJidWlsZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9UQUcgPSAidGFyZ2V0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUcgPSAidGFzayI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfVEFHID0gIm1lc3NhZ2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFIgPSAibmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVfQVRUUiA9ICJ0aW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfQVRUUiA9ICJwcmlvcml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0FUVFIgPSAibG9jYXRpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9BVFRSID0gImVycm9yIjsKLQotICAgIHByaXZhdGUgRG9jdW1lbnQgZG9jOwotICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhc2tzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhcmdldHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGhyZWFkU3RhY2tzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgVGltZWRFbGVtZW50IGJ1aWxkRWxlbWVudCA9IG51bGw7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUaW1lZEVsZW1lbnQgewotICAgICAgICBsb25nIHN0YXJ0VGltZTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgbmV3IEJ1aWxkTGlzdGVuZXIgdGhhdCBsb2dzIGJ1aWxkIGV2ZW50cyB0byBhbiBYTUwgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sTG9nZ2VyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGJ1aWxkRWxlbWVudCA9IG5ldyBUaW1lZEVsZW1lbnQoKTsKLSAgICAgICAgYnVpbGRFbGVtZW50LnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIGRvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgYnVpbGRFbGVtZW50LmVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChCVUlMRF9UQUcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBsb25nIHRvdGFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYnVpbGRFbGVtZW50LnN0YXJ0VGltZTsKLSAgICAgICAgYnVpbGRFbGVtZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKFRJTUVfQVRUUiwgRGVmYXVsdExvZ2dlci5mb3JtYXRUaW1lKHRvdGFsVGltZSkpOwotCi0gICAgICAgIGlmIChldmVudC5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWlsZEVsZW1lbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGUoRVJST1JfQVRUUiwgZXZlbnQuZ2V0RXhjZXB0aW9uKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG91dEZpbGVuYW1lID0gCi0gICAgICAgICAgICAgICAgZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJYbWxMb2dnZXIuZmlsZSIpOwotCi0gICAgICAgICAgICBpZiAob3V0RmlsZW5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dEZpbGVuYW1lID0gImxvZy54bWwiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzcGVjaWZ5IG91dHB1dCBpbiBVVEY4IG90aGVyd2lzZSBhY2NlbnRlZCBjaGFyYWN0ZXJzIHdpbGwgYmxvdwotICAgICAgICAgICAgLy8gdXAgZXZlcnl0aGluZwotICAgICAgICAgICAgV3JpdGVyIG91dCA9Ci0gICAgICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVRGOCIpOwotICAgICAgICAgICAgb3V0LndyaXRlKCI8P3htbDpzdHlsZXNoZWV0IHR5cGU9XCJ0ZXh0L3hzbFwiIGhyZWY9XCJsb2cueHNsXCI/PlxuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAobmV3IERPTUVsZW1lbnRXcml0ZXIoKSkud3JpdGUoYnVpbGRFbGVtZW50LmVsZW1lbnQsIG91dCwgMCwgIlx0Iik7Ci0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBjbG9zZSBsb2cgZmlsZSIsIGV4Yyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRFbGVtZW50ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0YWNrIGdldFN0YWNrKCkgeyAgICAKLSAgICAgICAgU3RhY2sgdGhyZWFkU3RhY2sgPSAoU3RhY2spdGhyZWFkU3RhY2tzLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLSAgICAgICAgaWYgKHRocmVhZFN0YWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocmVhZFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgICAgICB0aHJlYWRTdGFja3MucHV0KFRocmVhZC5jdXJyZW50VGhyZWFkKCksIHRocmVhZFN0YWNrKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhyZWFkU3RhY2s7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gZXZlbnQuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIFRpbWVkRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gbmV3IFRpbWVkRWxlbWVudCgpOwotICAgICAgICB0YXJnZXRFbGVtZW50LnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB0YXJnZXRFbGVtZW50LmVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChUQVJHRVRfVEFHKTsKLSAgICAgICAgdGFyZ2V0RWxlbWVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShOQU1FX0FUVFIsIHRhcmdldC5nZXROYW1lKCkpOwotICAgICAgICB0YXJnZXRzLnB1dCh0YXJnZXQsIHRhcmdldEVsZW1lbnQpOwotICAgICAgICBnZXRTdGFjaygpLnB1c2godGFyZ2V0RWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gZXZlbnQuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIFRpbWVkRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKFRpbWVkRWxlbWVudCl0YXJnZXRzLmdldCh0YXJnZXQpOwotICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIHRvdGFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGFyZ2V0RWxlbWVudC5zdGFydFRpbWU7Ci0gICAgICAgICAgICB0YXJnZXRFbGVtZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKFRJTUVfQVRUUiwgRGVmYXVsdExvZ2dlci5mb3JtYXRUaW1lKHRvdGFsVGltZSkpOwotCi0gICAgICAgICAgICBUaW1lZEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7ICAgICAgICAgICAgCi0gICAgICAgICAgICBTdGFjayB0aHJlYWRTdGFjayA9IGdldFN0YWNrKCk7Ci0gICAgICAgICAgICBpZiAoIXRocmVhZFN0YWNrLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBUaW1lZEVsZW1lbnQgcG9wcGVkU3RhY2sgPSAoVGltZWRFbGVtZW50KXRocmVhZFN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgIGlmIChwb3BwZWRTdGFjayAhPSB0YXJnZXRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNaXNtYXRjaCAtIHBvcHBlZCBlbGVtZW50ID0gIiArIHBvcHBlZFN0YWNrLmVsZW1lbnQgKwotICAgICAgICAgICAgICAgICAgICAiIGZpbmlzaGVkIHRhc2sgZWxlbWVudCA9ICIgKyB0YXJnZXRFbGVtZW50LmVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCF0aHJlYWRTdGFjay5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSAoVGltZWRFbGVtZW50KXRocmVhZFN0YWNrLnBlZWsoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRFbGVtZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQodGFyZ2V0RWxlbWVudC5lbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQodGFyZ2V0RWxlbWVudC5lbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOwotICAgICAgICBUaW1lZEVsZW1lbnQgdGFza0VsZW1lbnQgPSBuZXcgVGltZWRFbGVtZW50KCk7Ci0gICAgICAgIHRhc2tFbGVtZW50LnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB0YXNrRWxlbWVudC5lbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoVEFTS19UQUcpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB0YXNrLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBpbnQgcG9zID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICBpZiAocG9zICE9IC0xKSB7Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGFza0VsZW1lbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGUoTkFNRV9BVFRSLCBuYW1lKTsKLSAgICAgICAgdGFza0VsZW1lbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGUoTE9DQVRJT05fQVRUUiwgZXZlbnQuZ2V0VGFzaygpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHRhc2tzLnB1dCh0YXNrLCB0YXNrRWxlbWVudCk7Ci0gICAgICAgIGdldFN0YWNrKCkucHVzaCh0YXNrRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOwotICAgICAgICBUaW1lZEVsZW1lbnQgdGFza0VsZW1lbnQgPSAoVGltZWRFbGVtZW50KXRhc2tzLmdldCh0YXNrKTsKLSAgICAgICAgaWYgKHRhc2tFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgdG90YWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0YXNrRWxlbWVudC5zdGFydFRpbWU7Ci0gICAgICAgICAgICB0YXNrRWxlbWVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShUSU1FX0FUVFIsIERlZmF1bHRMb2dnZXIuZm9ybWF0VGltZSh0b3RhbFRpbWUpKTsKLSAgICAgICAgICAgIFRhcmdldCB0YXJnZXQgPSB0YXNrLmdldE93bmluZ1RhcmdldCgpOwotICAgICAgICAgICAgVGltZWRFbGVtZW50IHRhcmdldEVsZW1lbnQgPSAoVGltZWRFbGVtZW50KXRhcmdldHMuZ2V0KHRhcmdldCk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRFbGVtZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQodGFza0VsZW1lbnQuZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQodGFza0VsZW1lbnQuZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdGFjayB0aHJlYWRTdGFjayA9IGdldFN0YWNrKCk7Ci0gICAgICAgICAgICBpZiAoIXRocmVhZFN0YWNrLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBUaW1lZEVsZW1lbnQgcG9wcGVkU3RhY2sgPSAoVGltZWRFbGVtZW50KXRocmVhZFN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgIGlmIChwb3BwZWRTdGFjayAhPSB0YXNrRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzbWF0Y2ggLSBwb3BwZWQgZWxlbWVudCA9ICIgKyBwb3BwZWRTdGFjay5lbGVtZW50ICsKLSAgICAgICAgICAgICAgICAgICAgIiBmaW5pc2hlZCB0YXNrIGVsZW1lbnQgPSAiICsgdGFza0VsZW1lbnQuZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBFbGVtZW50IG1lc3NhZ2VFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoTUVTU0FHRV9UQUcpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gImRlYnVnIjsKLSAgICAgICAgc3dpdGNoKGV2ZW50LmdldFByaW9yaXR5KCkpIHsKLSAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfRVJSOiBuYW1lID0gImVycm9yIjsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX1dBUk46IG5hbWUgPSAid2FybiI7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQcm9qZWN0Lk1TR19JTkZPOiBuYW1lID0gImluZm8iOyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IG5hbWUgPSAiZGVidWciOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlRWxlbWVudC5zZXRBdHRyaWJ1dGUoUFJJT1JJVFlfQVRUUiwgbmFtZSk7Ci0KLSAgICAgICAgVGV4dCBtZXNzYWdlVGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShldmVudC5nZXRNZXNzYWdlKCkpOwotICAgICAgICBtZXNzYWdlRWxlbWVudC5hcHBlbmRDaGlsZChtZXNzYWdlVGV4dCk7Ci0KLSAgICAgICAgVGltZWRFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOwotICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gZXZlbnQuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGlmICh0YXNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSAoVGltZWRFbGVtZW50KXRhc2tzLmdldCh0YXNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyZW50RWxlbWVudCA9PSBudWxsICYmIHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJlbnRFbGVtZW50ID0gKFRpbWVkRWxlbWVudCl0YXJnZXRzLmdldCh0YXJnZXQpOwotICAgICAgICB9Ci0gICAgICAgICAKLSAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RhY2sgdGhyZWFkU3RhY2sgPSAoU3RhY2spdGhyZWFkU3RhY2tzLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLSAgICAgICAgICAgIGlmICh0aHJlYWRTdGFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0aHJlYWRTdGFjay5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSAoVGltZWRFbGVtZW50KXRocmVhZFN0YWNrLnBlZWsoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuZWxlbWVudC5hcHBlbmRDaGlsZChtZXNzYWdlRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBidWlsZEVsZW1lbnQuZWxlbWVudC5hcHBlbmRDaGlsZChtZXNzYWdlRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2RlZmF1bHRNYW5pZmVzdC5tZiBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2RlZmF1bHRNYW5pZmVzdC5tZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1Njc4Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kZWZhdWx0TWFuaWZlc3QubWYKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogQW50IEBWRVJTSU9OQAotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Mb2c0akxpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Mb2c0akxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2NkN2YuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvTG9nNGpMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuTnVsbEVudW1lcmF0aW9uOwotCi0gIAotLyoqCi0gKiAgTGlzdGVuZXIgd2hpY2ggc2VuZHMgZXZlbnRzIHRvIExvZzRqIGxvZ2dpbmcgc3lzdGVtCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZz5Db25vciBNYWNOZWlsbCA8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb2c0akxpc3RlbmVyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0c0Sl9DT05GSUdfUFJPUEVSVFkgPSAibG9nNGouY29uZmlndXJhdGlvbiI7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgCi0gICAgcHVibGljIExvZzRqTGlzdGVuZXIoKSB7Ci0gICAgICAgIGluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKCJvcmcuYXBhY2hlLnRvb2xzLmFudCIpOwotICAgICAgICBDYXRlZ29yeSByb290Q2F0ID0gQ2F0ZWdvcnkuZ2V0Um9vdCgpOwotICAgICAgICBpZiAoIShyb290Q2F0LmdldEFsbEFwcGVuZGVycygpIGluc3RhbmNlb2YgTnVsbEVudW1lcmF0aW9uKSkgewotICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2F0LmVycm9yKCJObyBsb2c0ai5wcm9wZXJ0aWVzIGluIGJ1aWxkIGFyZWEiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKFByb2plY3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNhdC5pbmZvKCJCdWlsZCBzdGFydGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKFByb2plY3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRFeGNlcHRpb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2F0LmluZm8oIkJ1aWxkIGZpbmlzaGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2F0LmVycm9yKCJCdWlsZCBmaW5pc2hlZCB3aXRoIGVycm9yLiIsIGV2ZW50LmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShUYXJnZXQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNhdC5pbmZvKCJUYXJnZXQgXCIiICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpICsgIlwiIHN0YXJ0ZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoVGFyZ2V0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhdC5pbmZvKCJUYXJnZXQgXCIiICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpICsgIlwiIGZpbmlzaGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2F0LmVycm9yKCJUYXJnZXQgXCIiICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpICsgIlwiIGZpbmlzaGVkIHdpdGggZXJyb3IuIiwgZXZlbnQuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChpbml0aWFsaXplZCkgewotICAgICAgICAgICAgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOwotICAgICAgICAgICAgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UodGFzay5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjYXQuaW5mbygiVGFzayBcIiIgKyB0YXNrLmdldFRhc2tOYW1lKCkgKyAiXCIgc3RhcnRlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIFRhc2sgdGFzayA9IGV2ZW50LmdldFRhc2soKTsKLSAgICAgICAgICAgIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKHRhc2suZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKGV2ZW50LmdldEV4Y2VwdGlvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYXQuaW5mbygiVGFzayBcIiIgKyB0YXNrLmdldFRhc2tOYW1lKCkgKyAiXCIgZmluaXNoZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYXQuZXJyb3IoIlRhc2sgXCIiICsgdGFzay5nZXRUYXNrTmFtZSgpICsgIlwiIGZpbmlzaGVkIHdpdGggZXJyb3IuIiwgZXZlbnQuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIE9iamVjdCBjYXRlZ29yeU9iamVjdCA9IGV2ZW50LmdldFRhc2soKTsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeU9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnlPYmplY3QgPSBldmVudC5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeU9iamVjdCA9IGV2ZW50LmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKGNhdGVnb3J5T2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0UHJpb3JpdHkoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfRVJSOgotICAgICAgICAgICAgICAgICAgICBjYXQuZXJyb3IoZXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQcm9qZWN0Lk1TR19XQVJOOgotICAgICAgICAgICAgICAgICAgICBjYXQud2FybihldmVudC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX0lORk86Ci0gICAgICAgICAgICAgICAgICAgIGNhdC5pbmZvKGV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfVkVSQk9TRToKLSAgICAgICAgICAgICAgICAgICAgY2F0LmRlYnVnKGV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfREVCVUc6Ci0gICAgICAgICAgICAgICAgICAgIGNhdC5kZWJ1ZyhldmVudC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBjYXQuZXJyb3IoZXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTY2YTQ4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBDYWxsIEFudCBpbiBhIHN1Yi1wcm9qZWN0Ci0gKgotICogIDxwcmU+Ci0gKiAgICA8dGFyZ2V0IG5hbWU9ImZvbyIgZGVwZW5kcz0iaW5pdCI+Ci0gKiAgICA8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgdGFyZ2V0PSJiYXIiID4KLSAqICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5MSIgdmFsdWU9ImFhYWFhIiAvPgotICogICAgICA8cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iYmF6IiAvPgotICogICAgIDwvYW50PgotICogIDwvdGFyZ2V0PgotICoKLSAqIDx0YXJnZXQgbmFtZT0iYmFyIiBkZXBlbmRzPSJpbml0Ij4KLSAqICAgIDxlY2hvIG1lc3NhZ2U9InByb3AgaXMgJHtwcm9wZXJ0eTF9ICR7Zm9vfSIgLz4KLSAqIDwvdGFyZ2V0PgotICogPC9wcmU+Ci0gKgotICoKLSAqIEBhdXRob3IgY29zdGluQGRudC5ybwotICovCi1wdWJsaWMgY2xhc3MgQW50IGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcml2YXRlIEZpbGUgZGlyID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBhbnRGaWxlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXRBbGwgPSB0cnVlOwotCi0gICAgVmVjdG9yIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgUHJvamVjdCBwMTsKLQotICAgIC8qKgotICAgICAqIElmIHRydWUsIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBwYXJlbnQgUHJvamVjdAotICAgICAqIElmIGZhbHNlLCBpbmhlcml0IG9ubHkgdXNlclByb3BlcnRpZXMgYW5kIHRob3NlIGRlZmluZWQKLSAgICAgKiBpbnNpZGUgdGhlIGFudCBjYWxsIGl0c2VsZgotICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmhlcml0QWxsKGJvb2xlYW4gaW5oZXJpdCkgewotICAgICAgIGluaGVyaXRBbGwgPSBpbmhlcml0OwotICAgIH0gLy8tLSBzZXRJbmhlcml0QWxsCi0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICBwMSA9IG5ldyBQcm9qZWN0KCk7Ci0gICAgICAgIHAxLnNldEphdmFWZXJzaW9uUHJvcGVydHkoKTsKLSAgICAgICAgcDEuYWRkVGFza0RlZmluaXRpb24oInByb3BlcnR5IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGFzcylwcm9qZWN0LmdldFRhc2tEZWZpbml0aW9ucygpLmdldCgicHJvcGVydHkiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlaW5pdCgpIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8cHJvcGVydGllcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHkgcCA9IChQcm9wZXJ0eSkgcHJvcGVydGllcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBQcm9wZXJ0eSBuZXdQID0gKFByb3BlcnR5KSBwMS5jcmVhdGVUYXNrKCJwcm9wZXJ0eSIpOwotICAgICAgICAgICAgbmV3UC5zZXROYW1lKHAuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChwLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5ld1Auc2V0VmFsdWUocC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwLmdldEZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbmV3UC5zZXRGaWxlKHAuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBpZiAocC5nZXRSZXNvdXJjZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuZXdQLnNldFJlc291cmNlKHAuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnNldEVsZW1lbnRBdChuZXdQLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJvamVjdCgpIHsKLSAgICAgICAgVmVjdG9yIGxpc3RlbmVycyA9IHByb2plY3QuZ2V0QnVpbGRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHAxLmFkZEJ1aWxkTGlzdGVuZXIoKEJ1aWxkTGlzdGVuZXIpbGlzdGVuZXJzLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dCkpOwotICAgICAgICAgICAgICAgIERlZmF1bHRMb2dnZXIgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTsKLSAgICAgICAgICAgICAgICBsb2dnZXIuc2V0TWVzc2FnZU91dHB1dExldmVsKFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgICAgIGxvZ2dlci5zZXRPdXRwdXRQcmludFN0cmVhbShvdXQpOwotICAgICAgICAgICAgICAgIGxvZ2dlci5zZXRFcnJvclByaW50U3RyZWFtKG91dCk7Ci0gICAgICAgICAgICAgICAgcDEuYWRkQnVpbGRMaXN0ZW5lcihsb2dnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4ICkgewotICAgICAgICAgICAgICAgIGxvZyggIkFudDogQ2FuJ3Qgc2V0IG91dHB1dCB0byAiICsgb3V0cHV0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBIYXNodGFibGUgdGFza2RlZnMgPSBwcm9qZWN0LmdldFRhc2tEZWZpbml0aW9ucygpOwotICAgICAgICBFbnVtZXJhdGlvbiBldCA9IHRhc2tkZWZzLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGV0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGFza05hbWUgPSAoU3RyaW5nKSBldC5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgQ2xhc3MgdGFza0NsYXNzID0gKENsYXNzKSB0YXNrZGVmcy5nZXQodGFza05hbWUpOwotICAgICAgICAgICAgcDEuYWRkVGFza0RlZmluaXRpb24odGFza05hbWUsIHRhc2tDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBIYXNodGFibGUgdHlwZWRlZnMgPSBwcm9qZWN0LmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IHR5cGVkZWZzLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIENsYXNzIHR5cGVDbGFzcyA9IChDbGFzcykgdHlwZWRlZnMuZ2V0KHR5cGVOYW1lKTsKLSAgICAgICAgICAgIHAxLmFkZERhdGFUeXBlRGVmaW5pdGlvbih0eXBlTmFtZSwgdHlwZUNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB1c2VyLWRlZmluZWQgb3IgYWxsIHByb3BlcnRpZXMgZnJvbSBjYWxsaW5nIHByb2plY3QKLSAgICAgICAgSGFzaHRhYmxlIHByb3AxOwotICAgICAgICBpZiAoaW5oZXJpdEFsbCA9PSB0cnVlKSB7Ci0gICAgICAgICAgIHByb3AxID0gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgIHByb3AxID0gcHJvamVjdC5nZXRVc2VyUHJvcGVydGllcygpOwotCi0gICAgICAgICAgIC8vIHNldCBKYXZhIGJ1aWx0LWluIHByb3BlcnRpZXMgc2VwYXJhdGVseSwKLSAgICAgICAgICAgLy8gYi9jIHdlIHdvbid0IGluaGVyaXQgdGhlbS4KLSAgICAgICAgICAgcHJvamVjdC5zZXRTeXN0ZW1Qcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGUgPSBwcm9wMS5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcHJvcDEuZ2V0KGFyZyk7Ci0gICAgICAgICAgICBpZiAoaW5oZXJpdEFsbCA9PSB0cnVlKQotICAgICAgICAgICAgICAgcDEuc2V0UHJvcGVydHkoYXJnLCB2YWx1ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBwMS5zZXRVc2VyUHJvcGVydHkoYXJnLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPdXRwdXQoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKHAxICE9IG51bGwpIHsKLSAgICAgICAgICAgIHAxLmRlbXV4T3V0cHV0KGxpbmUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZU91dHB1dChsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgbGluZSkgewotICAgICAgICBpZiAocDEgIT0gbnVsbCkgewotICAgICAgICAgICAgcDEuZGVtdXhPdXRwdXQobGluZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVFcnJvck91dHB1dChsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEbyB0aGUgZXhlY3V0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHAxID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWluaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICBpZihkaXIgPT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgZGlyID0gcHJvamVjdC5nZXRCYXNlRGlyKCk7Ci0KLSAgICAgICAgICAgIGluaXRpYWxpemVQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgIHAxLnNldEJhc2VEaXIoZGlyKTsKLSAgICAgICAgICAgIHAxLnNldFVzZXJQcm9wZXJ0eSgiYmFzZWRpciIgLCBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBPdmVycmlkZSB3aXRoIGxvY2FsLWRlZmluZWQgcHJvcGVydGllcwotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHByb3BlcnRpZXMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHkgcD0oUHJvcGVydHkpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBwLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGFudEZpbGUgPT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgYW50RmlsZSA9ICJidWlsZC54bWwiOwotCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShhbnRGaWxlKTsKLSAgICAgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgICAgICBhbnRGaWxlID0gKG5ldyBGaWxlKGRpciwgYW50RmlsZSkpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgIGZpbGUgPSAobmV3IEZpbGUoYW50RmlsZSkpIDsKLSAgICAgICAgICAgICAgICBpZiggISBmaWxlLmlzRmlsZSgpICkgewotICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCdWlsZCBmaWxlICIgKyBmaWxlICsgIiBub3QgZm91bmQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwMS5zZXRVc2VyUHJvcGVydHkoICJhbnQuZmlsZSIgLCBhbnRGaWxlICk7Ci0gICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNvbmZpZ3VyZVByb2plY3QocDEsIG5ldyBGaWxlKGFudEZpbGUpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcDEuZ2V0RGVmYXVsdFRhcmdldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBcmUgd2UgdHJ5aW5nIHRvIGNhbGwgdGhlIHRhcmdldCBpbiB3aGljaCB3ZSBhcmUgZGVmaW5lZD8KLSAgICAgICAgICAgIGlmIChwMS5nZXRCYXNlRGlyKCkuZXF1YWxzKHByb2plY3QuZ2V0QmFzZURpcigpKSAmJgotICAgICAgICAgICAgICAgIHAxLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpLmVxdWFscyhwcm9qZWN0LmdldFByb3BlcnR5KCJhbnQuZmlsZSIpKSAmJgotICAgICAgICAgICAgICAgIGdldE93bmluZ1RhcmdldCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICB0YXJnZXQuZXF1YWxzKHRoaXMuZ2V0T3duaW5nVGFyZ2V0KCkuZ2V0TmFtZSgpKSkgeyAKLQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYW50IHRhc2sgY2FsbGluZyBpdHMgb3duIHBhcmVudCB0YXJnZXQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcDEuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gaGVscCB0aGUgZ2MKLSAgICAgICAgICAgIHAxID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGQpIHsKLSAgICAgICAgdGhpcy5kaXIgPSBkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFudGZpbGUoU3RyaW5nIHMpIHsKLSAgICAgICAgdGhpcy5hbnRGaWxlID0gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHMpIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSBzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgcykgewotICAgICAgICB0aGlzLm91dHB1dCA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCkgewotICAgICAgICBpZiAocDEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVpbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eSBwPShQcm9wZXJ0eSlwMS5jcmVhdGVUYXNrKCJwcm9wZXJ0eSIpOwotICAgICAgICBwLnNldFVzZXJQcm9wZXJ0eSh0cnVlKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGRFbGVtZW50KCBwICk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFN0cnVjdHVyZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50U3RydWN0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNTc2NTkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50U3RydWN0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkludHJvc3BlY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIENyZWF0ZXMgYSBwYXJ0aWFsIERURCBmb3IgQW50IGZyb20gdGhlIGN1cnJlbnRseSBrbm93biB0YXNrcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi0KLXB1YmxpYyBjbGFzcyBBbnRTdHJ1Y3R1cmUgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBCT09MRUFOID0gIiVib29sZWFuOyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFTS1MgPSAiJXRhc2tzOyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVFlQRVMgPSAiJXR5cGVzOyI7Ci0KLSAgICBwcml2YXRlIEhhc2h0YWJsZSB2aXNpdGVkID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dDsKLQotICAgIC8qKgotICAgICAqIFRoZSBvdXRwdXQgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoRmlsZSBvdXRwdXQpIHsKLSAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm91dHB1dCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFByaW50V3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dCksICJVVEY4IikpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogUGxhaW4gaW1wb3NzaWJsZSB3aXRoIFVURjgsIHNlZQotICAgICAgICAgICAgICAgICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiBmYWxsYmFjayB0byBwbGF0Zm9ybSBzcGVjaWZpYyBhbnl3YXkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKG91dHB1dCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmludEhlYWQob3V0LCBwcm9qZWN0LmdldFRhc2tEZWZpbml0aW9ucygpLmtleXMoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXREYXRhVHlwZURlZmluaXRpb25zKCkua2V5cygpKTsKLQotICAgICAgICAgICAgcHJpbnRUYXJnZXREZWNsKG91dCk7Ci0KLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGRhdGFUeXBlcyA9IHByb2plY3QuZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpLmtleXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChkYXRhVHlwZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAoU3RyaW5nKSBkYXRhVHlwZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBwcmludEVsZW1lbnREZWNsKG91dCwgdHlwZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzKSBwcm9qZWN0LmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKS5nZXQodHlwZU5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRW51bWVyYXRpb24gdGFza3MgPSBwcm9qZWN0LmdldFRhc2tEZWZpbml0aW9ucygpLmtleXMoKTsKLSAgICAgICAgICAgIHdoaWxlICh0YXNrcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0YXNrTmFtZSA9IChTdHJpbmcpIHRhc2tzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRFbGVtZW50RGVjbChvdXQsIHRhc2tOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGFzcykgcHJvamVjdC5nZXRUYXNrRGVmaW5pdGlvbnMoKS5nZXQodGFza05hbWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpbnRUYWlsKG91dCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHdyaXRpbmcgIitvdXRwdXQuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9lLCBsb2NhdGlvbik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludEhlYWQoUHJpbnRXcml0ZXIgb3V0LCBFbnVtZXJhdGlvbiB0YXNrcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiB0eXBlcykgewotICAgICAgICBvdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiID8+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCI8IUVOVElUWSAlIGJvb2xlYW4gXCIodHJ1ZXxmYWxzZXxvbnxvZmZ8eWVzfG5vKVwiPiIpOwotICAgICAgICBvdXQucHJpbnQoIjwhRU5USVRZICUgdGFza3MgXCIiKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIHdoaWxlICh0YXNrcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHRhc2tOYW1lID0gKFN0cmluZykgdGFza3MubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiB8ICIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50KHRhc2tOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbigiXCI+Iik7Ci0gICAgICAgIG91dC5wcmludCgiPCFFTlRJVFkgJSB0eXBlcyBcIiIpOwotICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAgIHdoaWxlICh0eXBlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gKFN0cmluZykgdHlwZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiB8ICIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50KHR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbigiXCI+Iik7Ci0KLSAgICAgICAgb3V0LnByaW50bG4oIiIpOwotICAgICAgICAKLSAgICAgICAgb3V0LnByaW50KCI8IUVMRU1FTlQgcHJvamVjdCAodGFyZ2V0IHwgcHJvcGVydHkgfCB0YXNrZGVmIHwgIik7Ci0gICAgICAgIG91dC5wcmludChUWVBFUyk7Ci0gICAgICAgIG91dC5wcmludGxuKCIpKj4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oIjwhQVRUTElTVCBwcm9qZWN0Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgbmFtZSAgICBDREFUQSAjUkVRVUlSRUQiKTsKLSAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICBkZWZhdWx0IENEQVRBICNSRVFVSVJFRCIpOwotICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICAgIGJhc2VkaXIgQ0RBVEEgI0lNUExJRUQ+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRUYXJnZXREZWNsKFByaW50V3JpdGVyIG91dCkgewotICAgICAgICBvdXQucHJpbnQoIjwhRUxFTUVOVCB0YXJnZXQgKCIpOwotICAgICAgICBvdXQucHJpbnQoVEFTS1MpOwotICAgICAgICBvdXQucHJpbnQoIiB8ICIpOwotICAgICAgICBvdXQucHJpbnQoVFlQRVMpOwotICAgICAgICBvdXQucHJpbnRsbigiKSo+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCIiKTsKLQotICAgICAgICBvdXQucHJpbnRsbigiPCFBVFRMSVNUIHRhcmdldCIpOwotICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICAgIGlkICAgICAgICAgIElEICAgICNJTVBMSUVEIik7Ci0gICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgbmFtZSAgICAgICAgQ0RBVEEgI1JFUVVJUkVEIik7Ci0gICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgaWYgICAgICAgICAgQ0RBVEEgI0lNUExJRUQiKTsKLSAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICB1bmxlc3MgICAgICBDREFUQSAjSU1QTElFRCIpOwotICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICAgIGRlcGVuZHMgICAgIENEQVRBICNJTVBMSUVEIik7Ci0gICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgZGVzY3JpcHRpb24gQ0RBVEEgI0lNUExJRUQ+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRFbGVtZW50RGVjbChQcmludFdyaXRlciBvdXQsIFN0cmluZyBuYW1lLCBDbGFzcyBlbGVtZW50KSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodmlzaXRlZC5jb250YWluc0tleShuYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHZpc2l0ZWQucHV0KG5hbWUsICIiKTsKLQotICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoZWxlbWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogWFhYIC0gZmFpbGVkIHRvIGxvYWQgdGhlIGNsYXNzIHByb3Blcmx5LgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIHNob3VsZCB3ZSBwcmludCBhIHdhcm5pbmcgaGVyZT8KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiPCFFTEVNRU5UICIpOwotICAgICAgICBzYi5hcHBlbmQobmFtZSkuYXBwZW5kKCIgIik7Ci0KLSAgICAgICAgaWYgKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZS5jbGFzcy5lcXVhbHMoZWxlbWVudCkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiRU1QVFk+IikuYXBwZW5kKGxTZXApOwotICAgICAgICAgICAgc2IuYXBwZW5kKCI8IUFUVExJU1QgIikuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGxTZXApLmFwcGVuZCgiICAgICAgICAgIGlkIElEICNJTVBMSUVEIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobFNlcCkuYXBwZW5kKCIgICAgICAgICAgcmVmaWQgSURSRUYgI0lNUExJRUQiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiPiIpLmFwcGVuZChsU2VwKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKHNiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBpZiAoaWguc3VwcG9ydHNDaGFyYWN0ZXJzKCkpIHsKLSAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiI1BDREFUQSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFRhc2tDb250YWluZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShlbGVtZW50KSkgewotICAgICAgICAgICAgdi5hZGRFbGVtZW50KFRBU0tTKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBpaC5nZXROZXN0ZWRFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgdi5hZGRFbGVtZW50KChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiRU1QVFkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiKCIpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHYuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh2LmVsZW1lbnRBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIikiKTsKLSAgICAgICAgICAgIGlmICh2LnNpemUoKSA+IDEgfHwgIXYuZWxlbWVudEF0KDApLmVxdWFscygiI1BDREFUQSIpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIqIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKCI+Iik7Ci0gICAgICAgIG91dC5wcmludGxuKHNiKTsKLQotICAgICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiPCFBVFRMSVNUICIpLmFwcGVuZChuYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKGxTZXApLmFwcGVuZCgiICAgICAgICAgIGlkIElEICNJTVBMSUVEIik7Ci0gICAgICAgIAotICAgICAgICBlbnVtID0gaWguZ2V0QXR0cmlidXRlcygpOwotICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKCJpZCIuZXF1YWxzKGF0dHJOYW1lKSkgY29udGludWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNiLmFwcGVuZChsU2VwKS5hcHBlbmQoIiAgICAgICAgICAiKS5hcHBlbmQoYXR0ck5hbWUpLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IGloLmdldEF0dHJpYnV0ZVR5cGUoYXR0ck5hbWUpOwotICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKSB8fCAKLSAgICAgICAgICAgICAgICB0eXBlLmVxdWFscyhqYXZhLmxhbmcuQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChCT09MRUFOKS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsgCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJJRFJFRiAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRlZEF0dHJpYnV0ZSBlYSA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKEVudW1lcmF0ZWRBdHRyaWJ1dGUpdHlwZS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBlYS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCB2YWx1ZXMubGVuZ3RoID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFhcmVObXRva2Vucyh2YWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkNEQVRBICIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIoIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIpICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkNEQVRBICIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJDREFUQSAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQ0RBVEEgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiNJTVBMSUVEIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKCI+IikuYXBwZW5kKGxTZXApOwotICAgICAgICBvdXQucHJpbnRsbihzYik7Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHYuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuZXN0ZWROYW1lID0gKFN0cmluZykgdi5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBpZiAoISIjUENEQVRBIi5lcXVhbHMobmVzdGVkTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAhVEFTS1MuZXF1YWxzKG5lc3RlZE5hbWUpICYmCi0gICAgICAgICAgICAgICAgIVRZUEVTLmVxdWFscyhuZXN0ZWROYW1lKQotICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIHByaW50RWxlbWVudERlY2wob3V0LCBuZXN0ZWROYW1lLCBpaC5nZXRFbGVtZW50VHlwZShuZXN0ZWROYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50VGFpbChQcmludFdyaXRlciBvdXQpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIHRoaXMgU3RyaW5nIG1hdGNoIHRoZSBYTUwtTk1UT0tFTiBwcm9kdWN0aW9uPwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTm10b2tlbihTdHJpbmcgcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAvLyBYWFggLSB3ZSBhcmUgb21taXR0aW5nIENvbWJpbmluZ0NoYXIgYW5kIEV4dGVuZGVyIGhlcmUKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSAmJgotICAgICAgICAgICAgICAgIGMgIT0gJy4nICYmIGMgIT0gJy0nICYmCi0gICAgICAgICAgICAgICAgYyAhPSAnXycgJiYgYyAhPSAnOicpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gdGhlIFN0cmluZ3MgYWxsIG1hdGNoIHRoZSBYTUwtTk1UT0tFTiBwcm9kdWN0aW9uPwotICAgICAqCi0gICAgICogPHA+T3RoZXJ3aXNlIHRoZXkgYXJlIG5vdCBzdWl0YWJsZSBhcyBhbiBlbnVtZXJhdGVkIGF0dHJpYnV0ZSwKLSAgICAgKiBmb3IgZXhhbXBsZS48L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJlTm10b2tlbnMoU3RyaW5nW10gcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNObXRva2VuKHNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXZhaWxhYmxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2NWU4Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLS8qKgotICogV2lsbCBzZXQgdGhlIGdpdmVuIHByb3BlcnR5IGlmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuCi0gKgotICogQGF1dGhvciBTdGVmYW5vIE1henpvY2NoaSA8YSBocmVmPSJtYWlsdG86c3RlZmFub0BhcGFjaGUub3JnIj5zdGVmYW5vQGFwYWNoZS5vcmc8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEF2YWlsYWJsZSBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBDb25kaXRpb24gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lOwotICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgIHByaXZhdGUgUGF0aCBmaWxlcGF0aDsKLSAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZTsKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7Ci0gICAgcHJpdmF0ZSBBbnRDbGFzc0xvYWRlciBsb2FkZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWUgPSAidHJ1ZSI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKLSAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5jbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlcGF0aChQYXRoIGZpbGVwYXRoKSB7Ci0gICAgICAgIGNyZWF0ZUZpbGVwYXRoKCkuYXBwZW5kKGZpbGVwYXRoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFBhdGggY3JlYXRlRmlsZXBhdGgoKSB7Ci0gICAgICAgIGlmICh0aGlzLmZpbGVwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZmlsZXBhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5maWxlcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKGNsYXNzbmFtZSkpIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJvcGVydHkgYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV2YWwoKSkgewotICAgICAgICAgICAgdGhpcy5wcm9qZWN0LnNldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBib29sZWFuICBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNsYXNzbmFtZSA9PSBudWxsICYmIGZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBvZiAoY2xhc3NuYW1lfGZpbGV8cmVzb3VyY2UpIGlzIHJlcXVpcmVkIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCl7Ci0gICAgICAgICAgICBpZiAoIXR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpICYmICF0eXBlLmVxdWFsc0lnbm9yZUNhc2UoImRpciIpKXsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlR5cGUgbXVzdCBiZSBvbmUgb2YgZWl0aGVyIGRpciBvciBmaWxlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aC5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICAgICAgdGhpcy5sb2FkZXIgPSBuZXcgQW50Q2xhc3NMb2FkZXIocHJvamVjdCwgY2xhc3NwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoY2xhc3NuYW1lICE9IG51bGwpICYmICFjaGVja0NsYXNzKGNsYXNzbmFtZSkpIHsKLSAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvYWQgY2xhc3MgIiArIGNsYXNzbmFtZSArICIgdG8gc2V0IHByb3BlcnR5ICIgKyBwcm9wZXJ0eSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICgoZmlsZSAhPSBudWxsKSAmJiAhY2hlY2tGaWxlKCkpIHsKLSAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGZpbmQgIiArIGZpbGUgKyAiIHRvIHNldCBwcm9wZXJ0eSAiICsgcHJvcGVydHksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoKHJlc291cmNlICE9IG51bGwpICYmICFjaGVja1Jlc291cmNlKHJlc291cmNlKSkgewotICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9hZCByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIHRvIHNldCBwcm9wZXJ0eSAiICsgcHJvcGVydHksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2FkZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZSgpIHsKLSAgICAgICAgaWYgKGZpbGVwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGVja0ZpbGUoZmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXRocyA9IGZpbGVwYXRoLmxpc3QoKTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIGxvZygiU2VhcmNoaW5nICIgKyBwYXRoc1tpXSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgaWYobmV3IEZpbGUocGF0aHNbaV0sIGZpbGUuZ2V0TmFtZSgpKS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZpbGUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoImRpciIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5pc0ZpbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsZS5leGlzdHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlKSAhPSBudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNMID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBpZiAoY0wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoY0wuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSkgIT0gbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAKLSAgICAgICAgICAgICAgICAgICAgKENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2UpICE9IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgLy8gQ2FuIHJldHVybiBudWxsIHRvIHJlcHJlc2VudCB0aGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlci4KLSAgICAgICAgICAgICAgICAvLyBzZWUgQVBJIGRvY3Mgb2YgQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIuCi0gICAgICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5OWFiYi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DVlNQYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIENWU0xvZ2luCi0gKgotICogQWRkcyBhbiBuZXcgZW50cnkgdG8gYSBDVlMgcGFzc3dvcmQgZmlsZQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0iamVmZkBjdXN0b21tb25rZXkub3JnIj5KZWZmIE1hcnRpbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIENWU1Bhc3MgZXh0ZW5kcyBUYXNrIHsKLSAgICAvKiogQ1ZTIFJvb3QgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjdnNSb290ID0gbnVsbDsgCi0gICAgLyoqIFBhc3N3b3JkIGZpbGUgdG8gYWRkIHBhc3N3b3JkIHRvICovCi0gICAgcHJpdmF0ZSBGaWxlIHBhc3NGaWxlID0gbnVsbDsKLSAgICAvKiogUGFzc3dvcmQgdG8gYWRkIHRvIGZpbGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7Ci0gICAgLyoqIEVuZCBvZiBsaW5lIGNoYXJhY3RlciAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIC8qKiBBcnJheSBjb250YWluIGNoYXIgY29udmVyc2lvbiBkYXRhICovCi0gICBwcml2YXRlIGZpbmFsIGNoYXIgc2hpZnRzW10gPSB7Ci0gICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKLSAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAotICAxMTQsMTIwLCA1MywgNzksIDk2LDEwOSwgNzIsMTA4LCA3MCwgNjQsIDc2LCA2NywxMTYsIDc0LCA2OCwgODcsCi0gIDExMSwgNTIsIDc1LDExOSwgNDksIDM0LCA4MiwgODEsIDk1LCA2NSwxMTIsIDg2LDExOCwxMTAsMTIyLDEwNSwKLSAgIDQxLCA1NywgODMsIDQzLCA0NiwxMDIsIDQwLCA4OSwgMzgsMTAzLCA0NSwgNTAsIDQyLDEyMywgOTEsIDM1LAotICAxMjUsIDU1LCA1NCwgNjYsMTI0LDEyNiwgNTksIDQ3LCA5MiwgNzEsMTE1LCA3OCwgODgsMTA3LDEwNiwgNTYsCi0gICAzNiwxMjEsMTE3LDEwNCwxMDEsMTAwLCA2OSwgNzMsIDk5LCA2MywgOTQsIDkzLCAzOSwgMzcsIDYxLCA0OCwKLSAgIDU4LDExMywgMzIsIDkwLCA0NCwgOTgsIDYwLCA1MSwgMzMsIDk3LCA2MiwgNzcsIDg0LCA4MCwgODUsMjIzLAotICAyMjUsMjE2LDE4NywxNjYsMjI5LDE4OSwyMjIsMTg4LDE0MSwyNDksMTQ4LDIwMCwxODQsMTM2LDI0OCwxOTAsCi0gIDE5OSwxNzAsMTgxLDIwNCwxMzgsMjMyLDIxOCwxODMsMjU1LDIzNCwyMjAsMjQ3LDIxMywyMDMsMjI2LDE5MywKLSAgMTc0LDE3MiwyMjgsMjUyLDIxNywyMDEsMTMxLDIzMCwxOTcsMjExLDE0NSwyMzgsMTYxLDE3OSwxNjAsMjEyLAotICAyMDcsMjIxLDI1NCwxNzMsMjAyLDE0NiwyMjQsMTUxLDE0MCwxOTYsMjA1LDEzMCwxMzUsMTMzLDE0MywyNDYsCi0gIDE5MiwxNTksMjQ0LDIzOSwxODUsMTY4LDIxNSwxNDQsMTM5LDE2NSwxODAsMTU3LDE0NywxODYsMjE0LDE3NiwKLSAgMjI3LDIzMSwyMTksMTY5LDE3NSwxNTYsMjA2LDE5OCwxMjksMTY0LDE1MCwyMTAsMTU0LDE3NywxMzQsMTI3LAotICAxODIsMTI4LDE1OCwyMDgsMTYyLDEzMiwxNjcsMjA5LDE0OSwyNDEsMTUzLDI1MSwyMzcsMjM2LDE3MSwxOTUsCi0gIDI0MywyMzMsMjUzLDI0MCwxOTQsMjUwLDE5MSwxNTUsMTQyLDEzNywyNDUsMjM1LDE2MywyNDIsMTc4LDE1MiB9OwotCi0gICAgcHVibGljIENWU1Bhc3MoKXsKLSAgICAgICAgcGFzc0ZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpKyIvLmN2c3Bhc3MiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIHRoZSB3b3JrLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGN2c1Jvb3Q9PW51bGwpdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjdnNyb290IGlzIHJlcXVpcmVkIik7Ci0gICAgICAgIGlmKHBhc3N3b3JkPT1udWxsKXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicGFzc3dvcmQgaXMgcmVxdWlyZWQiKTsKLQotICAgICAgICBsb2coImN2c1Jvb3Q6ICIgKyBjdnNSb290LCBwcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgIGxvZygicGFzc3dvcmQ6ICIgKyBwYXNzd29yZCwgcHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICBsb2coInBhc3NGaWxlOiAiICsgcGFzc0ZpbGUsIHByb2plY3QuTVNHX0RFQlVHKTsKLQotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICBpZihwYXNzRmlsZS5leGlzdHMoKSl7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHBhc3NGaWxlKSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSgobGluZT1yZWFkZXIucmVhZExpbmUoKSkhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBpZighbGluZS5zdGFydHNXaXRoKGN2c1Jvb3QpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZStFT0wpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHB3ZGZpbGUgPSBidWYudG9TdHJpbmcoKSArIGN2c1Jvb3QgKyAiIEEiICsgbWFuZ2xlKHBhc3N3b3JkKTsKLQotICAgICAgICAgICAgbG9nKCJXcml0aW5nIC0+ICIgKyBwd2RmaWxlICwgcHJvamVjdC5NU0dfREVCVUcpOwotCi0gICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGFzc0ZpbGUpKTsKLQotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIHB3ZGZpbGUgKTsKLQotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIH1jYXRjaChJT0V4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWFuZ2xlKFN0cmluZyBwYXNzd29yZCl7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wO2k8cGFzc3dvcmQubGVuZ3RoKCk7aSsrKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHNoaWZ0c1twYXNzd29yZC5jaGFyQXQoaSldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBjdnMgcm9vdCB0byBiZSBhZGRlZCB0byB0aGUgcGFzc3dvcmQgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN2c3Jvb3QoU3RyaW5nIGN2c1Jvb3QpIHsKLSAgICAgICAgdGhpcy5jdnNSb290ID0gY3ZzUm9vdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXNzd29yZCBmaWxlIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzZmlsZShGaWxlIHBhc3NGaWxlKSB7Ci0gICAgICAgIHRoaXMucGFzc0ZpbGUgPSBwYXNzRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXNzd29yZCBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NhbGxUYXJnZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NhbGxUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhZjliYy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DYWxsVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogQ2FsbCBhbm90aGVyIHRhcmdldCBpbiB0aGUgc2FtZSBwcm9qZWN0LgotICoKLSAqICA8cHJlPgotICogICAgPHRhcmdldCBuYW1lPSJmb28iPgotICogICAgICA8YW50Y2FsbCB0YXJnZXQ9ImJhciI+Ci0gKiAgICAgICAgPHBhcmFtIG5hbWU9InByb3BlcnR5MSIgdmFsdWU9ImFhYWFhIiAvPgotICogICAgICAgIDxwYXJhbSBuYW1lPSJmb28iIHZhbHVlPSJiYXoiIC8+Ci0gKiAgICAgICA8L2FudGNhbGw+Ci0gKiAgICA8L3RhcmdldD4KLSAqCi0gKiAgICA8dGFyZ2V0IG5hbWU9ImJhciIgZGVwZW5kcz0iaW5pdCI+Ci0gKiAgICAgIDxlY2hvIG1lc3NhZ2U9InByb3AgaXMgJHtwcm9wZXJ0eTF9ICR7Zm9vfSIgLz4KLSAqICAgIDwvdGFyZ2V0PgotICogPC9wcmU+Ci0gKgotICogPHA+VGhpcyBvbmx5IHdvcmtzIGFzIGV4cGVjdGVkIGlmIG5laXRoZXIgcHJvcGVydHkxIG5vciBmb28gYXJlCi0gKiBkZWZpbmVkIGluIHRoZSBwcm9qZWN0IGl0c2VsZi4KLSAqCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIENhbGxUYXJnZXQgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgQW50IGNhbGxlZTsKLSAgICBwcml2YXRlIFN0cmluZyBzdWJUYXJnZXQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXRBbGwgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogSWYgdHJ1ZSwgaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIHBhcmVudCBQcm9qZWN0Ci0gICAgICogSWYgZmFsc2UsIGluaGVyaXQgb25seSB1c2VyUHJvcGVydGllcyBhbmQgdGhvc2UgZGVmaW5lZAotICAgICAqIGluc2lkZSB0aGUgYW50Y2FsbCBjYWxsIGl0c2VsZgotICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmhlcml0QWxsKGJvb2xlYW4gaW5oZXJpdCkgewotICAgICAgIGluaGVyaXRBbGwgPSBpbmhlcml0OwotICAgIH0gLy8tLSBzZXRJbmhlcml0QWxsCi0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICBjYWxsZWUgPSAoQW50KSBwcm9qZWN0LmNyZWF0ZVRhc2soImFudCIpOwotICAgICAgICBjYWxsZWUuc2V0T3duaW5nVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIGNhbGxlZS5zZXRUYXNrTmFtZShnZXRUYXNrTmFtZSgpKTsKLSAgICAgICAgY2FsbGVlLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICAgICAgY2FsbGVlLmluaXQoKTsKLSAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHN1YlRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0dHJpYnV0ZSB0YXJnZXQgaXMgcmVxdWlyZWQuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjYWxsZWUuc2V0RGlyKHByb2plY3QuZ2V0QmFzZURpcigpKTsKLSAgICAgICAgY2FsbGVlLnNldEFudGZpbGUocHJvamVjdC5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSk7Ci0gICAgICAgIGNhbGxlZS5zZXRUYXJnZXQoc3ViVGFyZ2V0KTsKLSAgICAgICAgY2FsbGVlLnNldEluaGVyaXRBbGwoaW5oZXJpdEFsbCk7Ci0gICAgICAgIGNhbGxlZS5leGVjdXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5IGNyZWF0ZVBhcmFtKCkgewotICAgICAgICByZXR1cm4gY2FsbGVlLmNyZWF0ZVByb3BlcnR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFN0cmluZyB0YXJnZXQpIHsKLSAgICAgICAgc3ViVGFyZ2V0ID0gdGFyZ2V0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dChTdHJpbmcgbGluZSkgewotICAgICAgICBpZiAoY2FsbGVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhbGxlZS5oYW5kbGVPdXRwdXQobGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVPdXRwdXQobGluZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKGNhbGxlZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWxsZWUuaGFuZGxlRXJyb3JPdXRwdXQobGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVFcnJvck91dHB1dChsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NobW9kLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaG1vZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTZkMzRiLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NobW9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBDaG1vZCBlcXVpdmFsZW50IGZvciB1bml4LWxpa2UgZW52aXJvbm1lbnRzLgotICoKLSAqIEBhdXRob3IgY29zdGluQGVuZy5zdW4uY29tCi0gKiBAYXV0aG9yIE1hcml1c3ogTm93b3N0YXdza2kgKE1hcm5pKSA8YSBocmVmPSJtYWlsdG86bW5vd29zdGF3c2tpQGluZm9zY2llbmNlLm90YWdvLmFjLm56Ij5tbm93b3N0YXdza2lAaW5mb3NjaWVuY2Uub3RhZ28uYWMubno8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIENobW9kIGV4dGVuZHMgRXhlY3V0ZU9uIHsKLQotICAgIHByaXZhdGUgRmlsZVNldCBkZWZhdWx0U2V0ID0gbmV3IEZpbGVTZXQoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFNldERlZmluZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZVBlcm0gPSBmYWxzZTsKLSAgICAKLSAgICBwdWJsaWMgQ2htb2QoKSB7Ci0gICAgICAgIHN1cGVyLnNldEV4ZWN1dGFibGUoImNobW9kIik7Ci0gICAgICAgIHN1cGVyLnNldFBhcmFsbGVsKHRydWUpOwotICAgICAgICBzdXBlci5zZXRTa2lwRW1wdHlGaWxlc2V0cyh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgc3JjKSB7Ci0gICAgICAgIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICBmcy5zZXREaXIobmV3IEZpbGUoc3JjLmdldFBhcmVudCgpKSk7Ci0gICAgICAgIGZzLmNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKHNyYy5nZXROYW1lKCkpOwotICAgICAgICBhZGRGaWxlc2V0KGZzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBzcmMpIHsKLSAgICAgICAgZGVmYXVsdFNldC5zZXREaXIoc3JjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJtKFN0cmluZyBwZXJtKSB7Ci0gICAgICAgIGNyZWF0ZUFyZygpLnNldFZhbHVlKHBlcm0pOwotICAgICAgICBoYXZlUGVybSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGUoKSB7Ci0gICAgICAgIGRlZmF1bHRTZXREZWZpbmVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRTZXQuY3JlYXRlSW5jbHVkZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBleGNsdWRlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlRXhjbHVkZSgpIHsKLSAgICAgICAgZGVmYXVsdFNldERlZmluZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gZGVmYXVsdFNldC5jcmVhdGVFeGNsdWRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgc2V0IG9mIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQgY3JlYXRlUGF0dGVyblNldCgpIHsKLSAgICAgICAgZGVmYXVsdFNldERlZmluZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gZGVmYXVsdFNldC5jcmVhdGVQYXR0ZXJuU2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB7Ci0gICAgICAgIGRlZmF1bHRTZXREZWZpbmVkID0gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdFNldC5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKSB7Ci0gICAgICAgIGRlZmF1bHRTZXREZWZpbmVkID0gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdFNldC5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlRGVmYXVsdEV4Y2x1ZGVzICJ0cnVlInwib24ifCJ5ZXMiIHdoZW4gZGVmYXVsdCBleGNsdXNpb25zIAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQsICJmYWxzZSJ8Im9mZiJ8Im5vIiB3aGVuIHRoZXkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZG4ndCBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRleGNsdWRlcyhib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlcykgewotICAgICAgICBkZWZhdWx0U2V0RGVmaW5lZCA9IHRydWU7Ci0gICAgICAgIGRlZmF1bHRTZXQuc2V0RGVmYXVsdGV4Y2x1ZGVzKHVzZURlZmF1bHRFeGNsdWRlcyk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgaWYgKCFoYXZlUGVybSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhdHRyaWJ1dGUgcGVybSBub3Qgc2V0IGluIGNobW9kIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVmYXVsdFNldERlZmluZWQgJiYgZGVmYXVsdFNldC5nZXREaXIocHJvamVjdCkgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkRmlsZXNldChkZWZhdWx0U2V0KTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5jaGVja0NvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRlZmF1bHRTZXREZWZpbmVkIHx8IGRlZmF1bHRTZXQuZ2V0RGlyKHByb2plY3QpID09IG51bGwpIHsKLSAgICAgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1ZhbGlkT3MoKSkgewotICAgICAgICAgICAgLy8gd2UgYXJlIGNobW9kZGluZyB0aGUgZ2l2ZW4gZGlyZWN0b3J5Ci0gICAgICAgICAgICBjcmVhdGVBcmcoKS5zZXRWYWx1ZShkZWZhdWx0U2V0LmdldERpcihwcm9qZWN0KS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgRXhlY3V0ZSBleGVjdXRlID0gcHJlcGFyZUV4ZWMoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZS5zZXRDb21tYW5kbGluZShjbWRsLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dGUoZXhlY3V0ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGVjdXRlIGZhaWxlZDogIiArIGUsIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIG91dHB1dCBmaWxlIGlmIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgbG9nRmx1c2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dGFibGUoU3RyaW5nIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHRhc2tUeXBlKyIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgZXhlY3V0YWJsZSBhdHRyaWJ1dGUiLCBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChTdHJpbmcgZSkgewotICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odGFza1R5cGUrIiBkb2VzblwndCBzdXBwb3J0IHRoZSBjb21tYW5kIGF0dHJpYnV0ZSIsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwRW1wdHlGaWxlc2V0cyhib29sZWFuIHNraXApIHsKLSAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHRhc2tUeXBlKyIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgc2tpcGVtcHR5ZmlsZXNldCBhdHRyaWJ1dGUiLCBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZE9zKCkgewotICAgICAgICAvLyBYWFggaWYgT1M9dW5peAotICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpLmVxdWFscygiOiIpIAotICAgICAgICAgICAgJiYgKCFTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJNYWMiKSAKLSAgICAgICAgICAgICAgICAgfHwgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuZW5kc1dpdGgoIlgiKSkKLSAgICAgICAgICAgICYmIHN1cGVyLmlzVmFsaWRPcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbXBpbGVUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db21waWxlVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTUwMzAwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbXBpbGVUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgdGFzayB3aWxsIGNvbXBpbGUgYW5kIGxvYWQgYSBuZXcgdGFza2RlZiBhbGwgaW4gb25lIHN0ZXAuCi0gKiBBdCB0aW1lcywgdGhpcyBpcyB1c2VmdWwgZm9yIGVsaW1pbmF0aW5nIG9yZGVyaW5nIGRlcGVuZGVuY2llcwotICogd2hpY2ggb3RoZXJ3aXNlIHdvdWxkIHJlcXVpcmUgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiBBbnQuCi0gKgotICogQGF1dGhvciBTYW0gUnVieSA8YSBocmVmPSJtYWlsdG86cnVieXNAdXMuaWJtLmNvbSI+cnVieXNAdXMuaWJtLmNvbTwvYT4KLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgJmx0O3Rhc2tkZWYmZ3Q7IGVsZW1lbnRzIG5lc3RlZCBpbnRvICZsdDt0YXJnZXQmZ3Q7cyBpbnN0ZWFkCi0gKi8KLQotcHVibGljIGNsYXNzIENvbXBpbGVUYXNrIGV4dGVuZHMgSmF2YWMgewotCi0gICAgcHJvdGVjdGVkIFZlY3RvciB0YXNrTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8qKgotICAgICAqIGFkZCBhIG5ldyB0YXNrIGVudHJ5IG9uIHRoZSB0YXNrIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza2RlZiBjcmVhdGVUYXNrZGVmKCkgewotICAgICAgICBUYXNrZGVmIHRhc2sgPSBuZXcgVGFza2RlZigpOwotICAgICAgICB0YXNrTGlzdC5hZGRFbGVtZW50KHRhc2spOwotICAgICAgICByZXR1cm4gdGFzazsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZG8gYWxsIHRoZSByZWFsIHdvcmsgaW4gaW5pdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGxvZygiISEgQ29tcGlsZVRhc2sgaXMgZGVwcmVjYXRlZC4gISEiKTsKLSAgICAgICAgbG9nKCJVc2UgPHRhc2tkZWY+IGVsZW1lbnRzIG5lc3RlZCBpbnRvIDx0YXJnZXQ+cyBpbnN0ZWFkIik7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGFsbCB0aGUgaW5jbHVkZSBlbnRyaWVzIGZyb20gdGhlIHRhc2sgZGVmcwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGU9dGFza0xpc3QuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICBUYXNrZGVmIHRhc2sgPSAoVGFza2RlZillLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgc291cmNlID0gdGFzay5nZXRDbGFzc25hbWUoKS5yZXBsYWNlKCcuJywnLycpICsgIi5qYXZhIjsKLSAgICAgICAgICAgIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGluY2x1ZGUgPSBzdXBlci5jcmVhdGVJbmNsdWRlKCk7Ci0gICAgICAgICAgICBpbmNsdWRlLnNldE5hbWUoIioqLyIgKyBzb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZXhlY3V0ZSBKYXZhYwotICAgICAgICBzdXBlci5pbml0KCk7ICAgICAgICAKLSAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOyAgICAgICAgCi0KLSAgICAgICAgLy8gbm93IGRlZmluZSBhbGwgdGhlIG5ldyB0YXNrcwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGU9dGFza0xpc3QuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICBUYXNrZGVmIHRhc2sgPSAoVGFza2RlZillLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB0YXNrLmluaXQoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogaGF2ZSBleGVjdXRlIGRvIG5vdGhpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmRpdGlvblRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmRpdGlvblRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2NzQ3Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25kaXRpb25UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbkJhc2U7Ci0KLS8qKgotICogJmx0O2NvbmRpdGlvbiZndDsgdGFzayBhcyBhIGdlbmVyYWxpemF0aW9uIG9mICZsdDthdmFpbGFibGUmZ3Q7IGFuZAotICogJmx0O3VwdG9kYXRlJmd0OwotICoKLSAqIDxwPlRoaXMgdGFzayBzdXBwb3J0cyBib29sZWFuIGxvZ2ljIGFzIHdlbGwgYXMgcGx1Z2dhYmxlIGNvbmRpdGlvbnMKLSAqIHRvIGRlY2lkZSwgd2hldGhlciBhIHByb3BlcnR5IHNob3VsZCBiZSBzZXQuPC9wPgotICoKLSAqIDxwPlRoaXMgdGFzayBkb2VzIG5vdCBleHRlbmQgVGFzayB0byB0YWtlIGFkdmFudGFnZSBvZgotICogQ29uZGl0aW9uQmFzZS48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGU+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25kaXRpb25UYXNrIGV4dGVuZHMgQ29uZGl0aW9uQmFzZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZSA9ICJ0cnVlIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuIFJlcXVpcmVkLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwKSB7cHJvcGVydHkgPSBwO30KLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHRvIHNldC4gRGVmYXVsdHMgdG8gInRydWUiLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2KSB7dmFsdWUgPSB2O30KLQotICAgIC8qKgotICAgICAqIFNlZSB3aGV0aGVyIG91ciBuZXN0ZWQgY29uZGl0aW9uIGhvbGRzIGFuZCBzZXQgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoY291bnRDb25kaXRpb25zKCkgPiAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IG5vdCBuZXN0IG1vcmUgdGhhbiBvbmUgY29uZGl0aW9uIGludG8gPGNvbmRpdGlvbj4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY291bnRDb25kaXRpb25zKCkgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IG5lc3QgYSBjb25kaXRpb24gaW50byA8Y29uZGl0aW9uPiIpOwotICAgICAgICB9Ci0gICAgICAgIENvbmRpdGlvbiBjID0gKENvbmRpdGlvbikgZ2V0Q29uZGl0aW9ucygpLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjLmV2YWwoKSkgewotICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzY4MGIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEEgY29uc29saWRhdGVkIGNvcHkgdGFzay4gIENvcGllcyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGEgbmV3IGZpbGUgCi0gKiBvciBkaXJlY3RvcnkuICBGaWxlcyBhcmUgb25seSBjb3BpZWQgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIG5ld2VyCi0gKiB0aGFuIHRoZSBkZXN0aW5hdGlvbiBmaWxlLCBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90IAotICogZXhpc3QuICBJdCBpcyBwb3NzaWJsZSB0byBleHBsaWNpdGx5IG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcy48L3A+Ci0gKgotICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcm5vdXQgS3VpcGVyJ3MgaW5pdGlhbCBkZXNpZ24KLSAqIGRvY3VtZW50LCB0aGUgZm9sbG93aW5nIG1haWxpbmcgbGlzdCBkaXNjdXNzaW9ucywgYW5kIHRoZSAKLSAqIGNvcHlmaWxlL2NvcHlkaXIgdGFza3MuPC9wPgotICoKLSAqIEBhdXRob3IgR2xlbm4gTWNBbGxpc3RlciA8YSBocmVmPSJtYWlsdG86Z2xlbm5tQGNhLmlibS5jb20iPmdsZW5ubUBjYS5pYm0uY29tPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICogQGF1dGhvciA8QSBocmVmPSJnaG9sYW1AeHRyYS5jby5ueiI+TWljaGFlbCBNY0NhbGx1bTwvQT4KLSAqLwotcHVibGljIGNsYXNzIENvcHkgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlID0gbnVsbDsgICAgIC8vIHRoZSBzb3VyY2UgZmlsZSAKLSAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RmlsZSA9IG51bGw7IC8vIHRoZSBkZXN0aW5hdGlvbiBmaWxlIAotICAgIHByb3RlY3RlZCBGaWxlIGRlc3REaXIgPSBudWxsOyAgLy8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQotICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWx0ZXJpbmcgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGZvcmNlT3ZlcndyaXRlID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmxhdHRlbiA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBpbnQgdmVyYm9zaXR5ID0gUHJvamVjdC5NU0dfVkVSQk9TRTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlRW1wdHkgPSB0cnVlOwotCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBmaWxlQ29weU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGRpckNvcHlNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwcGVyIG1hcHBlckVsZW1lbnQgPSBudWxsOwotICAgIHByaXZhdGUgVmVjdG9yIGZpbHRlclNldHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBGaWxlVXRpbHMgZmlsZVV0aWxzOwotICAgIAotICAgIHB1YmxpYyBDb3B5KCkgewotICAgICAgICBmaWxlVXRpbHMgPSBGaWxlVXRpbHMubmV3RmlsZVV0aWxzKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpbGVVdGlscyBnZXRGaWxlVXRpbHMoKSB7cmV0dXJuIGZpbGVVdGlsczt9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIGNvcHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvZmlsZShGaWxlIGRlc3RGaWxlKSB7Ci0gICAgICAgIHRoaXMuZGVzdEZpbGUgPSBkZXN0RmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9kaXIoRmlsZSBkZXN0RGlyKSB7Ci0gICAgICAgIHRoaXMuZGVzdERpciA9IGRlc3REaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmVzdGVkIGZpbHRlcnNldAotICAgICAqLwotICAgIHB1YmxpYyBGaWx0ZXJTZXQgY3JlYXRlRmlsdGVyU2V0KCkgewotICAgICAgICBGaWx0ZXJTZXQgZmlsdGVyU2V0ID0gbmV3IEZpbHRlclNldCgpOwotICAgICAgICBmaWx0ZXJTZXRzLmFkZEVsZW1lbnQoZmlsdGVyU2V0KTsKLSAgICAgICAgcmV0dXJuIGZpbHRlclNldDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgZmlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlc2VydmVMYXN0TW9kaWZpZWQoU3RyaW5nIHByZXNlcnZlKSB7Ci0gICAgICAgIHByZXNlcnZlTGFzdE1vZGlmaWVkID0gUHJvamVjdC50b0Jvb2xlYW4ocHJlc2VydmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmlsdGVyc2V0cyBiZWluZyBhcHBsaWVkIHRvIHRoaXMgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHZlY3RvciBvZiBGaWx0ZXJTZXQgb2JqZWN0cwotICAgICAqLwotICAgIHByb3RlY3RlZCBWZWN0b3IgZ2V0RmlsdGVyU2V0cygpIHsKLSAgICAgICAgcmV0dXJuIGZpbHRlclNldHM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgZmlsdGVyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcmluZyhib29sZWFuIGZpbHRlcmluZykgewotICAgICAgICB0aGlzLmZpbHRlcmluZyA9IGZpbHRlcmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVyd3JpdGUgYW55IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUocykuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlKGJvb2xlYW4gb3ZlcndyaXRlKSB7Ci0gICAgICAgIHRoaXMuZm9yY2VPdmVyd3JpdGUgPSBvdmVyd3JpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBjb3B5aW5nIGRpcmVjdG9yeSB0cmVlcywgdGhlIGZpbGVzIGNhbiBiZSAiZmxhdHRlbmVkIgotICAgICAqIGludG8gYSBzaW5nbGUgZGlyZWN0b3J5LiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIGZpbGVzIHdpdGgKLSAgICAgKiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRyZWUsIG9ubHkgdGhlIGZpcnN0Ci0gICAgICogZmlsZSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSAiZmxhdHRlbmVkIiBkaXJlY3RvcnksIHVubGVzcwotICAgICAqIHRoZSBmb3JjZW92ZXJ3cml0ZSBhdHRyaWJ1dGUgaXMgdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGbGF0dGVuKGJvb2xlYW4gZmxhdHRlbikgewotICAgICAgICB0aGlzLmZsYXR0ZW4gPSBmbGF0dGVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gZm9yY2UgbGlzdGluZyBvZiBhbGwgbmFtZXMgb2YgY29waWVkIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IFByb2plY3QuTVNHX0lORk87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IFByb2plY3QuTVNHX1ZFUkJPU0U7Ci0gICAgICAgIH0gCi0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gY29weSBlbXB0eSBkaXJlY3Rvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRW1wdHlEaXJzKGJvb2xlYW4gaW5jbHVkZUVtcHR5KSB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZUVtcHR5ID0gaW5jbHVkZUVtcHR5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgewotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUgRmlsZU5hbWVNYXBwZXIgdG8gdXNlIChuZXN0ZWQgbWFwcGVyIGVsZW1lbnQpLgotICAgICAqLwotICAgIHB1YmxpYyBNYXBwZXIgY3JlYXRlTWFwcGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgbWFwcGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgbWFwcGVyRWxlbWVudCA9IG5ldyBNYXBwZXIocHJvamVjdCk7Ci0gICAgICAgIHJldHVybiBtYXBwZXJFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBjb3B5IG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYW4gaWxsZWdhbCBzZXQgb2Ygb3B0aW9ucwotICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsgICAKLQotICAgICAgICAvLyBkZWFsIHdpdGggdGhlIHNpbmdsZSBmaWxlCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc3RGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBmaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChmb3JjZU92ZXJ3cml0ZSB8fCAKLSAgICAgICAgICAgICAgICAgICAgKGZpbGUubGFzdE1vZGlmaWVkKCkgPiBkZXN0RmlsZS5sYXN0TW9kaWZpZWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZUNvcHlNYXAucHV0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coZmlsZSArICIgb21pdHRlZCBhcyAiICsgZGVzdEZpbGUgKyAiIGlzIHVwIHRvIGRhdGUuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IGZpbmQgZmlsZSAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiB0byBjb3B5LiI7Ci0gICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgZmlsZXNldHMKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgRmlsZSBmcm9tRGlyID0gZnMuZ2V0RGlyKHByb2plY3QpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBzcmNGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHNyY0RpcnMgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7Ci0KLSAgICAgICAgICAgIHNjYW4oZnJvbURpciwgZGVzdERpciwgc3JjRmlsZXMsIHNyY0RpcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG8gYWxsIHRoZSBjb3B5IG9wZXJhdGlvbnMgbm93Li4uCi0gICAgICAgIGRvRmlsZU9wZXJhdGlvbnMoKTsKLQotICAgICAgICAvLyBjbGVhbiB1cCBkZXN0RGlyIGFnYWluIC0gc28gdGhpcyBpbnN0YW5jZSBjYW4gYmUgdXNlZCBhIHNlY29uZAotICAgICAgICAvLyB0aW1lIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCi0gICAgICAgIGlmIChkZXN0RmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXN0RGlyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICBwcm90ZWN0ZWQgYW5kIHByaXZhdGUgbWV0aG9kcwotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB3ZSBoYXZlIGEgY29uc2lzdGVudCBhbmQgbGVnYWwgc2V0IG9mIGF0dHJpYnV0ZXMsIGFuZCBzZXQKLSAgICAgKiBhbnkgaW50ZXJuYWwgZmxhZ3MgbmVjZXNzYXJ5IGJhc2VkIG9uIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgCi0gICAgICogb2YgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIGZpbGVzZXRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNwZWNpZnkgYXQgbGVhc3Qgb25lIHNvdXJjZSAtIGEgZmlsZSBvciBhIGZpbGVzZXQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVzdEZpbGUgIT0gbnVsbCAmJiBkZXN0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgb2YgZGVzdGZpbGUgYW5kIGRlc3RkaXIgbWF5IGJlIHNldC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0RmlsZSA9PSBudWxsICYmIGRlc3REaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmUgb2YgZGVzdGZpbGUgb3IgZGVzdGRpciBtdXN0IGJlIHNldC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVXNlIGEgZmlsZXNldCB0byBjb3B5IGRpcmVjdG9yaWVzLiIpOwotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICBpZiAoZGVzdEZpbGUgIT0gbnVsbCAmJiBmaWxlc2V0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBjb25jYXRlbmF0ZSBtdWx0cGxlIGZpbGVzIGludG8gYSBzaW5nbGUgZmlsZS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0RmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXN0RGlyID0gbmV3IEZpbGUoZGVzdEZpbGUuZ2V0UGFyZW50KCkpOyAgIC8vIGJlIDEuMSBmcmllbmRseQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyBzb3VyY2UgZmlsZXMgdG8gZGVzdGluYXRpb24gZmlsZXMgdG8gc2VlIGlmIHRoZXkgc2hvdWxkIGJlCi0gICAgICogY29waWVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNjYW4oRmlsZSBmcm9tRGlyLCBGaWxlIHRvRGlyLCBTdHJpbmdbXSBmaWxlcywgU3RyaW5nW10gZGlycykgewotICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBudWxsOwotICAgICAgICBpZiAobWFwcGVyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXBwZXIgPSBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmxhdHRlbikgewotICAgICAgICAgICAgbWFwcGVyID0gbmV3IEZsYXRGaWxlTmFtZU1hcHBlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFwcGVyID0gbmV3IElkZW50aXR5TWFwcGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBidWlsZE1hcChmcm9tRGlyLCB0b0RpciwgZmlsZXMsIG1hcHBlciwgZmlsZUNvcHlNYXApOwotCi0gICAgICAgIGlmIChpbmNsdWRlRW1wdHkpIHsKLSAgICAgICAgICAgIGJ1aWxkTWFwKGZyb21EaXIsIHRvRGlyLCBkaXJzLCBtYXBwZXIsIGRpckNvcHlNYXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRNYXAoRmlsZSBmcm9tRGlyLCBGaWxlIHRvRGlyLCBTdHJpbmdbXSBuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIsIEhhc2h0YWJsZSBtYXApIHsKLQotICAgICAgICBTdHJpbmdbXSB0b0NvcHkgPSBudWxsOwotICAgICAgICBpZiAoZm9yY2VPdmVyd3JpdGUpIHsKLSAgICAgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcHBlci5tYXBGaWxlTmFtZShuYW1lc1tpXSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2LmFkZEVsZW1lbnQobmFtZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvQ29weSA9IG5ldyBTdHJpbmdbdi5zaXplKCldOwotICAgICAgICAgICAgdi5jb3B5SW50byh0b0NvcHkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgZHMgPSBuZXcgU291cmNlRmlsZVNjYW5uZXIodGhpcyk7Ci0gICAgICAgICAgICB0b0NvcHkgPSBkcy5yZXN0cmljdChuYW1lcywgZnJvbURpciwgdG9EaXIsIG1hcHBlcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9Db3B5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIHNyYyA9IG5ldyBGaWxlKGZyb21EaXIsIHRvQ29weVtpXSk7Ci0gICAgICAgICAgICBGaWxlIGRlc3QgPSBuZXcgRmlsZSh0b0RpciwgbWFwcGVyLm1hcEZpbGVOYW1lKHRvQ29weVtpXSlbMF0pOwotICAgICAgICAgICAgbWFwLnB1dCggc3JjLmdldEFic29sdXRlUGF0aCgpLCBkZXN0LmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3R1YWxseSBkb2VzIHRoZSBmaWxlIChhbmQgcG9zc2libHkgZW1wdHkgZGlyZWN0b3J5KSBjb3BpZXMuCi0gICAgICogVGhpcyBpcyBhIGdvb2QgbWV0aG9kIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRmlsZU9wZXJhdGlvbnMoKSB7Ci0gICAgICAgIGlmIChmaWxlQ29weU1hcC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBsb2coIkNvcHlpbmcgIiArIGZpbGVDb3B5TWFwLnNpemUoKSArIAotICAgICAgICAgICAgICAgICIgZmlsZSIgKyAoZmlsZUNvcHlNYXAuc2l6ZSgpID09IDEgPyAiIiA6ICJzIikgKyAKLSAgICAgICAgICAgICAgICAiIHRvICIgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpICk7Ci0KLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBmaWxlQ29weU1hcC5rZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmcm9tRmlsZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG9GaWxlID0gKFN0cmluZykgZmlsZUNvcHlNYXAuZ2V0KGZyb21GaWxlKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcm9tRmlsZS5lcXVhbHMoIHRvRmlsZSApICkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nIHNlbGYtY29weSBvZiAiICsgZnJvbUZpbGUsIHZlcmJvc2l0eSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiQ29weWluZyAiICsgZnJvbUZpbGUgKyAiIHRvICIgKyB0b0ZpbGUsIHZlcmJvc2l0eSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBGaWx0ZXJTZXRDb2xsZWN0aW9uIGV4ZWN1dGlvbkZpbHRlcnMgPSBuZXcgRmlsdGVyU2V0Q29sbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25GaWx0ZXJzLmFkZEZpbHRlclNldChwcm9qZWN0LmdldEdsb2JhbEZpbHRlclNldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGZpbHRlckVudW0gPSBmaWx0ZXJTZXRzLmVsZW1lbnRzKCk7IGZpbHRlckVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25GaWx0ZXJzLmFkZEZpbHRlclNldCgoRmlsdGVyU2V0KWZpbHRlckVudW0ubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmlsZVV0aWxzLmNvcHlGaWxlKGZyb21GaWxlLCB0b0ZpbGUsIGV4ZWN1dGlvbkZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU92ZXJ3cml0ZSwgcHJlc2VydmVMYXN0TW9kaWZpZWQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBjb3B5ICIgKyBmcm9tRmlsZSArICIgdG8gIiArIHRvRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGR1ZSB0byAiICsgaW9lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluY2x1ZGVFbXB0eSkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGRpckNvcHlNYXAuZWxlbWVudHMoKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIEZpbGUgZCA9IG5ldyBGaWxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5ICIgKyBkLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIGxvZygiQ29waWVkICIgKyBjb3VudCArIAotICAgICAgICAgICAgICAgICAgICAiIGVtcHR5IGRpcmVjdG9yIiArIAotICAgICAgICAgICAgICAgICAgICAoY291bnQ9PTE/InkiOiJpZXMiKSArIAotICAgICAgICAgICAgICAgICAgICAiIHRvICIgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGZmYmYxLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlkaXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogQ29waWVzIGEgZGlyZWN0b3J5LgotICoKLSAqIEBhdXRob3IgSmFtZXMgRGF2aWRzb24gPGEgaHJlZj0ibWFpbHRvOmR1bmNhbkB4MTgwLmNvbSI+ZHVuY2FuQHgxODAuY29tPC9hPgotICoKLSAqIEBkZXByZWNhdGVkIFRoZSBjb3B5ZGlyIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBjb3B5IGluc3RlYWQuCi0gKi8KLQotcHVibGljIGNsYXNzIENvcHlkaXIgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotCi0gICAgcHJpdmF0ZSBGaWxlIHNyY0RpcjsKLSAgICBwcml2YXRlIEZpbGUgZGVzdERpcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyaW5nID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZsYXR0ZW4gPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2VPdmVyd3JpdGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIEhhc2h0YWJsZSBmaWxlY29weUxpc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmMpIHsKLSAgICAgICAgc3JjRGlyID0gc3JjOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkZXN0KSB7Ci0gICAgICAgIGRlc3REaXIgPSBkZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcmluZyhib29sZWFuIGZpbHRlcikgewotICAgICAgICBmaWx0ZXJpbmcgPSBmaWx0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmxhdHRlbihib29sZWFuIGZsYXR0ZW4pIHsKLSAgICAgICAgdGhpcy5mbGF0dGVuID0gZmxhdHRlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZW92ZXJ3cml0ZShib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIGZvcmNlT3ZlcndyaXRlID0gZm9yY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBjb3B5ZGlyIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBjb3B5IGluc3RlYWQuIik7Ci0KLSAgICAgICAgaWYgKHNyY0RpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyYyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzcmNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyICIrc3JjRGlyLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiBkb2VzIG5vdCBleGlzdCEiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBkZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldC4iLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3JjRGlyLmVxdWFscyhkZXN0RGlyKSkgewotICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBzcmMgPT0gZGVzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHN1cGVyLmdldERpcmVjdG9yeVNjYW5uZXIoc3JjRGlyKTsKLQotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgc2NhbkRpcihzcmNEaXIsIGRlc3REaXIsIGZpbGVzKTsKLSAgICAgICAgaWYgKGZpbGVjb3B5TGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBsb2coIkNvcHlpbmcgIiArIGZpbGVjb3B5TGlzdC5zaXplKCkgKyAiIGZpbGUiCi0gICAgICAgICAgICAgICAgKyAoZmlsZWNvcHlMaXN0LnNpemUoKSA9PSAxID8gIiIgOiAicyIpCi0gICAgICAgICAgICAgICAgKyAiIHRvICIgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBmaWxlY29weUxpc3Qua2V5cygpOwotICAgICAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnJvbUZpbGUgPSAoU3RyaW5nKSBlbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRvRmlsZSA9IChTdHJpbmcpIGZpbGVjb3B5TGlzdC5nZXQoZnJvbUZpbGUpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuY29weUZpbGUoZnJvbUZpbGUsIHRvRmlsZSwgZmlsdGVyaW5nLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU92ZXJ3cml0ZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGNvcHkgIiArIGZyb21GaWxlICsgIiB0byAiICsgdG9GaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZHVlIHRvICIgKyBpb2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2NhbkRpcihGaWxlIGZyb20sIEZpbGUgdG8sIFN0cmluZ1tdIGZpbGVzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoZnJvbSwgZmlsZW5hbWUpOwotICAgICAgICAgICAgRmlsZSBkZXN0RmlsZTsKLSAgICAgICAgICAgIGlmIChmbGF0dGVuKSB7Ci0gICAgICAgICAgICAgICAgZGVzdEZpbGUgPSBuZXcgRmlsZSh0bywgbmV3IEZpbGUoZmlsZW5hbWUpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc3RGaWxlID0gbmV3IEZpbGUodG8sIGZpbGVuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmb3JjZU92ZXJ3cml0ZSB8fAotICAgICAgICAgICAgICAgIChzcmNGaWxlLmxhc3RNb2RpZmllZCgpID4gZGVzdEZpbGUubGFzdE1vZGlmaWVkKCkpKSB7Ci0gICAgICAgICAgICAgICAgZmlsZWNvcHlMaXN0LnB1dChzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWZpbGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlmaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzYzZDAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogQ29waWVzIGEgZmlsZS4KLSAqCi0gKiBAYXV0aG9yIGR1bmNhbkB4MTgwLmNvbQotICoKLSAqIEBkZXByZWNhdGVkIFRoZSBjb3B5ZmlsZSB0YXNrIGlzIGRlcHJlY2F0ZWQuICBVc2UgY29weSBpbnN0ZWFkLgotICovCi0KLXB1YmxpYyBjbGFzcyBDb3B5ZmlsZSBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBGaWxlIHNyY0ZpbGU7Ci0gICAgcHJpdmF0ZSBGaWxlIGRlc3RGaWxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJpbmcgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2VPdmVyd3JpdGUgPSBmYWxzZTsKLSAKLSAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmMpIHsKLSAgICAgICAgc3JjRmlsZSA9IHNyYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZW92ZXJ3cml0ZShib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIGZvcmNlT3ZlcndyaXRlID0gZm9yY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3QpIHsKLSAgICAgICAgZGVzdEZpbGUgPSBkZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcmluZyhTdHJpbmcgZmlsdGVyKSB7Ci0gICAgICAgIGZpbHRlcmluZyA9IFByb2plY3QudG9Cb29sZWFuKGZpbHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBjb3B5ZmlsZSB0YXNrIGlzIGRlcHJlY2F0ZWQuICBVc2UgY29weSBpbnN0ZWFkLiIpOwotCi0gICAgICAgIGlmIChzcmNGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHNyYyBhdHRyaWJ1dGUgbXVzdCBiZSBwcmVzZW50LiIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFzcmNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyYyAiICsgc3JjRmlsZS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0LiIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0RmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBkZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHByZXNlbnQuIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNyY0ZpbGUuZXF1YWxzKGRlc3RGaWxlKSkgewotICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBzcmMgPT0gZGVzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZvcmNlT3ZlcndyaXRlIHx8IHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPiBkZXN0RmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmNvcHlGaWxlKHNyY0ZpbGUsIGRlc3RGaWxlLCBmaWx0ZXJpbmcsIGZvcmNlT3ZlcndyaXRlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3IgY29weWluZyBmaWxlOiAiICsgc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQotICAgICAgICAgICAgICAgICAgICArICIgZHVlIHRvICIgKyBpb2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ3ZzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DdnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNmQwOS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DdnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudDsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICoKLSAqCi0gKiBAYXV0aG9yIGNvc3RpbkBkbnQucm8KLSAqIEBhdXRob3Igc3RlZmFub0BhcGFjaGUub3JnCi0gKiBAYXV0aG9yIFdvbGZnYW5nIFdlcm5lciA8YSBocmVmPSJtYWlsdG86d3dlcm5lckBwaWN0dXJlc2FmZS5kZSI+d3dlcm5lckBwaWN0dXJlc2FmZS5kZTwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ3ZzIGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcml2YXRlIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIHRoZSBDVlNST09UIHZhcmlhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGN2c1Jvb3Q7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2s7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgQ1ZTIGNvbW1hbmQgdG8gZXhlY3V0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjb21tYW5kID0gImNoZWNrb3V0IjsKLQotICAgIC8qKgotICAgICAqIHN1cHByZXNzIGluZm9ybWF0aW9uIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBxdWlldCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogcmVwb3J0IG9ubHksIGRvbid0IGNoYW5nZSBhbnkgZmlsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG5vZXhlYyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ1ZTIHBvcnQKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKLQotICAgIC8qKgotICAgICAqIENWUyBwYXNzd29yZCBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHBhc3NGaWxlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNoZWNrZWQgb3V0IGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGRlc3Q7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZmlsZSB0byBkaXJlY3Qgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dDsKLQotICAgIC8qKgotICAgICAqIHRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBjb21tYW5kLgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBlcnJvcjsgCi0KLSAgICAvKioKLSAgICAgKiBJZiB0cnVlIGl0IHdpbGwgc3RvcCB0aGUgYnVpbGQgaWYgY3ZzIGV4aXRzIHdpdGggZXJyb3IuCi0gICAgICogRGVmYXVsdCBpcyBmYWxzZS4gKEl1bGlhbikKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSBmYWxzZTsgCi0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIFhYWDogd2Ugc2hvdWxkIHVzZSBKQ1ZTICh3d3cuaWNlLmNvbS9KQ1ZTKSBpbnN0ZWFkIG9mIGNvbW1hbmQgbGluZQotICAgICAgICAvLyBleGVjdXRpb24gc28gdGhhdCB3ZSBkb24ndCByZWx5IG9uIGhhdmluZyBuYXRpdmUgQ1ZTIHN0dWZmIGFyb3VuZCAoU00pCi0KLSAgICAgICAgLy8gV2UgY2FuJ3QgZG8gaXQgb3Vyc2VsdmVzIGFzIGpDVlMgaXMgR1BMZWQsIGEgdGhpcmQgcGFydHkgdGFzayAKLSAgICAgICAgLy8gb3V0c2lkZSBvZiBqYWthcnRhIHJlcG9zaXRvcmllcyB3b3VsZCBiZSBwb3NzaWJsZSB0aG91Z2ggKFNCKS4KLSAgICAKLSAgICAgICAgQ29tbWFuZGxpbmUgdG9FeGVjdXRlID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0KLSAgICAgICAgdG9FeGVjdXRlLnNldEV4ZWN1dGFibGUoImN2cyIpOwotICAgICAgICBpZiAoY3ZzUm9vdCAhPSBudWxsKSB7IAotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kIik7Ci0gICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShjdnNSb290KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9leGVjKSB7Ci0gICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocXVpZXQpIHsKLSAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItcSIpOwotICAgICAgICB9Ci0gICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUoY29tbWFuZCk7Ci0gICAgICAgIHRvRXhlY3V0ZS5hZGRBcmd1bWVudHMoY21kLmdldENvbW1hbmRsaW5lKCkpOwotCi0gICAgICAgIGlmIChwYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUocGFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbnZpcm9ubWVudCBlbnYgPSBuZXcgRW52aXJvbm1lbnQoKTsKLQotICAgICAgICBpZihwb3J0PjApewotICAgICAgICAgICAgRW52aXJvbm1lbnQuVmFyaWFibGUgdmFyID0gbmV3IEVudmlyb25tZW50LlZhcmlhYmxlKCk7Ci0gICAgICAgICAgICB2YXIuc2V0S2V5KCJDVlNfQ0xJRU5UX1BPUlQiKTsKLSAgICAgICAgICAgIHZhci5zZXRWYWx1ZShTdHJpbmcudmFsdWVPZihwb3J0KSk7Ci0gICAgICAgICAgICBlbnYuYWRkVmFyaWFibGUodmFyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHBhc3NGaWxlIT1udWxsKXsKLSAgICAgICAgICAgIEVudmlyb25tZW50LlZhcmlhYmxlIHZhciA9IG5ldyBFbnZpcm9ubWVudC5WYXJpYWJsZSgpOwotICAgICAgICAgICAgdmFyLnNldEtleSgiQ1ZTX1BBU1NGSUxFIik7Ci0gICAgICAgICAgICB2YXIuc2V0VmFsdWUoU3RyaW5nLnZhbHVlT2YocGFzc0ZpbGUpKTsKLSAgICAgICAgICAgIGVudi5hZGRWYXJpYWJsZSh2YXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgc3RyZWFtaGFuZGxlciA9IG51bGw7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRzdHJlYW0gPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gZXJyb3JzdHJlYW0gPSBudWxsOyAKLSAgICAgICAgaWYgKGVycm9yID09IG51bGwgJiYgb3V0cHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0cmVhbWhhbmRsZXIgPSBuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLCBQcm9qZWN0Lk1TR19JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0c3RyZWFtID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXQpKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dHN0cmVhbSA9IG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcywgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yc3RyZWFtID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShlcnJvcikpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzdHJlYW0gPSBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyZWFtaGFuZGxlciA9IG5ldyBQdW1wU3RyZWFtSGFuZGxlcihvdXRwdXRzdHJlYW0sIGVycm9yc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUoc3RyZWFtaGFuZGxlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgZXhlLnNldEFudFJ1bihwcm9qZWN0KTsKLSAgICAgICAgaWYgKGRlc3QgPT0gbnVsbCkgZGVzdCA9IHByb2plY3QuZ2V0QmFzZURpcigpOwotICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShkZXN0KTsKLQotICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUodG9FeGVjdXRlLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICBleGUuc2V0RW52aXJvbm1lbnQoZW52LmdldFZhcmlhYmxlcygpKTsKLSAgICAgICAgdHJ5IHsKLQkgICAgaW50IHJldENvZGUgPSBleGUuZXhlY3V0ZSgpOwotCSAgICAvKlRocm93IGFuIGV4Y2VwdGlvbiBpZiBjdnMgZXhpdGVkIHdpdGggZXJyb3IuIChJdWxpYW4pKi8KLQkgICAgaWYoZmFpbE9uRXJyb3IgJiYgcmV0Q29kZSAhPSAwKQotCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImN2cyBleGl0ZWQgd2l0aCBlcnJvciBjb2RlICIrIHJldENvZGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgbG9jYXRpb24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0c3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3ZzUm9vdChTdHJpbmcgcm9vdCkgewotICAgICAgICAvLyBDaGVjayBpZiBub3QgcmVhbCBjdnNyb290ID0+IHNldCBpdCB0byBudWxsIAotICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7IAotICAgICAgICAgICAgaWYgKHJvb3QudHJpbSgpLmVxdWFscygiIikpIAotICAgICAgICAgICAgICAgIHJvb3QgPSBudWxsOyAKLSAgICAgICAgfSAKLQotICAgICAgICB0aGlzLmN2c1Jvb3QgPSByb290OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpewotICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3NmaWxlKEZpbGUgcGFzc0ZpbGUpewotICAgICAgICB0aGlzLnBhc3NGaWxlID0gcGFzc0ZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3QpIHsKLSAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBwKSB7Ci0gICAgICAgIHRoaXMucGFjayA9IHA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFnKFN0cmluZyBwKSB7IAotICAgICAgICAvLyBDaGVjayBpZiBub3QgcmVhbCB0YWcgPT4gc2V0IGl0IHRvIG51bGwgCi0gICAgICAgIGlmIChwICE9IG51bGwgJiYgcC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXIiKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHApOwotICAgICAgICB9Ci0gICAgfSAKLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERhdGUoU3RyaW5nIHApIHsKLSAgICAgICAgaWYocCAhPSBudWxsICYmIHAudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1EIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmQoU3RyaW5nIGMpIHsKLSAgICAgICAgdGhpcy5jb21tYW5kID0gYzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UXVpZXQoYm9vbGVhbiBxKSB7Ci0gICAgICAgIHF1aWV0ID0gcTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Tm9leGVjKGJvb2xlYW4gbmUpIHsKLSAgICAgICAgbm9leGVjID0gbmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KEZpbGUgb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvcihGaWxlIGVycm9yKSB7Ci0gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxPbkVycm9yKSB7Ci0JdGhpcy5mYWlsT25FcnJvciA9IGZhaWxPbkVycm9yOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZpbmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzE4ZmIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBUYXNrZGVmIGFuZCBUeXBlZGVmIC0gZG9lcyBhbGwgdGhlIGNsYXNzcGF0aAotICogaGFuZGxpbmcgYW5kIGFuZCBjbGFzcyBsb2FkaW5nLgotICoKLSAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQotICogQGF1dGhvciA8YSBocmVmPSJzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZpbmVyIGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOwotICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlOwotICAgIHByaXZhdGUgYm9vbGVhbiByZXZlcnNlTG9hZGVyID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXZlcnNlTG9hZGVyKGJvb2xlYW4gcmV2ZXJzZUxvYWRlcikgewotICAgICAgICB0aGlzLnJldmVyc2VMb2FkZXIgPSByZXZlcnNlTG9hZGVyOwotICAgICAgICBsb2coIlRoZSByZXZlcnNlbG9hZGVyIGF0dHJpYnV0ZSBpcyBERVBSRUNBVEVELiBJdCB3aWxsIGJlIHJlbW92ZWQiLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7Ci0gICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5jbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQW50Q2xhc3NMb2FkZXIgYWw9Y3JlYXRlTG9hZGVyKCk7Ci0KLSAgICAgICAgaWYgKGZpbGU9PW51bGwgJiYgcmVzb3VyY2U9PW51bGwgKSB7Ci0KLSAgICAgICAgICAgIC8vIHNpbXBsZSBjYXNlIC0gb25lIGRlZmluaXRpb24KLSAgICAgICAgICAgIGlmICggbmFtZT09bnVsbCB8fCB2YWx1ZT09bnVsbCAgKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJuYW1lIG9yIGNsYXNzbmFtZSBhdHRyaWJ1dGVzIG9mICIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRUYXNrTmFtZSgpICsgIiBlbGVtZW50ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiYXJlIHVuZGVmaW5lZCI7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGREZWZpbml0aW9uKCBhbCwgbmFtZSwgdmFsdWUgKTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgfHwgdmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5hbWUgb3IgdmFsdWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAidG9nZXRoZXIgd2l0aCBmaWxlIG9yIHJlc291cmNlLiI7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJZb3UgbXVzdCBub3Qgc3BlY2lmeSBib3RoLCBmaWxlIGFuZCByZXNvdXJjZS4iOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzPW5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXM9bnVsbDsKLSAgICAgICAgICAgICAgICBpZiggZmlsZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICBsb2coIkxvYWRpbmcgZGVmaW5pdGlvbnMgZnJvbSBmaWxlICIgKyBmaWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICBpcz1uZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBsb2FkIGRlZmluaXRpb25zIGZyb20gZmlsZSAiICsgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi4gSXQgZG9lc25cJ3QgZXhpc3QuIiwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICAgIAotICAgICAgICAgICAgICAgIGlmKCByZXNvdXJjZSE9bnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJMb2FkaW5nIGRlZmluaXRpb25zIGZyb20gcmVzb3VyY2UgIiArIHJlc291cmNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICBpcz1hbC5nZXRSZXNvdXJjZUFzU3RyZWFtKCByZXNvdXJjZSApOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDb3VsZCBub3QgbG9hZCBkZWZpbml0aW9ucyBmcm9tIHJlc291cmNlICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNvdXJjZSArICIuIEl0IGNvdWxkIG5vdCBiZSBmb3VuZC4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBpcyE9bnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcHMubG9hZCggaXMgKTsKLSAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24ga2V5cz1wcm9wcy5rZXlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCBrZXlzLmhhc01vcmVFbGVtZW50cygpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG49KFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdj1wcm9wcy5nZXRQcm9wZXJ0eSggbiApOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRGVmaW5pdGlvbiggYWwsIG4sIHYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2goIElPRXhjZXB0aW9uIGV4ICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGREZWZpbml0aW9uKCBDbGFzc0xvYWRlciBhbCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGMgPSBhbC5sb2FkQ2xhc3ModmFsdWUpOwotICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIuaW5pdGlhbGl6ZUNsYXNzKGMpOwotICAgICAgICAgICAgYWRkRGVmaW5pdGlvbihuYW1lLCBjKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gZ2V0VGFza05hbWUoKSsiIGNsYXNzICIgKyB2YWx1ZSArCi0gICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgZm91bmQiOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgY25mZSwgbG9jYXRpb24pOwotICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGdldFRhc2tOYW1lKCkrIiBjbGFzcyAiICsgdmFsdWUgKwotICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIGZvdW5kIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIG5jZGZlLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgQW50Q2xhc3NMb2FkZXIgY3JlYXRlTG9hZGVyKCkgewotICAgICAgICBBbnRDbGFzc0xvYWRlciBhbCA9IG51bGw7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgYWwgPSBuZXcgQW50Q2xhc3NMb2FkZXIocHJvamVjdCwgY2xhc3NwYXRoLCAhcmV2ZXJzZUxvYWRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhbCA9IG5ldyBBbnRDbGFzc0xvYWRlcihwcm9qZWN0LCBQYXRoLnN5c3RlbUNsYXNzcGF0aCwgIXJldmVyc2VMb2FkZXIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIG5lZWQgdG8gbG9hZCBUYXNrIHZpYSBzeXN0ZW0gY2xhc3Nsb2FkZXIgb3IgdGhlIG5ldwotICAgICAgICAvLyB0YXNrIHdlIHdhbnQgdG8gZGVmaW5lIHdpbGwgbmV2ZXIgYmUgYSBUYXNrIGJ1dCBhbHdheXMKLSAgICAgICAgLy8gYmUgd3JhcHBlZCBpbnRvIGEgVGFza0FkYXB0ZXIuCi0gICAgICAgIGFsLmFkZFN5c3RlbVBhY2thZ2VSb290KCJvcmcuYXBhY2hlLnRvb2xzLmFudCIpOwotICAgICAgICByZXR1cm4gYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZSggRmlsZSBmaWxlICkgewotICAgICAgICB0aGlzLmZpbGU9ZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZSggU3RyaW5nIHJlcyApIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZT1yZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZSggU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRGVmaW5pdGlvbihTdHJpbmcgbmFtZSwgQ2xhc3MgYyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWxldGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbGV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2EwNGJiLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbGV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIERlbGV0ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSwgb3Igc2V0IG9mIGZpbGVzIGRlZmluZWQgYnkgYSBmaWxlc2V0LgotICogVGhlIG9yaWdpbmFsIGRlbGV0ZSB0YXNrIHdvdWxkIGRlbGV0ZSBhIGZpbGUsIG9yIGEgc2V0IG9mIGZpbGVzIAotICogdXNpbmcgdGhlIGluY2x1ZGUvZXhjbHVkZSBzeW50YXguICBUaGUgZGVsdHJlZSB0YXNrIHdvdWxkIGRlbGV0ZSBhIAotICogZGlyZWN0b3J5IHRyZWUuICBUaGlzIHRhc2sgY29tYmluZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlc2UgdHdvCi0gKiBvcmlnaW5hbGx5IGRpc3RpbmN0IHRhc2tzLgotICogPHA+Q3VycmVudGx5IERlbGV0ZSBleHRlbmRzIE1hdGNoaW5nVGFzay4gIFRoaXMgaXMgaW50ZW5kIDxpPm9ubHk8L2k+Ci0gKiB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBhIHJlbGVhc2UuICBUaGUgZnV0dXJlIHBvc2l0aW9uCi0gKiBpcyB0byB1c2UgbmVzdGVkIGZpbGVzZXRzIGV4Y2x1c2l2ZWx5LjwvcD4KLSAqIAotICogQGF1dGhvciBTdGVmYW5vIE1henpvY2NoaSA8YSBocmVmPSJtYWlsdG86c3RlZmFub0BhcGFjaGUub3JnIj5zdGVmYW5vQGFwYWNoZS5vcmc8L2E+Ci0gKiBAYXV0aG9yIFRvbSBEaW1vY2sgPGEgaHJlZj0ibWFpbHRvOnRhZDFAY29ybmVsbC5lZHUiPnRhZDFAY29ybmVsbC5lZHU8L2E+Ci0gKiBAYXV0aG9yIEdsZW5uIE1jQWxsaXN0ZXIgPGEgaHJlZj0ibWFpbHRvOmdsZW5ubUBjYS5pYm0uY29tIj5nbGVubm1AY2EuaWJtLmNvbTwvYT4KLSAqIEBhdXRob3IgSm9uIFMuIFN0ZXZlbnMgPGEgaHJlZj0ibWFpbHRvOmpvbkBsYXRjaGtleS5jb20iPmpvbkBsYXRjaGtleS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGUgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotICAgIHByb3RlY3RlZCBGaWxlIGZpbGUgPSBudWxsOwotICAgIHByb3RlY3RlZCBGaWxlIGRpciA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VkTWF0Y2hpbmdUYXNrID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUVtcHR5ID0gZmFsc2U7ICAgICAvLyBieSBkZWZhdWx0LCByZW1vdmUgbWF0Y2hpbmcgZW1wdHkgZGlycwotCi0gICAgcHJpdmF0ZSBpbnQgdmVyYm9zaXR5ID0gUHJvamVjdC5NU0dfVkVSQk9TRTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcXVpZXQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmFpbG9uZXJyb3IgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBuYW1lIG9mIGEgc2luZ2xlIGZpbGUgdG8gYmUgcmVtb3ZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIGJlIGRlbGV0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZmlsZXMgYXJlIHRvIGJlIGRlbGV0ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgewotICAgICAgICB0aGlzLmRpciA9IGRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGZvcmNlIGxpc3Rpbmcgb2YgYWxsIG5hbWVzIG9mIGRlbGV0ZWQgZmlsZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmVyYm9zZSAidHJ1ZSIgb3IgIm9uIgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IFByb2plY3QuTVNHX0lORk87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IFByb2plY3QuTVNHX1ZFUkJPU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgZG8gbm90IGRpc3BsYXkgYSBkaWFnbm9zdGljCi0gICAgICogbWVzc2FnZSBvciBtb2RpZnkgdGhlIGV4aXQgc3RhdHVzIHRvIHJlZmxlY3QgYW4gZXJyb3IuCi0gICAgICogVGhpcyBtZWFucyB0aGF0IGlmIGEgZmlsZSBvciBkaXJlY3RvcnkgY2Fubm90IGJlIGRlbGV0ZWQsCi0gICAgICogdGhlbiBubyBlcnJvciBpcyByZXBvcnRlZC4gVGhpcyBzZXR0aW5nIGVtdWxhdGVzIHRoZQotICAgICAqIC1mIG9wdGlvbiB0byB0aGUgVW5peCAmcXVvdDtybSZxdW90OyBjb21tYW5kLgotICAgICAqIERlZmF1bHQgaXMgZmFsc2UgbWVhbmluZyB0aGluZ3MgYXJlICZxdW90O25vaXN5JnF1b3Q7Ci0gICAgICogQHBhcmFtIHF1aWV0ICJ0cnVlIiBvciAib24iCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UXVpZXQoYm9vbGVhbiBxdWlldCkgewotICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7Ci0gICAgICAgIGlmIChxdWlldCkgewotICAgICAgICAgICAgdGhpcy5mYWlsb25lcnJvciA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBmbGFnIG1lYW5zICdub3RlIGVycm9ycyB0byB0aGUgb3V0cHV0LCBidXQga2VlcCBnb2luZycKLSAgICAgKiBAcGFyYW0gZmFpbG9uZXJyb3IgdHJ1ZSBvciBmYWxzZQotICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxvbmVycm9yKSB7Ci0gICAgICAgICB0aGlzLmZhaWxvbmVycm9yPWZhaWxvbmVycm9yOwotICAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gZGVsZXRlIGVtcHR5IGRpcmVjdG9yaWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVFbXB0eURpcnMoYm9vbGVhbiBpbmNsdWRlRW1wdHkpIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlRW1wdHkgPSBpbmNsdWRlRW1wdHk7Ci0gICAgfQotCi0gICAvKioKLSAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKLSAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVJbmNsdWRlKCkgewotICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUluY2x1ZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBleGNsdWRlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlRXhjbHVkZSgpIHsKLSAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7Ci0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVFeGNsdWRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgc2V0IG9mIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQgY3JlYXRlUGF0dGVyblNldCgpIHsKLSAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7Ci0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVQYXR0ZXJuU2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB7Ci0gICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwotICAgICAgICBzdXBlci5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKSB7Ci0gICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwotICAgICAgICBzdXBlci5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlRGVmYXVsdEV4Y2x1ZGVzICJ0cnVlInwib24ifCJ5ZXMiIHdoZW4gZGVmYXVsdCBleGNsdXNpb25zCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCwgImZhbHNlInwib2ZmInwibm8iIHdoZW4gdGhleQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkbid0IGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdGV4Y2x1ZGVzKGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzKSB7Ci0gICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwotICAgICAgICBzdXBlci5zZXREZWZhdWx0ZXhjbHVkZXModXNlRGVmYXVsdEV4Y2x1ZGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGluY2x1ZGVzZmlsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZSB0byBmZXRjaAotICAgICAqIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXNmaWxlKEZpbGUgaW5jbHVkZXNmaWxlKSB7Ci0gICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwotICAgICAgICBzdXBlci5zZXRJbmNsdWRlc2ZpbGUoaW5jbHVkZXNmaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVzZmlsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZSB0byBmZXRjaAotICAgICAqIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXNmaWxlKEZpbGUgZXhjbHVkZXNmaWxlKSB7Ci0gICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwotICAgICAgICBzdXBlci5zZXRFeGNsdWRlc2ZpbGUoZXhjbHVkZXNmaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgdGhlIGZpbGUocykuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh1c2VkTWF0Y2hpbmdUYXNrKSB7Ci0gICAgICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBVc2Ugb2YgdGhlIGltcGxpY2l0IEZpbGVTZXQgaXMgZGVwcmVjYXRlZC4gIFVzZSBhIG5lc3RlZCBmaWxlc2V0IGVsZW1lbnQgaW5zdGVhZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWxlID09IG51bGwgJiYgZGlyID09IG51bGwgJiYgZmlsZXNldHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIG9mIHRoZSBmaWxlIG9yIGRpciBhdHRyaWJ1dGVzLCBvciBhIGZpbGVzZXQgZWxlbWVudCwgbXVzdCBiZSBzZXQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocXVpZXQgJiYgZmFpbG9uZXJyb3IpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicXVpZXQgYW5kIGZhaWxvbmVycm9yIGNhbm5vdCBib3RoIGJlIHNldCB0byB0cnVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgLy8gZGVsZXRlIHRoZSBzaW5nbGUgZmlsZQotICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXJlY3RvcnkgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGNhbm5vdCBiZSByZW1vdmVkIHVzaW5nIHRoZSBmaWxlIGF0dHJpYnV0ZS4gIFVzZSBkaXIgaW5zdGVhZC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmRlbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZT0iVW5hYmxlIHRvIGRlbGV0ZSBmaWxlICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmFpbG9uZXJyb3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBmaW5kIGZpbGUgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIHRvIGRlbGV0ZS4iLCAKLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWxldGUgdGhlIGRpcmVjdG9yeQotICAgICAgICBpZiAoZGlyICE9IG51bGwgJiYgZGlyLmV4aXN0cygpICYmIGRpci5pc0RpcmVjdG9yeSgpICYmICF1c2VkTWF0Y2hpbmdUYXNrKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgSWYgdmVyYm9zaXR5IGlzIE1TR19WRVJCT1NFLCB0aGF0IG1lYW4gd2UgYXJlIGRvaW5nIHJlZ3VsYXIgbG9nZ2luZwotICAgICAgICAgICAgICAgKGJhY2t3YXJkcyBhcyB0aGF0IHNvdW5kcykuICBJbiB0aGF0IGNhc2UsIHdlIHdhbnQgdG8gcHJpbnQgb25lCi0gICAgICAgICAgICAgICBtZXNzYWdlIGFib3V0IGRlbGV0aW5nIHRoZSB0b3Agb2YgdGhlIGRpcmVjdG9yeSB0cmVlLiAgT3RoZXJ3aXNlLAotICAgICAgICAgICAgICAgdGhlIHJlbW92ZURpciBtZXRob2Qgd2lsbCBoYW5kbGUgbWVzc2FnZXMgZm9yIF9hbGxfIGRpcmVjdG9yaWVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAodmVyYm9zaXR5ID09IFByb2plY3QuTVNHX1ZFUkJPU0UpIHsKLSAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbW92ZURpcihkaXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVsZXRlIHRoZSBmaWxlcyBpbiB0aGUgZmlsZXNldHMKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZGlycyA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKLSAgICAgICAgICAgICAgICByZW1vdmVGaWxlcyhmcy5nZXREaXIocHJvamVjdCksIGZpbGVzLCBkaXJzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IHJlYWRhYmxlCi0gICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGJlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhiZS5nZXRNZXNzYWdlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVsZXRlIHRoZSBmaWxlcyBmcm9tIHRoZSBkZWZhdWx0IGZpbGVzZXQKLSAgICAgICAgaWYgKHVzZWRNYXRjaGluZ1Rhc2sgJiYgZGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHN1cGVyLmdldERpcmVjdG9yeVNjYW5uZXIoZGlyKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBkaXJzID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOwotICAgICAgICAgICAgICAgIHJlbW92ZUZpbGVzKGRpciwgZmlsZXMsIGRpcnMpOwotICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUKLSAgICAgICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgYmU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGJlLmdldE1lc3NhZ2UoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAgcHJvdGVjdGVkIGFuZCBwcml2YXRlIG1ldGhvZHMKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVEaXIoRmlsZSBkKSB7Ci0gICAgICAgIFN0cmluZ1tdIGxpc3QgPSBkLmxpc3QoKTsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgbGlzdCA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBsaXN0W2ldOwotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZCwgcyk7Ci0gICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRGlyKGYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nICIgKyBmLmdldEFic29sdXRlUGF0aCgpLCB2ZXJib3NpdHkpOwotICAgICAgICAgICAgICAgIGlmICghZi5kZWxldGUoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZT0iVW5hYmxlIHRvIGRlbGV0ZSBmaWxlICIgKyBmLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICBpZihmYWlsb25lcnJvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvZygiRGVsZXRpbmcgZGlyZWN0b3J5ICIgKyBkLmdldEFic29sdXRlUGF0aCgpLCB2ZXJib3NpdHkpOwotICAgICAgICBpZiAoIWQuZGVsZXRlKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlPSJVbmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgaWYoZmFpbG9uZXJyb3IpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlbW92ZSBhbiBhcnJheSBvZiBmaWxlcyBpbiBhIGRpcmVjdG9yeSwgYW5kIGEgbGlzdCBvZiBzdWJkaXJlY3RvcmllcwotICAgICAqIHdoaWNoIHdpbGwgb25seSBiZSBkZWxldGVkIGlmICdpbmNsdWRlRW1wdHknIGlzIHRydWUKLSAgICAgKiBAcGFyYW0gZCBkaXJlY3RvcnkgdG8gd29yayBmcm9tCi0gICAgICogQHBhcmFtIGZpbGVzIGFycmF5IG9mIGZpbGVzIHRvIGRlbGV0ZTsgY2FuIGJlIG9mIHplcm8gbGVuZ3RoCi0gICAgICogQHBhcmFtIGRpcnMgYXJyYXkgb2YgZGlyZWN0b3JpZXMgdG8gZGVsZXRlOyBjYW4gb2YgemVybyBsZW5ndGgKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVGaWxlcyhGaWxlIGQsIFN0cmluZ1tdIGZpbGVzLCBTdHJpbmdbXSBkaXJzKSB7Ci0gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBsb2coIkRlbGV0aW5nICIgKyBmaWxlcy5sZW5ndGggKyAiIGZpbGVzIGZyb20gIiArIGQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPGZpbGVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZCwgZmlsZXNbal0pOwotICAgICAgICAgICAgICAgIGxvZygiRGVsZXRpbmcgIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCksIHZlcmJvc2l0eSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmLmRlbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlPSJVbmFibGUgdG8gZGVsZXRlIGZpbGUgIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZhaWxvbmVycm9yKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlycy5sZW5ndGggPiAwICYmIGluY2x1ZGVFbXB0eSkgewotICAgICAgICAgICAgaW50IGRpckNvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGo9ZGlycy5sZW5ndGgtMTsgaj49MDsgai0tKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShkLCBkaXJzW2pdKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBkaXJGaWxlcyA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRpckZpbGVzID09IG51bGwgfHwgZGlyRmlsZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJEZWxldGluZyAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpLCB2ZXJib3NpdHkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWRpci5kZWxldGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2U9IlVuYWJsZSB0byBkZWxldGUgZGlyZWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmYWlsb25lcnJvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlyQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRpckNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIGxvZygiRGVsZXRlZCAiICsgZGlyQ291bnQgKyAiIGRpcmVjdG9yIiArCi0gICAgICAgICAgICAgICAgICAgIChkaXJDb3VudD09MSA/ICJ5IiA6ICJpZXMiKSArCi0gICAgICAgICAgICAgICAgICAgICIgZnJvbSAiICsgZC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4MWEyMy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWx0cmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqCi0gKgotICogQGF1dGhvciBkdW5jYW5AeDE4MC5jb20KLSAqCi0gKiBAZGVwcmVjYXRlZCBUaGUgZGVsdHJlZSB0YXNrIGlzIGRlcHJlY2F0ZWQuICBVc2UgZGVsZXRlIGluc3RlYWQuCi0gKi8KLQotcHVibGljIGNsYXNzIERlbHRyZWUgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgRmlsZSBkaXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkaXIpIHsKLQl0aGlzLmRpciA9IGRpcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBkZWx0cmVlIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBkZWxldGUgaW5zdGVhZC4iKTsKLQotICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0gCi0KLQlpZiAoZGlyLmV4aXN0cygpKSB7Ci0JICAgIGlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJaWYgKCFkaXIuZGVsZXRlKCkpIHsKLSAgICAgICAgCSAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBkZWxldGUgZGlyZWN0b3J5ICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLQkgICAgICAgIH0KLQkJcmV0dXJuOwotCQkvLyBTdHJpbmcgbXNnID0gIkdpdmVuIGRpcjogIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArCi0JCS8vICIgaXMgbm90IGEgZGlyIjsKLQkJLy8gdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0JICAgIH0KLQotICAgICAgICAgICAgbG9nKCJEZWxldGluZzogIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRGlyKGRpcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlVuYWJsZSB0byBkZWxldGUgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZURpcihGaWxlIGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gZGlyIGlzbid0IGEgc3ltbGluawotICAgICAgICAvLyB0aGUgY29tcGFyaXNvbiBvZiBhYnNvbHV0ZSBwYXRoIGFuZCBjYW5vbmljYWwgcGF0aAotICAgICAgICAvLyBjYXRjaGVzIHRoaXMKLQkKLQkvLyAgICAgICAgaWYgKGRpci5nZXRDYW5vbmljYWxQYXRoKCkuZXF1YWxzKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkvLyAoY29zdGluKSBJdCB3aWxsIG5vdCB3b3JrIGlmIC9ob21lL2Nvc3RpbiBpcyBzeW1saW5rIHRvIC9kYTAvaG9tZS9jb3N0aW4gKCB0YXoKLQkvLyBmb3IgZXhhbXBsZSApCi0JU3RyaW5nW10gbGlzdCA9IGRpci5saXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JICAgIFN0cmluZyBzID0gbGlzdFtpXTsKLQkgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBzKTsKLQkgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotCQlyZW1vdmVEaXIoZik7Ci0JICAgIH0gZWxzZSB7Ci0JCWlmICghZi5kZWxldGUoKSkgewotICAgICAgICAJICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGRlbGV0ZSBmaWxlICIgKyBmLmdldEFic29sdXRlUGF0aCgpKTsKLQkgICAgICAgIH0KLQkgICAgfQotCX0KLSAgICAgICAgaWYgKCFkaXIuZGVsZXRlKCkpIHsKLQkgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXBlbmRTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlcGVuZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVmNTg1Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlcGVuZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0OwotCi0vKioKLSAqIEEgVGFzayB0byByZWNvcmQgZXhwbGljaXQgZGVwZW5kZW5jaWVzLiAgSWYgYW55IG9mIHRoZSB0YXJnZXQgZmlsZXMKLSAqIGFyZSBvdXQgb2YgZGF0ZSB3aXRoIHJlc3BlY3QgdG8gYW55IG9mIHRoZSBzb3VyY2UgZmlsZXMsIGFsbCB0YXJnZXQKLSAqIGZpbGVzIGFyZSByZW1vdmVkLiAgVGhpcyBpcyB1c2VmdWwgd2hlcmUgZGVwZW5kZW5jaWVzIGNhbm5vdCBiZQotICogY29tcHV0ZWQgKGZvciBleGFtcGxlLCBkeW5hbWljYWxseSBpbnRlcnByZXRlZCBwYXJhbWV0ZXJzIG9yIGZpbGVzCi0gKiB0aGF0IG5lZWQgdG8gc3RheSBpbiBzeW5jaCBidXQgYXJlIG5vdCBkaXJlY3RseSBsaW5rZWQpIG9yIHdoZXJlCi0gKiB0aGUgYW50IHRhc2sgaW4gcXVlc3Rpb24gY291bGQgY29tcHV0ZSB0aGVtIGJ1dCBkb2VzIG5vdCAoZm9yCi0gKiBleGFtcGxlLCB0aGUgbGlua2VkIERURCBmb3IgYW4gWE1MIGZpbGUgdXNpbmcgdGhlIHN0eWxlIHRhc2spLgotICoKLSAqIG5lc3RlZCBhcmd1bWVudHM6Ci0gKiA8dWw+Ci0gKiA8bGk+c3JjZmlsZXNldCAgICAgKGZpbGVzZXQgZGVzY3JpYmluZyB0aGUgc291cmNlIGZpbGVzIHRvIGV4YW1pbmUpCi0gKiA8bGk+c3JjZmlsZWxpc3QgICAgKGZpbGVsaXN0IGRlc2NyaWJpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBleGFtaW5lKQotICogPGxpPnRhcmdldGZpbGVzZXQgIChmaWxlc2V0IGRlc2NyaWJpbmcgdGhlIHRhcmdldCBmaWxlcyB0byBleGFtaW5lKQotICogPGxpPnRhcmdldGZpbGVsaXN0IChmaWxlbGlzdCBkZXNjcmliaW5nIHRoZSB0YXJnZXQgZmlsZXMgdG8gZXhhbWluZSkKLSAqIDwvdWw+Ci0gKiBBdCBsZWFzdCBvbmUgaW5zdGFuY2Ugb2YgZWl0aGVyIGEgZmlsZXNldCBvciBmaWxlbGlzdCBmb3IgYm90aCBzb3VyY2UgYW5kIHRhcmdldAotICogYXJlIHJlcXVpcmVkLgotICogPHA+Ci0gKiBUaGlzIHRhc2sgd2lsbCBleGFtaW5lIGVhY2ggb2YgdGhlIHNvdXJjZSBmaWxlcyBhZ2FpbnN0IGVhY2ggb2YgdGhlIHRhcmdldCBmaWxlcy4KLSAqIElmIGFueSB0YXJnZXQgZmlsZXMgYXJlIG91dCBvZiBkYXRlIHdpdGggcmVzcGVjdCB0byBhbnkgb2YgdGhlIHNvdXJjZSBmaWxlcywgYWxsIHRhcmdldHMgYXJlIHJlbW92ZWQuCi0gKiBJZiBhbnkgZmlsZXMgbmFtZWQgaW4gYSAoc3JjIG9yIHRhcmdldCkgZmlsZWxpc3QgZG8gbm90IGV4aXN0LCBhbGwgdGFyZ2V0cyBhcmUgcmVtb3ZlZC4KLSAqIEhpbnQ6IElmIG1pc3NpbmcgZmlsZXMgc2hvdWxkIGJlIGlnbm9yZWQsIHNwZWNpZnkgdGhlbSBhcyBpbmNsdWRlIHBhdHRlcm5zIGluIGZpbGVzZXRzLAotICogcmF0aGVyIHRoYW4gdXNpbmcgZmlsZWxpc3RzLgotICogPC9wPjxwPgotICogVGhpcyB0YXNrIGF0dGVtcHRzIHRvIG9wdGltaXplIHNwZWVkIG9mIGRlcGVuZGVuY3kgY2hlY2tpbmcuICBJdCB3aWxsIHN0b3AgYWZ0ZXIgdGhlIGZpcnN0Ci0gKiBvdXQgb2YgZGF0ZSBmaWxlIGlzIGZvdW5kIGFuZCByZW1vdmUgYWxsIHRhcmdldHMsIHJhdGhlciB0aGFuIGV4aGF1c3RpdmVseSBjaGVja2luZyBldmVyeQotICogc291cmNlIHZzIHRhcmdldCBjb21iaW5hdGlvbiB1bm5lY2Vzc2FyaWx5LgotICogPC9wPjxwPgotICogRXhhbXBsZSB1c2VzOiAKLSAqIDx1bGlzdD48bGk+Ci0gKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhbiBYTUwgZmlsZSBtdXN0IGJlIHVwIHRvIGRhdGUKLSAqIHdpdGggcmVzcGVjdCB0byBpdHMgWFNEIChTY2hlbWEgZmlsZSksIGV2ZW4gdGhvdWdoIHRoZSBYTUwgZmlsZQotICogaXRzZWxmIGluY2x1ZGVzIG5vIHJlZmVyZW5jZSB0byBpdHMgWFNELgotICogPC9saT48bGk+Ci0gKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhbiBYU0wgc3R5bGVzaGVldCBpbmNsdWRlcyBvdGhlcgotICogc3ViLXN0eWxlc2hlZXRzCi0gKiA8L2xpPjxsaT4KLSAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGphdmEgZmlsZXMgbXVzdCBiZSByZWNvbXBpbGVkIGlmIHRoZSBhbnQgYnVpbGQKLSAqIGZpbGUgY2hhbmdlcwotICogPC9saT48L3VsaXN0PgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjc3Ryb25nQGFyaWVscGFydG5lcnMuY29tIj5DcmFlZyBTdHJvbmc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kU2V0IGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKLQotICAgIHByaXZhdGUgVmVjdG9yIHNvdXJjZUZpbGVTZXRzICA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcml2YXRlIFZlY3RvciBzb3VyY2VGaWxlTGlzdHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgdGFyZ2V0RmlsZVNldHMgID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgVmVjdG9yIHRhcmdldEZpbGVMaXN0cyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRGVwZW5kU2V0IFRhc2suCi0gICAgICoqLwotICAgIHB1YmxpYyBEZXBlbmRTZXQoKSB7Ci0gICAgfSAvLy0tIERlcGVuZFNldAotCi0gICAgLyoqCi0gICAgICogTmVzdGVkICZsdDtzcmNmaWxlc2V0Jmd0OyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNyY2ZpbGVzZXQoRmlsZVNldCBmcykgewotICAgICAgICBzb3VyY2VGaWxlU2V0cy5hZGRFbGVtZW50KGZzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOZXN0ZWQgJmx0O3NyY2ZpbGVsaXN0Jmd0OyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNyY2ZpbGVsaXN0KEZpbGVMaXN0IGZsKSB7Ci0gICAgICAgIHNvdXJjZUZpbGVMaXN0cy5hZGRFbGVtZW50KGZsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOZXN0ZWQgJmx0O3RhcmdldGZpbGVzZXQmZ3Q7IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGFyZ2V0ZmlsZXNldChGaWxlU2V0IGZzKSB7Ci0gICAgICAgIHRhcmdldEZpbGVTZXRzLmFkZEVsZW1lbnQoZnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5lc3RlZCAmbHQ7dGFyZ2V0ZmlsZWxpc3QmZ3Q7IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGFyZ2V0ZmlsZWxpc3QoRmlsZUxpc3QgZmwpIHsKLSAgICAgICAgdGFyZ2V0RmlsZUxpc3RzLmFkZEVsZW1lbnQoZmwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCAoc291cmNlRmlsZVNldHMuc2l6ZSgpID09IDApICYmIChzb3VyY2VGaWxlTGlzdHMuc2l6ZSgpID09IDApICkgeyAKLSAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSA8c3JjZmlsZXNldD4gb3IgPHNyY2ZpbGVsaXN0PiBlbGVtZW50IG11c3QgYmUgc2V0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICh0YXJnZXRGaWxlU2V0cy5zaXplKCkgPT0gMCkgJiYgKHRhcmdldEZpbGVMaXN0cy5zaXplKCkgPT0gMCkgKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBdCBsZWFzdCBvbmUgPHRhcmdldGZpbGVzZXQ+IG9yIDx0YXJnZXRmaWxlbGlzdD4gZWxlbWVudCBtdXN0IGJlIHNldCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotICAgICAgICAvKgotICAgICAgICAgIElmIHdlJ3JlIG9uIFdpbmRvd3MsIHdlIGhhdmUgdG8gbXVuZ2UgdGhlIHRpbWUgdXAgdG8gMiBzZWNzIHRvCi0gICAgICAgICAgYmUgYWJsZSB0byBjaGVjayBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcy4KLSAgICAgICAgICAoV2luZG93cyBoYXMgYSBtYXggcmVzb2x1dGlvbiBvZiB0d28gc2VjcyBmb3IgbW9kaWZpY2F0aW9uIHRpbWVzKQotICAgICAgICAqLwotICAgICAgICBTdHJpbmcgb3NuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYgKCBvc25hbWUuaW5kZXhPZigid2luZG93cyIpID49IDAgKSB7Ci0gICAgICAgICAgICBub3cgKz0gMjAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEdyYWIgYWxsIHRoZSB0YXJnZXQgZmlsZXMgc3BlY2lmaWVkIHZpYSBmaWxlc2V0cwotICAgICAgICAvLwotICAgICAgICBWZWN0b3IgIGFsbFRhcmdldHMgICAgICAgICA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZW51bVRhcmdldFNldHMgPSB0YXJnZXRGaWxlU2V0cy5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZW51bVRhcmdldFNldHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgIEZpbGVTZXQgdGFyZ2V0RlMgICAgICAgICAgPSAoRmlsZVNldCkgZW51bVRhcmdldFNldHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciB0YXJnZXREUyA9IHRhcmdldEZTLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgIFN0cmluZ1tdIHRhcmdldEZpbGVzICAgICAgPSB0YXJnZXREUy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldEZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBGaWxlIGRlc3QgPSBuZXcgRmlsZSh0YXJnZXRGUy5nZXREaXIocHJvamVjdCksIHRhcmdldEZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgYWxsVGFyZ2V0cy5hZGRFbGVtZW50KGRlc3QpOwotCi0gICAgICAgICAgICAgIGlmIChkZXN0Lmxhc3RNb2RpZmllZCgpID4gbm93KSB7Ci0gICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogIit0YXJnZXRGaWxlc1tpXSsiIG1vZGlmaWVkIGluIHRoZSBmdXR1cmUuIiwgCi0gICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBHcmFiIGFsbCB0aGUgdGFyZ2V0IGZpbGVzIHNwZWNpZmllZCB2aWEgZmlsZWxpc3RzCi0gICAgICAgIC8vCi0gICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgICAgICAgICAgICA9IHRydWU7Ci0gICAgICAgIEVudW1lcmF0aW9uIGVudW1UYXJnZXRMaXN0cyA9IHRhcmdldEZpbGVMaXN0cy5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZW51bVRhcmdldExpc3RzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICBGaWxlTGlzdCB0YXJnZXRGTCAgICA9IChGaWxlTGlzdCkgZW51bVRhcmdldExpc3RzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgIFN0cmluZ1tdIHRhcmdldEZpbGVzID0gdGFyZ2V0RkwuZ2V0RmlsZXMocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldEZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBGaWxlIGRlc3QgPSBuZXcgRmlsZSh0YXJnZXRGTC5nZXREaXIocHJvamVjdCksIHRhcmdldEZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgaWYgKCFkZXN0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgIGxvZyh0YXJnZXRGaWxlc1tpXSsgIiBkb2VzIG5vdCBleGlzdC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgdXBUb0RhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgIGFsbFRhcmdldHMuYWRkRWxlbWVudChkZXN0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoZGVzdC5sYXN0TW9kaWZpZWQoKSA+IG5vdykgewotICAgICAgICAgICAgICAgICBsb2coIldhcm5pbmc6ICIrdGFyZ2V0RmlsZXNbaV0rIiBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLiIsIAotICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQ2hlY2sgdGFyZ2V0cyB2cyBzb3VyY2UgZmlsZXMgc3BlY2lmaWVkIHZpYSBmaWxlc2V0cwotICAgICAgICAvLwotICAgICAgICBpZiAodXBUb0RhdGUpIHsKLSAgICAgICAgICAgRW51bWVyYXRpb24gZW51bVNvdXJjZVNldHMgPSBzb3VyY2VGaWxlU2V0cy5lbGVtZW50cygpOwotICAgICAgICAgICB3aGlsZSAodXBUb0RhdGUgJiYgZW51bVNvdXJjZVNldHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAKLSAgICAgICAgICAgICAgRmlsZVNldCBzb3VyY2VGUyAgICAgICAgICA9IChGaWxlU2V0KSBlbnVtU291cmNlU2V0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNvdXJjZURTID0gc291cmNlRlMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKLSAgICAgICAgICAgICAgU3RyaW5nW10gc291cmNlRmlsZXMgICAgICA9IHNvdXJjZURTLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgRmlsZSBzcmMgPSBuZXcgRmlsZShzb3VyY2VGUy5nZXREaXIocHJvamVjdCksIHNvdXJjZUZpbGVzW2ldKTsKLQotICAgICAgICAgICAgICAgICBpZiAoc3JjLmxhc3RNb2RpZmllZCgpID4gbm93KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogIitzb3VyY2VGaWxlc1tpXSsiIG1vZGlmaWVkIGluIHRoZSBmdXR1cmUuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW1UYXJnZXRzID0gYWxsVGFyZ2V0cy5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgICB3aGlsZSAodXBUb0RhdGUgJiYgZW51bVRhcmdldHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgZGVzdCA9IChGaWxlKWVudW1UYXJnZXRzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmMubGFzdE1vZGlmaWVkKCkgPiBkZXN0Lmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxvZyhkZXN0LmdldFBhdGgoKSArICIgaXMgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlc1tpXSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHVwVG9EYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gd2hpbGUgKHVwVG9EYXRlICYmICgrK2kgPCBzb3VyY2VGaWxlcy5sZW5ndGgpICk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENoZWNrIHRhcmdldHMgdnMgc291cmNlIGZpbGVzIHNwZWNpZmllZCB2aWEgZmlsZWxpc3RzCi0gICAgICAgIC8vCi0gICAgICAgIGlmICh1cFRvRGF0ZSkgewotICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtU291cmNlTGlzdHMgPSBzb3VyY2VGaWxlTGlzdHMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgd2hpbGUgKHVwVG9EYXRlICYmIGVudW1Tb3VyY2VMaXN0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgIAotICAgICAgICAgICAgICBGaWxlTGlzdCBzb3VyY2VGTCAgICAgICAgID0gKEZpbGVMaXN0KSBlbnVtU291cmNlTGlzdHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nW10gc291cmNlRmlsZXMgICAgICA9IHNvdXJjZUZMLmdldEZpbGVzKHByb2plY3QpOwotCi0gICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICBGaWxlIHNyYyA9IG5ldyBGaWxlKHNvdXJjZUZMLmdldERpcihwcm9qZWN0KSwgc291cmNlRmlsZXNbaV0pOwotCi0gICAgICAgICAgICAgICAgIGlmIChzcmMubGFzdE1vZGlmaWVkKCkgPiBub3cpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiAiK3NvdXJjZUZpbGVzW2ldKyIgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZS4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgaWYgKCFzcmMuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKHNvdXJjZUZpbGVzW2ldKyAiIGRvZXMgbm90IGV4aXN0LiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICB1cFRvRGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW1UYXJnZXRzID0gYWxsVGFyZ2V0cy5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgICB3aGlsZSAodXBUb0RhdGUgJiYgZW51bVRhcmdldHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgZGVzdCA9IChGaWxlKWVudW1UYXJnZXRzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLmxhc3RNb2RpZmllZCgpID4gZGVzdC5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICBsb2coZGVzdC5nZXRQYXRoKCkgKyAiIGlzIG91dCBvZiBkYXRlIHdpdGggcmVzcGVjdCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZXNbaV0sIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICB1cFRvRGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IHdoaWxlICh1cFRvRGF0ZSAmJiAoKytpIDwgc291cmNlRmlsZXMubGVuZ3RoKSApOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXVwVG9EYXRlKSB7Ci0gICAgICAgICAgIGxvZygiRGVsZXRpbmcgYWxsIHRhcmdldCBmaWxlcy4gIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGFsbFRhcmdldHMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICAgIEZpbGUgZmlsZVRvUmVtb3ZlID0gKEZpbGUpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGZpbGUgIiArIGZpbGVUb1JlbW92ZS5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgIGZpbGVUb1JlbW92ZS5kZWxldGUoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotCi0gICAgfSAvLy0tIGV4ZWN1dGUKLSAgIAotfSAvLy0tIERlcGVuZFNldC5qYXZhCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FYXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Vhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWMxODVjLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Vhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBDcmVhdGVzIGEgRUFSIGFyY2hpdmUuIEJhc2VkIG9uIFdBUiB0YXNrCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpsZXNsaWUuaHVnaGVzQHJ1YnVzLmNvbSI+TGVzIEh1Z2hlczwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBFYXIgZXh0ZW5kcyBKYXIgewotCi0gICAgcHJpdmF0ZSBGaWxlIGRlcGxveW1lbnREZXNjcmlwdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZXNjcmlwdG9yQWRkZWQ7ICAgIAotCi0gICAgcHVibGljIEVhcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgYXJjaGl2ZVR5cGUgPSAiZWFyIjsKLSAgICAgICAgZW1wdHlCZWhhdmlvciA9ICJjcmVhdGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVhcmZpbGUoRmlsZSBlYXJGaWxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFppcGZpbGUoZWFyRmlsZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEFwcHhtbChGaWxlIGRlc2NyKSB7Ci0gICAgICAgIGRlcGxveW1lbnREZXNjcmlwdG9yID0gZGVzY3I7IAotICAgICAgICBpZiAoIWRlcGxveW1lbnREZXNjcmlwdG9yLmV4aXN0cygpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEZXBsb3ltZW50IGRlc2NyaXB0b3I6ICIgKyBkZXBsb3ltZW50RGVzY3JpcHRvciArICIgZG9lcyBub3QgZXhpc3QuIik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgWmlwRmlsZVNldCBmb3IgdGhpcyBmaWxlLCBhbmQgcGFzcyBpdCB1cC4KLSAgICAgICAgWmlwRmlsZVNldCBmcyA9IG5ldyBaaXBGaWxlU2V0KCk7Ci0gICAgICAgIGZzLnNldERpcihuZXcgRmlsZShkZXBsb3ltZW50RGVzY3JpcHRvci5nZXRQYXJlbnQoKSkpOwotICAgICAgICBmcy5zZXRJbmNsdWRlcyhkZXBsb3ltZW50RGVzY3JpcHRvci5nZXROYW1lKCkpOwotICAgICAgICBmcy5zZXRGdWxscGF0aCgiTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIik7Ci0gICAgICAgIHN1cGVyLmFkZEZpbGVzZXQoZnMpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgYWRkQXJjaGl2ZXMoWmlwRmlsZVNldCBmcykgewotICAgICAgICAvLyBXZSBqdXN0IHNldCB0aGUgcHJlZml4IGZvciB0aGlzIGZpbGVzZXQsIGFuZCBwYXNzIGl0IHVwLgotICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/IExICi0gICAgICAgIGxvZygiYWRkQXJjaGl2ZXMgY2FsbGVkIixQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgIGZzLnNldFByZWZpeCgiLyIpOwotICAgICAgICBzdXBlci5hZGRGaWxlc2V0KGZzKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRaaXBPdXRwdXRTdHJlYW0oWmlwT3V0cHV0U3RyZWFtIHpPdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIElmIG5vIHdlYnhtbCBmaWxlIGlzIHNwZWNpZmllZCwgaXQncyBhbiBlcnJvci4KLSAgICAgICAgaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYXBweG1sIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3VwZXIuaW5pdFppcE91dHB1dFN0cmVhbSh6T3V0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKEZpbGUgZmlsZSwgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBJZiB0aGUgZmlsZSBiZWluZyBhZGRlZCBpcyBXRUItSU5GL3dlYi54bWwsIHdlIHdhcm4gaWYgaXQncyBub3QgdGhlCi0gICAgICAgIC8vIG9uZSBzcGVjaWZpZWQgaW4gdGhlICJ3ZWJ4bWwiIGF0dHJpYnV0ZSAtIG9yIGlmIGl0J3MgYmVpbmcgYWRkZWQgdHdpY2UsIAotICAgICAgICAvLyBtZWFuaW5nIHRoZSBzYW1lIGZpbGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSAid2VieG1sIiBhdHRyaWJ1dGUgYW5kIGluCi0gICAgICAgIC8vIGEgPGZpbGVzZXQ+IGVsZW1lbnQuCi0gICAgICAgIGlmICh2UGF0aC5lcXVhbHNJZ25vcmVDYXNlKCJNRVRBLUlORi9hcGxpY2F0aW9uLnhtbCIpKSAgewotICAgICAgICAgICAgaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yID09IG51bGwgfHwgIWRlcGxveW1lbnREZXNjcmlwdG9yLmVxdWFscyhmaWxlKSB8fCBkZXNjcmlwdG9yQWRkZWQpIHsKLSAgICAgICAgICAgICAgICBsb2coIldhcm5pbmc6IHNlbGVjdGVkICIrYXJjaGl2ZVR5cGUrIiBmaWxlcyBpbmNsdWRlIGEgTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIHdoaWNoIHdpbGwgYmUgaWdub3JlZCAiICsKLSAgICAgICAgICAgICAgICAgICAgIihwbGVhc2UgdXNlIGFwcHhtbCBhdHRyaWJ1dGUgdG8gIithcmNoaXZlVHlwZSsiIHRhc2spIiwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1cGVyLnppcEZpbGUoZmlsZSwgek91dCwgdlBhdGgpOwotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JBZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci56aXBGaWxlKGZpbGUsIHpPdXQsIHZQYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2Ugc3VyZSB3ZSBkb24ndCB0aGluayB3ZSBhbHJlYWR5IGhhdmUgYSB3ZWIueG1sIG5leHQgdGltZSB0aGlzIHRhc2sKLSAgICAgKiBnZXRzIGV4ZWN1dGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoKSB7Ci0gICAgICAgIGRlc2NyaXB0b3JBZGRlZCA9IGZhbHNlOwotICAgICAgICBzdXBlci5jbGVhblVwKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNoby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjg4MWRkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0VjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IGphdmEuaW8uKjsKLS8qKgotICogRWNobwotICoKLSAqIEBhdXRob3IgY29zdGluQGRudC5ybwotICovCi1wdWJsaWMgY2xhc3MgRWNobyBleHRlbmRzIFRhc2sgewotICAgIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyByZXF1aXJlZAotICAgIHByb3RlY3RlZCBGaWxlIGZpbGUgPSBudWxsOwotICAgIHByb3RlY3RlZCBib29sZWFuIGFwcGVuZCA9IGZhbHNlOwotICAgIAotICAgIC8vIGJ5IGRlZmF1bHQsIG1lc3NhZ2VzIGFyZSBhbHdheXMgZGlzcGxheWVkCi0gICAgcHJvdGVjdGVkIGludCBsb2dMZXZlbCA9IFByb2plY3QuTVNHX1dBUk47ICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgd29yay4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cobWVzc2FnZSwgbG9nTGV2ZWwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpLCBhcHBlbmQpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShtZXNzYWdlLCAwLCBtZXNzYWdlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkge30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZXNzYWdlIHZhcmlhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1zZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNoYWxsIHdlIGFwcGVuZCB0byBhbiBleGlzdGluZyBmaWxlPwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFwcGVuZChib29sZWFuIGFwcGVuZCkgewotICAgICAgICB0aGlzLmFwcGVuZCA9IGFwcGVuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBtdWx0aWxpbmUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyBtc2cpIHsKLSAgICAgICAgbWVzc2FnZSArPSAKLSAgICAgICAgICAgIFByb2plY3RIZWxwZXIucmVwbGFjZVByb3BlcnRpZXMocHJvamVjdCwgbXNnLCBwcm9qZWN0LmdldFByb3BlcnRpZXMoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsb2dnaW5nIGxldmVsIHRvIG9uZSBvZgotICAgICAqIDx1bD4KLSAgICAgKiAgPGxpPmVycm9yPC9saT4KLSAgICAgKiAgPGxpPndhcm5pbmc8L2xpPgotICAgICAqICA8bGk+aW5mbzwvbGk+Ci0gICAgICogIDxsaT52ZXJib3NlPC9saT4KLSAgICAgKiAgPGxpPmRlYnVnPC9saT4KLSAgICAgKiA8dWw+Ci0gICAgICogPHA+VGhlIGRlZmF1bHQgaXMgJnF1b3Q7d2FybmluZyZxdW90OyB0byBlbnN1cmUgdGhhdCBtZXNzYWdlcyBhcmUKLSAgICAgKiBkaXNwbGF5ZWQgYnkgZGVmYXVsdCB3aGVuIHVzaW5nIHRoZSAtcXVpZXQgY29tbWFuZCBsaW5lIG9wdGlvbi48L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGV2ZWwoRWNob0xldmVsIGVjaG9MZXZlbCkgewotICAgICAgICBTdHJpbmcgb3B0aW9uID0gZWNob0xldmVsLmdldFZhbHVlKCk7Ci0gICAgICAgIGlmIChvcHRpb24uZXF1YWxzKCJlcnJvciIpKSB7Ci0gICAgICAgICAgICBsb2dMZXZlbCA9IFByb2plY3QuTVNHX0VSUjsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCJ3YXJuaW5nIikpIHsKLSAgICAgICAgICAgIGxvZ0xldmVsID0gUHJvamVjdC5NU0dfV0FSTjsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCJpbmZvIikpIHsKLSAgICAgICAgICAgIGxvZ0xldmVsID0gUHJvamVjdC5NU0dfSU5GTzsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCJ2ZXJib3NlIikpIHsKLSAgICAgICAgICAgIGxvZ0xldmVsID0gUHJvamVjdC5NU0dfVkVSQk9TRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG11c3QgYmUgImRlYnVnIgotICAgICAgICAgICAgbG9nTGV2ZWwgPSBQcm9qZWN0Lk1TR19ERUJVRzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWNob0xldmVsIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiZXJyb3IiLCAid2FybmluZyIsICJpbmZvIiwgInZlcmJvc2UiLCAiZGVidWcifTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzMjU5Yy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEV4ZWN1dGVzIGEgZ2l2ZW4gY29tbWFuZCBpZiB0aGUgb3MgcGxhdGZvcm0gaXMgYXBwcm9wcmlhdGUuCi0gKgotICogQGF1dGhvciBkdW5jYW5AeDE4MC5jb20KLSAqIEBhdXRob3IgcnVieXNAdXMuaWJtLmNvbQotICoKLSAqIEBkZXByZWN0ZWQgSW5zdGVhZCBvZiB1c2luZyB0aGlzIGNsYXNzLCBwbGVhc2UgZXh0ZW5kIEV4ZWNUYXNrIG9yCi0gKiBkZWxlZ2F0ZSB0byBFeGVjdXRlLiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjIGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0OwotICAgIHByaXZhdGUgRmlsZSBkaXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZDsKLSAgICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgZm9zID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDUxMjsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBydW4oY29tbWFuZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBydW4oU3RyaW5nIGNvbW1hbmQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW50IGVyciA9IC0xOyAvLyBhc3N1bWUgdGhlIHdvcnN0Ci0KLSAgICAgICAgLy8gdGVzdCBpZiBvcyBtYXRjaAotICAgICAgICBTdHJpbmcgbXlvcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOwotICAgICAgICBsb2coIk15b3MgPSAiICsgbXlvcywgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIGlmICgob3MgIT0gbnVsbCkgJiYgKG9zLmluZGV4T2YobXlvcykgPCAwKSl7Ci0gICAgICAgICAgICAvLyB0aGlzIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uIHRoZSBzcGVjaWZpZWQgT1MKLSAgICAgICAgICAgIGxvZygiTm90IGZvdW5kIGluICIgKyBvcywgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlZmF1bHQgZGlyZWN0b3J5IHRvIHRoZSBwcm9qZWN0J3MgYmFzZSBkaXJlY3RvcnkKLSAgICAgICAgaWYgKGRpciA9PSBudWxsKSBkaXIgPSBwcm9qZWN0LmdldEJhc2VEaXIoKTsKLQotICAgICAgICBpZiAobXlvcy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndpbmRvd3MiKSA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAoIWRpci5lcXVhbHMocHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpKSkgewotICAgICAgICAgICAgICAgIGlmIChteW9zLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigibnQiKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAiY21kIC9jIGNkICIgKyBkaXIgKyAiICYmICIgKyBjb21tYW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFudCA9IHByb2plY3QuZ2V0UHJvcGVydHkoImFudC5ob21lIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9wZXJ0eSAnYW50LmhvbWUnIG5vdCBmb3VuZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW50UnVuID0gcHJvamVjdC5yZXNvbHZlRmlsZShhbnQgKyAiL2Jpbi9hbnRSdW4uYmF0IikudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IGFudFJ1biArICIgIiArIGRpciArICIgIiArIGNvbW1hbmQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGFudCA9IHByb2plY3QuZ2V0UHJvcGVydHkoImFudC5ob21lIik7Ci0gICAgICAgICAgICBpZiAoYW50ID09IG51bGwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvcGVydHkgJ2FudC5ob21lJyBub3QgZm91bmQiLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICBTdHJpbmcgYW50UnVuID0gcHJvamVjdC5yZXNvbHZlRmlsZShhbnQgKyAiL2Jpbi9hbnRSdW4iKS50b1N0cmluZygpOwotCi0gICAgICAgICAgICBjb21tYW5kID0gYW50UnVuICsgIiAiICsgZGlyICsgIiAiICsgY29tbWFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzaG93IHRoZSBjb21tYW5kCi0gICAgICAgICAgICBsb2coY29tbWFuZCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWMgY29tbWFuZCBvbiBzeXN0ZW0gcnVudGltZQotICAgICAgICAgICAgUHJvY2VzcyBwcm9jID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsKLQotICAgICAgICAgICAgaWYoIG91dCE9bnVsbCApICB7Ci0gICAgICAgICAgICAgICAgZm9zPW5ldyBQcmludFdyaXRlciggbmV3IEZpbGVXcml0ZXIoIG91dCApICk7Ci0gICAgICAgICAgICAgICAgbG9nKCJPdXRwdXQgcmVkaXJlY3RlZCB0byAiICsgb3V0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY29weSBpbnB1dCBhbmQgZXJyb3IgdG8gdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgICAgICAgIFN0cmVhbVB1bXBlciBpbnB1dFB1bXBlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0cmVhbVB1bXBlcihwcm9jLmdldElucHV0U3RyZWFtKCksIFByb2plY3QuTVNHX0lORk8sIHRoaXMpOwotICAgICAgICAgICAgU3RyZWFtUHVtcGVyIGVycm9yUHVtcGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUHVtcGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSwgUHJvamVjdC5NU0dfV0FSTiwgdGhpcyk7Ci0KLSAgICAgICAgICAgIC8vIHN0YXJ0cyBwdW1waW5nIGF3YXkgdGhlIGdlbmVyYXRlZCBvdXRwdXQvZXJyb3IKLSAgICAgICAgICAgIGlucHV0UHVtcGVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICBlcnJvclB1bXBlci5zdGFydCgpOwotCi0gICAgICAgICAgICAvLyBXYWl0IGZvciBldmVyeXRoaW5nIHRvIGZpbmlzaAotICAgICAgICAgICAgcHJvYy53YWl0Rm9yKCk7Ci0gICAgICAgICAgICBpbnB1dFB1bXBlci5qb2luKCk7Ci0gICAgICAgICAgICBlcnJvclB1bXBlci5qb2luKCk7Ci0gICAgICAgICAgICBwcm9jLmRlc3Ryb3koKTsKLQotICAgICAgICAgICAgLy8gY2xvc2UgdGhlIG91dHB1dCBmaWxlIGlmIHJlcXVpcmVkCi0gICAgICAgICAgICBsb2dGbHVzaCgpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpdHMgZXhpdCB2YWx1ZQotICAgICAgICAgICAgZXJyID0gcHJvYy5leGl0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4ZWMgcmV0dXJuZWQ6ICIrZXJyLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJSZXN1bHQ6ICIgKyBlcnIsIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgZXhlYzogIiArIGNvbW1hbmQsIGlvZSwgbG9jYXRpb24pOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkge30KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERpcihTdHJpbmcgZCkgewotICAgICAgICB0aGlzLmRpciA9IHByb2plY3QucmVzb2x2ZUZpbGUoZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3MoU3RyaW5nIG9zKSB7Ci0gICAgICAgIHRoaXMub3MgPSBvczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7Ci0gICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KFN0cmluZyBvdXQpIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsKSB7Ci0gICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvdXRwdXRMb2coU3RyaW5nIGxpbmUsIGludCBtZXNzYWdlTGV2ZWwpIHsKLSAgICAgICAgaWYgKGZvcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cobGluZSwgbWVzc2FnZUxldmVsKTsgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3MucHJpbnRsbihsaW5lKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dGbHVzaCgpIHsKLSAgICAgICAgaWYgKGZvcyAhPSBudWxsKSBmb3MuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvLyBJbm5lciBjbGFzcyBmb3IgY29udGludWFsbHkgcHVtcGluZyB0aGUgaW5wdXQgc3RyZWFtIGR1cmluZwotICAgIC8vIFByb2Nlc3MncyBydW50aW1lLgotICAgIGNsYXNzIFN0cmVhbVB1bXBlciBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgIHByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZGluOwotICAgICAgICBwcml2YXRlIGludCBtZXNzYWdlTGV2ZWw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBlbmRPZlN0cmVhbSA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGludCBTTEVFUF9USU1FID0gNTsKLSAgICAgICAgcHJpdmF0ZSBFeGVjIHBhcmVudDsKLQotICAgICAgICBwdWJsaWMgU3RyZWFtUHVtcGVyKElucHV0U3RyZWFtIGlzLCBpbnQgbWVzc2FnZUxldmVsLCBFeGVjIHBhcmVudCkgewotICAgICAgICAgICAgdGhpcy5kaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7Ci0gICAgICAgICAgICB0aGlzLm1lc3NhZ2VMZXZlbCA9IG1lc3NhZ2VMZXZlbDsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHVtcFN0cmVhbSgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLSAgICAgICAgICAgIGlmICghZW5kT2ZTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGRpbi5yZWFkTGluZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXRMb2cobGluZSwgbWVzc2FnZUxldmVsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmRPZlN0cmVhbSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWVuZE9mU3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdW1wU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcChTTEVFUF9USU1FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fQotICAgICAgICAgICAgICAgIGRpbi5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7fQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY1Rhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZDMzNjMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEV4ZWN1dGVzIGEgZ2l2ZW4gY29tbWFuZCBpZiB0aGUgb3MgcGxhdGZvcm0gaXMgYXBwcm9wcmlhdGUuCi0gKgotICogQGF1dGhvciBkdW5jYW5AeDE4MC5jb20KLSAqIEBhdXRob3IgcnVieXNAdXMuaWJtLmNvbQotICogQGF1dGhvciB0aG9tYXMuaGFhc0Bzb2Z0d2lyZWQtaW5jLmNvbQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bWFyaXVzekByYWtpdXJhLm9yZyI+TWFyaXVzeiBOb3dvc3Rhd3NraTwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjVGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBvczsKLSAgICBwcml2YXRlIEZpbGUgb3V0OwotICAgIHByaXZhdGUgRmlsZSBkaXI7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBuZXdFbnZpcm9ubWVudCA9IGZhbHNlOwotICAgIHByaXZhdGUgSW50ZWdlciB0aW1lb3V0ID0gbnVsbDsKLSAgICBwcml2YXRlIEVudmlyb25tZW50IGVudiA9IG5ldyBFbnZpcm9ubWVudCgpOwotICAgIHByb3RlY3RlZCBDb21tYW5kbGluZSBjbWRsID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0cHJvcDsKLQotICAgIC8qKiBDb250cm9scyB3aGV0aGVyIHRoZSBWTSAoMS4zIGFuZCBhYm92ZSkgaXMgdXNlZCB0byBleGVjdXRlIHRoZSBjb21tYW5kICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZtTGF1bmNoZXIgPSB0cnVlOwotICAgICAKLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgdGltZW91dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgY21kbC5zZXRFeGVjdXRhYmxlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkKSB7Ci0gICAgICAgIHRoaXMuZGlyID0gZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IGV4ZWN1dGUgdGhlIHByb2Nlc3MgaWYgPGNvZGU+b3MubmFtZTwvY29kZT4gaXMgaW5jbHVkZWQgaW4gdGhpcyBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3MoU3RyaW5nIG9zKSB7Ci0gICAgICAgIHRoaXMub3MgPSBvczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZnVsbCBjb21tYW5kbGluZSB0byBleGVjdXRlLCBleGVjdXRhYmxlICsgYXJndW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmQoQ29tbWFuZGxpbmUgY21kbCkgewotICAgICAgICBsb2coIlRoZSBjb21tYW5kIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkLiAiICsKLSAgICAgICAgICAgICJQbGVhc2UgdXNlIHRoZSBleGVjdXRhYmxlIGF0dHJpYnV0ZSBhbmQgbmVzdGVkIGFyZyBlbGVtZW50cy4iLAotICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIHRoaXMuY21kbCA9IGNtZGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsZSB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQgdG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KEZpbGUgb3V0KSB7Ci0gICAgICAgIHRoaXMub3V0ID0gb3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0IG9mCi0gICAgICogdGhlIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRwcm9wZXJ0eShTdHJpbmcgb3V0cHV0cHJvcCkgewotCXRoaXMub3V0cHV0cHJvcCA9IG91dHB1dHByb3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3cgYSBCdWlsZEV4Y2VwdGlvbiBpZiBwcm9jZXNzIHJldHVybnMgbm9uIDAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsKSB7Ci0gICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgYSBjb21wbGV0ZWx5IG5ldyBlbnZpcm9ubWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5ld2Vudmlyb25tZW50KGJvb2xlYW4gbmV3ZW52KSB7Ci0gICAgICAgIG5ld0Vudmlyb25tZW50ID0gbmV3ZW52OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIG5lc3RlZCBlbnYgZWxlbWVudCAtIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEVudihFbnZpcm9ubWVudC5WYXJpYWJsZSB2YXIpIHsKLSAgICAgICAgZW52LmFkZFZhcmlhYmxlKHZhcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbmVzdGVkIGFyZyBlbGVtZW50IC0gYSBjb21tYW5kIGxpbmUgYXJndW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUFyZygpIHsKLSAgICAgICAgcmV0dXJuIGNtZGwuY3JlYXRlQXJndW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyB0aGUgd29yay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGlmIChpc1ZhbGlkT3MoKSkgewotICAgICAgICAgICAgcnVuRXhlYyhwcmVwYXJlRXhlYygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhcyB0aGUgdXNlciBzZXQgYWxsIG5lY2Vzc2FyeSBhdHRyaWJ1dGVzPwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjbWRsLmdldEV4ZWN1dGFibGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5vIGV4ZWN1dGFibGUgc3BlY2lmaWVkIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkaXIgIT0gbnVsbCAmJiAhZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgIAl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkaXIgIT0gbnVsbCAmJiAhZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkIGlzIG5vdCBhIGRpcmVjdG9yeSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhpcyB0aGUgT1MgdGhlIHVzZXIgd2FudGVkPwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRPcygpIHsKLSAgICAgICAgLy8gdGVzdCBpZiBvcyBtYXRjaAotICAgICAgICBTdHJpbmcgbXlvcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOwotICAgICAgICBsb2coIkN1cnJlbnQgT1MgaXMgIiArIG15b3MsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICBpZiAoKG9zICE9IG51bGwpICYmIChvcy5pbmRleE9mKG15b3MpIDwgMCkpewotICAgICAgICAgICAgLy8gdGhpcyBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbiB0aGUgc3BlY2lmaWVkIE9TCi0gICAgICAgICAgICBsb2coIlRoaXMgT1MsICIgKyBteW9zICsgIiB3YXMgbm90IGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiB2YWxpZCBPU2VzOiAiICsgb3MsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgVk0gaXMgdXNlZCB0byBsYXVuY2ggdGhlIG5ldyBwcm9jZXNzIG9yCi0gICAgICogd2hldGhlciB0aGUgT1MncyBzaGVsbCBpcyB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZNTGF1bmNoZXIoYm9vbGVhbiB2bUxhdW5jaGVyKSB7Ci0gICAgICAgIHRoaXMudm1MYXVuY2hlciA9IHZtTGF1bmNoZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFeGVjdXRlIGluc3RhbmNlIHdpdGggdGhlIGNvcnJlY3Qgd29ya2luZyBkaXJlY3Rvcnkgc2V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFeGVjdXRlIHByZXBhcmVFeGVjKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZGVmYXVsdCBkaXJlY3RvcnkgdG8gdGhlIHByb2plY3QncyBiYXNlIGRpcmVjdG9yeQotICAgICAgICBpZiAoZGlyID09IG51bGwpIGRpciA9IHByb2plY3QuZ2V0QmFzZURpcigpOwotICAgICAgICAvLyBzaG93IHRoZSBjb21tYW5kCi0gICAgICAgIGxvZyhjbWRsLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAKLSAgICAgICAgRXhlY3V0ZSBleGUgPSBuZXcgRXhlY3V0ZShjcmVhdGVIYW5kbGVyKCksIGNyZWF0ZVdhdGNoZG9nKCkpOwotICAgICAgICBleGUuc2V0QW50UnVuKHByb2plY3QpOwotICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOwotICAgICAgICBleGUuc2V0Vk1MYXVuY2hlcih2bUxhdW5jaGVyKTsKLSAgICAgICAgU3RyaW5nW10gZW52aXJvbm1lbnQgPSBlbnYuZ2V0VmFyaWFibGVzKCk7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZW52aXJvbm1lbnQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsb2coIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGU6ICIrZW52aXJvbm1lbnRbaV0sCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGV4ZS5zZXROZXdlbnZpcm9ubWVudChuZXdFbnZpcm9ubWVudCk7Ci0gICAgICAgIGV4ZS5zZXRFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7Ci0gICAgICAgIHJldHVybiBleGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBVdGlsaXR5IG1ldGhvZCBmb3IgdGhpcyBjbGFzc2VzIGFuZCBzdWJjbGFzc2VzIHRvIHJ1biBhbiBFeGVjdXRlIGluc3RhbmNlIChhbiBleHRlcm5hbCBjb21tYW5kKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBydW5FeGVjdXRlKEV4ZWN1dGUgZXhlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgZXJyID0gLTE7IC8vIGFzc3VtZSB0aGUgd29yc3QKLQotICAgICAgICBlcnIgPSBleGUuZXhlY3V0ZSgpOwotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0YXNrVHlwZSArICIgcmV0dXJuZWQ6ICIrZXJyLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygiUmVzdWx0OiAiICsgZXJyLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChiYW9zICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gCi0gICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoYmFvcy50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgdmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB2YWwuYXBwZW5kKGxTZXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWwuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eShvdXRwdXRwcm9wLCB2YWwudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUnVuIHRoZSBjb21tYW5kIHVzaW5nIHRoZSBnaXZlbiBFeGVjdXRlIGluc3RhbmNlLiBUaGlzIG1heSBiZSBvdmVyaWRkZW4gYnkgc3ViY2xhc3NlcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJ1bkV4ZWMoRXhlY3V0ZSBleGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjbWRsLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVuRXhlY3V0ZShleGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4ZWN1dGUgZmFpbGVkOiAiICsgZSwgZSwgbG9jYXRpb24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gY2xvc2UgdGhlIG91dHB1dCBmaWxlIGlmIHJlcXVpcmVkCi0gICAgICAgICAgICBsb2dGbHVzaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBTdHJlYW1IYW5kbGVyIHRvIHVzZSB3aXRoIG91ciBFeGVjdXRlIGluc3RhbmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBFeGVjdXRlU3RyZWFtSGFuZGxlciBjcmVhdGVIYW5kbGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYob3V0IT1udWxsKSAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpOwotICAgICAgICAgICAgICAgIGxvZygiT3V0cHV0IHJlZGlyZWN0ZWQgdG8gIiArIG91dCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQdW1wU3RyZWFtSGFuZGxlcihmb3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIHRvICIrb3V0LCBmbmUsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIHRvICIrb3V0LCBpb2UsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRwcm9wICE9IG51bGwpIHsKLQkgICAgLy8JICAgIHRyeSB7Ci0JICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JICAgIGxvZygiT3V0cHV0IHJlZGlyZWN0ZWQgdG8gQnl0ZUFycmF5IiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0JICAgIHJldHVybiBuZXcgUHVtcFN0cmVhbUhhbmRsZXIoYmFvcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgV2F0Y2hkb2cgdG8ga2lsbCBhIHJ1bmF3YXkgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRXhlY3V0ZVdhdGNoZG9nIGNyZWF0ZVdhdGNoZG9nKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZVdhdGNoZG9nKHRpbWVvdXQuaW50VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gLSBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nRmx1c2goKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZm9zICE9IG51bGwpIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgaWYgKGJhb3MgIT0gbnVsbCkgYmFvcy5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpbykge30KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiOWNlMC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFJ1bnMgYW4gZXh0ZXJuYWwgcHJvZ3JhbS4KLSAqCi0gKiBAYXV0aG9yIHRob21hcy5oYWFzQHNvZnR3aXJlZC1pbmMuY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjdXRlIHsKLQotICAgIC8qKiBJbnZhbGlkIGV4aXQgY29kZS4gKiovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5WQUxJRCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjbWRsID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGVudiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgZXhpdFZhbHVlID0gSU5WQUxJRDsKLSAgICBwcml2YXRlIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHN0cmVhbUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBFeGVjdXRlV2F0Y2hkb2cgd2F0Y2hkb2c7Ci0gICAgcHJpdmF0ZSBGaWxlIHdvcmtpbmdEaXJlY3RvcnkgPSBudWxsOwotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbmV3RW52aXJvbm1lbnQgPSBmYWxzZTsKLQotICAgIC8qKiBDb250cm9scyB3aGV0aGVyIHRoZSBWTSBpcyB1c2VkIHRvIGxhdW5jaCBjb21tYW5kcywgd2hlcmUgcG9zc2libGUgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlVk1MYXVuY2hlciA9IHRydWU7ICAgIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhbnRXb3JraW5nRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotICAgIHByaXZhdGUgc3RhdGljIENvbW1hbmRMYXVuY2hlciB2bUxhdW5jaGVyID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBDb21tYW5kTGF1bmNoZXIgc2hlbGxMYXVuY2hlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIHByb2NFbnZpcm9ubWVudCA9IG51bGw7Ci0KLSAgICAvKiogCi0gICAgICogQnVpbGRzIGEgY29tbWFuZCBsYXVuY2hlciBmb3IgdGhlIE9TIGFuZCBKVk0gd2UgYXJlIHJ1bm5pbmcgdW5kZXIKLSAgICAgKi8KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBUcnkgdXNpbmcgYSBKREsgMS4zIGxhdW5jaGVyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2bUxhdW5jaGVyID0gbmV3IEphdmExM0NvbW1hbmRMYXVuY2hlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4YyApIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBhbmQga2VlcCB0cnkKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBvc25hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBpZiAoIG9zbmFtZS5pbmRleE9mKCJtYWMgb3MiKSA+PSAwICkgewotICAgICAgICAgICAgLy8gTWFjCi0gICAgICAgICAgICBzaGVsbExhdW5jaGVyID0gbmV3IE1hY0NvbW1hbmRMYXVuY2hlcihuZXcgQ29tbWFuZExhdW5jaGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBvc25hbWUuaW5kZXhPZigib3MvMiIpID49IDAgKSB7Ci0gICAgICAgICAgICAvLyBPUy8yIC0gdXNlIHNhbWUgbWVjaGFuaXNtIGFzIFdpbmRvd3MgMjAwMAotICAgICAgICAgICAgc2hlbGxMYXVuY2hlciA9IG5ldyBXaW5OVENvbW1hbmRMYXVuY2hlcihuZXcgQ29tbWFuZExhdW5jaGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBvc25hbWUuaW5kZXhPZigid2luZG93cyIpID49IDAgKSB7Ci0gICAgICAgICAgICAvLyBXaW5kb3dzLiAgTmVlZCB0byBkZXRlcm1pbmUgd2hpY2ggSkRLIHdlJ3JlIHJ1bm5pbmcgaW4KLSAgICAgICAgICAgIENvbW1hbmRMYXVuY2hlciBiYXNlTGF1bmNoZXI7Ci0gICAgICAgICAgICBpZiAoIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIikuc3RhcnRzV2l0aCgiMS4xIikgKSB7Ci0gICAgICAgICAgICAgICAgLy8gSkRLIDEuMQotICAgICAgICAgICAgICAgIGJhc2VMYXVuY2hlciA9IG5ldyBKYXZhMTFDb21tYW5kTGF1bmNoZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEpESyAxLjIKLSAgICAgICAgICAgICAgICBiYXNlTGF1bmNoZXIgPSBuZXcgQ29tbWFuZExhdW5jaGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIDIwMDAvTlQgb3IgOTgvOTUKLSAgICAgICAgICAgIGlmICggb3NuYW1lLmluZGV4T2YoIm50IikgPj0gMCB8fCBvc25hbWUuaW5kZXhPZigiMjAwMCIpID49IDAgKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2luZG93cyAyMDAwL05UCi0gICAgICAgICAgICAgICAgc2hlbGxMYXVuY2hlciA9IG5ldyBXaW5OVENvbW1hbmRMYXVuY2hlcihiYXNlTGF1bmNoZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2luZG93cyA5OC85NSAtIG5lZWQgdG8gdXNlIGFuIGF1eGlsaWFyeSBzY3JpcHQKLSAgICAgICAgICAgICAgICBzaGVsbExhdW5jaGVyID0gbmV3IFNjcmlwdENvbW1hbmRMYXVuY2hlcigiYmluL2FudFJ1bi5iYXQiLCBiYXNlTGF1bmNoZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gR2VuZXJpYwotICAgICAgICAgICAgc2hlbGxMYXVuY2hlciA9IG5ldyBTY3JpcHRDb21tYW5kTGF1bmNoZXIoImJpbi9hbnRSdW4iLCBuZXcgQ29tbWFuZExhdW5jaGVyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoaXMgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBWZWN0b3IgZ2V0UHJvY0Vudmlyb25tZW50KCkgewotICAgICAgICBpZiAocHJvY0Vudmlyb25tZW50ICE9IG51bGwpIHJldHVybiBwcm9jRW52aXJvbm1lbnQ7Ci0KLSAgICAgICAgcHJvY0Vudmlyb25tZW50ID0gbmV3IFZlY3RvcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUobmV3IFB1bXBTdHJlYW1IYW5kbGVyKG91dCkpOwotICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGdldFByb2NFbnZDb21tYW5kKCkpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvIG5vdCByZWN1cnNlIGZvcmV2ZXIKLSAgICAgICAgICAgIGV4ZS5zZXROZXdlbnZpcm9ubWVudCh0cnVlKTsKLSAgICAgICAgICAgIGludCByZXR2YWwgPSBleGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgaWYgKCByZXR2YWwgIT0gMCApIHsKLSAgICAgICAgICAgICAgICAvLyBKdXN0IHRyeSB0byB1c2Ugd2hhdCB3ZSBnb3QKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSAKLSAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihvdXQudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgU3RyaW5nIHZhciA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSwgbGluZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCc9JykgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2h1bmsgcGFydCBvZiBwcmV2aW91cyBlbnYgdmFyIChVTklYIGVudiB2YXJzIGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBjb250YWluIGVtYmVkZGVkIG5ldyBsaW5lcykuCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyID0gbGluZVNlcCArIGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgKz0gbGluZVNlcCArIGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5ldyBlbnYgdmFyLi4uYXBwZW5kIHRoZSBwcmV2aW91cyBvbmUgaWYgd2UgaGF2ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jRW52aXJvbm1lbnQuYWRkRWxlbWVudCh2YXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhciA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU2luY2Ugd2UgImxvb2sgYWhlYWQiIGJlZm9yZSBhZGRpbmcsIHRoZXJlJ3Mgb25lIGxhc3QgZW52IHZhci4KLSAgICAgICAgICAgIHByb2NFbnZpcm9ubWVudC5hZGRFbGVtZW50KHZhcik7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgLy8gSnVzdCB0cnkgdG8gc2VlIGhvdyBtdWNoIHdlIGdvdAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9jRW52aXJvbm1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0UHJvY0VudkNvbW1hbmQoKSB7Ci0gICAgICAgIFN0cmluZyBvc25hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBpZiAoIG9zbmFtZS5pbmRleE9mKCJtYWMgb3MiKSA+PSAwICkgewotICAgICAgICAgICAgLy8gTWFjCi0gICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgT1MgWAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MudmVyc2lvbiIpOwotICAgICAgICAgICAgICAgIGludCBtYWpvclZlcnNpb24gPSAKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludCh2ZXJzaW9uLnN1YnN0cmluZygwLCB2ZXJzaW9uLmluZGV4T2YoJy4nKSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ham9yVmVyc2lvbiA+PSAxMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBPUyBYIC0ganVzdCBsaW5lIFVOSVgKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gY21kID0geyIvdXNyL2Jpbi9lbnYifTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNtZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBPUyA5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBPUyA5IGFuZCBwcmV2aW91cwotICAgICAgICAgICAgLy8gVE9ETzogSSBoYXZlIG5vIGlkZWEgaG93IHRvIGdldCBpdCwgc29tZW9uZSBtdXN0IGZpeCBpdAotICAgICAgICAgICAgU3RyaW5nW10gY21kID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBjbWQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIG9zbmFtZS5pbmRleE9mKCJvcy8yIikgPj0gMCApIHsKLSAgICAgICAgICAgIC8vIE9TLzIgLSB1c2Ugc2FtZSBtZWNoYW5pc20gYXMgV2luZG93cyAyMDAwCi0gICAgICAgICAgICAvLyBOb3Qgc3VyZQotICAgICAgICAgICAgU3RyaW5nW10gY21kID0geyJjbWQiLCAiL2MiLCAic2V0IiB9OwotICAgICAgICAgICAgcmV0dXJuIGNtZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggb3NuYW1lLmluZGV4T2YoImluZG93cyIpID49IDAgKSB7Ci0gICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyB1bmRlciAyMDAwL05UIG9yIDk4Lzk1Ci0gICAgICAgICAgICBpZiAoIG9zbmFtZS5pbmRleE9mKCJudCIpID49IDAgfHwgb3NuYW1lLmluZGV4T2YoIjIwMDAiKSA+PSAwICkgewotICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgMjAwMC9OVAotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNtZCA9IHsiY21kIiwgIi9jIiwgInNldCIgfTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY21kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2luZG93cyA5OC85NSAtIG5lZWQgdG8gdXNlIGFuIGF1eGlsaWFyeSBzY3JpcHQKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjbWQgPSB7ImNvbW1hbmQuY29tIiwgIi9jIiwgInNldCIgfTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY21kOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gR2VuZXJpYyBVTklYCi0gICAgICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5IG9uZSBjb3VsZCB1c2U6IC9iaW4vc2ggLWMgZW52Ci0gICAgICAgICAgICBTdHJpbmdbXSBjbWQgPSB7Ii91c3IvYmluL2VudiJ9OwotICAgICAgICAgICAgcmV0dXJuIGNtZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXhlY3V0ZSBvYmplY3QgdXNpbmcgPGNvZGU+UHVtcFN0cmVhbUhhbmRsZXI8L2NvZGU+IGZvcgotICAgICAqIHN0cmVhbSBoYW5kbGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0ZSgpIHsKLSAgICAgICAgdGhpcyhuZXcgUHVtcFN0cmVhbUhhbmRsZXIoKSwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGV4ZWN1dGUgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmVhbUhhbmRsZXIgdGhlIHN0cmVhbSBoYW5kbGVyIHVzZWQgdG8gaGFuZGxlIHRoZSBpbnB1dCBhbmQKLSAgICAgKiAgICAgICAgb3V0cHV0IHN0cmVhbXMgb2YgdGhlIHN1YnByb2Nlc3MuCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dGUoRXhlY3V0ZVN0cmVhbUhhbmRsZXIgc3RyZWFtSGFuZGxlcikgewotICAgICAgICB0aGlzKHN0cmVhbUhhbmRsZXIsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZXhlY3V0ZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyZWFtSGFuZGxlciB0aGUgc3RyZWFtIGhhbmRsZXIgdXNlZCB0byBoYW5kbGUgdGhlIGlucHV0IGFuZAotICAgICAqICAgICAgICBvdXRwdXQgc3RyZWFtcyBvZiB0aGUgc3VicHJvY2Vzcy4KLSAgICAgKiBAcGFyYW0gd2F0Y2hkb2cgYSB3YXRjaGRvZyBmb3IgdGhlIHN1YnByb2Nlc3Mgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICAgKiAgICAgICAgdG8gZGlzYWJsZSBhIHRpbWVvdXQgZm9yIHRoZSBzdWJwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRlKEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHN0cmVhbUhhbmRsZXIsIEV4ZWN1dGVXYXRjaGRvZyB3YXRjaGRvZykgewotICAgICAgICB0aGlzLnN0cmVhbUhhbmRsZXIgPSBzdHJlYW1IYW5kbGVyOwotICAgICAgICB0aGlzLndhdGNoZG9nID0gd2F0Y2hkb2c7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kbGluZSB1c2VkIHRvIGNyZWF0ZSBhIHN1YnByb2Nlc3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kbGluZSB1c2VkIHRvIGNyZWF0ZSBhIHN1YnByb2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWFuZGxpbmUoKSB7Ci0gICAgICAgIHJldHVybiBjbWRsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29tbWFuZGxpbmUgb2YgdGhlIHN1YnByb2Nlc3MgdG8gbGF1bmNoLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbW1hbmRsaW5lIHRoZSBjb21tYW5kbGluZSBvZiB0aGUgc3VicHJvY2VzcyB0byBsYXVuY2gKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kbGluZShTdHJpbmdbXSBjb21tYW5kbGluZSkgewotICAgICAgICBjbWRsID0gY29tbWFuZGxpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSBkZWZhdWx0IGVudmlyb25tZW50IG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdlbnYgd2hldGhlciB0byBwcm9wYWdhdGUgdGhlIHByb2Nlc3MgZW52aXJvbm1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmV3ZW52aXJvbm1lbnQoYm9vbGVhbiBuZXdlbnYpIHsKLSAgICAgICAgbmV3RW52aXJvbm1lbnQgPSBuZXdlbnY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW52aXJvbm1lbnQgdXNlZCB0byBjcmVhdGUgYSBzdWJwcm9jZXNzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZW52aXJvbm1lbnQgdXNlZCB0byBjcmVhdGUgYSBzdWJwcm9jZXNzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEVudmlyb25tZW50KCkgewotICAgICAgICBpZiAoZW52ID09IG51bGwgfHwgbmV3RW52aXJvbm1lbnQpIHJldHVybiBlbnY7Ci0gICAgICAgIHJldHVybiBwYXRjaEVudmlyb25tZW50KCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBzdWJwcm9jZXNzIHRvIGxhdW5jaC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21tYW5kbGluZSBhcnJheSBvZiBTdHJpbmdzLCBlYWNoIGVsZW1lbnQgb2Ygd2hpY2ggaGFzCi0gICAgICogYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0dGluZ3MgaW4gZm9ybWF0IDxlbT5rZXk9dmFsdWU8L2VtPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChTdHJpbmdbXSBlbnYpIHsKLSAgICAgICAgdGhpcy5lbnYgPSBlbnY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MgdG8gZXhlY3V0ZS4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgaXMgZW11bGF0ZWQgdXNpbmcgdGhlIGFudFJ1biBzY3JpcHRzIHVubGVzcyB0aGUgT1MgaXMKLSAgICAgKiBXaW5kb3dzIE5UIGluIHdoaWNoIGNhc2UgYSBjbWQuZXhlIGlzIHNwYXduZWQsCi0gICAgICogb3IgTVJKIGFuZCBzZXR0aW5nIHVzZXIuZGlyIHdvcmtzLCBvciBKREsgMS4zIGFuZCB0aGVyZSBpcwotICAgICAqIG9mZmljaWFsIHN1cHBvcnQgaW4gamF2YS5sYW5nLlJ1bnRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2QgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdvcmtpbmdEaXJlY3RvcnkoRmlsZSB3ZCkgewotICAgICAgICBpZiAod2QgPT0gbnVsbCB8fCB3ZC5nZXRBYnNvbHV0ZVBhdGgoKS5lcXVhbHMoYW50V29ya2luZ0RpcmVjdG9yeSkpCi0gICAgICAgICAgICB3b3JraW5nRGlyZWN0b3J5ID0gbnVsbDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgd29ya2luZ0RpcmVjdG9yeSA9IHdkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgYW50UnVuIHNjcmlwdCB1c2luZyB0aGUgcHJvamVjdCdzIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbnRSdW4oUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhdW5jaCB0aGlzIGV4ZWN1dGlvbiB0aHJvdWdoIHRoZSBWTSwgd2hlcmUgcG9zc2libGUsIHJhdGhlciB0aGFuIHRocm91Z2gKLSAgICAgKiB0aGUgT1MncyBzaGVsbC4gSW4gc29tZSBjYXNlcyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMgdXNpbmcgdGhlIHNoZWxsIHdpbGwgCi0gICAgICogYWxsb3cgdGhlIHNoZWxsIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBwcm9jZXNzaW5nIHN1Y2ggYXMgYXNzb2NpYXRpbmcgYW4gCi0gICAgICogZXhlY3V0YWJsZSB3aXRoIGEgc2NyaXB0LCBldGMKLSAgICAgKgotICAgICAqIEBwYXJhbSB2bUxhdW5jaGVyIHRydWUgaWYgZXhlYyBzaG91bGQgbGF1bmNoIHRocm91Z2ggdGhnZSBWTSwgCi0gICAgICogICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIHNoZWxsIHNob3VsZCBiZSB1c2VkIHRvIGxhdW5jaCB0aGUgY29tbWFuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWTUxhdW5jaGVyKGJvb2xlYW4gdXNlVk1MYXVuY2hlcikgewotICAgICAgICB0aGlzLnVzZVZNTGF1bmNoZXIgPSB1c2VWTUxhdW5jaGVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSdW5zIGEgcHJvY2VzcyBkZWZpbmVkIGJ5IHRoZSBjb21tYW5kIGxpbmUgYW5kIHJldHVybnMgaXRzIGV4aXQgc3RhdHVzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHN1YnByb2Nlc3Mgb3IgPGNvZGU+SU5WQUxJRDwvY29kZT4KLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNwZXRpb24gVGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIGlmIGxhdW5jaGluZwotICAgICAqICAgICAgICAgICAgb2YgdGhlIHN1YnByb2Nlc3MgZmFpbGVkCi0gICAgICovCi0gICAgcHVibGljIGludCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tbWFuZExhdW5jaGVyIGxhdW5jaGVyID0gdm1MYXVuY2hlciAhPSBudWxsID8gdm1MYXVuY2hlciA6IHNoZWxsTGF1bmNoZXI7Ci0gICAgICAgIGlmICghdXNlVk1MYXVuY2hlcikgewotICAgICAgICAgICAgbGF1bmNoZXIgPSBzaGVsbExhdW5jaGVyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBQcm9jZXNzIHByb2Nlc3MgPSBsYXVuY2hlci5leGVjKHByb2plY3QsIGdldENvbW1hbmRsaW5lKCksIGdldEVudmlyb25tZW50KCksIHdvcmtpbmdEaXJlY3RvcnkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyZWFtSGFuZGxlci5zZXRQcm9jZXNzSW5wdXRTdHJlYW0ocHJvY2Vzcy5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBzdHJlYW1IYW5kbGVyLnNldFByb2Nlc3NPdXRwdXRTdHJlYW0ocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIHN0cmVhbUhhbmRsZXIuc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByb2Nlc3MuZGVzdHJveSgpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgICBzdHJlYW1IYW5kbGVyLnN0YXJ0KCk7Ci0gICAgICAgIGlmICh3YXRjaGRvZyAhPSBudWxsKSB3YXRjaGRvZy5zdGFydChwcm9jZXNzKTsKLSAgICAgICAgd2FpdEZvcihwcm9jZXNzKTsKLSAgICAgICAgaWYgKHdhdGNoZG9nICE9IG51bGwpIHdhdGNoZG9nLnN0b3AoKTsKLSAgICAgICAgc3RyZWFtSGFuZGxlci5zdG9wKCk7Ci0gICAgICAgIGlmICh3YXRjaGRvZyAhPSBudWxsKSB3YXRjaGRvZy5jaGVja0V4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gZ2V0RXhpdFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvcihQcm9jZXNzIHByb2Nlc3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2Nlc3Mud2FpdEZvcigpOwotICAgICAgICAgICAgc2V0RXhpdFZhbHVlKHByb2Nlc3MuZXhpdFZhbHVlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEV4aXRWYWx1ZShpbnQgdmFsdWUpIHsKLSAgICAgICAgZXhpdFZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFeGl0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBleGl0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGF0Y2ggdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgd2l0aCB0aGUgbmV3IHZhbHVlcyBmcm9tIHRoZSB1c2VyLgotICAgICAqIEByZXR1cm4gdGhlIHBhdGNoZWQgZW52aXJvbm1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIHBhdGNoRW52aXJvbm1lbnQoKSB7Ci0gICAgICAgIFZlY3RvciBvc0VudiA9IChWZWN0b3IpIGdldFByb2NFbnZpcm9ubWVudCgpLmNsb25lKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZW52W2ldLmluZGV4T2YoJz0nKTsKLSAgICAgICAgICAgIC8vIEdldCBrZXkgaW5jbHVkaW5nICI9IgotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVudltpXS5zdWJzdHJpbmcoMCwgcG9zKzEpOwotICAgICAgICAgICAgaW50IHNpemUgPSBvc0Vudi5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotICAgICAgICAgICAgICAgIGlmICgoKFN0cmluZylvc0Vudi5lbGVtZW50QXQoaikpLnN0YXJ0c1dpdGgoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBvc0Vudi5yZW1vdmVFbGVtZW50QXQoaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9zRW52LmFkZEVsZW1lbnQoZW52W2ldKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW29zRW52LnNpemUoKV07Ci0gICAgICAgIG9zRW52LmNvcHlJbnRvKHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB1dGlsaXR5IG1ldGhvZCB0aGF0IHJ1bnMgYW4gZXh0ZXJuYWwgY29tbWFuZC4gIFdyaXRlcyB0aGUgb3V0cHV0IGFuZAotICAgICAqIGVycm9yIHN0cmVhbXMgb2YgdGhlIGNvbW1hbmQgdG8gdGhlIHByb2plY3QgbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhc2sgICAgICBUaGUgdGFzayB0aGF0IHRoZSBjb21tYW5kIGlzIHBhcnQgb2YuICBVc2VkIGZvciBsb2dnaW5nCi0gICAgICogQHBhcmFtIGNtZGxpbmUgICBUaGUgY29tbWFuZCB0byBleGVjdXRlLgotICAgICAqCi0gICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBkb2VzIG5vdCByZXR1cm4gMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuQ29tbWFuZChUYXNrIHRhc2ssIFN0cmluZ1tdIGNtZGxpbmUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhc2subG9nKENvbW1hbmRsaW5lLnRvU3RyaW5nKGNtZGxpbmUpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGFzaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0VSUikpOwotICAgICAgICAgICAgZXhlLnNldEFudFJ1bih0YXNrLmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kbGluZSk7Ci0gICAgICAgICAgICBpbnQgcmV0dmFsID0gZXhlLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGlmICggcmV0dmFsICE9IDAgKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNtZGxpbmVbMF0gKyAiIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICIgKyByZXR2YWwsIHRhc2suZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgbGF1bmNoICIgKyBjbWRsaW5lWzBdICsgIjogIiArIGV4YywgdGFzay5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY29tbWFuZCBsYXVuY2hlciBmb3IgYSBwYXJ0aWN1bGFyIEpWTS9PUyBwbGF0Zm9ybS4gIFRoaXMgY2xhc3MgaXMKLSAgICAgKiBhIGdlbmVyYWwgcHVycG9zZSBjb21tYW5kIGxhdW5jaGVyIHdoaWNoIGNhbiBvbmx5IGxhdW5jaCBjb21tYW5kcyBpbgotICAgICAqIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbW1hbmRMYXVuY2hlcgotICAgIHsKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29tbWFuZCBpbiBhIG5ldyBwcm9jZXNzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCAgICAgICBUaGUgcHJvamVjdCB0aGF0IHRoZSBjb21tYW5kIGlzIHBhcnQgb2YKLSAgICAgICAgICogQHBhcmFtIGNtZCAgICAgICAgICAgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZQotICAgICAgICAgKiBAcGFyYW0gZW52ICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQgZm9yIHRoZSBuZXcgcHJvY2Vzcy4gIElmIG51bGwsCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgY3VycmVudCBwcm9jY2VzcyBpcyB1c2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNtZCwgU3RyaW5nW10gZW52KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJFeGVjdXRlOkNvbW1hbmRMYXVuY2hlcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZGxpbmUudG9TdHJpbmcoY21kKSwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZCwgZW52KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcywgaW4gdGhlIGdpdmVuIHdvcmtpbmcKLSAgICAgICAgICogZGlyZWN0b3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCAgICAgICBUaGUgcHJvamVjdCB0aGF0IHRoZSBjb21tYW5kIGlzIHBhcnQgb2YKLSAgICAgICAgICogQHBhcmFtIGNtZCAgICAgICAgICAgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZQotICAgICAgICAgKiBAcGFyYW0gZW52ICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQgZm9yIHRoZSBuZXcgcHJvY2Vzcy4gIElmIG51bGwsCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgY3VycmVudCBwcm9jY2VzcyBpcyB1c2VkLgotICAgICAgICAgKiBAcGFyYW0gd29ya2luZ0RpciAgICBUaGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBjb21tYW5kIGluLiAgSWYgbnVsbCwKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHVzZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudiwgRmlsZSB3b3JraW5nRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCB3b3JraW5nRGlyID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWMocHJvamVjdCwgY21kLCBlbnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgZXhlY3V0ZSBhIHByb2Nlc3MgaW4gZGlmZmVyZW50IGRpcmVjdG9yeSB1bmRlciB0aGlzIEpWTSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjb21tYW5kIGxhdW5jaGVyIGZvciBKREsvSlJFIDEuMSB1bmRlciBXaW5kb3dzLiAgRml4ZXMgcXVvdGluZyBwcm9ibGVtcwotICAgICAqIGluIFJ1bnRpbWUuZXhlYygpLiAgQ2FuIG9ubHkgbGF1bmNoIGNvbW1hbmRzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcKLSAgICAgKiBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXZhMTFDb21tYW5kTGF1bmNoZXIgZXh0ZW5kcyBDb21tYW5kTGF1bmNoZXIKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29tbWFuZCBpbiBhIG5ldyBwcm9jZXNzLiAgTmVlZHMgdG8gcXVvdGUKLSAgICAgICAgICogYXJndW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvY2VzcyBleGVjKFByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gY21kLCBTdHJpbmdbXSBlbnYpIHRocm93cyBJT0V4Y2VwdGlvbiAKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTmVlZCB0byBxdW90ZSBhcmd1bWVudHMgd2l0aCBzcGFjZXMsIGFuZCB0byBlc2NhcGUgcXVvdGUgY2hhcmFjdGVycwotICAgICAgICAgICAgU3RyaW5nW10gbmV3Y21kID0gbmV3IFN0cmluZ1tjbWQubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGNtZC5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBuZXdjbWRbaV0gPSBDb21tYW5kbGluZS5xdW90ZUFyZ3VtZW50KGNtZFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIkV4ZWN1dGU6SmF2YTExQ29tbWFuZExhdW5jaGVyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kbGluZS50b1N0cmluZyhuZXdjbWQpLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3Y21kLCBlbnYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjb21tYW5kIGxhdW5jaGVyIGZvciBKREsvSlJFIDEuMyAoYW5kIGhpZ2hlcikuICBVc2VzIHRoZSBidWlsdC1pbgotICAgICAqIFJ1bnRpbWUuZXhlYygpIGNvbW1hbmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXZhMTNDb21tYW5kTGF1bmNoZXIgZXh0ZW5kcyBDb21tYW5kTGF1bmNoZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBKYXZhMTNDb21tYW5kTGF1bmNoZXIoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIExvY2F0ZSBtZXRob2QgUnVudGltZS5leGVjKFN0cmluZ1tdIGNtZGFycmF5LCBTdHJpbmdbXSBlbnZwLCBGaWxlIGRpcikKLSAgICAgICAgICAgIF9leGVjV2l0aENXRCA9IFJ1bnRpbWUuY2xhc3MuZ2V0TWV0aG9kKCJleGVjIiwgbmV3IENsYXNzW10ge1N0cmluZ1tdLmNsYXNzLCBTdHJpbmdbXS5jbGFzcywgRmlsZS5jbGFzc30pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29tbWFuZCBpbiBhIG5ldyBwcm9jZXNzLCBpbiB0aGUgZ2l2ZW4gd29ya2luZwotICAgICAgICAgKiBkaXJlY3RvcnkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudiwgRmlsZSB3b3JraW5nRGlyKSAKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIkV4ZWN1dGU6SmF2YTEzQ29tbWFuZExhdW5jaGVyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZGxpbmUudG9TdHJpbmcoY21kKSwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3VtZW50cyA9IHsgY21kLCBlbnYsIHdvcmtpbmdEaXIgfTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFByb2Nlc3MpX2V4ZWNXaXRoQ1dELmludm9rZShSdW50aW1lLmdldFJ1bnRpbWUoKSwgYXJndW1lbnRzKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgcmVhbGV4YyA9IGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIHJlYWxleGMgaW5zdGFuY2VvZiBUaHJlYWREZWF0aCApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFRocmVhZERlYXRoKXJlYWxleGM7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggcmVhbGV4YyBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pcmVhbGV4YzsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBleGVjdXRlIGNvbW1hbmQiLCByZWFsZXhjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsQWNjZXNzLCBJbGxlZ2FsQXJndW1lbnQsIENsYXNzQ2FzdAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGV4ZWN1dGUgY29tbWFuZCIsIGV4Yyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgTWV0aG9kIF9leGVjV2l0aENXRDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBjb21tYW5kIGxhdW5jaGVyIHRoYXQgcHJveGllcyBhbm90aGVyIGNvbW1hbmQgbGF1bmNoZXIuICAKLSAgICAgKgotICAgICAqIFN1Yi1jbGFzc2VzIG92ZXJyaWRlIGV4ZWMoYXJncywgZW52LCB3b3JrZGlyKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbW1hbmRMYXVuY2hlclByb3h5IGV4dGVuZHMgQ29tbWFuZExhdW5jaGVyCi0gICAgewotICAgICAgICBDb21tYW5kTGF1bmNoZXJQcm94eShDb21tYW5kTGF1bmNoZXIgbGF1bmNoZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9sYXVuY2hlciA9IGxhdW5jaGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29tbWFuZCBpbiBhIG5ldyBwcm9jZXNzLiAgRGVsZWdhdGVzIHRoaXMKLSAgICAgICAgICogbWV0aG9kIHRvIHRoZSBwcm94aWVkIGxhdW5jaGVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvY2VzcyBleGVjKFByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gY21kLCBTdHJpbmdbXSBlbnYpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2xhdW5jaGVyLmV4ZWMocHJvamVjdCwgY21kLCBlbnYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDb21tYW5kTGF1bmNoZXIgX2xhdW5jaGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY29tbWFuZCBsYXVuY2hlciBmb3IgV2luZG93cyAyMDAwL05UIHRoYXQgdXNlcyAnY21kLmV4ZScgd2hlbgotICAgICAqIGxhdW5jaGluZyBjb21tYW5kcyBpbiBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IHdvcmtpbmcKLSAgICAgKiBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2luTlRDb21tYW5kTGF1bmNoZXIgZXh0ZW5kcyBDb21tYW5kTGF1bmNoZXJQcm94eQotICAgIHsKLSAgICAgICAgV2luTlRDb21tYW5kTGF1bmNoZXIoQ29tbWFuZExhdW5jaGVyIGxhdW5jaGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihsYXVuY2hlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIExhdW5jaGVzIHRoZSBnaXZlbiBjb21tYW5kIGluIGEgbmV3IHByb2Nlc3MsIGluIHRoZSBnaXZlbiB3b3JraW5nCi0gICAgICAgICAqIGRpcmVjdG9yeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudiwgRmlsZSB3b3JraW5nRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBjb21tYW5kRGlyID0gd29ya2luZ0RpcjsKLSAgICAgICAgICAgIGlmICggd29ya2luZ0RpciA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIGlmICggcHJvamVjdCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICBjb21tYW5kRGlyID0gcHJvamVjdC5nZXRCYXNlRGlyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWMocHJvamVjdCwgY21kLCBlbnYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXNlIGNtZC5leGUgdG8gY2hhbmdlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nCi0gICAgICAgICAgICAvLyB0aGUgY29tbWFuZAotICAgICAgICAgICAgZmluYWwgaW50IHByZUNtZExlbmd0aCA9IDY7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdjbWQgPSBuZXcgU3RyaW5nW2NtZC5sZW5ndGggKyBwcmVDbWRMZW5ndGhdOwotICAgICAgICAgICAgbmV3Y21kWzBdID0gImNtZCI7Ci0gICAgICAgICAgICBuZXdjbWRbMV0gPSAiL2MiOwotICAgICAgICAgICAgbmV3Y21kWzJdID0gImNkIjsKLSAgICAgICAgICAgIG5ld2NtZFszXSA9ICIvZCI7Ci0gICAgICAgICAgICBuZXdjbWRbNF0gPSBjb21tYW5kRGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgbmV3Y21kWzVdID0gIiYmIjsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY21kLCAwLCBuZXdjbWQsIHByZUNtZExlbmd0aCwgY21kLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBleGVjKHByb2plY3QsIG5ld2NtZCwgZW52KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY29tbWFuZCBsYXVuY2hlciBmb3IgTWFjIHRoYXQgdXNlcyBhIGRvZGd5IG1lY2hhbmlzbSB0byBjaGFuZ2UKLSAgICAgKiB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgbGF1bmNoaW5nIGNvbW1hbmRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hY0NvbW1hbmRMYXVuY2hlciBleHRlbmRzIENvbW1hbmRMYXVuY2hlclByb3h5Ci0gICAgewotICAgICAgICBNYWNDb21tYW5kTGF1bmNoZXIoQ29tbWFuZExhdW5jaGVyIGxhdW5jaGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihsYXVuY2hlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIExhdW5jaGVzIHRoZSBnaXZlbiBjb21tYW5kIGluIGEgbmV3IHByb2Nlc3MsIGluIHRoZSBnaXZlbiB3b3JraW5nCi0gICAgICAgICAqIGRpcmVjdG9yeQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNtZCwgU3RyaW5nW10gZW52LCBGaWxlIHdvcmtpbmdEaXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHdvcmtpbmdEaXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBjbWQsIGVudik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJ1c2VyLmRpciIsIHdvcmtpbmdEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBjbWQsIGVudik7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoInVzZXIuZGlyIiwgYW50V29ya2luZ0RpcmVjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbW1hbmQgbGF1bmNoZXIgdGhhdCB1c2VzIGFuIGF1eGlsaWFyeSBzY3JpcHQgdG8gbGF1bmNoIGNvbW1hbmRzCi0gICAgICogaW4gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTY3JpcHRDb21tYW5kTGF1bmNoZXIgZXh0ZW5kcyBDb21tYW5kTGF1bmNoZXJQcm94eQotICAgIHsKLSAgICAgICAgU2NyaXB0Q29tbWFuZExhdW5jaGVyKFN0cmluZyBzY3JpcHQsIENvbW1hbmRMYXVuY2hlciBsYXVuY2hlcikKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIobGF1bmNoZXIpOwotICAgICAgICAgICAgX3NjcmlwdCA9IHNjcmlwdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcywgaW4gdGhlIGdpdmVuIHdvcmtpbmcKLSAgICAgICAgICogZGlyZWN0b3J5Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvY2VzcyBleGVjKFByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gY21kLCBTdHJpbmdbXSBlbnYsIEZpbGUgd29ya2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcHJvamVjdCA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIGlmICggd29ya2luZ0RpciA9PSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBjbWQsIGVudik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGxvY2F0ZSBhbnRSdW4gc2NyaXB0OiBObyBwcm9qZWN0IHByb3ZpZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIExvY2F0ZSB0aGUgYXV4aWxpYXJ5IHNjcmlwdAotICAgICAgICAgICAgU3RyaW5nIGFudEhvbWUgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJhbnQuaG9tZSIpOwotICAgICAgICAgICAgaWYgKCBhbnRIb21lID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgbG9jYXRlIGFudFJ1biBzY3JpcHQ6IFByb3BlcnR5ICdhbnQuaG9tZScgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgYW50UnVuID0gcHJvamVjdC5yZXNvbHZlRmlsZShhbnRIb21lICsgRmlsZS5zZXBhcmF0b3IgKyBfc2NyaXB0KS50b1N0cmluZygpOwotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgY29tbWFuZAotICAgICAgICAgICAgRmlsZSBjb21tYW5kRGlyID0gd29ya2luZ0RpcjsKLSAgICAgICAgICAgIGlmICggd29ya2luZ0RpciA9PSBudWxsICYmIHByb2plY3QgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kRGlyID0gcHJvamVjdC5nZXRCYXNlRGlyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIG5ld2NtZCA9IG5ldyBTdHJpbmdbY21kLmxlbmd0aCArIDJdOwotICAgICAgICAgICAgbmV3Y21kWzBdID0gYW50UnVuOwotICAgICAgICAgICAgbmV3Y21kWzFdID0gY29tbWFuZERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY21kLCAwLCBuZXdjbWQsIDIsIGNtZC5sZW5ndGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBuZXdjbWQsIGVudik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBfc2NyaXB0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVKYXZhLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTRjZGQ4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRXhpdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKgotICoKLSAqIEBhdXRob3IgdGhvbWFzLmhhYXNAc29mdHdpcmVkLWluYy5jb20KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIEV4ZWN1dGVKYXZhIHsKLQotICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgamF2YUNvbW1hbmQgPSBudWxsOwotICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGggPSBudWxsOwotICAgIHByaXZhdGUgQ29tbWFuZGxpbmVKYXZhLlN5c1Byb3BlcnRpZXMgc3lzUHJvcGVydGllcyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhQ29tbWFuZChDb21tYW5kbGluZSBqYXZhQ29tbWFuZCkgewotICAgICAgICB0aGlzLmphdmFDb21tYW5kID0gamF2YUNvbW1hbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggcCkgewotICAgICAgICBjbGFzc3BhdGggPSBwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbVByb3BlcnRpZXMoQ29tbWFuZGxpbmVKYXZhLlN5c1Byb3BlcnRpZXMgcykgewotICAgICAgICBzeXNQcm9wZXJ0aWVzID0gczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgb3V0cHV0IChTeXN0ZW0ub3V0IGFzIHdlbGwgYXMgU3lzdGVtLmVycikgd2lsbCBiZSB3cml0dGVuCi0gICAgICogdG8gdGhpcyBTdHJlYW0uCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBtYW5hZ2Ugb3V0cHV0IGF0IHRoZSB0YXNrIGxldmVsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KFByaW50U3RyZWFtIG91dCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb257Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc25hbWUgPSBqYXZhQ29tbWFuZC5nZXRFeGVjdXRhYmxlKCk7Ci0gICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50ID0geyBqYXZhQ29tbWFuZC5nZXRBcmd1bWVudHMoKSB9OwotCi0gICAgICAgIEFudENsYXNzTG9hZGVyIGxvYWRlciA9IG51bGw7IAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN5c1Byb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN5c1Byb3BlcnRpZXMuc2V0U3lzdGVtKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIENsYXNzW10gcGFyYW0gPSB7IENsYXNzLmZvck5hbWUoIltMamF2YS5sYW5nLlN0cmluZzsiKSB9OwotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhcmdldCA9IENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gbmV3IEFudENsYXNzTG9hZGVyKHByb2plY3QuZ2V0Q29yZUxvYWRlcigpLCBwcm9qZWN0LCBjbGFzc3BhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBsb2FkZXIuc2V0SXNvbGF0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbG9hZGVyLnNldFRocmVhZENvbnRleHRMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBsb2FkZXIuZm9yY2VMb2FkQ2xhc3MoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICBBbnRDbGFzc0xvYWRlci5pbml0aWFsaXplQ2xhc3ModGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtYWluID0gdGFyZ2V0LmdldE1ldGhvZCgibWFpbiIsIHBhcmFtKTsKLSAgICAgICAgICAgIG1haW4uaW52b2tlKG51bGwsIGFyZ3VtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBtYWluKCkgbWV0aG9kIGluICIgKyBjbGFzc25hbWUpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgIiArIGNsYXNzbmFtZSArICIuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBpdCBpbiB5b3VyIGNsYXNzcGF0aCIpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBTZWN1cml0eUV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoU2VjdXJpdHlFeGNlcHRpb24pdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvYWRlci5yZXNldFRocmVhZENvbnRleHRMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICBsb2FkZXIuY2xlYW51cCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN5c1Byb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN5c1Byb3BlcnRpZXMucmVzdG9yZVN5c3RlbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZU9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlT24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4Mzg1YS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlT24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBFeGVjdXRlcyBhIGdpdmVuIGNvbW1hbmQsIHN1cHBseWluZyBhIHNldCBvZiBmaWxlcyBhcyBhcmd1bWVudHMuIAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptYXJpdXN6QHJha2l1cmEub3JnIj5NYXJpdXN6IE5vd29zdGF3c2tpPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIEV4ZWN1dGVPbiBleHRlbmRzIEV4ZWNUYXNrIHsKLQotICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBhcmFsbGVsID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gImZpbGUiOwotICAgIHByb3RlY3RlZCBDb21tYW5kbGluZS5NYXJrZXIgc3JjRmlsZVBvcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBFbXB0eSA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBDb21tYW5kbGluZS5NYXJrZXIgdGFyZ2V0RmlsZVBvcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIE1hcHBlciBtYXBwZXJFbGVtZW50ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgRmlsZU5hbWVNYXBwZXIgbWFwcGVyID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RGlyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEhhcyAmbHQ7c3JjZmlsZSZndDsgYmVlbiBzcGVjaWZpZWQgYmVmb3JlICZsdDt0YXJnZXRmaWxlJmd0OwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHNyY0lzRmlyc3QgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7Ci0gICAgICAgIGZpbGVzZXRzLmFkZEVsZW1lbnQoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaGFsbCB0aGUgY29tbWFuZCB3b3JrIG9uIGFsbCBzcGVjaWZpZWQgZmlsZXMgaW4gcGFyYWxsZWw/Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYWxsZWwoYm9vbGVhbiBwYXJhbGxlbCkgewotICAgICAgICB0aGlzLnBhcmFsbGVsID0gcGFyYWxsZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hhbGwgdGhlIGNvbW1hbmQgd29yayBvbmx5IG9uIGZpbGVzLCBkaXJlY3RvcmllcyBvciBib3RoPwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoRmlsZURpckJvdGggdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdWxkIGVtcHR5IGZpbGVzZXRzIGJlIGlnbm9yZWQ/Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcEVtcHR5RmlsZXNldHMoYm9vbGVhbiBza2lwKSB7Ci0gICAgICAgIHNraXBFbXB0eSA9IHNraXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3REaXIpIHsKLSAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrZXIgdGhhdCBpbmRpY2F0ZXMgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHNob3VsZAotICAgICAqIGJlIHB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIHB1YmxpYyBDb21tYW5kbGluZS5NYXJrZXIgY3JlYXRlU3JjZmlsZSgpIHsKLSAgICAgICAgaWYgKHNyY0ZpbGVQb3MgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHRhc2tUeXBlICsgIiBkb2VzblwndCBzdXBwb3J0IG11bHRpcGxlIHNyY2ZpbGUgZWxlbWVudHMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjRmlsZVBvcyA9IGNtZGwuY3JlYXRlTWFya2VyKCk7Ci0gICAgICAgIHJldHVybiBzcmNGaWxlUG9zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmtlciB0aGF0IGluZGljYXRlcyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgc2hvdWxkCi0gICAgICogYmUgcHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRsaW5lLk1hcmtlciBjcmVhdGVUYXJnZXRmaWxlKCkgewotICAgICAgICBpZiAodGFyZ2V0RmlsZVBvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odGFza1R5cGUgKyAiIGRvZXNuXCd0IHN1cHBvcnQgbXVsdGlwbGUgdGFyZ2V0ZmlsZSBlbGVtZW50cy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICB0YXJnZXRGaWxlUG9zID0gY21kbC5jcmVhdGVNYXJrZXIoKTsKLSAgICAgICAgc3JjSXNGaXJzdCA9IChzcmNGaWxlUG9zICE9IG51bGwpOwotICAgICAgICByZXR1cm4gdGFyZ2V0RmlsZVBvczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBGaWxlTmFtZU1hcHBlciB0byB1c2UgKG5lc3RlZCBtYXBwZXIgZWxlbWVudCkuCi0gICAgICovCi0gICAgcHVibGljIE1hcHBlciBjcmVhdGVNYXBwZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAobWFwcGVyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSBtYXBwZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBtYXBwZXJFbGVtZW50ID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIG1hcHBlckVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgewotICAgICAgICBpZiAoImV4ZWNvbiIuZXF1YWxzKHRhc2tOYW1lKSkgewotICAgICAgICAgICAgbG9nKCIhISBleGVjb24gaXMgZGVwcmVjYXRlZC4gVXNlIGFwcGx5IGluc3RlYWQuICEhIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN1cGVyLmNoZWNrQ29uZmlndXJhdGlvbigpOwotICAgICAgICBpZiAoZmlsZXNldHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibm8gZmlsZXNldHMgc3BlY2lmaWVkIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhcmdldEZpbGVQb3MgIT0gbnVsbCB8fCBtYXBwZXJFbGVtZW50ICE9IG51bGwgCi0gICAgICAgICAgICB8fCBkZXN0RGlyICE9IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibm8gbWFwcGVyIHNwZWNpZmllZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYXBwZXJFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5vIGRlc3QgYXR0cmlidXRlIHNwZWNpZmllZCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXBwZXIgPSBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5FeGVjKEV4ZWN1dGUgZXhlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBWZWN0b3IgZmlsZU5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgVmVjdG9yIGJhc2VEaXJzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgRmlsZSBiYXNlID0gZnMuZ2V0RGlyKHByb2plY3QpOwotICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotCi0gICAgICAgICAgICAgICAgaWYgKCEiZGlyIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcyA9IGdldEZpbGVzKGJhc2UsIGRzKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lcy5hZGRFbGVtZW50KHNbal0pOwotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMuYWRkRWxlbWVudChiYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghImZpbGUiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzID0gZ2V0RGlycyhiYXNlLCBkcyk7OwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVzLmFkZEVsZW1lbnQoc1tqXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlRGlycy5hZGRFbGVtZW50KGJhc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lcy5zaXplKCkgPT0gMCAmJiBza2lwRW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyBmaWxlc2V0IGZvciBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBiYXNlICsgIi4gSXQgaXMgZW1wdHkuIiwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghcGFyYWxsZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbZmlsZU5hbWVzLnNpemUoKV07Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lcy5jb3B5SW50byhzKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBnZXRDb21tYW5kbGluZShzW2pdLCBiYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRXhlY3V0aW5nICIgKyBDb21tYW5kbGluZS50b1N0cmluZyhjb21tYW5kKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5FeGVjdXRlKGV4ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VEaXJzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyYWxsZWwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tmaWxlTmFtZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZXMuY29weUludG8ocyk7Ci0gICAgICAgICAgICAgICAgRmlsZVtdIGIgPSBuZXcgRmlsZVtiYXNlRGlycy5zaXplKCldOwotICAgICAgICAgICAgICAgIGJhc2VEaXJzLmNvcHlJbnRvKGIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBnZXRDb21tYW5kbGluZShzLCBiKTsKLSAgICAgICAgICAgICAgICBsb2coIkV4ZWN1dGluZyAiICsgQ29tbWFuZGxpbmUudG9TdHJpbmcoY29tbWFuZCksIAotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgcnVuRXhlY3V0ZShleGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhlY3V0ZSBmYWlsZWQ6ICIgKyBlLCBlLCBsb2NhdGlvbik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBjbG9zZSB0aGUgb3V0cHV0IGZpbGUgaWYgcmVxdWlyZWQKLSAgICAgICAgICAgIGxvZ0ZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIGNvbW1hbmQgbGluZSBmb3IgcGFyYWxsZWwgZXhlY3V0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNyY0ZpbGVzIFRoZSBmaWxlbmFtZXMgdG8gYWRkIHRvIHRoZSBjb21tYW5kbGluZQotICAgICAqIEBwYXJhbSBiYXNlRGlyIGZpbGVuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBkaXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29tbWFuZGxpbmUoU3RyaW5nW10gc3JjRmlsZXMsIEZpbGVbXSBiYXNlRGlycykgewotICAgICAgICBWZWN0b3IgdGFyZ2V0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgaWYgKHRhcmdldEZpbGVQb3MgIT0gbnVsbCkgewotICAgICAgICAgICAgSGFzaHRhYmxlIGFkZGVkRmlsZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c3JjRmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdWJUYXJnZXRzID0gbWFwcGVyLm1hcEZpbGVOYW1lKHNyY0ZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoc3ViVGFyZ2V0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxzdWJUYXJnZXRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChuZXcgRmlsZShkZXN0RGlyLCBzdWJUYXJnZXRzW2pdKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZGVkRmlsZXMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRGaWxlcy5wdXQobmFtZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RmlsZXMgPSBuZXcgU3RyaW5nW3RhcmdldHMuc2l6ZSgpXTsKLSAgICAgICAgdGFyZ2V0cy5jb3B5SW50byh0YXJnZXRGaWxlcyk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBvcmlnID0gY21kbC5nZXRDb21tYW5kbGluZSgpOwotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW29yaWcubGVuZ3RoK3NyY0ZpbGVzLmxlbmd0aCt0YXJnZXRGaWxlcy5sZW5ndGhdOwotCi0gICAgICAgIGludCBzcmNJbmRleCA9IG9yaWcubGVuZ3RoOwotICAgICAgICBpZiAoc3JjRmlsZVBvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzcmNJbmRleCA9IHNyY0ZpbGVQb3MuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0YXJnZXRGaWxlUG9zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCB0YXJnZXRJbmRleCA9IHRhcmdldEZpbGVQb3MuZ2V0UG9zaXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKHNyY0luZGV4IDwgdGFyZ2V0SW5kZXggCi0gICAgICAgICAgICAgICAgfHwgKHNyY0luZGV4ID09IHRhcmdldEluZGV4ICYmIHNyY0lzRmlyc3QpKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyAwIC0tPiBzcmNJbmRleAotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgcmVzdWx0LCAwLCBzcmNJbmRleCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gc3JjSW5kZXggLS0+IHRhcmdldEluZGV4Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCBzcmNJbmRleCwgcmVzdWx0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luZGV4ICsgc3JjRmlsZXMubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggLSBzcmNJbmRleCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdGFyZ2V0cyBhcmUgYWxyZWFkeSBhYnNvbHV0ZSBmaWxlIG5hbWVzCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0YXJnZXRGaWxlcywgMCwgcmVzdWx0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ICsgc3JjRmlsZXMubGVuZ3RoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEZpbGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdGFyZ2V0SW5kZXggLS0+IGVuZAotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgdGFyZ2V0SW5kZXgsIHJlc3VsdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCArIHNyY0ZpbGVzLmxlbmd0aCArIHRhcmdldEZpbGVzLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcubGVuZ3RoIC0gdGFyZ2V0SW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyAwIC0tPiB0YXJnZXRJbmRleAotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgcmVzdWx0LCAwLCB0YXJnZXRJbmRleCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdGFyZ2V0cyBhcmUgYWxyZWFkeSBhYnNvbHV0ZSBmaWxlIG5hbWVzCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0YXJnZXRGaWxlcywgMCwgcmVzdWx0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RmlsZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0YXJnZXRJbmRleCAtLT4gc3JjSW5kZXgKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWcsIHRhcmdldEluZGV4LCByZXN1bHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggKyB0YXJnZXRGaWxlcy5sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbmRleCAtIHRhcmdldEluZGV4KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzcmNJbmRleCAtLT4gZW5kCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCBzcmNJbmRleCwgcmVzdWx0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luZGV4ICsgc3JjRmlsZXMubGVuZ3RoICsgdGFyZ2V0RmlsZXMubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZy5sZW5ndGggLSBzcmNJbmRleCk7Ci0gICAgICAgICAgICAgICAgc3JjSW5kZXggKz0gdGFyZ2V0RmlsZXMubGVuZ3RoOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7IC8vIG5vIHRhcmdldEZpbGVQb3MKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgcmVzdWx0LCAwLCBzcmNJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaWxsIGluIHNvdXJjZSBmaWxlIG5hbWVzCi0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHNyY0ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHRbc3JjSW5kZXgraV0gPSAKLSAgICAgICAgICAgICAgICAobmV3IEZpbGUoYmFzZURpcnNbaV0sIHNyY0ZpbGVzW2ldKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIGNvbW1hbmQgbGluZSBmb3Igc2VyaWFsIGV4ZWN1dGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcmNGaWxlIFRoZSBmaWxlbmFtZSB0byBhZGQgdG8gdGhlIGNvbW1hbmRsaW5lCi0gICAgICogQHBhcmFtIGJhc2VEaXIgZmlsZW5hbWUgaXMgcmVsYXRpdmUgdG8gdGhpcyBkaXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29tbWFuZGxpbmUoU3RyaW5nIHNyY0ZpbGUsIEZpbGUgYmFzZURpcikgewotICAgICAgICByZXR1cm4gZ2V0Q29tbWFuZGxpbmUobmV3IFN0cmluZ1tdIHtzcmNGaWxlfSwgbmV3IEZpbGVbXSB7YmFzZURpcn0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoaXMgRGlyZWN0b3J5U2Nhbm5lciB0aGF0IHNob3VsZAotICAgICAqIGJlIGluY2x1ZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbGVzKEZpbGUgYmFzZURpciwgRGlyZWN0b3J5U2Nhbm5lciBkcykgewotICAgICAgICBpZiAobWFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNvdXJjZUZpbGVTY2FubmVyIHNmcyA9IG5ldyBTb3VyY2VGaWxlU2Nhbm5lcih0aGlzKTsKLSAgICAgICAgICAgIHJldHVybiBzZnMucmVzdHJpY3QoZHMuZ2V0SW5jbHVkZWRGaWxlcygpLCBiYXNlRGlyLCBkZXN0RGlyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgRGlyZWN0b3JpZXMgZnJvbSB0aGlzIERpcmVjdG9yeVNjYW5uZXIgdGhhdAotICAgICAqIHNob3VsZCBiZSBpbmNsdWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREaXJzKEZpbGUgYmFzZURpciwgRGlyZWN0b3J5U2Nhbm5lciBkcykgewotICAgICAgICBpZiAobWFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNvdXJjZUZpbGVTY2FubmVyIHNmcyA9IG5ldyBTb3VyY2VGaWxlU2Nhbm5lcih0aGlzKTsKLSAgICAgICAgICAgIHJldHVybiBzZnMucmVzdHJpY3QoZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpLCBiYXNlRGlyLCBkZXN0RGlyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgImZpbGUiLCAiZGlyIiBhbmQgImJvdGgiCi0gICAgICogZm9yIHRoZSB0eXBlIGF0dHJpYnV0ZS4gIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZURpckJvdGggZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJmaWxlIiwgImRpciIsICJib3RoIn07Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlU3RyZWFtSGFuZGxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVN0cmVhbUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyNWZiNy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlU3RyZWFtSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogVXNlZCBieSA8Y29kZT5FeGVjdXRlPC9jb2RlPiB0byBoYW5kbGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW0gb2YKLSAqIHN1YnByb2Nlc3Nlcy4KLSAqCi0gKiBAYXV0aG9yIHRob21hcy5oYWFzQHNvZnR3aXJlZC1pbmMuY29tCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIHN1YnByb2Nlc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3Mgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0byB0aGUgc3RhbmRhcmQgaW5wdXQgc3RyZWFtIG9mIHRoZQotICAgICAqICAgICAgICAgICBzdWJwcm9jZXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0lucHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoZSBlcnJvciBzdHJlYW0gb2YgdGhlIHN1YnByb2Nlc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbSB0aGUgZXJyb3Igc3RyZWFtIGZyb20gdGhlIHN1YnByb2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzRXJyb3JTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEluc3RhbGwgYSBoYW5kbGVyIGZvciB0aGUgb3V0cHV0IHN0cmVhbSBvZiB0aGUgc3VicHJvY2Vzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpcyBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tIHRoZSBlcnJvciBzdHJlYW0gZnJvbSB0aGUgc3VicHJvY2VzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NPdXRwdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGhhbmRsaW5nIG9mIHRoZSBzdHJlYW1zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU3RvcCBoYW5kbGluZyBvZiB0aGUgc3RyZWFtcyAtIHdpbGwgbm90IGJlIHJlc3RhcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlV2F0Y2hkb2cuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVXYXRjaGRvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTk3NjY0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVXYXRjaGRvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBEZXN0cm95cyBhIHByb2Nlc3MgcnVubmluZyBmb3IgdG9vIGxvbmcuCi0gKiBGb3IgZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiBFeGVjdXRlV2F0Y2hkb2cgd2F0Y2hkb2cgPSBuZXcgRXhlY3V0ZVdhdGNoZG9nKDMwMDAwKTsKLSAqIEV4ZWN1dGUgZXhlYyA9IG5ldyBFeGVjdXRlKG15bG9naGFuZGxlciwgd2F0Y2hkb2cpOwotICogZXhlYy5zZXRDb21tYW5kTGluZShteWNtZGxpbmUpOwotICogaW50IGV4aXR2YWx1ZSA9IGV4ZWMuZXhlY3V0ZSgpOwotICogaWYgKGV4aXR2YWx1ZSAhPSBTVUNDRVNTICYmIHdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKSl7Ci0gKiAgICAgICAgICAgICAgLy8gaXQgd2FzIGtpbGxlZCBvbiBwdXJwb3NlIGJ5IHRoZSB3YXRjaGRvZwotICogfQotICogPC9wcmU+Ci0gCi0gKiBAYXV0aG9yIHRob21hcy5oYWFzQHNvZnR3aXJlZC1pbmMuY29tCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICogQHNlZSBFeGVjdXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjdXRlV2F0Y2hkb2cgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIAotICAgIC8qKiB0aGUgcHJvY2VzcyB0byBleGVjdXRlIGFuZCB3YXRjaCBmb3IgZHVyYXRpb24gKi8KLSAgICBwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotICAgIC8qKiB0aW1lb3V0IGR1cmF0aW9uLiBPbmNlIHRoZSBwcm9jZXNzIHJ1bm5pbmcgdGltZSBleGNlZWRzIHRoaXMgaXQgc2hvdWxkIGJlIGtpbGxlZCAqLwotICAgIHByaXZhdGUgaW50IHRpbWVvdXQ7Ci0KLSAgICAvKiogc2F5IHdoZXRoZXIgb3Igbm90IHRoZSB3YXRjaG9nIGlzIGN1cnJlbnRseSBtb25pdG9yaW5nIGEgcHJvY2VzcyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB3YXRjaCA9IGZhbHNlOwotICAgICAgICAKLSAgICAvKiogZXhjZXB0aW9uIHRoYXQgbWlnaHQgYmUgdGhyb3duIGR1cmluZyB0aGUgcHJvY2VzcyBleGVjdXRpb24gKi8KLSAgICBwcml2YXRlIEV4Y2VwdGlvbiBjYXVnaHQgPSBudWxsOwotCi0gICAgLyoqIHNheSB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2VzcyB3YXMga2lsbGVkIGR1ZSB0byBydW5uaW5nIG92ZXJ0aW1lICovCi0gICAgcHJpdmF0ZSBib29sZWFuICAgICBraWxsZWRQcm9jZXNzID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdhdGNoZG9nIHdpdGggYSBnaXZlbiB0aW1lb3V0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgZm9yIHRoZSBwcm9jZXNzIGluIG1pbGxpc2Vjb25kcy4gSXQgbXVzdCBiZSBncmVhdGhlciB0aGFuIDAuCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dGVXYXRjaGRvZyhpbnQgdGltZW91dCkgewotICAgICAgICBpZiAodGltZW91dCA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWVvdXQgbGVzc2VyIHRoYW4gMS4iKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdhdGNoZXMgdGhlIGdpdmVuIHByb2Nlc3MgYW5kIHRlcm1pbmF0ZXMgaXQsIGlmIGl0IHJ1bnMgZm9yIHRvbyBsb25nLgotICAgICAqIEFsbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBydW4gYXJlIHJlc2V0LgotICAgICAqIEBwYXJhbSBwcm9jZXNzIHRoZSBwcm9jZXNzIHRvIG1vbml0b3IuIEl0IGNhbm5vdCBiZSA8dHQ+bnVsbDwvdHQ+Ci0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgdGhyb3duIGlmIGEgcHJvY2VzcyBpcyBzdGlsbCBiZWluZyBtb25pdG9yZWQuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KFByb2Nlc3MgcHJvY2VzcykgewotICAgICAgICBpZiAocHJvY2VzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByb2Nlc3MgaXMgbnVsbC4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5wcm9jZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFscmVhZHkgcnVubmluZy4iKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNhdWdodCA9IG51bGw7Ci0gICAgICAgIHRoaXMua2lsbGVkUHJvY2VzcyA9IGZhbHNlOwotICAgICAgICB0aGlzLndhdGNoID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLSAgICAgICAgZmluYWwgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQodGhpcywgIldBVENIRE9HIik7Ci0gICAgICAgIHRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0gICAgICAgIHRocmVhZC5zdGFydCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIHRoZSB3YXRjaGVyLiBJdCB3aWxsIG5vdGlmeSBhbGwgdGhyZWFkcyBwb3NzaWJseSB3YWl0aW5nIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotICAgICAgICB3YXRjaCA9IGZhbHNlOwotICAgICAgICBub3RpZnlBbGwoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFdhdGNoZXMgdGhlIHByb2Nlc3MgYW5kIHRlcm1pbmF0ZXMgaXQsIGlmIGl0IHJ1bnMgZm9yIHRvIGxvbmcuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXNuJ3QgYSBUYXNrLCBkb24ndCBoYXZlIGEgUHJvamVjdCBvYmplY3QgdG8gbG9nLgotICAgICAgICAgICAgLy8gcHJvamVjdC5sb2coIkV4ZWN1dGVXYXRjaGRvZzogdGltZW91dCA9ICIrdGltZW91dCsiIG1zZWMiLCAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHVudGlsID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotICAgICAgICAgICAgbG9uZyBub3c7Ci0gICAgICAgICAgICB3aGlsZSAod2F0Y2ggJiYgdW50aWwgPiAobm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2FpdCh1bnRpbCAtIG5vdyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGhlcmUsIGVpdGhlciBzb21lb25lIHN0b3BwZWQgdGhlIHdhdGNoZG9nLAotICAgICAgICAgICAgLy8gd2UgYXJlIG9uIHRpbWVvdXQgYW5kIHRoZSBwcm9jZXNzIG11c3QgYmUga2lsbGVkLCBvcgotICAgICAgICAgICAgLy8gd2UgYXJlIG9uIHRpbWVvdXQgYW5kIHRoZSBwcm9jZXNzIGhhcyBhbHJlYWR5IHN0b3BwZWQuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgY2hlY2sgaWYgdGhlIHByb2Nlc3Mgd2FzIG5vdCBzdG9wcGVkCi0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGJlaW5nIGhlcmUKLSAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXRWYWx1ZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIG5vdCB0ZXJtaW5hdGVkLCBpZiB0aGlzIGlzIHJlYWxseQotICAgICAgICAgICAgICAgIC8vIGEgdGltZW91dCBhbmQgbm90IGEgbWFudWFsIHN0b3AgdGhlbiBraWxsIGl0LgotICAgICAgICAgICAgICAgIGlmICh3YXRjaCl7Ci0gICAgICAgICAgICAgICAgICAgIGtpbGxlZFByb2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmRlc3Ryb3koKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGNhdWdodCA9IGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbGVhblVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXNldCB0aGUgbW9uaXRvciBmbGFnIGFuZCB0aGUgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgewotICAgICAgICB3YXRjaCA9IGZhbHNlOwotICAgICAgICBwcm9jZXNzID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldGhyb3cgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBwb3NzaWJseSBjYXVnaHQgZHVyaW5nIHRoZQotICAgICAqIHJ1biBvZiB0aGUgcHJvY2Vzcy4gSXQgd2lsbCBvbmx5IHJlbWFpbnMgdmFsaWQgb25jZSB0aGUgcHJvY2VzcyBoYXMgYmVlbgotICAgICAqIHRlcm1pbmF0ZWQgZWl0aGVyIGJ5ICdlcnJvcicsIHRpbWVvdXQgb3IgbWFudWFsIGludGVydmVudGlvbi4gSW5mb3JtYXRpb24KLSAgICAgKiB3aWxsIGJlIGRpc2NhcmRlZCBvbmNlIGEgbmV3IHByb2Nlc3MgaXMgcmFuLgotICAgICAqIEB0aHJvd3MgIEJ1aWxkRXhjZXB0aW9uICBhIHdyYXBwZWQgZXhjZXB0aW9uIG92ZXIgdGhlIG9uZSB0aGF0IHdhcyBzaWxlbnRseQotICAgICAqIHN3YWxsb3dlZCBhbmQgc3RvcmVkIGR1cmluZyB0aGUgcHJvY2VzcyBydW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hlY2tFeGNlcHRpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2F1Z2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhjZXB0aW9uIGluIEV4ZWN1dGVXYXRjaGRvZy5ydW46ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNhdWdodC5nZXRNZXNzYWdlKCksIGNhdWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHdhdGNoZG9nIGlzIHN0aWxsIG1vbml0b3JpbmcgdGhlIHByb2Nlc3MuCi0gICAgICogQHJldHVybiAgPHR0PnRydWU8L3R0PiBpZiB0aGUgcHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nLCBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNXYXRjaGluZygpewotICAgICAgICByZXR1cm4gd2F0Y2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxhc3QgcHJvY2VzcyBydW4gd2FzIGtpbGxlZCBvbiB0aW1lb3V0IG9yIG5vdC4KLSAgICAgKiBAcmV0dXJuICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBwcm9jZXNzIHdhcyBraWxsZWQgb3RoZXJ3aXNlIDx0dD5mYWxzZTwvdHQ+LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGtpbGxlZFByb2Nlc3MoKXsKLSAgICAgICAgcmV0dXJuIGtpbGxlZFByb2Nlc3M7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGl0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDdkYjYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogSnVzdCBleGl0IHRoZSBhY3RpdmUgYnVpbGQsIGdpdmluZyBhbiBhZGRpdGlvbmFsIG1lc3NhZ2UgCi0gKiBpZiBhdmFpbGFibGUuCi0gKgotICogQGF1dGhvciBOaWNvIFNlZXNzbGUgPG5pY29Ac2Vlc3NsZS5kZT4KLSAqLwotcHVibGljIGNsYXNzIEV4aXQgZXh0ZW5kcyBUYXNrIHsgCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyB2YWx1ZSkgeyAKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7IAotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBtZXNzYWdlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBtdWx0aWxpbmUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyBtc2cpIHsKLSAgICAgICAgbWVzc2FnZSArPSAKLSAgICAgICAgICAgIFByb2plY3RIZWxwZXIucmVwbGFjZVByb3BlcnRpZXMocHJvamVjdCwgbXNnLCBwcm9qZWN0LmdldFByb3BlcnRpZXMoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeHBhbmQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4cGFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI1MTQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4cGFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0vKioKLSAqIFVuemlwIGEgZmlsZS4gCi0gKgotICogQGF1dGhvciBjb3N0aW5AZG50LnJvCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeHBhbmQgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotICAgIHByaXZhdGUgRmlsZSBkZXN0OyAvLyByZXEKLSAgICBwcml2YXRlIEZpbGUgc291cmNlOyAvLyByZXEKLQotICAgIHByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGUgPSB0cnVlOwotICAgIAotICAgIC8qKgotICAgICAqIERvIHRoZSB3b3JrLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBUaHJvd24gaW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KLSAgICAgKi8KLSAgICAvLyBYWFggbW92ZSBpdCB0byB1dGlsIG9yIHRvb2xzCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgiZXhwYW5kIi5lcXVhbHModGFza1R5cGUpKSB7Ci0gICAgICAgICAgICBsb2coIiEhIGV4cGFuZCBpcyBkZXByZWNhdGVkLiBVc2UgdW56aXAgaW5zdGVhZC4gISEiKTsKLSAgICAgICAgfQotICAgICAgICAKLQotICAgICAgICBUb3VjaCB0b3VjaCA9IChUb3VjaCkgcHJvamVjdC5jcmVhdGVUYXNrKCJ0b3VjaCIpOwotICAgICAgICB0b3VjaC5zZXRPd25pbmdUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgdG91Y2guc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgIHRvdWNoLnNldExvY2F0aW9uKGdldExvY2F0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNvdXJjZSBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlc3QgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIC8vIGdldCBhbGwgdGhlIGZpbGVzIGluIHRoZSBkZXNjcmlwdG9yIGRpcmVjdG9yeQotICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHN1cGVyLmdldERpcmVjdG9yeVNjYW5uZXIoc291cmNlKTsKLSAgICAKLSAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHNvdXJjZSwgZmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIGV4cGFuZEZpbGUodG91Y2gsIGZpbGUsIGRlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZXhwYW5kRmlsZSh0b3VjaCwgc291cmNlLCBkZXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmRGaWxlKFRvdWNoIHRvdWNoLCBGaWxlIHNyY0YsIEZpbGUgZGlyKSB7Ci0gICAgICAgIFppcElucHV0U3RyZWFtIHppcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2coIkV4cGFuZGluZzogIiArIHNyY0YgKyAiIGludG8gIiArIGRpciwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAvLyBjb2RlIGZyb20gV2FyRXhwYW5kCi0gICAgICAgICAgICB6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGKSk7Ci0gICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIHdoaWxlICgoemUgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIHByb2plY3QudHJhbnNsYXRlUGF0aCh6ZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW92ZXJ3cml0ZSAmJiBmLmV4aXN0cygpIAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZi5sYXN0TW9kaWZpZWQoKSA+PSB6ZS5nZXRUaW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiU2tpcHBpbmcgIiArIGYgKyAiIGFzIGl0IGlzIHVwLXRvLWRhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBsb2coImV4cGFuZGluZyAiICsgemUuZ2V0TmFtZSgpICsgIiB0byAiKyBmLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgaW50ZXJtZWRpYXJ5IGRpcmVjdG9yaWVzIC0gc29tZXRpbWVzIHppcCBkb24ndCBhZGQgdGhlbQotICAgICAgICAgICAgICAgICAgICBGaWxlIGRpckY9bmV3IEZpbGUoZi5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpckYubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoemUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5ta2RpcnMoKTsgCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gemlzLnJlYWQoYnVmZmVyKSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5nZXRKYXZhVmVyc2lvbigpICE9IFByb2plY3QuSkFWQV8xXzEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoLnNldEZpbGUoZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3VjaC5zZXRNaWxsaXMoemUuZ2V0VGltZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoLnRvdWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSBjYXRjaCggRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4ICkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBleHBhbmQgdG8gZmlsZSAiICsgZi5nZXRQYXRoKCksIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZygiZXhwYW5kIGNvbXBsZXRlIiwgUHJvamVjdC5NU0dfVkVSQk9TRSApOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgZXhwYW5kaW5nICIgKyBzcmNGLmdldFBhdGgoKSwgaW9lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh6aXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHppcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gRmlsZSB3aWxsIGJlIHVuemlwcGVkIGludG8gdGhlCi0gICAgICogZGVzdGluYXRpb24gZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGQgUGF0aCB0byB0aGUgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkKSB7Ci0gICAgICAgIHRoaXMuZGVzdD1kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aCB0byB6aXAtZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIFBhdGggdG8gemlwLWZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgcykgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdWxkIHdlIG92ZXJ3cml0ZSBmaWxlcyBpbiBkZXN0LCBldmVuIGlmIHRoZXkgYXJlIG5ld2VyIHRoYW4KLSAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSBhcmNoaXZlPwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZShib29sZWFuIGIpIHsKLSAgICAgICAgb3ZlcndyaXRlID0gYjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpbHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNmVlYzcuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi0vKioKLSAqIFRoaXMgdGFzayBzZXRzIGEgdG9rZW4gZmlsdGVyIHRoYXQgaXMgdXNlZCBieSB0aGUgZmlsZSBjb3B5IG1ldGhvZHMKLSAqIG9mIHRoZSBwcm9qZWN0IHRvIGRvIHRva2VuIHN1YnN0aXR1dGlvbiwgb3Igc2V0cyBtdXRpcGxlIHRva2VucyBieQotICogcmVhZGluZyB0aGVzZSBmcm9tIGEgZmlsZS4KLSAqCi0gKiBAYXV0aG9yIFN0ZWZhbm8gTWF6em9jY2hpIDxhIGhyZWY9Im1haWx0bzpzdGVmYW5vQGFwYWNoZS5vcmciPnN0ZWZhbm9AYXBhY2hlLm9yZzwvYT4KLSAqIEBhdXRob3IgR2VybyBWZXJtYWFzIDxhIGhyZWY9Im1haWx0bzpnZXJvQHhzNGFsbC5ubCI+Z2Vyb0B4czRhbGwubmw8L2E+Ci0gKiBAYXV0aG9yIDxBIGhyZWY9Imdob2xhbUB4dHJhLmNvLm56Ij5NaWNoYWVsIE1jQ2FsbHVtPC9BPgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyIGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0b2tlbjsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICBwcml2YXRlIEZpbGUgZmlsdGVyc0ZpbGU7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VG9rZW4oU3RyaW5nIHRva2VuKSB7Ci0gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnNmaWxlKEZpbGUgZmlsdGVyc0ZpbGUpIHsKLSAgICAgICAgdGhpcy5maWx0ZXJzRmlsZSA9IGZpbHRlcnNGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzRmlsdGVyc0Zyb21GaWxlID0gZmlsdGVyc0ZpbGUgIT0gbnVsbCAmJiB0b2tlbiA9PSBudWxsICYmIHZhbHVlID09IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNTaW5nbGVGaWx0ZXIgPSBmaWx0ZXJzRmlsZSA9PSBudWxsICYmIHRva2VuICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICghaXNGaWx0ZXJzRnJvbUZpbGUgJiYgIWlzU2luZ2xlRmlsdGVyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJvdGggdG9rZW4gYW5kIHZhbHVlIHBhcmFtZXRlcnMsIG9yIG9ubHkgYSBmaWx0ZXJzRmlsZSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpc1NpbmdsZUZpbHRlcikgewotICAgICAgICAgICAgcHJvamVjdC5nZXRHbG9iYWxGaWx0ZXJTZXQoKS5hZGRGaWx0ZXIodG9rZW4sIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGlzRmlsdGVyc0Zyb21GaWxlKSB7Ci0gICAgICAgICAgICByZWFkRmlsdGVycygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRGaWx0ZXJzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nKCJSZWFkaW5nIGZpbHRlcnMgZnJvbSAiICsgZmlsdGVyc0ZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICBwcm9qZWN0LmdldEdsb2JhbEZpbHRlclNldCgpLnJlYWRGaWx0ZXJzRnJvbUZpbGUoZmlsdGVyc0ZpbGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENSTEYuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENSTEYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzYjgxYi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDUkxGLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUYXNrIHRvIGNvbnZlcnQgdGV4dCBzb3VyY2UgZmlsZXMgdG8gbG9jYWwgT1MgZm9ybWF0dGluZyBjb252ZW50aW9ucywgYXMKLSAqIHdlbGwgYXMgcmVwYWlyIHRleHQgZmlsZXMgZGFtYWdlZCBieSBtaXNjb25maWd1cmVkIG9yIG1pc2d1aWRlZCBlZGl0b3JzIG9yCi0gKiBmaWxlIHRyYW5zZmVyIHByb2dyYW1zLgotICogPHA+Ci0gKiBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6Ci0gKiA8dWw+Ci0gKiA8bGk+c3JjZGlyCi0gKiA8bGk+ZGVzdGRpcgotICogPGxpPmluY2x1ZGUKLSAqIDxsaT5leGNsdWRlCi0gKiA8bGk+Y3IKLSAqIDxsaT5lb2wKLSAqIDxsaT50YWIKLSAqIDxsaT5lb2YKLSAqIDwvdWw+Ci0gKiBPZiB0aGVzZSBhcmd1bWVudHMsIG9ubHkgPGI+c291cmNlZGlyPC9iPiBpcyByZXF1aXJlZC4KLSAqIDxwPgotICogV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2NhbiB0aGUgc3JjZGlyIGJhc2VkIG9uIHRoZSBpbmNsdWRlCi0gKiBhbmQgZXhjbHVkZSBwcm9wZXJ0aWVzLgotICogPHA+Ci0gKiBUaGlzIHZlcnNpb24gZ2VuZXJhbGlzZXMgdGhlIGhhbmRsaW5nIG9mIEVPTCBjaGFyYWN0ZXJzLCBhbmQgYWxsb3dzCi0gKiBmb3IgQ1Itb25seSBsaW5lIGVuZGluZ3MgKHdoaWNoIEkgc3VzcGVjdCBpcyB0aGUgc3RhbmRhcmQgb24gTWFjcy4pCi0gKiBUYWIgaGFuZGxpbmcgaGFzIGFsc28gYmVlbiBnZW5lcmFsaXNlZCB0byBhY2NvbW1vZGF0ZSBhbnkgdGFid2lkdGgKLSAqIGZyb20gMiB0byA4MCwgaW5jbHVzaXZlLiAgSW1wb3J0YW50bHksIGl0IHdpbGwgbGVhdmUgdW50b3VjaGVkIGFueQotICogbGl0ZXJhbCBUQUIgY2hhcmFjdGVycyBlbWJlZGRlZCB3aXRoaW4gc3RyaW5nIG9yIGNoYXJhY3RlciBjb25zdGFudHMuCi0gKiA8cD4KLSAqIDxlbT5XYXJuaW5nOjwvZW0+IGRvIG5vdCBydW4gb24gYmluYXJ5IGZpbGVzLgotICogPGVtPkNhdXRpb246PC9lbT4gcnVuIHdpdGggY2FyZSBvbiBjYXJlZnVsbHkgZm9ybWF0dGVkIGZpbGVzLgotICogVGhpcyBtYXkgc291bmQgb2J2aW91cywgYnV0IGlmIHlvdSBkb24ndCBzcGVjaWZ5IGFzaXMsIHByZXN1bWUgdGhhdAotICogeW91ciBmaWxlcyBhcmUgZ29pbmcgdG8gYmUgbW9kaWZpZWQuICBJZiAidGFicyIgaXMgImFkZCIgb3IgInJlbW92ZSIsCi0gKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQgYXMgbmVjZXNzYXJ5LiAgU2ltaWxhcmx5LAotICogZm9yIENSJ3MgLSBpbiBmYWN0ICJlb2wiPSJjcmxmIiBvciBjcj0iYWRkIiBjYW4gcmVzdWx0IGluIGNyCi0gKiBjaGFyYWN0ZXJzIGJlaW5nIHJlbW92ZWQgaW4gb25lIHNwZWNpYWwgY2FzZSBhY2NvbW1vZGF0ZWQsIGkuZS4sCi0gKiBDUkNSTEYgaXMgcmVnYXJkZWQgYXMgYSBzaW5nbGUgRU9MIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBvdGhlcgotICogcHJvZ3JhbXMgaGF2ZSBjb252ZXJ0ZWQgQ1JMRiBpbnRvIENSQ1JMRi4KLSAqCi0gKiBAYXV0aG9yIFNhbSBSdWJ5IDxhIGhyZWY9Im1haWx0bzpydWJ5c0B1cy5pYm0uY29tIj5ydWJ5c0B1cy5pYm0uY29tPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cGJ3ZXN0QHBvd2VydXAuY29tLmF1Ij5QZXRlciBCLiBXZXN0PC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJCAkTmFtZSQKLSAqLwotCi1wdWJsaWMgY2xhc3MgRml4Q1JMRiBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUYgPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USkFWQSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPT0tJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTl9DSEFSX0NPTlNUID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5fU1RSX0NPTlNUID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5fU0lOR0xFX0NPTU1FTlQgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTl9NVUxUSV9DT01NRU5UID0gNTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0lTID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1IgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRiA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSTEYgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0VTID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQlMgPSAxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQlVGTEVOID0gODE5MjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElORUJVRkxFTiA9IDIwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ1RSTFogPSAnXHUwMDFBJzsKLQotICAgIHByaXZhdGUgaW50IHRhYmxlbmd0aCA9IDg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3BhY2VzID0gIiAgICAgICAgIjsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBsaW5lYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigxMDI0KTsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBsaW5lYnVmMiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAyNCk7Ci0gICAgcHJpdmF0ZSBpbnQgZW9sOwotICAgIHByaXZhdGUgU3RyaW5nIGVvbHN0cjsKLSAgICBwcml2YXRlIGludCBjdHJsejsKLSAgICBwcml2YXRlIGludCB0YWJzOwotICAgIHByaXZhdGUgYm9vbGVhbiBqYXZhZmlsZXMgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgRmlsZSBzcmNEaXI7Ci0gICAgcHJpdmF0ZSBGaWxlIGRlc3REaXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdHMgdGhlIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIHN5c3RlbSB0eXBlLgotICAgICAqIDx1bD48bGk+VW5peDogZW9sPSJMRiIgdGFiPSJhc2lzIiBlb2Y9InJlbW92ZSIKLSAgICAgKiAgICAgPGxpPk1hYzogZW9sPSJDUiIgdGFiPSJhc2lzIiBlb2Y9InJlbW92ZSIKLSAgICAgKiAgICAgPGxpPkRPUzogZW9sPSJDUkxGIiB0YWI9ImFzaXMiIGVvZj0iYXNpcyI8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBGaXhDUkxGICgpIHsKLSAgICAgICAgdGFicyA9IEFTSVM7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIikuZXF1YWxzKCI6IikpIHsKLSAgICAgICAgICAgIGN0cmx6ID0gUkVNT1ZFOwotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmluZGV4T2YoIk1hYyIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICBlb2wgPSBDUjsKLSAgICAgICAgICAgICAgICBlb2xzdHIgPSAiXHIiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlb2wgPSBMRjsKLSAgICAgICAgICAgICAgICBlb2xzdHIgPSAiXG4iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY3RybHogPSBBU0lTOwotICAgICAgICAgICAgZW9sID0gQ1JMRjsKLSAgICAgICAgICAgIGVvbHN0ciA9ICJcclxuIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc291cmNlIGRpciB0byBmaW5kIHRoZSBzb3VyY2UgdGV4dCBmaWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmNkaXIoRmlsZSBzcmNEaXIpIHsKLSAgICAgICAgdGhpcy5zcmNEaXIgPSBzcmNEaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiB3aGVyZSB0aGUgZml4ZWQgZmlsZXMgc2hvdWxkIGJlIHBsYWNlZC4KLSAgICAgKiBEZWZhdWx0IGlzIHRvIHJlcGxhY2UgdGhlIG9yaWdpbmFsIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGRlc3REaXIpIHsKLSAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXhpbmcgSmF2YSBzb3VyY2UgZmlsZXM/Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YWZpbGVzKGJvb2xlYW4gamF2YWZpbGVzKSB7Ci0gICAgICAgIHRoaXMuamF2YWZpbGVzID0gamF2YWZpbGVzOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSBob3cgRW5kT2ZMaW5lIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcHRpb24gdmFsaWQgdmFsdWVzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+YXNpczogbGVhdmUgbGluZSBlbmRpbmdzIGFsb25lCi0gICAgICogPGxpPmNyOiBjb252ZXJ0IGxpbmUgZW5kaW5ncyB0byBDUgotICAgICAqIDxsaT5sZjogY29udmVydCBsaW5lIGVuZGluZ3MgdG8gTEYKLSAgICAgKiA8bGk+Y3JsZjogY29udmVydCBsaW5lIGVuZGluZ3MgdG8gQ1JMRgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW9sKENyTGYgYXR0cikgewotICAgICAgICBTdHJpbmcgb3B0aW9uID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAob3B0aW9uLmVxdWFscygiYXNpcyIpKSB7Ci0gICAgICAgICAgICBlb2wgPSBBU0lTOwotICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoImNyIikpIHsKLSAgICAgICAgICAgIGVvbCA9IENSOwotICAgICAgICAgICAgZW9sc3RyID0gIlxyIjsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCJsZiIpKSB7Ci0gICAgICAgICAgICBlb2wgPSBMRjsKLSAgICAgICAgICAgIGVvbHN0ciA9ICJcbiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBNdXN0IGJlICJjcmxmIgotICAgICAgICAgICAgZW9sID0gQ1JMRjsKLSAgICAgICAgICAgIGVvbHN0ciA9ICJcclxuIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpZnkgaG93IGNhcnJpYWdlIHJldHVybiAoQ1IpIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcHRpb24gdmFsaWQgdmFsdWVzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+YWRkOiBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIENSIGJlZm9yZSBldmVyeSBMRgotICAgICAqIDxsaT5hc2lzOiBsZWF2ZSBDUiBjaGFyYWN0ZXJzIGFsb25lCi0gICAgICogPGxpPnJlbW92ZTogcmVtb3ZlIGFsbCBDUiBjaGFyYWN0ZXJzCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3NldEVvbCBzZXRFb2x9IGluc3RlYWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3IoQWRkQXNpc1JlbW92ZSBhdHRyKSB7Ci0gICAgICAgIGxvZygiREVQUkVDQVRFRDogVGhlIGNyIGF0dHJpYnV0ZSBoYXMgYmVlbiBkZXByZWNhdGVkLCIsIAotICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIGxvZygiUGxlYXNlIHVzIHRoZSBlb2wgYXR0cmlidXRlIGluc3RlYWQiLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgU3RyaW5nIG9wdGlvbiA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgQ3JMZiBjID0gbmV3IENyTGYoKTsKLSAgICAgICAgaWYgKG9wdGlvbi5lcXVhbHMoInJlbW92ZSIpKSB7Ci0gICAgICAgICAgICBjLnNldFZhbHVlKCJsZiIpOwotICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoImFzaXMiKSkgewotICAgICAgICAgICAgYy5zZXRWYWx1ZSgiYXNpcyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbXVzdCBiZSAiYWRkIgotICAgICAgICAgICAgYy5zZXRWYWx1ZSgiY3JsZiIpOwotICAgICAgICB9Ci0gICAgICAgIHNldEVvbChjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IGhvdyB0YWIgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZAotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbiB2YWxpZCB2YWx1ZXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5hZGQ6IGNvbnZlcnQgc2VxdWVuY2VzIG9mIHNwYWNlcyB3aGljaCBzcGFuIGEgdGFiIHN0b3AgdG8gdGFicwotICAgICAqIDxsaT5hc2lzOiBsZWF2ZSB0YWIgYW5kIHNwYWNlIGNoYXJhY3RlcnMgYWxvbmUKLSAgICAgKiA8bGk+cmVtb3ZlOiBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzCi0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWIoQWRkQXNpc1JlbW92ZSBhdHRyKSB7Ci0gICAgICAgIFN0cmluZyBvcHRpb24gPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgIGlmIChvcHRpb24uZXF1YWxzKCJyZW1vdmUiKSkgewotICAgICAgICAgICAgdGFicyA9IFNQQUNFUzsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCJhc2lzIikpIHsKLSAgICAgICAgICAgIHRhYnMgPSBBU0lTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbXVzdCBiZSAiYWRkIgotICAgICAgICAgICAgdGFicyA9IFRBQlM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRhYiBsZW5ndGggaW4gY2hhcmFjdGVycwotICAgICAqCi0gICAgICogQHBhcmFtIHRsZW5ndGggc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRhYiBpbiBzcGFjZXMsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFibGVuZ3RoKGludCB0bGVuZ3RoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAodGxlbmd0aCA8IDIgfHwgdGxlbmd0aCA+ODApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGFibGVuZ3RoIG11c3QgYmUgYmV0d2VlbiAyIGFuZCA4MCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHRhYmxlbmd0aCA9IHRsZW5ndGg7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzcCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc3AuYXBwZW5kKCcgJyk7Ci0gICAgICAgIH0KLSAgICAgICAgc3BhY2VzID0gc3AudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IGhvdyBET1MgRU9GIChjb250cm9sLXopIGNoYXJhdGVycyBhcmUgdG8gYmUgaGFuZGxlZAotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbiB2YWxpZCB2YWx1ZXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5hZGQ6IGVuc3VyZSB0aGF0IHRoZXJlIGlzIGFuIGVvZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCi0gICAgICogPGxpPmFzaXM6IGxlYXZlIGVvZiBjaGFyYWN0ZXJzIGFsb25lCi0gICAgICogPGxpPnJlbW92ZTogcmVtb3ZlIGFueSBlb2YgY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQKLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVvZihBZGRBc2lzUmVtb3ZlIGF0dHIpIHsKLSAgICAgICAgU3RyaW5nIG9wdGlvbiA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKG9wdGlvbi5lcXVhbHMoInJlbW92ZSIpKSB7Ci0gICAgICAgICAgICBjdHJseiA9IFJFTU9WRTsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCJhc2lzIikpIHsKLSAgICAgICAgICAgIGN0cmx6ID0gQVNJUzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG11c3QgYmUgImFkZCIKLSAgICAgICAgICAgIGN0cmx6ID0gQUREOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAvLyBmaXJzdCBvZmYsIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIHNyY2RpciBhbmQgZGVzdGRpcgotICAgICAgICAKLSAgICAgICAgaWYgKHNyY0RpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzcmNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3JjRGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGlzIG5vdCBhIGRpcmVjdG9yeSEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVzdERpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWRlc3REaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3RkaXIgZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzdGRpciBpcyBub3QgYSBkaXJlY3RvcnkhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb2cgb3B0aW9ucyB1c2VkCi0gICAgICAgIGxvZygib3B0aW9uczoiICsKLSAgICAgICAgICAgICIgZW9sPSIgKwotICAgICAgICAgICAgKGVvbD09QVNJUyA/ICJhc2lzIiA6IGVvbD09Q1IgPyAiY3IiIDogZW9sPT1MRiA/ICJsZiIgOiAiY3JsZiIpICsKLSAgICAgICAgICAgICIgdGFiPSIgKyAodGFicz09VEFCUyA/ICJhZGQiIDogdGFicz09QVNJUyA/ICJhc2lzIiA6ICJyZW1vdmUiKSArCi0gICAgICAgICAgICAiIGVvZj0iICsgKGN0cmx6PT1BREQgPyAiYWRkIiA6IGN0cmx6PT1BU0lTID8gImFzaXMiIDogInJlbW92ZSIpICsKLSAgICAgICAgICAgICIgdGFibGVuZ3RoPSIgKyB0YWJsZW5ndGgsCi0gICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzcmNEaXIpOwotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBwcm9jZXNzRmlsZShmaWxlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBGaWxlKCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9ICJmaXhjcmxmIiAKLSAgICAgICAgICAgICsgKG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKS5uZXh0TG9uZygpOwotICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoc3JjRGlyLCBuYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShkZXN0RGlyLCBuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBmb3IgdGhlIGluZXF1YWxpdHkgb2YgdHdvIGZpbGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbGVzRXF1YWwoRmlsZSBmaWxlMSwgRmlsZSBmaWxlMikgewotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIxOwotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIyOwotICAgICAgICBjaGFyIGJ1ZjFbXSA9IG5ldyBjaGFyW0lOQlVGTEVOXTsKLSAgICAgICAgY2hhciBidWYyW10gPSBuZXcgY2hhcltJTkJVRkxFTl07Ci0gICAgICAgIGludCBidWZsZW47Ci0KLSAgICAgICAgaWYgKGZpbGUxLmxlbmd0aCgpICE9IGZpbGUyLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgcmVhZGVyMSA9IG5ldyBCdWZmZXJlZFJlYWRlcgotICAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlUmVhZGVyKGZpbGUxKSwgSU5CVUZMRU4pOwotICAgICAgICAgICAgIHJlYWRlcjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgIChuZXcgRmlsZVJlYWRlcihmaWxlMiksIElOQlVGTEVOKTsKLSAgICAgICAgICAgICB3aGlsZSAoKGJ1ZmxlbiA9IHJlYWRlcjEucmVhZChidWYxLCAwLCBJTkJVRkxFTikpICE9IC0xICkgewotICAgICAgICAgICAgICAgICByZWFkZXIyLnJlYWQoYnVmMiwgMCwgSU5CVUZMRU4pOwotICAgICAgICAgICAgICAgICAvLyBDb21wYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVycwotICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGFuIGVhc2llciB3YXkgdG8gZG8gdGhpcywgYnV0IEkgZG9uJyd0Ci0gICAgICAgICAgICAgICAgIC8vIGtub3cgd2hhdCBpdCBpcwotICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZmxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoYnVmMVtpXSAhPSBidWYyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyMS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcjIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBvZiBpZiAoYnVmMVtpXSAhPSBidWYyW2ldKQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJlYWRlcjEuY2xvc2UoKTsKLSAgICAgICAgICAgICByZWFkZXIyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgLy8gZXF1YWwKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJT0V4Y2VwdGlvbiBpbiBmaWxlc0VxdWFsOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTEgKyAiIDogIiArIGZpbGUyKTsKLSAgICAgICAgfSAvLyBlbmQgb2YgdHJ5LWNhdGNoCi0gICAgICAgICAgICAgICAgIAotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGaWxlKFN0cmluZyBmaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIGZpbGUpOwotICAgICAgICBGaWxlIHRtcEZpbGUgPSBudWxsOwotICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXRXcml0ZXI7Ci0gICAgICAgIE9uZUxpbmVyLkJ1ZmZlckxpbmUgbGluZTsKLQotICAgICAgICAvLyByZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQotICAgICAgICBPbmVMaW5lciBsaW5lcyA9IG5ldyBPbmVMaW5lcihzcmNGaWxlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBvdXRwdXQgV3JpdGVyCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcEZpbGUgPSBjcmVhdGVUZW1wRmlsZSgpOwotICAgICAgICAgICAgICAgIEZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIodG1wRmlsZSk7Ci0gICAgICAgICAgICAgICAgb3V0V3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKHdyaXRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAobGluZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJbi1saW5lIHN0YXRlcwotICAgICAgICAgICAgICAgIGludCBlbmRDb21tZW50OwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IChPbmVMaW5lci5CdWZmZXJMaW5lKWxpbmVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZVN0cmluZyA9IGxpbmUuZ2V0TGluZVN0cmluZygpOwotICAgICAgICAgICAgICAgIGludCBsaW5lbGVuID0gbGluZS5sZW5ndGgoKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdGUgLSBhbGwgb2YgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nIE5PVCBkb25lIGZvciAKLSAgICAgICAgICAgICAgICAvLyB0YWJzIEFTSVMKLQotICAgICAgICAgICAgICAgIGlmICh0YWJzID09IEFTSVMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBjb3B5IHRoZSBib2R5IG9mIHRoZSBsaW5lIGFjcm9zcwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0V3JpdGVyLndyaXRlKGxpbmVTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIG9mIHRyeS1jYXRjaAotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gKHRhYnMgIT0gQVNJUykKLSAgICAgICAgICAgICAgICAgICAgaW50IHB0cjsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciA9IGxpbmUuZ2V0TmV4dCgpKSA8IGxpbmVsZW4pIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChsaW5lcy5nZXRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5PVEpBVkE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90SW5Db25zdGFudChsaW5lLCBsaW5lLmxlbmd0aCgpLCBvdXRXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElOX01VTFRJX0NPTU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlbmRDb21tZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHJpbmcuaW5kZXhPZigiKi8iLCBsaW5lLmdldE5leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5kIG9mIG11bHRpTGluZUNvbW1lbnQgb24gdGhpcyBsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRDb21tZW50ICs9IDI7ICAvLyBJbmNsdWRlIHRoZSBlbmQgdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLnNldFN0YXRlKExPT0tJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbW1lbnQgPSBsaW5lbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdEluQ29uc3RhbnQobGluZSwgZW5kQ29tbWVudCwgb3V0V3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTl9TSU5HTEVfQ09NTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RJbkNvbnN0YW50KGxpbmUsIGxpbmUubGVuZ3RoKCksIG91dFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuc2V0U3RhdGUoTE9PS0lORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5fQ0hBUl9DT05TVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5fU1RSX0NPTlNUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvdCBoZXJlIGZyb20gTE9PS0lORyBieSBmaW5kaW5nIGFuIG9wZW5pbmcgIlwnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgcG9pbnRzIHRvIHRoYXQgcXVvdGUgY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgY29uc3RhbnQuICBXYXRjaCBvdXQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3NsYXNoZXMuICBMaXRlcmFsIHRhYnMgYXJlIGxlZnQgdW5jaGFuZ2VkLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29sdW1uIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZWdpbiA9IGxpbmUuZ2V0TmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdGVybWluYXRvciA9IChsaW5lcy5nZXRTdGF0ZSgpID09IElOX1NUUl9DT05TVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdcIicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnXCcnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRPZkNoYXJDb25zdChsaW5lLCB0ZXJtaW5hdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGluZS5nZXROZXh0KCkgPCBsaW5lLmdldExvb2thaGVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmdldE5leHRDaGFySW5jKCkgPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zZXRDb2x1bW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmdldENvbHVtbigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlbmd0aCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmdldENvbHVtbigpICUgdGFibGVuZ3RoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmluY0NvbHVtbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBvdXRwdXQgdGhlIHN1YnN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdyaXRlci53cml0ZShsaW5lLnN1YnN0cmluZyhiZWdpbiwgbGluZS5nZXROZXh0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuc2V0U3RhdGUoTE9PS0lORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExPT0tJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlQ2hhbmdlKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdEluQ29uc3RhbnQobGluZSwgbGluZS5nZXRMb29rYWhlYWQoKSwgb3V0V3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIG9mIHN3aXRjaCAoc3RhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgb2Ygd2hpbGUgKGxpbmUuZ2V0TmV4dCgpIDwgbGluZWxlbikKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSAvLyBlbmQgb2YgZWxzZSAodGFicyAhPSBBU0lTKQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dFdyaXRlci53cml0ZShlb2xzdHIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0gLy8gZW5kIG9mIHRyeS1jYXRjaAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAvLyBlbmQgb2Ygd2hpbGUgKGxpbmVzLmhhc05leHQoKSkKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgQ1RSTFoKLSAgICAgICAgICAgICAgICBpZiAoY3RybHogPT0gQVNJUykgewotICAgICAgICAgICAgICAgICAgICBvdXRXcml0ZXIud3JpdGUobGluZXMuZ2V0RW9mU3RyKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybHogPT0gQUREKXsKLSAgICAgICAgICAgICAgICAgICAgb3V0V3JpdGVyLndyaXRlKENUUkxaKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0V3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSAvLyBlbmQgb2YgdHJ5LWNhdGNoCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyID09IG51bGwgPyBzcmNEaXIgOiBkZXN0RGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUpOwotCi0gICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbGluZXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBsaW5lcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNsb3NlIHNvdXJjZSBmaWxlICIgKyBzcmNGaWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRlc3RGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgZGVzdGluYXRpb24gd2l0aCB0aGUgdGVtcCBmaWxlCi0gICAgICAgICAgICAgICAgbG9nKCJkZXN0RmlsZSBleGlzdHMiLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgaWYgKCAhIGZpbGVzRXF1YWwoZGVzdEZpbGUsIHRtcEZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhkZXN0RmlsZSArICIgaXMgYmVpbmcgd3JpdHRlbiIsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXN0RmlsZS5kZWxldGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlc3RGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIXRtcEZpbGUucmVuYW1lVG8oZGVzdEZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gdHJhbnNmb3JtICIgKyBzcmNGaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgZGVzdEZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBDb3VsZG4ndCByZW5hbWUgdGVtcG9yYXJ5IGZpbGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0bXBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZGVzdGluYXRpb24gaXMgZXF1YWwgdG8gdGVtcCBmaWxlCi0gICAgICAgICAgICAgICAgICAgIGxvZyhkZXN0RmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCB3cml0dGVuLCBhcyB0aGUgY29udGVudHMgYXJlIGlkZW50aWNhbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdG1wRmlsZS5kZWxldGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRtcEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsgLy8gZGVzdEZpbGUgZG9lcyBub3QgZXhpc3QgLSB3cml0ZSB0aGUgdGVtcCBmaWxlCi0gICAgICAgICAgICAgICAgbG9nKCJkZXN0RmlsZSBkb2VzIG5vdCBleGlzdCIsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICBpZiAoIXRtcEZpbGUucmVuYW1lVG8oZGVzdEZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHRyYW5zZm9ybSAiICsgc3JjRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgZGVzdEZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuIENvdWxkbid0IHJlbmFtZSB0ZW1wb3JhcnkgZmlsZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG1wRmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0bXBGaWxlID0gbnVsbDsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAobGluZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaW5lcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJFcnJvciBjbG9zaW5nICIrc3JjRmlsZSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIH0gLy8gZW5kIG9mIGNhdGNoCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0bXBGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8vIGVuZCBvZiBmaW5hbGx5Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NhbiBhIEJ1ZmZlckxpbmUgZm9yIHRoZSBuZXh0IHN0YXRlIGNoYW5naW5nIHRva2VuOiB0aGUgYmVnaW5uaW5nCi0gICAgICogb2YgYSBzaW5nbGUgb3IgbXVsdGktbGluZSBjb21tZW50LCBhIGNoYXJhY3RlciBvciBhIHN0cmluZyBjb25zdGFudC4KLSAgICAgKgotICAgICAqIEFzIGEgc2lkZS1lZmZlY3QsIHNldHMgdGhlIGJ1ZmZlciBzdGF0ZSB0byB0aGUgbmV4dCBzdGF0ZSwgYW5kIHNldHMKLSAgICAgKiBmaWVsZCBsb29rYWhlYWQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3RhdGUtY2hhbmdpbmcgdG9rZW4sIG9yCi0gICAgICogdG8gdGhlIG5leHQgZW9sIGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBCdWZmZXJMaW5lIGJ1ZmxpbmUgICAgICAgQnVmZmVyTGluZSBjb250YWluaW5nIHRoZSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZAotICAgICAqIEBleGNlcHRpb24gb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93biB3aGVuIGVuZCBvZiBsaW5lIGlzIHJlYWNoZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgdGVybWluYXRvciBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbmV4dFN0YXRlQ2hhbmdlKE9uZUxpbmVyLkJ1ZmZlckxpbmUgYnVmbGluZSkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbnQgZW9sID0gYnVmbGluZS5sZW5ndGgoKTsKLSAgICAgICAgaW50IHB0ciA9IGJ1ZmxpbmUuZ2V0TmV4dCgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vICBMb29rIGZvciBuZXh0IHNpbmdsZSBvciBkb3VibGUgcXVvdGUsIGRvdWJsZSBzbGFzaCBvciBzbGFzaCBzdGFyCi0gICAgICAgIHdoaWxlIChwdHIgPCBlb2wpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYnVmbGluZS5nZXRDaGFyKHB0cisrKSkgewotICAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICAgIGJ1ZmxpbmUuc2V0U3RhdGUoSU5fQ0hBUl9DT05TVCk7Ci0gICAgICAgICAgICAgICAgYnVmbGluZS5zZXRMb29rYWhlYWQoLS1wdHIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgICAgICBidWZsaW5lLnNldFN0YXRlKElOX1NUUl9DT05TVCk7Ci0gICAgICAgICAgICAgICAgYnVmbGluZS5zZXRMb29rYWhlYWQoLS1wdHIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgJy8nOgotICAgICAgICAgICAgICAgIGlmIChwdHIgPCBlb2wpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmxpbmUuZ2V0Q2hhcihwdHIpID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmbGluZS5zZXRTdGF0ZShJTl9NVUxUSV9DT01NRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmxpbmUuc2V0TG9va2FoZWFkKC0tcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWZsaW5lLmdldENoYXIocHRyKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmxpbmUuc2V0U3RhdGUoSU5fU0lOR0xFX0NPTU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVmbGluZS5zZXRMb29rYWhlYWQoLS1wdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSAvLyBlbmQgb2Ygc3dpdGNoIChidWZsaW5lLmdldENoYXIocHRyKyspKQotICAgICAgICAgICAgCi0gICAgICAgIH0gLy8gZW5kIG9mIHdoaWxlIChwdHIgPCBlb2wpCi0gICAgICAgIC8vIEVvbCBpcyB0aGUgbmV4dCB0b2tlbgotICAgICAgICBidWZsaW5lLnNldExvb2thaGVhZChwdHIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2NhbiBhIEJ1ZmZlckxpbmUgZm9yd2FyZCBmcm9tIHRoZSAnbmV4dCcgcG9pbnRlcgotICAgICAqIGZvciB0aGUgZW5kIG9mIGEgY2hhcmFjdGVyIGNvbnN0YW50LiAgU2V0ICdsb29rYWhlYWQnIHBvaW50ZXIgdG8gdGhlCi0gICAgICogY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgdGVybWluYXRpbmcgcXVvdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gQnVmZmVyTGluZSBidWZsaW5lICAgICAgIEJ1ZmZlckxpbmUgY29udGFpbmluZyB0aGUgc3RyaW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gY2hhciB0ZXJtaW5hdG9yICAgICAgICAgIFRoZSBjb25zdGFudCB0ZXJtaW5hdG9yCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd24gd2hlbiBlbmQgb2YgbGluZSBpcyByZWFjaGVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIHRlcm1pbmF0b3IgaXMgZm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuZE9mQ2hhckNvbnN0KE9uZUxpbmVyLkJ1ZmZlckxpbmUgYnVmbGluZSwgY2hhciB0ZXJtaW5hdG9yKQotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBwdHIgPSBidWZsaW5lLmdldE5leHQoKTsKLSAgICAgICAgaW50IGVvbCA9IGJ1ZmxpbmUubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXIgYzsKLSAgICAgICAgcHRyKys7ICAgICAgICAgIC8vIHNraXAgcGFzdCBpbml0aWFsIHF1b3RlCi0gICAgICAgIHdoaWxlIChwdHIgPCBlb2wpIHsKLSAgICAgICAgICAgIGlmICgoYyA9IGJ1ZmxpbmUuZ2V0Q2hhcihwdHIrKykpID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjID09IHRlcm1pbmF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmbGluZS5zZXRMb29rYWhlYWQocHRyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvLyBlbmQgb2Ygd2hpbGUgKHB0ciA8IGVvbCkKLSAgICAgICAgLy8gTXVzdCBoYXZlIGZhbGxlbiB0aHJvdWdoIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUKLSAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJlbmRPZkNoYXJDb25zdDogdW50ZXJtaW5hdGVkIGNoYXIgY29uc3RhbnQiKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBCdWZmZXJMaW5lIHN0cmluZyB3aGljaCBpcyBub3QgcGFydCBvZiBvZiBhIHN0cmluZyBjb25zdGFudC4KLSAgICAgKiBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHN0cmluZyBpcyBnaXZlbiBieSB0aGUgJ25leHQnIGZpZWxkLgotICAgICAqIFNldHMgdGhlICduZXh0JyBhbmQgJ2NvbHVtbicgZmllbGRzIGluIHRoZSBCdWZmZXJMaW5lLgotICAgICAqCi0gICAgICogQHBhcmFtIEJ1ZmZlckxpbmUgYnVmbGluZSAgICAgICBCdWZmZXJMaW5lIGNvbnRhaW5pbmcgdGhlIHN0cmluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICogQHBhcmFtIGludCBlbmQgICAgICAgICAgICAgICAgICBJbmRleCBqdXN0IHBhc3QgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZwotICAgICAqIEBwYXJhbSBCdWZmZXJlZFdyaXRlciBvdXRXcml0ZXIgU2luayBmb3IgdGhlIHByb2Nlc3NlZCBzdHJpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbm90SW5Db25zdGFudChPbmVMaW5lci5CdWZmZXJMaW5lIGJ1ZmxpbmUsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dFdyaXRlcikKLSAgICB7Ci0gICAgICAgIC8vIE4uQi4gYm90aCBjb2x1bW4gYW5kIHN0cmluZyBpbmRleCBhcmUgemVyby1iYXNlZAotICAgICAgICAvLyBQcm9jZXNzIGEgc3RyaW5nIG5vdCBwYXJ0IG9mIGEgY29uc3RhbnQ7Ci0gICAgICAgIC8vIGkuZS4gY29udmVydCB0YWJzPC0+c3BhY2VzIGFzIHJlcXVpcmVkCi0gICAgICAgIC8vIFRoaXMgaXMgTk9UIGNhbGxlZCBmb3IgQVNJUyB0YWIgaGFuZGxpbmcKLSAgICAgICAgaW50IG5leHRUYWI7Ci0gICAgICAgIGludCBuZXh0U3RvcDsKLSAgICAgICAgaW50IHRhYnNwYWNlczsKLSAgICAgICAgU3RyaW5nIGxpbmUgPSBidWZsaW5lLnN1YnN0cmluZyhidWZsaW5lLmdldE5leHQoKSwgZW5kKTsKLSAgICAgICAgaW50IHBsYWNlID0gMDsgICAgICAgICAgLy8gWmVyby1iYXNlZAotICAgICAgICBpbnQgY29sID0gYnVmbGluZS5nZXRDb2x1bW4oKTsgIC8vIFplcm8tYmFzZWQKLQotICAgICAgICAvLyBwcm9jZXNzIHNlcXVlbmNlcyBvZiB3aGl0ZSBzcGFjZQotICAgICAgICAvLyBmaXJzdCBjb252ZXJ0IGFsbCB0YWJzIHRvIHNwYWNlcwotICAgICAgICBsaW5lYnVmLnNldExlbmd0aCgwKTsKLSAgICAgICAgd2hpbGUgKChuZXh0VGFiID0gbGluZS5pbmRleE9mKChpbnQpICdcdCcsIHBsYWNlKSkgPj0gMCkgewotICAgICAgICAgICAgbGluZWJ1Zi5hcHBlbmQobGluZS5zdWJzdHJpbmcocGxhY2UsIG5leHRUYWIpKTsgLy8gY29weSB0byB0aGUgVEFCCi0gICAgICAgICAgICBjb2wgKz0gbmV4dFRhYiAtIHBsYWNlOwotICAgICAgICAgICAgdGFic3BhY2VzID0gdGFibGVuZ3RoIC0gKGNvbCAlIHRhYmxlbmd0aCk7Ci0gICAgICAgICAgICBsaW5lYnVmLmFwcGVuZChzcGFjZXMuc3Vic3RyaW5nKDAsIHRhYnNwYWNlcykpOwotICAgICAgICAgICAgY29sICs9IHRhYnNwYWNlczsKLSAgICAgICAgICAgIHBsYWNlID0gbmV4dFRhYiArIDE7Ci0gICAgICAgIH0gLy8gZW5kIG9mIHdoaWxlCi0gICAgICAgIGxpbmVidWYuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKHBsYWNlLCBsaW5lLmxlbmd0aCgpKSk7Ci0gICAgICAgIC8vIGlmIGNvbnZlcnRpbmcgdG8gc3BhY2VzLCBhbGwgZmluaXNoZWQKLSAgICAgICAgU3RyaW5nIGxpbmVzdHJpbmcgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmICh0YWJzID09IFJFTU9WRSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRXcml0ZXIud3JpdGUobGluZXN0cmluZyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSAvLyBlbmQgb2YgdHJ5LWNhdGNoCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7IC8vIHRhYnMgPT0gQURECi0gICAgICAgICAgICBpbnQgdGFiQ29sOwotICAgICAgICAgICAgbGluZWJ1ZjIuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgcGxhY2UgPSAwOwotICAgICAgICAgICAgY29sID0gYnVmbGluZS5nZXRDb2x1bW4oKTsKLSAgICAgICAgICAgIGludCBwbGFjZWRpZmYgPSBjb2wgLSAwOwotICAgICAgICAgICAgLy8gZm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgY3ljbGUgdGhyb3VnaCB0aGUgdGFiIHN0b3AKLSAgICAgICAgICAgIC8vIHBvc2l0aW9ucywgY2hlY2tpbmcgZm9yIGEgc3BhY2UgcHJlY2VkZWQgYnkgYXQgbGVhc3Qgb25lCi0gICAgICAgICAgICAvLyBvdGhlciBzcGFjZSBhdCB0aGUgdGFiIHN0b3AuICBpZiBzbyByZXBsYWNlIHRoZSBsb25nZXN0IHBvc3NpYmxlCi0gICAgICAgICAgICAvLyBwcmVjZWRpbmcgc2VxdWVuY2Ugb2Ygc3BhY2VzIHdpdGggYSB0YWIuCi0gICAgICAgICAgICBuZXh0U3RvcCA9IGNvbCArICh0YWJsZW5ndGggLSBjb2wgJSB0YWJsZW5ndGgpOwotICAgICAgICAgICAgaWYgKG5leHRTdG9wIC0gY29sIDwgMikgewotICAgICAgICAgICAgICAgIGxpbmVidWYyLmFwcGVuZChsaW5lc3RyaW5nLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSwgbmV4dFN0b3AgLSBwbGFjZWRpZmYpKTsKLSAgICAgICAgICAgICAgICBwbGFjZSA9IG5leHRTdG9wIC0gcGxhY2VkaWZmOwotICAgICAgICAgICAgICAgIG5leHRTdG9wICs9IHRhYmxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICggOyBuZXh0U3RvcCAtIHBsYWNlZGlmZiA8PSBsaW5lc3RyaW5nLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDsgbmV4dFN0b3AgKz0gdGFibGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAodGFiQ29sID0gbmV4dFN0b3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tdGFiQ29sIC0gcGxhY2VkaWZmID49IHBsYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxpbmVzdHJpbmcuY2hhckF0KHRhYkNvbCAtIHBsYWNlZGlmZikgPT0gJyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICA7IC8vIExvb3AgZm9yIHRoZSBzaWRlLWVmZmVjdHMKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gdGFiQ29sIGlzIGNvbHVtbiBpbmRleCBvZiB0aGUgbGFzdCBub24tc3BhY2UgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBuZXh0IHRhYiBzdG9wCi0gICAgICAgICAgICAgICAgaWYgKG5leHRTdG9wIC0gdGFiQ29sID4gMikgewotICAgICAgICAgICAgICAgICAgICBsaW5lYnVmMi5hcHBlbmQobGluZXN0cmluZy5zdWJzdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSwgKyt0YWJDb2wgLSBwbGFjZWRpZmYpKTsKLSAgICAgICAgICAgICAgICAgICAgbGluZWJ1ZjIuYXBwZW5kKCdcdCcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWJ1ZjIuYXBwZW5kKGxpbmVzdHJpbmcuc3Vic3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UsIG5leHRTdG9wIC0gcGxhY2VkaWZmKSk7Ci0gICAgICAgICAgICAgICAgfSAvLyBlbmQgb2YgZWxzZQotCi0gICAgICAgICAgICAgICAgcGxhY2UgPSBuZXh0U3RvcCAtIHBsYWNlZGlmZjsKLSAgICAgICAgICAgIH0gLy8gZW5kIG9mIGZvciAobmV4dFN0b3AgLi4uICkKLQotICAgICAgICAgICAgLy8gcGljayB1cCB0aGF0IGxhc3QgYml0LCBpZiBhbnkKLSAgICAgICAgICAgIGxpbmVidWYyLmFwcGVuZChsaW5lc3RyaW5nLnN1YnN0cmluZyhwbGFjZSwgbGluZXN0cmluZy5sZW5ndGgoKSkpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dFdyaXRlci53cml0ZShsaW5lYnVmMi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IC8vIGVuZCBvZiB0cnktY2F0Y2gKLSAgICAgICAgICAgIAotICAgICAgICB9IC8vIGVuZCBvZiBlbHNlIHRhYnMgPT0gQURECi0KLSAgICAgICAgLy8gU2V0IGNvbHVtbiBwb3NpdGlvbiBhcyBtb2RpZmllZCBieSB0aGlzIG1ldGhvZAotICAgICAgICBidWZsaW5lLnNldENvbHVtbihidWZsaW5lLmdldENvbHVtbigpICsgbGluZXN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgIGJ1ZmxpbmUuc2V0TmV4dChlbmQpOwotCi0gICAgfQotCi0KLSAgICBjbGFzcyBPbmVMaW5lciBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotICAgICAgICBwcml2YXRlIGludCBzdGF0ZSA9IGphdmFmaWxlcyA/IExPT0tJTkcgOiBOT1RKQVZBOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGVvbFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoTElORUJVRkxFTik7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGVvZlN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGluZTsKLQotICAgICAgICBwdWJsaWMgT25lTGluZXIoRmlsZSBzcmNGaWxlKQotICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGVSZWFkZXIoc3JjRmlsZSksIElOQlVGTEVOKTsKLSAgICAgICAgICAgICAgICBuZXh0TGluZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG5leHRMaW5lKCkKLSAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgY2g7Ci0gICAgICAgICAgICBpbnQgZW9sY291bnQgPSAwOwotCi0gICAgICAgICAgICBlb2xTdHIuc2V0TGVuZ3RoKDApOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludCBsaW5lbGVuOwotCi0gICAgICAgICAgICAgICAgcmVhZGVyLm1hcmsoSU5CVUZMRU4pOwotICAgICAgICAgICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVvZiBoYXMgYmVlbiByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWxlbiA9IGxpbmUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIEVPTCBjaGFyYWN0ZXIocykKLQotICAgICAgICAgICAgICAgIHJlYWRlci5yZXNldCgpOwotCi0gICAgICAgICAgICAgICAgLy8gYW4gSU9FeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KLSAgICAgICAgICAgICAgICByZWFkZXIuc2tpcCgobG9uZylsaW5lbGVuKTsKLSAgICAgICAgICAgICAgICByZWFkZXIubWFyayhJTkJVRkxFTik7Ci0gICAgICAgICAgICAgICAgY2ggPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoKGNoYXIpIGNoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgXHIsIFxyXG4gYW5kIFxyXHJcbgotICAgICAgICAgICAgICAgICAgICAvLyBSZWdhcmQgXHJcciBub3QgZm9sbG93ZWQgYnkgXG4gYXMgdHdvIGxpbmVzCi0gICAgICAgICAgICAgICAgICAgICsrZW9sY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGVvbFN0ci5hcHBlbmQoJ1xyJyk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKGNoYXIpKGNoID0gcmVhZGVyLnJlYWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjaGFyKShjaCA9IHJlYWRlci5yZWFkKCkpID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2xjb3VudCArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvbFN0ci5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2VvbGNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgZW9sU3RyLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBvZiBzd2l0Y2ggKChjaGFyKShjaCA9IHJlYWRlci5yZWFkKCkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgICAgICArK2VvbGNvdW50OwotICAgICAgICAgICAgICAgICAgICBlb2xTdHIuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSAvLyBlbmQgb2Ygc3dpdGNoICgoY2hhcikgY2gpCi0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpbGUgcmVhZGVyCi0gICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLnNraXAoKGxvbmcpZW9sY291bnQpOwotCi0gICAgICAgICAgICAgICAgLy8gaWYgYXQgZW9sY291bnQgPT0gMCBhbmQgdHJhaWxpbmcgY2hhcmFjdGVycyBvZiBzdHJpbmcKLSAgICAgICAgICAgICAgICAvLyBhcmUgQ1RSTC1acywgc2V0IGVvZlN0cgotICAgICAgICAgICAgICAgIGlmIChsaW5lICE9IG51bGwgJiYgZW9sY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IGxpbmVsZW47Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCAmJiBsaW5lLmNoYXJBdChpKSA9PSBDVFJMWikge30KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsaW5lbGVuIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhaWxpbmcgY2hhcmFjdGVycyBhcmUgXlpzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgbmV3IGxpbmUgYW5kIGVvZlN0cgotICAgICAgICAgICAgICAgICAgICAgICAgZW9mU3RyLmFwcGVuZChsaW5lLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGkgPCAwID8gbnVsbCA6IGxpbmUuc3Vic3RyaW5nKDAsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IC8vIGVuZCBvZiBpZiAoZW9sY291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVvZlN0cigpIHsKLSAgICAgICAgICAgIHJldHVybiBlb2ZTdHIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaW5lICE9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkKLSAgICAgICAgICAgIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghIGhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk9uZUxpbmVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdWZmZXJMaW5lIHRtcExpbmUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyTGluZShsaW5lLCBlb2xTdHIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBuZXh0TGluZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRtcExpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIEJ1ZmZlckxpbmUgewotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbmV4dCA9IDA7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBjb2x1bW4gPSAwOwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbG9va2FoZWFkID0gVU5ERUY7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZW9sU3RyOwotICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyBCdWZmZXJMaW5lKFN0cmluZyBsaW5lLCBTdHJpbmcgZW9sU3RyKQotICAgICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5leHQgPSAwOwotICAgICAgICAgICAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICAgICAgICAgICAgdGhpcy5saW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICB0aGlzLmVvbFN0ciA9IGVvbFN0cjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXROZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0KGludCBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRMb29rYWhlYWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvb2thaGVhZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TG9va2FoZWFkKGludCBsb29rYWhlYWQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvb2thaGVhZCA9IGxvb2thaGVhZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgaSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLmNoYXJBdChpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGNoYXIgZ2V0TmV4dENoYXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENoYXIobmV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBjaGFyIGdldE5leHRDaGFySW5jKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGFyKG5leHQrKyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbihpbnQgY29sKSB7Ci0gICAgICAgICAgICAgICAgY29sdW1uID0gY29sOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGluY0NvbHVtbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldEVvbExlbmd0aCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW9sU3RyLmxlbmd0aCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExpbmVTdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW9sKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlb2xTdHI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RyaW5nKGludCBiZWdpbikgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLnN1YnN0cmluZyhiZWdpbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RyaW5nKGludCBiZWdpbiwgaW50IGVuZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLnN1YnN0cmluZyhiZWdpbiwgZW5kKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgT25lTGluZXIudGhpcy5zZXRTdGF0ZShzdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9uZUxpbmVyLnRoaXMuZ2V0U3RhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVudW1lcmF0ZWQgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlcyAiYXNpcyIsICJhZGQiIGFuZCAicmVtb3ZlIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFkZEFzaXNSZW1vdmUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJhZGQiLCAiYXNpcyIsICJyZW1vdmUifTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVudW1lcmF0ZWQgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlcyAiYXNpcyIsICJjciIsICJsZiIgYW5kICJjcmxmIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENyTGYgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJhc2lzIiwgImNyIiwgImxmIiwgImNybGYifTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1VuemlwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMzRkYy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLS8qKgotICogRXhwYW5kcyBhIGZpbGUgdGhhdCBoYXMgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlIEdaSVAKLSAqIGFsZ29yaWdodG0uIE5vcm1hbGx5IHVzZWQgdG8gY29tcHJlc3Mgbm9uLWNvbXByZXNzZWQgYXJjaGl2ZXMgc3VjaAotICogYXMgVEFSIGZpbGVzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgR1VuemlwIGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcml2YXRlIEZpbGUgc291cmNlOwotICAgIHByaXZhdGUgRmlsZSBkZXN0OwotCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKLSAgICAgICAgc291cmNlID0gcHJvamVjdC5yZXNvbHZlRmlsZShzcmMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc3QoU3RyaW5nIGRlc3QpIHsKLSAgICAgICAgdGhpcy5kZXN0ID0gcHJvamVjdC5yZXNvbHZlRmlsZShkZXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHNvdXJjZSBmb3IgZ3VuemlwIHNwZWNpZmllZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNvdXJjZSBkb2Vzbid0IGV4aXN0IiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBleHBhbmQgYSBkaXJlY3RvcnkiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXN0ID0gbmV3IEZpbGUoc291cmNlLmdldFBhcmVudCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBzb3VyY2VOYW1lID0gc291cmNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSBzb3VyY2VOYW1lLmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbiA+IDMKLSAgICAgICAgICAgICAgICAmJiAiLmd6Ii5lcXVhbHNJZ25vcmVDYXNlKHNvdXJjZU5hbWUuc3Vic3RyaW5nKGxlbi0zKSkpIHsKLSAgICAgICAgICAgICAgICBkZXN0ID0gbmV3IEZpbGUoZGVzdCwgc291cmNlTmFtZS5zdWJzdHJpbmcoMCwgbGVuLTMpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzdCA9IG5ldyBGaWxlKGRlc3QsIHNvdXJjZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5sYXN0TW9kaWZpZWQoKSA+IGRlc3QubGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgIGxvZygiRXhwYW5kaW5nICIrIHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXN0LmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICAgICAgR1pJUElucHV0U3RyZWFtIHpJbiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3QpOwotICAgICAgICAgICAgICAgIHpJbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpKTsKLSAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbOCAqIDEwMjRdOwotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gekluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAtMSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gZXhwYW5kaW5nIGd6aXAgIiArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHt9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh6SW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgekluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHt9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1ppcC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1ppcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzBkZmNjLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0daaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLS8qKgotICogQ29tcHJlc3NlcyBhIGZpbGUgd2l0aCB0aGUgR1pJUCBhbGdvcmlnaHRtLiBOb3JtYWxseSB1c2VkIHRvIGNvbXByZXNzCi0gKiBub24tY29tcHJlc3NlZCBhcmNoaXZlcyBzdWNoIGFzIFRBUiBmaWxlcy4KLSAqCi0gKiBAYXV0aG9yIEphbWVzIERhdmlkc29uIDxhIGhyZWY9Im1haWx0bzpkdW5jYW5AeDE4MC5jb20iPmR1bmNhbkB4MTgwLmNvbTwvYT4KLSAqIEBhdXRob3IgSm9uIFMuIFN0ZXZlbnMgPGEgaHJlZj0ibWFpbHRvOmpvbkBjbGVhcmluay5jb20iPmpvbkBjbGVhcmluay5jb208L2E+Ci0gKi8KLSAKLXB1YmxpYyBjbGFzcyBHWmlwIGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcml2YXRlIEZpbGUgemlwRmlsZTsKLSAgICBwcml2YXRlIEZpbGUgc291cmNlOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFppcGZpbGUoRmlsZSB6aXBGaWxlbmFtZSkgewotICAgICAgICB6aXBGaWxlID0gemlwRmlsZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgc3JjKSB7Ci0gICAgICAgIHNvdXJjZSA9IHNyYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHppcEZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ6aXBmaWxlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nKCJCdWlsZGluZyBnemlwOiAiICsgemlwRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgCi0gICAgICAgIEdaSVBPdXRwdXRTdHJlYW0gek91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB6T3V0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oemlwRmlsZSkpOwotICAgICAgICAKLSAgICAgICAgICAgIGlmIChzb3VyY2UuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGxvZyAoIkNhbm5vdCBHemlwIGEgZGlyZWN0b3J5ISIsIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHppcEZpbGUoc291cmNlLCB6T3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gY3JlYXRpbmcgZ3ppcCAiICsgaW9lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSwgbG9jYXRpb24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHpPdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVwCi0gICAgICAgICAgICAgICAgICAgIHpPdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHppcEZpbGUoSW5wdXRTdHJlYW0gaW4sIEdaSVBPdXRwdXRTdHJlYW0gek91dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgeyAgICAgICAgCi0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4ICogMTAyNF07Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHpPdXQud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICBjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLSAgICAgICAgfSB3aGlsZSAoY291bnQgIT0gLTEpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgemlwRmlsZShGaWxlIGZpbGUsIEdaSVBPdXRwdXRTdHJlYW0gek91dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZkluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHppcEZpbGUoZkluLCB6T3V0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGZJbi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2VuZXJhdGVLZXkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dlbmVyYXRlS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjA4MjAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2VuZXJhdGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci0KLS8qKgotICogR2VuZXJhdGVzIGEga2V5LgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlS2V5IGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERuYW1lUGFyYW0gewotICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpc3Rpbmd1aXNoZWROYW1lIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgVmVjdG9yIHBhcmFtcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlUGFyYW0oKSB7Ci0gICAgICAgICAgICBEbmFtZVBhcmFtIHBhcmFtID0gbmV3IERuYW1lUGFyYW0oKTsKLSAgICAgICAgICAgIHBhcmFtcy5hZGRFbGVtZW50KHBhcmFtKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1zKCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy5lbGVtZW50cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gcGFyYW1zLnNpemUoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RQYXNzID0gdHJ1ZTsKLQotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBzaXplOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgaWYoICFmaXJzdFBhc3MgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlyc3RQYXNzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBEbmFtZVBhcmFtIHBhcmFtID0gKERuYW1lUGFyYW0pcGFyYW1zLmVsZW1lbnRBdCggaSApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggZW5jb2RlKCBwYXJhbS5nZXROYW1lKCkgKSApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJz0nICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBlbmNvZGUoIHBhcmFtLmdldFZhbHVlKCkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlKCBmaW5hbCBTdHJpbmcgc3RyaW5nICkgewotICAgICAgICAgICAgaW50IGVuZCA9IHN0cmluZy5pbmRleE9mKCcsJyk7Ci0KLSAgICAgICAgICAgIGlmKCAtMSA9PSBlbmQgKSByZXR1cm4gc3RyaW5nOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUoIC0xICE9IGVuZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBzdHJpbmcuc3Vic3RyaW5nKCBzdGFydCwgZW5kICkgKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJcXCwiICk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwotICAgICAgICAgICAgICAgIGVuZCA9IHN0cmluZy5pbmRleE9mKCAnLCcsIHN0YXJ0ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggc3RyaW5nLnN1YnN0cmluZyggc3RhcnQgKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7ICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGFsaWFzIG9mIHNpZ25lci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsaWFzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2Yga2V5c3RvcmUgZmlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleXN0b3JlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcmVwYXNzOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcmV0eXBlOwotICAgIHByb3RlY3RlZCBTdHJpbmcga2V5cGFzczsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgc2lnYWxnOwotICAgIHByb3RlY3RlZCBTdHJpbmcga2V5YWxnOwotICAgIHByb3RlY3RlZCBTdHJpbmcgZG5hbWU7Ci0gICAgcHJvdGVjdGVkIERpc3Rpbmd1aXNoZWROYW1lIGV4cGFuZGVkRG5hbWU7Ci0gICAgcHJvdGVjdGVkIGludCBrZXlzaXplOwotICAgIHByb3RlY3RlZCBpbnQgdmFsaWRpdHk7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZTsKLQotICAgIHB1YmxpYyBEaXN0aW5ndWlzaGVkTmFtZSBjcmVhdGVEbmFtZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKCBudWxsICE9IGV4cGFuZGVkRG5hbWUgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJETmFtZSBzdWItZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgb25jZS4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIG51bGwgIT0gZG5hbWUgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJJdCBpcyBub3QgcG9zc2libGUgdG8gc3BlY2lmeSBkbmFtZSBib3RoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXMgYXR0cmlidXRlIGFuZCBlbGVtZW50LiIgKTsKLSAgICAgICAgfQotICAgICAgICBleHBhbmRlZERuYW1lID0gbmV3IERpc3Rpbmd1aXNoZWROYW1lKCk7Ci0gICAgICAgIHJldHVybiBleHBhbmRlZERuYW1lOwotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgc2V0RG5hbWUoZmluYWwgU3RyaW5nIGRuYW1lKSB7Ci0gICAgICAgIGlmKCBudWxsICE9IGV4cGFuZGVkRG5hbWUgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJJdCBpcyBub3QgcG9zc2libGUgdG8gc3BlY2lmeSBkbmFtZSBib3RoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXMgYXR0cmlidXRlIGFuZCBlbGVtZW50LiIgKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmRuYW1lID0gZG5hbWU7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHNldEFsaWFzKGZpbmFsIFN0cmluZyBhbGlhcykgewotICAgICAgICB0aGlzLmFsaWFzID0gYWxpYXM7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHNldEtleXN0b3JlKGZpbmFsIFN0cmluZyBrZXlzdG9yZSkgewotICAgICAgICB0aGlzLmtleXN0b3JlID0ga2V5c3RvcmU7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlcGFzcyhmaW5hbCBTdHJpbmcgc3RvcmVwYXNzKSB7Ci0gICAgICAgIHRoaXMuc3RvcmVwYXNzID0gc3RvcmVwYXNzOwotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdG9yZXR5cGUoZmluYWwgU3RyaW5nIHN0b3JldHlwZSkgewotICAgICAgICB0aGlzLnN0b3JldHlwZSA9IHN0b3JldHlwZTsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5cGFzcyhmaW5hbCBTdHJpbmcga2V5cGFzcykgewotICAgICAgICB0aGlzLmtleXBhc3MgPSBrZXlwYXNzOwotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaWdhbGcoZmluYWwgU3RyaW5nIHNpZ2FsZykgewotICAgICAgICB0aGlzLnNpZ2FsZyA9IHNpZ2FsZzsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5YWxnKGZpbmFsIFN0cmluZyBrZXlhbGcpIHsKLSAgICAgICAgdGhpcy5rZXlhbGcgPSBrZXlhbGc7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHNldEtleXNpemUoZmluYWwgU3RyaW5nIGtleXNpemUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7IHRoaXMua2V5c2l6ZSA9IEludGVnZXIucGFyc2VJbnQoa2V5c2l6ZSk7IH0KLSAgICAgICAgY2F0Y2goZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIktleVNpemUgYXR0cmlidXRlIHNob3VsZCBiZSBhIGludGVnZXIiICk7Ci0gICAgICAgIH0KLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRpdHkoZmluYWwgU3RyaW5nIHZhbGlkaXR5KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgeyB0aGlzLnZhbGlkaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWxpZGl0eSk7IH0KLSAgICAgICAgY2F0Y2goZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIlZhbGlkaXR5IGF0dHJpYnV0ZSBzaG91bGQgYmUgYSBpbnRlZ2VyIiApOwotICAgICAgICB9Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoZmluYWwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAocHJvamVjdC5nZXRKYXZhVmVyc2lvbigpLmVxdWFscyhQcm9qZWN0LkpBVkFfMV8xKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiVGhlIGdlbmtleSB0YXNrIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEpESyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZlcnNpb25zIDEuMiBvciBncmVhdGVyIiApOwotICAgICAgICB9IAotCi0gICAgICAgIGlmIChudWxsID09IGFsaWFzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJhbGlhcyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiICk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKG51bGwgPT0gc3RvcmVwYXNzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJzdG9yZXBhc3MgYXR0cmlidXRlIG11c3QgYmUgc2V0IiApOwotICAgICAgICB9IAotCi0gICAgICAgIGlmIChudWxsID09IGRuYW1lICYmIG51bGwgPT0gZXhwYW5kZWREbmFtZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiZG5hbWUgbXVzdCBiZSBzZXQiICk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIHNiLmFwcGVuZCgia2V5dG9vbCAtZ2Vua2V5ICIpOwotCi0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi12ICIpOwotICAgICAgICB9IAotCi0gICAgICAgIHNiLmFwcGVuZCgiLWFsaWFzIFwiIik7Ci0gICAgICAgIHNiLmFwcGVuZChhbGlhcyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiXCIgIik7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gZG5hbWUpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLWRuYW1lIFwiIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZG5hbWUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAobnVsbCAhPSBleHBhbmRlZERuYW1lKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi1kbmFtZSBcIiIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGV4cGFuZGVkRG5hbWUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAobnVsbCAhPSBrZXlzdG9yZSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIta2V5c3RvcmUgXCIiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChrZXlzdG9yZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlwiICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gc3RvcmVwYXNzKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi1zdG9yZXBhc3MgXCIiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzdG9yZXBhc3MpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAobnVsbCAhPSBzdG9yZXR5cGUpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLXN0b3JldHlwZSBcIiIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHN0b3JldHlwZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlwiICIpOwotICAgICAgICB9IAotCi0gICAgICAgIHNiLmFwcGVuZCgiLWtleXBhc3MgXCIiKTsKLSAgICAgICAgaWYgKG51bGwgIT0ga2V5cGFzcykgewotICAgICAgICAgICAgc2IuYXBwZW5kKGtleXBhc3MpOwotICAgICAgICB9IAotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzdG9yZXBhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZCgiXCIgIik7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gc2lnYWxnKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi1zaWdhbGcgXCIiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzaWdhbGcpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAobnVsbCAhPSBrZXlhbGcpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLWtleWFsZyBcIiIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGtleWFsZyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlwiICIpOwotICAgICAgICB9IAotCi0KLSAgICAgICAgaWYgKDAgPCBrZXlzaXplKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi1rZXlzaXplIFwiIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoa2V5c2l6ZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlwiICIpOwotICAgICAgICB9IAotCi0gICAgICAgIGlmICgwIDwgdmFsaWRpdHkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLXZhbGlkaXR5IFwiIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQodmFsaWRpdHkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBsb2coIkdlbmVyYXRpbmcgS2V5IGZvciAiICsgYWxpYXMgKTsKLSAgICAgICAgZmluYWwgRXhlY1Rhc2sgY21kID0gKEV4ZWNUYXNrKSBwcm9qZWN0LmNyZWF0ZVRhc2soImV4ZWMiKTsKLSAgICAgICAgY21kLnNldENvbW1hbmQobmV3IENvbW1hbmRsaW5lKHNiLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgY21kLnNldEZhaWxvbmVycm9yKHRydWUpOwotICAgICAgICBjbWQuc2V0VGFza05hbWUoIGdldFRhc2tOYW1lKCkgKTsKLSAgICAgICAgY21kLmV4ZWN1dGUoKTsKLSAgICB9IAotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE0MGFjLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi0vKioKLSAqIEdldCBhIHBhcnRpY3VsYXIgZmlsZSBmcm9tIGEgVVJMIHNvdXJjZS4gCi0gKiBPcHRpb25zIGluY2x1ZGUgdmVyYm9zZSByZXBvcnRpbmcsIHRpbWVzdGFtcCBiYXNlZCBmZXRjaGVzIGFuZCBjb250cm9sbGluZyAKLSAqIGFjdGlvbnMgb24gZmFpbHVyZXMuIE5COiBhY2Nlc3MgdGhyb3VnaCBhIGZpcmV3YWxsIG9ubHkgd29ya3MgaWYgdGhlIHdob2xlIAotICogSmF2YSBydW50aW1lIGlzIGNvcnJlY3RseSBjb25maWd1cmVkLgotICoKLSAqIEBhdXRob3IgY29zdGluQGRudC5ybwotICovCi1wdWJsaWMgY2xhc3MgR2V0IGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBVUkwgc291cmNlOyAvLyByZXF1aXJlZAotICAgIHByaXZhdGUgRmlsZSBkZXN0OyAvLyByZXF1aXJlZAotICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHVzZVRpbWVzdGFtcCA9IGZhbHNlOyAvL29mZiBieSBkZWZhdWx0Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZUVycm9ycyA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIERvZXMgdGhlIHdvcmsuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIFRocm93biBpbiB1bnJlY292ZXJhYmxlIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzdCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVzdC5leGlzdHMoKSAmJiBkZXN0LmlzRGlyZWN0b3J5KCkpIHsgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0LmV4aXN0cygpICYmICFkZXN0LmNhbldyaXRlKCkpIHsgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IHdyaXRlIHRvICIgKyBkZXN0LmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGxvZygiR2V0dGluZzogIiArIHNvdXJjZSk7Ci0KLSAgICAgICAgICAgIC8vc2V0IHRoZSB0aW1lc3RhbXAgdG8gdGhlIGZpbGUgZGF0ZS4KLSAgICAgICAgICAgIGxvbmcgdGltZXN0YW1wPTA7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGltZXN0YW1wPWZhbHNlOwotICAgICAgICAgICAgaWYodXNlVGltZXN0YW1wICYmIGRlc3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXA9ZGVzdC5sYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgIHsKLSAgICAgICAgICAgICAgICAgICAgRGF0ZSB0PW5ldyBEYXRlKHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygibG9jYWwgZmlsZSBkYXRlIDogIit0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBoYXNUaW1lc3RhbXA9dHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICAvL3NldCB1cCB0aGUgVVJMIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbj1zb3VyY2Uub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIC8vbW9kaWZ5IHRoZSBoZWFkZXJzCi0gICAgICAgICAgICAvL05COiB0aGluZ3MgbGlrZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGNvdWxkIGdvIGluIGhlcmUgdG9vLgotICAgICAgICAgICAgaWYodXNlVGltZXN0YW1wICYmIGhhc1RpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0SWZNb2RpZmllZFNpbmNlKHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vY29ubmVjdCB0byB0aGUgcmVtb3RlIHNpdGUgKG1heSB0YWtlIHNvbWUgdGltZSkKLSAgICAgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOwotICAgICAgICAgICAgLy9uZXh0IHRlc3QgZm9yIGEgMzA0IHJlc3VsdCAoSFRUUCBvbmx5KQotICAgICAgICAgICAgaWYoY29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKSAgewotICAgICAgICAgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGh0dHBDb25uZWN0aW9uPShIdHRwVVJMQ29ubmVjdGlvbiljb25uZWN0aW9uOwotICAgICAgICAgICAgICAgIGlmKGh0dHBDb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpPT1IdHRwVVJMQ29ubmVjdGlvbi5IVFRQX05PVF9NT0RJRklFRCkgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9ub3QgbW9kaWZpZWQgc28gbm8gZmlsZSBkb3dubG9hZC4ganVzdCByZXR1cm4gaW5zdGVhZAotICAgICAgICAgICAgICAgICAgICAvL2FuZCB0cmFjZSBvdXQgc29tZXRoaW5nIHNvIHRoZSB1c2VyIGRvZXNuJ3QgdGhpbmsgdGhhdCB0aGUgCi0gICAgICAgICAgICAgICAgICAgIC8vZG93bmxvYWQgaGFwcGVuZWQgd2hlbiBpdCBkaWRudAotICAgICAgICAgICAgICAgICAgICBsb2coIk5vdCBtb2RpZmllZCAtIHNvIG5vdCBkb3dubG9hZGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL1JFVklTSVQ6IGF0IHRoaXMgcG9pbnQgZXZlbiBub24gSFRUUCBjb25uZWN0aW9ucyBtYXkgc3VwcG9ydCB0aGUgaWYtbW9kaWZpZWQtc2luY2UKLSAgICAgICAgICAgIC8vYmVoYXZpb3VyIC13ZSBqdXN0IGNoZWNrIHRoZSBkYXRlIG9mIHRoZSBjb250ZW50IGFuZCBza2lwIHRoZSB3cml0ZSBpZiBpdCBpcyBub3QKLSAgICAgICAgICAgIC8vbmV3ZXIuIFNvbWUgcHJvdG9jb2xzIChGVFApIGRvbnQgaW5jbHVkZSBkYXRlcywgb2YgY291cnNlLiAKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzPW51bGw7Ci0gICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8IDMgOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goIElPRXhjZXB0aW9uIGV4ICkgewotICAgICAgICAgICAgICAgICAgICBsb2coICJFcnJvciBvcGVuaW5nIGNvbm5lY3Rpb24gIiArIGV4ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIGlzPT1udWxsICkgewotICAgICAgICAgICAgICAgIGxvZyggIkNhbid0IGdldCAiICsgc291cmNlICsgIiB0byAiICsgZGVzdCk7Ci0gICAgICAgICAgICAgICAgaWYoaWdub3JlRXJyb3JzKSAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIkNhbid0IGdldCAiICsgc291cmNlICsgIiB0byAiICsgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDAgKiAxMDI0XTsKLSAgICAgICAgICAgIGludCBsZW5ndGg7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gaXMucmVhZChidWZmZXIpKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludCgiLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICBmb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgLy9pZiAoYW5kIG9ubHkgaWYpIHRoZSB1c2UgZmlsZSB0aW1lIG9wdGlvbiBpcyBzZXQsIHRoZW4gdGhlIAotICAgICAgICAgICAgLy9zYXZlZCBmaWxlIG5vdyBoYXMgaXRzIHRpbWVzdGFtcCBzZXQgdG8gdGhhdCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlCi0gICAgICAgICAgICBpZih1c2VUaW1lc3RhbXApICB7Ci0gICAgICAgICAgICAgICAgbG9uZyByZW1vdGVUaW1lc3RhbXA9Y29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgIHsKLSAgICAgICAgICAgICAgICAgICAgRGF0ZSB0PW5ldyBEYXRlKHJlbW90ZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygibGFzdCBtb2RpZmllZCA9ICIrdC50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICArKChyZW1vdGVUaW1lc3RhbXA9PTApPyIgLSB1c2luZyBjdXJyZW50IHRpbWUgaW5zdGVhZCI6IiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocmVtb3RlVGltZXN0YW1wIT0wKQotICAgICAgICAgICAgICAgICAgICB0b3VjaEZpbGUoZGVzdCxyZW1vdGVUaW1lc3RhbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgIAotCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgbG9nKCJFcnJvciBnZXR0aW5nICIgKyBzb3VyY2UgKyAiIHRvICIgKyBkZXN0ICk7Ci0gICAgICAgICAgICBpZihpZ25vcmVFcnJvcnMpIAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogc2V0IHRoZSB0aW1lc3RhbXAgb2YgYSBuYW1lZCBmaWxlIHRvIGEgc3BlY2lmaWVkIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIHN0YXJ0IG9mIHRoZSBlcmEKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQgc3VjY2VlZGVkLiBGYWxzZSBtZWFucyB0aGF0IHRoaXMgaXMgYQotICAgICAqIGphdmExLjEgc3lzdGVtIGFuZCB0aGF0IGZpbGUgdGltZXMgY2FuIG5vdCBiZSBzZXQKLSAgICAgKkBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gVGhyb3duIGluIHVucmVjb3ZlcmFibGUgZXJyb3IuIExpa2VseQotICAgICAqdGhpcyBjb21lcyBmcm9tIGZpbGUgYWNjZXNzIGZhaWx1cmVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHRvdWNoRmlsZShGaWxlIGZpbGUsIGxvbmcgdGltZW1pbGxpcykgCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiAgewotCi0gICAgICAgIGlmIChwcm9qZWN0LmdldEphdmFWZXJzaW9uKCkgIT0gUHJvamVjdC5KQVZBXzFfMSkgewotICAgICAgICAgICAgVG91Y2ggdG91Y2ggPSAoVG91Y2gpIHByb2plY3QuY3JlYXRlVGFzaygidG91Y2giKTsKLSAgICAgICAgICAgIHRvdWNoLnNldE93bmluZ1RhcmdldCh0YXJnZXQpOwotICAgICAgICAgICAgdG91Y2guc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgICAgICB0b3VjaC5zZXRMb2NhdGlvbihnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIHRvdWNoLnNldEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICB0b3VjaC5zZXRNaWxsaXModGltZW1pbGxpcyk7Ci0gICAgICAgICAgICB0b3VjaC50b3VjaCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gICAgICAgIAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBVUkwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdSBVUkwgZm9yIHRoZSBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNyYyhVUkwgdSkgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlcmUgdG8gY29weSB0aGUgc291cmNlIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzdCBQYXRoIHRvIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3QpIHsKLSAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCZSB2ZXJib3NlLCBpZiBzZXQgdG8gIjxDT0RFPnRydWU8L0NPREU+Ii4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2IGlmICJ0cnVlIiB0aGVuIGJlIHZlcmJvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdikgewotICAgICAgICB2ZXJib3NlID0gdjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb24ndCBzdG9wIGlmIGdldCBmYWlscyBpZiBzZXQgdG8gIjxDT0RFPnRydWU8L0NPREU+Ii4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2IGlmICJ0cnVlIiB0aGVuIGRvbid0IHJlcG9ydCBkb3dubG9hZCBlcnJvcnMgdXAgdG8gYW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWdub3JlRXJyb3JzKGJvb2xlYW4gdikgewotICAgICAgICBpZ25vcmVFcnJvcnMgPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aW1lc3RhbXBzLCBpZiBzZXQgdG8gIjxDT0RFPnRydWU8L0NPREU+Ii4KLSAgICAgKgotICAgICAqIDxwPkluIHRoaXMgc2l0dWF0aW9uLCB0aGUgaWYtbW9kaWZpZWQtc2luY2UgaGVhZGVyIGlzIHNldCBzbyB0aGF0IHRoZSBmaWxlIGlzCi0gICAgICogb25seSBmZXRjaGVkIGlmIGl0IGlzIG5ld2VyIHRoYW4gdGhlIGxvY2FsIGZpbGUgKG9yIHRoZXJlIGlzIG5vIGxvY2FsIGZpbGUpCi0gICAgICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgb24gSFRUUCBjb25uZWN0aW9ucywgaXQgaXMgaWdub3JlZCBpbiBvdGhlciBjYXNlcy4KLSAgICAgKiBXaGVuIHRoZSBmbGFnIGlzIHNldCwgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSB3aWxsIGFsc28gCi0gICAgICogaGF2ZSBpdHMgdGltZXN0YW1wIHNldCB0byB0aGUgcmVtb3RlIGZpbGUgdGltZS4gCi0gICAgICogPGJyPgotICAgICAqIE5vdGUgdGhhdCByZW1vdGUgZmlsZXMgb2YgZGF0ZSAxLzEvMTk3MCAoR01UKSBhcmUgdHJlYXRlZCBhcyAnbm8gdGltZXN0YW1wJywgYW5kCi0gICAgICogd2ViIHNlcnZlcnMgb2Z0ZW4gc2VydmUgZmlsZXMgd2l0aCBhIHRpbWVzdGFtcCBpbiB0aGUgZnV0dXJlIGJ5IHJlcGxhY2luZyB0aGVpciB0aW1lc3RhbXAKLSAgICAgKiB3aXRoIHRoYXQgb2YgdGhlIGN1cnJlbnQgdGltZS4gQWxzbywgaW50ZXItY29tcHV0ZXIgY2xvY2sgZGlmZmVyZW5jZXMgY2FuIGNhdXNlIG5vIGVuZCBvZiAKLSAgICAgKiBncmllZi4gCi0gICAgICogQHBhcmFtIHYgInRydWUiIHRvIGVuYWJsZSBmaWxlIHRpbWUgZmV0Y2hpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VUaW1lc3RhbXAoYm9vbGVhbiB2KSB7Ci0gICAgICAgIGlmIChwcm9qZWN0LmdldEphdmFWZXJzaW9uKCkgIT0gUHJvamVjdC5KQVZBXzFfMSkgewotICAgICAgICAgICAgdXNlVGltZXN0YW1wID0gdjsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmFyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4ZTQ4Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIENyZWF0ZXMgYSBKQVIgYXJjaGl2ZS4KLSAqIAotICogQGF1dGhvciBKYW1lcyBEYXZpZHNvbiA8YSBocmVmPSJtYWlsdG86ZHVuY2FuQHgxODAuY29tIj5kdW5jYW5AeDE4MC5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXIgZXh0ZW5kcyBaaXAgewotCi0gICAgcHJpdmF0ZSBGaWxlIG1hbmlmZXN0RmlsZTsKLSAgICBwcml2YXRlIE1hbmlmZXN0IG1hbmlmZXN0OwotICAgIHByaXZhdGUgTWFuaWZlc3QgZXhlY01hbmlmZXN0OyAgCi0gICAgCi0gICAgLyoqIHRydWUgaWYgYSBtYW5pZmVzdCBoYXMgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIHRhc2sgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gYnVpbGRGaWxlTWFuaWZlc3QgPSBmYWxzZTsKLSAgICAKLSAgICBwdWJsaWMgSmFyKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBhcmNoaXZlVHlwZSA9ICJqYXIiOwotICAgICAgICBlbXB0eUJlaGF2aW9yID0gImNyZWF0ZSI7Ci0gICAgICAgIHNldEVuY29kaW5nKCJVVEY4Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmFyZmlsZShGaWxlIGphckZpbGUpIHsKLSAgICAgICAgc3VwZXIuc2V0WmlwZmlsZShqYXJGaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkTWFuaWZlc3QoTWFuaWZlc3QgbmV3TWFuaWZlc3QpIHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYW5pZmVzdCA9IGdldERlZmF1bHRNYW5pZmVzdCgpOwotICAgICAgICB9Ci0gICAgICAgIG1hbmlmZXN0Lm1lcmdlKG5ld01hbmlmZXN0KTsKLSAgICAgICAgYnVpbGRGaWxlTWFuaWZlc3QgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChGaWxlIG1hbmlmZXN0RmlsZSkgewotICAgICAgICBpZiAoIW1hbmlmZXN0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNYW5pZmVzdCBmaWxlOiAiICsgbWFuaWZlc3RGaWxlICsgIiBkb2VzIG5vdCBleGlzdC4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWFuaWZlc3RGaWxlID0gbWFuaWZlc3RGaWxlOwotICAgICAgICAKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0RmlsZSk7Ci0gICAgICAgICAgICBNYW5pZmVzdCBuZXdNYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpcyk7Ci0gICAgICAgICAgICBpZiAobWFuaWZlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmlmZXN0ID0gZ2V0RGVmYXVsdE1hbmlmZXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYW5pZmVzdC5tZXJnZShuZXdNYW5pZmVzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbmlmZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZygiTWFuaWZlc3QgaXMgaW52YWxpZDogIiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIE1hbmlmZXN0OiAiICsgbWFuaWZlc3RGaWxlLCBlLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCBtYW5pZmVzdCBmaWxlOiAiICsgbWFuaWZlc3RGaWxlLCBlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFpbmYoWmlwRmlsZVNldCBmcykgewotICAgICAgICAvLyBXZSBqdXN0IHNldCB0aGUgcHJlZml4IGZvciB0aGlzIGZpbGVzZXQsIGFuZCBwYXNzIGl0IHVwLgotICAgICAgICBmcy5zZXRQcmVmaXgoIk1FVEEtSU5GLyIpOwotICAgICAgICBzdXBlci5hZGRGaWxlc2V0KGZzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0WmlwT3V0cHV0U3RyZWFtKFppcE91dHB1dFN0cmVhbSB6T3V0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSWYgbm8gbWFuaWZlc3QgaXMgc3BlY2lmaWVkLCBhZGQgdGhlIGRlZmF1bHQgb25lLgotICAgICAgICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBleGVjTWFuaWZlc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXhlY01hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KCk7Ci0gICAgICAgICAgICAgICAgZXhlY01hbmlmZXN0Lm1lcmdlKG1hbmlmZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHppcERpcihudWxsLCB6T3V0LCAiTUVUQS1JTkYvIik7Ci0gICAgICAgICAgICBzdXBlci5pbml0WmlwT3V0cHV0U3RyZWFtKHpPdXQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJNYW5pZmVzdCBpcyBpbnZhbGlkOiAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIE1hbmlmZXN0IiwgZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgTWFuaWZlc3QgZ2V0RGVmYXVsdE1hbmlmZXN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAiL29yZy9hcGFjaGUvdG9vbHMvYW50L2RlZmF1bHRNYW5pZmVzdC5tZiI7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHMpOwotICAgICAgICAgICAgaWYgKGluID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGRlZmF1bHQgbWFuaWZlc3Q6ICIgKyBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWFuaWZlc3QoaW4pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlZmF1bHQgbWFuaWZlc3QgaXMgaW52YWxpZCAhISIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIGRlZmF1bHQgbWFuaWZlc3QiLCBlKTsKLSAgICAgICAgfQotICAgIH0gICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZVppcE91dHB1dFN0cmVhbShaaXBPdXRwdXRTdHJlYW0gek91dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGV4ZWNNYW5pZmVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBleGVjTWFuaWZlc3QgPSBnZXREZWZhdWx0TWFuaWZlc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGV4ZWNNYW5pZmVzdC5nZXRXYXJuaW5ncygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgIGxvZygiTWFuaWZlc3Qgd2FybmluZzogIiArIChTdHJpbmcpZS5uZXh0RWxlbWVudCgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gdGltZSB0byB3cml0ZSB0aGUgbWFuaWZlc3QKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihiYW9zKTsKLSAgICAgICAgZXhlY01hbmlmZXN0LndyaXRlKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICBzdXBlci56aXBGaWxlKGJhaXMsIHpPdXQsICJNRVRBLUlORi9NQU5JRkVTVC5NRiIsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgICAgICAgc3VwZXIuZmluYWxpemVaaXBPdXRwdXRTdHJlYW0oek91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIHNpdHVhdGlvbiB3aGVuIHdlIGVuY291bnRlciBhIG1hbmlmZXN0IGZpbGUKLSAgICAgKgotICAgICAqIElmIHdlIGhhdmVuJ3QgYmVlbiBnaXZlbiBvbmUsIHdlIHVzZSB0aGlzIG9uZS4KLSAgICAgKgotICAgICAqIElmIHdlIGhhdmUsIHdlIG1lcmdlIHRoZSBtYW5pZmVzdCBpbiwgcHJvdmlkZWQgaXQgaXMgYSBuZXcgZmlsZQotICAgICAqIGFuZCBub3QgdGhlIG9sZCBvbmUgZnJvbSB0aGUgSkFSIHdlIGFyZSB1cGRhdGluZwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB6aXBNYW5pZmVzdEVudHJ5KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGV4ZWNNYW5pZmVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXhlY01hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGlzQWRkaW5nTmV3RmlsZXMoKSkgewotICAgICAgICAgICAgICAgIGV4ZWNNYW5pZmVzdC5tZXJnZShuZXcgTWFuaWZlc3QoaXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFuaWZlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nKCJNYW5pZmVzdCBpcyBpbnZhbGlkOiAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgTWFuaWZlc3QiLCBlLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKEZpbGUgZmlsZSwgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBJZiB0aGUgZmlsZSBiZWluZyBhZGRlZCBpcyBNRVRBLUlORi9NQU5JRkVTVC5NRiwgd2UgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgICAgLy8gY3VycmVudCBtYW5pZmVzdCAKLSAgICAgICAgaWYgKHZQYXRoLmVxdWFsc0lnbm9yZUNhc2UoIk1FVEEtSU5GL01BTklGRVNULk1GIikpICB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICB6aXBNYW5pZmVzdEVudHJ5KGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCBtYW5pZmVzdCBmaWxlOiAiICsgZmlsZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuemlwRmlsZShmaWxlLCB6T3V0LCB2UGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKElucHV0U3RyZWFtIGlzLCBaaXBPdXRwdXRTdHJlYW0gek91dCwgU3RyaW5nIHZQYXRoLCBsb25nIGxhc3RNb2RpZmllZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBJZiB0aGUgZmlsZSBiZWluZyBhZGRlZCBpcyBNRVRBLUlORi9NQU5JRkVTVC5NRiwgd2UgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgICAgLy8gY3VycmVudCBtYW5pZmVzdCAKLSAgICAgICAgaWYgKHZQYXRoLmVxdWFsc0lnbm9yZUNhc2UoIk1FVEEtSU5GL01BTklGRVNULk1GIikpICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHppcE1hbmlmZXN0RW50cnkoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIG1hbmlmZXN0IGZpbGU6ICIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuemlwRmlsZShpcywgek91dCwgdlBhdGgsIGxhc3RNb2RpZmllZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIHVwLXRvLWRhdGU7IAotICAgICAqIEBwYXJhbSBzY2FubmVycyBsaXN0IG9mIHByZXBhcmVkIHNjYW5uZXJzIGNvbnRhaW5pbmcgZmlsZXMgdG8gYXJjaGl2ZQotICAgICAqIEBwYXJhbSB6aXBGaWxlIGludGVuZGVkIGFyY2hpdmUgZmlsZSAobWF5IG9yIG1heSBub3QgZXhpc3QpCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5vdGhpbmcgbmVlZCBiZSBkb25lIChtYXkgaGF2ZSBkb25lIHNvbWV0aGluZyBhbHJlYWR5KTsgZmFsc2UgaWYKLSAgICAgKiAgICAgICAgIGFyY2hpdmUgY3JlYXRpb24gc2hvdWxkIHByb2NlZWQKLSAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGl0IGxpa2VzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVcFRvRGF0ZShGaWxlU2Nhbm5lcltdIHNjYW5uZXJzLCBGaWxlIHppcEZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5lZWQgdG8gaGFuZGxlIG1hbmlmZXN0IGFzIGEgc3BlY2lhbCBjaGVjawotICAgICAgICBpZiAoYnVpbGRGaWxlTWFuaWZlc3QgfHwgbWFuaWZlc3RGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZSB0aGVaaXBGaWxlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhlWmlwRmlsZSA9IG5ldyBqYXZhLnV0aWwuemlwLlppcEZpbGUoemlwRmlsZSk7Ci0gICAgICAgICAgICAgICAgamF2YS51dGlsLnppcC5aaXBFbnRyeSBlbnRyeSA9IHRoZVppcEZpbGUuZ2V0RW50cnkoIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJVcGRhdGluZyBqYXIgc2luY2UgdGhlIGN1cnJlbnQgamFyIGhhcyBubyBtYW5pZmVzdCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1hbmlmZXN0IGN1cnJlbnRNYW5pZmVzdCA9IG5ldyBNYW5pZmVzdCh0aGVaaXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3QgPSBnZXREZWZhdWx0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50TWFuaWZlc3QuZXF1YWxzKG1hbmlmZXN0KSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlVwZGF0aW5nIGphciBzaW5jZSBqYXIgbWFuaWZlc3QgaGFzIGNoYW5nZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGFueSBwcm9ibGVtcyBhbmQgd2Ugd2lsbCByZWJ1aWxkCi0gICAgICAgICAgICAgICAgbG9nKCJVcGRhdGluZyBqYXIgc2luY2UgY2Fubm90IHJlYWQgY3VycmVudCBqYXIgbWFuaWZlc3Q6ICIgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgZS5nZXRNZXNzYWdlKCksIAotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAodGhlWmlwRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGVaaXBGaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWFuaWZlc3RGaWxlLmxhc3RNb2RpZmllZCgpID4gemlwRmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5pc1VwVG9EYXRlKHNjYW5uZXJzLCB6aXBGaWxlKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZUVtcHR5WmlwKEZpbGUgemlwRmlsZSkgewotICAgICAgICAvLyBKYXIgZmlsZXMgYWx3YXlzIGNvbnRhaW4gYSBtYW5pZmVzdCBhbmQgY2FuIG5ldmVyIGJlIGVtcHR5ICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdGhpbmsgd2UgYWxyZWFkeSBoYXZlIGEgTUFOSUZFU1QgbmV4dCB0aW1lIHRoaXMgdGFzawotICAgICAqIGdldHMgZXhlY3V0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW5VcCgpIHsKLSAgICAgICAgc3VwZXIuY2xlYW5VcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmEuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiN2FmNy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkV4aXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGlzIHRhc2sgYWN0cyBhcyBhIGxvYWRlciBmb3IgamF2YSBhcHBsaWNhdGlvbnMgYnV0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgSlZNIAotICogZm9yIHRoZSBjYWxsZWQgYXBwbGljYXRpb24gdGh1cyByZXN1bHRpbmcgaW4gbXVjaCBmYXN0ZXIgb3BlcmF0aW9uLgotICoKLSAqIEBhdXRob3IgU3RlZmFubyBNYXp6b2NjaGkgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbm9AYXBhY2hlLm9yZyI+c3RlZmFub0BhcGFjaGUub3JnPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSmF2YSBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBDb21tYW5kbGluZUphdmEgY21kbCA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZm9yayA9IGZhbHNlOwotICAgIHByaXZhdGUgRmlsZSBkaXIgPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSBvdXQ7Ci0gICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXRTdHJlYW0gPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIERvIHRoZSBleGVjdXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBlcnIgPSAtMTsKLSAgICAgICAgaWYgKChlcnIgPSBleGVjdXRlSmF2YSgpKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkphdmEgcmV0dXJuZWQ6ICIrZXJyLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygiSmF2YSBSZXN1bHQ6ICIgKyBlcnIsIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyB0aGUgZXhlY3V0aW9uIGFuZCByZXR1cm4gYSByZXR1cm4gY29kZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIGV4ZWN1dGUgamF2YSBjbGFzcyBpZiBpdCB3YXMgZXhlY3V0ZWQgaW4gCi0gICAgICogYSBzZXBhcmF0ZSBWTSAoZm9yayA9ICJ5ZXMiKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGV4ZWN1dGVKYXZhKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGNtZGwuZ2V0Q2xhc3NuYW1lKCk7Ci0gICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCAmJiBjbWRsLmdldEphcigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2xhc3NuYW1lIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3JrICYmIGNtZGwuZ2V0SmFyKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBleGVjdXRlIGEgamFyIGluIG5vbi1mb3JrZWQgbW9kZS4gUGxlYXNlIHNldCBmb3JrPSd0cnVlJy4gIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm9yaykgewotICAgICAgICAgICAgbG9nKCJGb3JraW5nICIgKyBjbWRsLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBydW4oY21kbC5nZXRDb21tYW5kbGluZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjbWRsLmdldFZtQ29tbWFuZCgpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBsb2coIkpWTSBhcmdzIGlnbm9yZWQgd2hlbiBzYW1lIEpWTSBpcyB1c2VkLiIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJXb3JraW5nIGRpcmVjdG9yeSBpZ25vcmVkIHdoZW4gc2FtZSBKVk0gaXMgdXNlZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9nKCJSdW5uaW5nIGluIHNhbWUgVk0gIiArIGNtZGwuZ2V0SmF2YUNvbW1hbmQoKS50b1N0cmluZygpLCAKLSAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcnVuKGNtZGwpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4aXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXguZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIHMpIHsKLSAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuYXBwZW5kKHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICByZXR1cm4gY21kbC5jcmVhdGVDbGFzc3BhdGgocHJvamVjdCkuY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBDTEFTU1BBVEggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgamFyIG5hbWUuLi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXIoRmlsZSBqYXJmaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIGNtZGwuZ2V0Q2xhc3NuYW1lKCkgIT0gbnVsbCApewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgdXNlICdqYXInIGFuZCAnY2xhc3NuYW1lJyBhdHRyaWJ1dGVzIGluIHNhbWUgY29tbWFuZC4iKTsKLSAgICAgICAgfQotICAgICAgICBjbWRsLnNldEphcihqYXJmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyBzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIGNtZGwuZ2V0SmFyKCkgIT0gbnVsbCApewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgdXNlICdqYXInIGFuZCAnY2xhc3NuYW1lJyBhdHRyaWJ1dGVzIGluIHNhbWUgY29tbWFuZCIpOwotICAgICAgICB9Ci0gICAgICAgIGNtZGwuc2V0Q2xhc3NuYW1lKHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFyZ3MoU3RyaW5nIHMpIHsKLSAgICAgICAgbG9nKCJUaGUgYXJncyBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZC4gIiArCi0gICAgICAgICAgICAiUGxlYXNlIHVzZSBuZXN0ZWQgYXJnIGVsZW1lbnRzLiIsCi0gICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUocyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5lc3RlZCBhcmcgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWFuZGxpbmUuQXJndW1lbnQgY3JlYXRlQXJnKCkgewotICAgICAgICByZXR1cm4gY21kbC5jcmVhdGVBcmd1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZm9ya2luZyBmbGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiBzKSB7Ci0gICAgICAgIHRoaXMuZm9yayA9IHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgSlZNLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEp2bWFyZ3MoU3RyaW5nIHMpIHsKLSAgICAgICAgbG9nKCJUaGUganZtYXJncyBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZC4gIiArCi0gICAgICAgICAgICAiUGxlYXNlIHVzZSBuZXN0ZWQganZtYXJnIGVsZW1lbnRzLiIsCi0gICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgY21kbC5jcmVhdGVWbUFyZ3VtZW50KCkuc2V0TGluZShzKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXN0ZWQganZtYXJnIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUp2bWFyZygpIHsKLSAgICAgICAgcmV0dXJuIGNtZGwuY3JlYXRlVm1Bcmd1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29tbWFuZCB1c2VkIHRvIHN0YXJ0IHRoZSBWTSAob25seSBpZiBmb3JrPT1mYWxzZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SnZtKFN0cmluZyBzKSB7Ci0gICAgICAgIGNtZGwuc2V0Vm0ocyk7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXN0ZWQgc3lzcHJvcGVydHkgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTeXNwcm9wZXJ0eShFbnZpcm9ubWVudC5WYXJpYWJsZSBzeXNwKSB7Ci0gICAgICAgIGNtZGwuYWRkU3lzcHJvcGVydHkoc3lzcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3cgYSBCdWlsZEV4Y2VwdGlvbiBpZiBwcm9jZXNzIHJldHVybnMgbm9uIDAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsKSB7Ci0gICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkKSB7Ci0gICAgICAgIHRoaXMuZGlyID0gZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxlIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoRmlsZSBvdXQpIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogLW14IG9yIC1YbXggZGVwZW5kaW5nIG9uIFZNIHZlcnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhtZW1vcnkoU3RyaW5nIG1heCl7Ci0gICAgICAgIGNtZGwuc2V0TWF4bWVtb3J5KG1heCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SlZNVmVyc2lvbihTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgY21kbC5zZXRWbXZlcnNpb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPdXRwdXQoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKG91dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRTdHJlYW0ucHJpbnRsbihsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZU91dHB1dChsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgbGluZSkgewotICAgICAgICBpZiAob3V0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dFN0cmVhbS5wcmludGxuKGxpbmUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXJyb3JPdXRwdXQobGluZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIGNsYXNzbmFtZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYXMgaXQKLSAgICAgKiB3YXMgYSBjb21tYW5kIGxpbmUgYXBwbGljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bihDb21tYW5kbGluZUphdmEgY29tbWFuZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRXhlY3V0ZUphdmEgZXhlID0gbmV3IEV4ZWN1dGVKYXZhKCk7Ci0gICAgICAgIGV4ZS5zZXRKYXZhQ29tbWFuZChjb21tYW5kLmdldEphdmFDb21tYW5kKCkpOwotICAgICAgICBleGUuc2V0Q2xhc3NwYXRoKGNvbW1hbmQuZ2V0Q2xhc3NwYXRoKCkpOwotICAgICAgICBleGUuc2V0U3lzdGVtUHJvcGVydGllcyhjb21tYW5kLmdldFN5c3RlbVByb3BlcnRpZXMoKSk7Ci0gICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0KSk7Ci0gICAgICAgICAgICAgICAgZXhlLmV4ZWN1dGUocHJvamVjdCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpbykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpbywgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGV4ZS5leGVjdXRlKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIGNsYXNzbmFtZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgaW4gYSBzZXBhcmF0ZSBWTS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBydW4oU3RyaW5nW10gY29tbWFuZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRXhlY3V0ZSBleGUgPSBudWxsOwotICAgICAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXhlID0gbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywgUHJvamVjdC5NU0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dCk7Ci0gICAgICAgICAgICAgICAgZXhlID0gbmV3IEV4ZWN1dGUobmV3IFB1bXBTdHJlYW1IYW5kbGVyKGZvcyksIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBleGUuc2V0QW50UnVuKHByb2plY3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaXIgPSBwcm9qZWN0LmdldEJhc2VEaXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRpci5leGlzdHMoKSB8fCAhZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZGlyLmdldEFic29sdXRlUGF0aCgpKyIgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY29tbWFuZCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBleGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW8sIGxvY2F0aW9uKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Zm9zLmNsb3NlKCk7fSBjYXRjaCAoSU9FeGNlcHRpb24gaW8pIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gY2xhc3NuYW1lIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhcyBpdAotICAgICAqIHdhcyBhIGNvbW1hbmQgbGluZSBhcHBsaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW4oU3RyaW5nIGNsYXNzbmFtZSwgVmVjdG9yIGFyZ3MpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRsaW5lSmF2YSBjbWRqID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOwotICAgICAgICBjbWRqLnNldENsYXNzbmFtZShjbGFzc25hbWUpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8YXJncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY21kai5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKChTdHJpbmcpIGFyZ3MuZWxlbWVudEF0KGkpKTsKLSAgICAgICAgfQotICAgICAgICBydW4oY21kaik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgb3V0IHRoZSBhcmd1bWVudHMgdG8gdGhpcyBqYXZhIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJBcmdzKCkgewotICAgICAgICBjbWRsLmNsZWFySmF2YUFyZ3MoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2NzJhOS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLio7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGFzayB0byBjb21waWxlIEphdmEgc291cmNlIGZpbGVzLiBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZwotICogYXJndW1lbnRzOgotICogPHVsPgotICogPGxpPnNvdXJjZWRpcgotICogPGxpPmRlc3RkaXIKLSAqIDxsaT5kZXByZWNhdGlvbgotICogPGxpPmNsYXNzcGF0aAotICogPGxpPmJvb3RjbGFzc3BhdGgKLSAqIDxsaT5leHRkaXJzCi0gKiA8bGk+b3B0aW1pemUKLSAqIDxsaT5kZWJ1ZwotICogPGxpPmVuY29kaW5nCi0gKiA8bGk+dGFyZ2V0Ci0gKiA8bGk+ZGVwZW5kCi0gKiA8bGk+dmVib3NlCi0gKiA8bGk+ZmFpbG9uZXJyb3IKLSAqIDxsaT5pbmNsdWRlYW50cnVudGltZQotICogPGxpPmluY2x1ZGVqYXZhcnVudGltZQotICogPC91bD4KLSAqIE9mIHRoZXNlIGFyZ3VtZW50cywgdGhlIDxiPnNvdXJjZWRpcjwvYj4gYW5kIDxiPmRlc3RkaXI8L2I+IGFyZSByZXF1aXJlZC4KLSAqIDxwPgotICogV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgcmVjdXJzaXZlbHkgc2NhbiB0aGUgc291cmNlZGlyIGFuZAotICogZGVzdGRpciBsb29raW5nIGZvciBKYXZhIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLiBUaGlzIHRhc2sgbWFrZXMgaXRzCi0gKiBjb21waWxlIGRlY2lzaW9uIGJhc2VkIG9uIHRpbWVzdGFtcC4gCi0gKgotICogQGF1dGhvciBKYW1lcyBEYXZpZHNvbiA8YSBocmVmPSJtYWlsdG86ZHVuY2FuQHgxODAuY29tIj5kdW5jYW5AeDE4MC5jb208L2E+Ci0gKiBAYXV0aG9yIFJvYmluIEdyZWVuIDxhIGhyZWY9Im1haWx0bzpncmVlbnJkQGhvdG1haWwuY29tIj5ncmVlbnJkQGhvdG1haWwuY29tPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpheWdsYW52aWxsZUBob21lLmNvbSI+SiBEIEdsYW52aWxsZTwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSmF2YWMgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxfTVNHIAotICAgICAgICA9ICJDb21waWxlIGZhaWxlZCwgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBwcm92aWRlZC4iOwotCi0gICAgcHJpdmF0ZSBQYXRoIHNyYzsKLSAgICBwcml2YXRlIEZpbGUgZGVzdERpcjsKLSAgICBwcml2YXRlIFBhdGggY29tcGlsZUNsYXNzcGF0aDsKLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gb3B0aW1pemUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVwcmVjYXRpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVwZW5kID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXQ7Ci0gICAgcHJpdmF0ZSBQYXRoIGJvb3RjbGFzc3BhdGg7Ci0gICAgcHJpdmF0ZSBQYXRoIGV4dGRpcnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVBbnRSdW50aW1lID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUphdmFSdW50aW1lID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZvcmsgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbm93YXJuID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvciA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIEZpbGVbXSBjb21waWxlTGlzdCA9IG5ldyBGaWxlWzBdOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmVzdGVkIDxzcmMgLi4uPiBlbGVtZW50IGZvciBtdWx0aXBsZSBzb3VyY2UgcGF0aAotICAgICAqIHN1cHBvcnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV4dGVkIHNyYyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZVNyYygpIHsKLSAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzcmMgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3JjLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvdXJjZSBkaXJzIHRvIGZpbmQgdGhlIHNvdXJjZSBKYXZhIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNyY2RpcihQYXRoIHNyY0RpcikgewotICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKLSAgICAgICAgICAgIHNyYyA9IHNyY0RpcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyYy5hcHBlbmQoc3JjRGlyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBHZXRzIHRoZSBzb3VyY2UgZGlycyB0byBmaW5kIHRoZSBzb3VyY2UgamF2YSBmaWxlcy4gKi8KLSAgICBwdWJsaWMgUGF0aCBnZXRTcmNkaXIoKSB7Ci0gICAgICAgIHJldHVybiBzcmM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSmF2YSBzb3VyY2UKLSAgICAgKiBmaWxlcyBzaG91bGQgYmUgY29tcGlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGRlc3REaXIpIHsKLSAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogR2V0cyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGphdmEgc291cmNlIGZpbGVzCi0gICAgICogc2hvdWxkIGJlIGNvbXBpbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldERlc3RkaXIoKSB7Ci0gICAgICAgIHJldHVybiBkZXN0RGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7Ci0gICAgICAgIGlmIChjb21waWxlQ2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEdldHMgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLiAqLwotICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVDbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWF5YmUgY3JlYXRlcyBhIG5lc3RlZCBjbGFzc3BhdGggZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChjb21waWxlQ2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGlsZUNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKLSAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYm9vdGNsYXNzcGF0aCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb21waWxlIHRoZSBjbGFzc2VzCi0gICAgICogYWdhaW5zdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb290Y2xhc3NwYXRoKFBhdGggYm9vdGNsYXNzcGF0aCkgewotICAgICAgICBpZiAodGhpcy5ib290Y2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuYm9vdGNsYXNzcGF0aCA9IGJvb3RjbGFzc3BhdGg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmJvb3RjbGFzc3BhdGguYXBwZW5kKGJvb3RjbGFzc3BhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYm9vdGNsYXNzcGF0aCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb21waWxlIHRoZSBjbGFzc2VzCi0gICAgICogYWdhaW5zdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBnZXRCb290Y2xhc3NwYXRoKCkgewotICAgICAgICByZXR1cm4gYm9vdGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXliZSBjcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUJvb3RjbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChib290Y2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGJvb3RjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYm9vdGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb290Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUJvb3RjbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleHRlbnNpb24gZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZQotICAgICAqIGNvbXBpbGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4dGRpcnMoUGF0aCBleHRkaXJzKSB7Ci0gICAgICAgIGlmICh0aGlzLmV4dGRpcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5leHRkaXJzID0gZXh0ZGlyczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuZXh0ZGlycy5hcHBlbmQoZXh0ZGlycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBleHRlbnNpb24gZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZQotICAgICAqIGNvbXBpbGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGdldEV4dGRpcnMoKSB7Ci0gICAgICAgIHJldHVybiBleHRkaXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1heWJlIGNyZWF0ZXMgYSBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlRXh0ZGlycygpIHsKLSAgICAgICAgaWYgKGV4dGRpcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXh0ZGlycyA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHRkaXJzLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvdyBhIEJ1aWxkRXhjZXB0aW9uIGlmIGNvbXBpbGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsKSB7Ci0gICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZWVkIGlmIGNvbXBpbGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2VlZChib29sZWFuIHByb2NlZWQpIHsKLSAgICAgICAgZmFpbE9uRXJyb3IgPSAhcHJvY2VlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmYWlsb25lcnJvciBmbGFnLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEZhaWxvbmVycm9yKCkgewotICAgICAgICByZXR1cm4gZmFpbE9uRXJyb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXByZWNhdGlvbiBmbGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlcHJlY2F0aW9uKGJvb2xlYW4gZGVwcmVjYXRpb24pIHsKLSAgICAgICAgdGhpcy5kZXByZWNhdGlvbiA9IGRlcHJlY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiBHZXRzIHRoZSBkZXByZWNhdGlvbiBmbGFnLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlcHJlY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVwcmVjYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBKYXZhIHNvdXJjZSBmaWxlIGVuY29kaW5nIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICAvKiogR2V0cyB0aGUgamF2YSBzb3VyY2UgZmlsZSBlbmNvZGluZyBuYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlYnVnIGZsYWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykgewotICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7Ci0gICAgfQotCi0gICAgLyoqIEdldHMgdGhlIGRlYnVnIGZsYWcuICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RGVidWcoKSB7Ci0gICAgICAgIHJldHVybiBkZWJ1ZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG9wdGltaXplIGZsYWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW1pemUoYm9vbGVhbiBvcHRpbWl6ZSkgewotICAgICAgICB0aGlzLm9wdGltaXplID0gb3B0aW1pemU7Ci0gICAgfQotCi0gICAgLyoqIEdldHMgdGhlIG9wdGltaXplIGZsYWcuICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pemUoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpbWl6ZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU2V0IHRoZSBkZXBlbmQgZmxhZy4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0RGVwZW5kKGJvb2xlYW4gZGVwZW5kKSB7Ci0gICAgICAgIHRoaXMuZGVwZW5kID0gZGVwZW5kOwotICAgIH0gIAotCi0gICAgLyoqIEdldHMgdGhlIGRlcGVuZCBmbGFnLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlcGVuZCgpIHsKLSAgICAgICAgcmV0dXJuIGRlcGVuZDsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU2V0IHRoZSB2ZXJib3NlIGZsYWcuCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqIEdldHMgdGhlIHZlcmJvc2UgZmxhZy4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRWZXJib3NlKCkgewotICAgICAgICByZXR1cm4gdmVyYm9zZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0YXJnZXQgVk0gdGhhdCB0aGUgY2xhc3NlcyB3aWxsIGJlIGNvbXBpbGVkIGZvci4gVmFsaWQKLSAgICAgKiBzdHJpbmdzIGFyZSAiMS4xIiwgIjEuMiIsIGFuZCAiMS4zIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci0KLSAgICAvKiogR2V0cyB0aGUgdGFyZ2V0IFZNIHRoYXQgdGhlIGNsYXNzZXMgd2lsbCBiZSBjb21waWxlZCBmb3IuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5jbHVkZSBhbnQncyBvd24gY2xhc3NwYXRoIGluIHRoaXMgdGFzaydzIGNsYXNzcGF0aD8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlYW50cnVudGltZSggYm9vbGVhbiBpbmNsdWRlICkgewotICAgICAgICBpbmNsdWRlQW50UnVudGltZSA9IGluY2x1ZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIG9yIG5vdCB0aGUgYW50IGNsYXNzcGF0aCBpcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICAgKiB0YXNrJ3MgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVhbnRydW50aW1lKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZUFudFJ1bnRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSBqYXZhIHJ1bnRpbWUgbGlicmFyaWVzIHRvIHRoaXMKLSAgICAgKiB0YXNrJ3MgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVqYXZhcnVudGltZSggYm9vbGVhbiBpbmNsdWRlICkgewotICAgICAgICBpbmNsdWRlSmF2YVJ1bnRpbWUgPSBpbmNsdWRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBvciBub3QgdGhlIGphdmEgcnVudGltZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhpcwotICAgICAqIHRhc2sncyBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZWphdmFydW50aW1lKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZUphdmFSdW50aW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBmb3JrIHRoZSBqYXZhYyBjb21waWxlci4KLSAgICAgKi8gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yayhib29sZWFuIGZvcmspIAotICAgIHsKLQl0aGlzLmZvcmsgPSBmb3JrOwotICAgIH0KLQkKLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGUgLW5vd2FybiBvcHRpb24gc2hvdWxkIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm93YXJuKGJvb2xlYW4gZmxhZykgewotICAgICAgICB0aGlzLm5vd2FybiA9IGZsYWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdWxkIHRoZSAtbm93YXJuIG9wdGlvbiBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldE5vd2FybigpIHsKLSAgICAgICAgcmV0dXJuIG5vd2FybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZmlyc3Qgb2ZmLCBtYWtlIHN1cmUgdGhhdCB3ZSd2ZSBnb3QgYSBzcmNkaXIKLQotICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIFtdIGxpc3QgPSBzcmMubGlzdCgpOwotICAgICAgICBpZiAobGlzdC5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmNkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGRlc3REaXIgIT0gbnVsbCAmJiAhZGVzdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3RpbmF0aW9uIGRpcmVjdG9yeSBcIiIgKyBkZXN0RGlyICsgIlwiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNjYW4gc291cmNlIGRpcmVjdG9yaWVzIGFuZCBkZXN0IGRpcmVjdG9yeSB0byBidWlsZCB1cCAKLSAgICAgICAgLy8gY29tcGlsZSBsaXN0cwotICAgICAgICByZXNldEZpbGVMaXN0cygpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBzcmNEaXIgPSAoRmlsZSlwcm9qZWN0LnJlc29sdmVGaWxlKGxpc3RbaV0pOwotICAgICAgICAgICAgaWYgKCFzcmNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBcIiIgKyBzcmNEaXIuZ2V0UGF0aCgpICsgIlwiIGRvZXMgbm90IGV4aXN0ISIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHRoaXMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzcmNEaXIpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICAgICAgc2NhbkRpcihzcmNEaXIsIGRlc3REaXIgIT0gbnVsbCA/IGRlc3REaXIgOiBzcmNEaXIsIGZpbGVzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzCi0KLSAgICAgICAgU3RyaW5nIGNvbXBpbGVyID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiKTsKLQkKLQlpZiAoZm9yaykgewotCSAgICBpZiAoY29tcGlsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChpc0pka0NvbXBpbGVyKGNvbXBpbGVyKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlNpbmNlIGZvcmsgaXMgdHJ1ZSwgaWdub3JpbmcgYnVpbGQuY29tcGlsZXIgc2V0dGluZy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyID0gImV4dEphdmFjIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiU2luY2UgYnVpbGQuY29tcGlsZXIgc2V0dGluZyBpc24ndCBjbGFzc2ljIG9yIG1vZGVybiwgaWdub3JpbmcgZm9yayBzZXR0aW5nLiIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgIH0KLQkgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29tcGlsZXIgPSAiZXh0SmF2YWMiOwotICAgICAgICAgICAgfQotCX0gCi0KLQlpZiAoY29tcGlsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKFByb2plY3QuZ2V0SmF2YVZlcnNpb24oKSAhPSBQcm9qZWN0LkpBVkFfMV8xICYmCi0gICAgICAgICAgICAgICAgUHJvamVjdC5nZXRKYXZhVmVyc2lvbigpICE9IFByb2plY3QuSkFWQV8xXzIpIHsKLSAgICAgICAgICAgICAgICBjb21waWxlciA9ICJtb2Rlcm4iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb21waWxlciA9ICJjbGFzc2ljIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21waWxlTGlzdC5sZW5ndGggPiAwKSB7Ci0KLSAgICAgICAgICAgIENvbXBpbGVyQWRhcHRlciBhZGFwdGVyID0gQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5nZXRDb21waWxlcigKLSAgICAgICAgICAgICAgY29tcGlsZXIsIHRoaXMgKTsKLSAgICAgICAgICAgIGxvZygiQ29tcGlsaW5nICIgKyBjb21waWxlTGlzdC5sZW5ndGggKyAKLSAgICAgICAgICAgICAgICAiIHNvdXJjZSBmaWxlIgotICAgICAgICAgICAgICAgICsgKGNvbXBpbGVMaXN0Lmxlbmd0aCA9PSAxID8gIiIgOiAicyIpCi0gICAgICAgICAgICAgICAgKyAoZGVzdERpciAhPSBudWxsID8gIiB0byAiICsgZGVzdERpciA6ICIiKSk7Ci0KLSAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHBvcHVsYXRlIHRoZSBjb21waWxlciBhZGFwdGVyCi0gICAgICAgICAgICBhZGFwdGVyLnNldEphdmFjKCB0aGlzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGZpbmFsbHksIGxldHMgZXhlY3V0ZSB0aGUgY29tcGlsZXIhIQotICAgICAgICAgICAgaWYgKCFhZGFwdGVyLmV4ZWN1dGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRkFJTF9NU0csIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhGQUlMX01TRywgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgbGlzdCBvZiBmaWxlcyB0byBiZSBjb21waWxlZCBhbmQgY29waWVkLi4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRGaWxlTGlzdHMoKSB7Ci0gICAgICAgIGNvbXBpbGVMaXN0ID0gbmV3IEZpbGVbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NhbnMgdGhlIGRpcmVjdG9yeSBsb29raW5nIGZvciBzb3VyY2UgZmlsZXMgdG8gYmUgY29tcGlsZWQuICAKLSAgICAgKiBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gdGhlIGNsYXNzIHZhcmlhYmxlIGNvbXBpbGVMaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NhbkRpcihGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLCBTdHJpbmcgZmlsZXNbXSkgewotICAgICAgICBHbG9iUGF0dGVybk1hcHBlciBtID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7Ci0gICAgICAgIG0uc2V0RnJvbSgiKi5qYXZhIik7Ci0gICAgICAgIG0uc2V0VG8oIiouY2xhc3MiKTsKLSAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOwotICAgICAgICBGaWxlW10gbmV3RmlsZXMgPSBzZnMucmVzdHJpY3RBc0ZpbGVzKGZpbGVzLCBzcmNEaXIsIGRlc3REaXIsIG0pOwotICAgICAgICAKLSAgICAgICAgaWYgKG5ld0ZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIEZpbGVbXSBuZXdDb21waWxlTGlzdCA9IG5ldyBGaWxlW2NvbXBpbGVMaXN0Lmxlbmd0aCArCi0gICAgICAgICAgICAgICAgbmV3RmlsZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29tcGlsZUxpc3QsIDAsIG5ld0NvbXBpbGVMaXN0LCAwLAotICAgICAgICAgICAgICAgICAgICBjb21waWxlTGlzdC5sZW5ndGgpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuZXdGaWxlcywgMCwgbmV3Q29tcGlsZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVMaXN0Lmxlbmd0aCwgbmV3RmlsZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGNvbXBpbGVMaXN0ID0gbmV3Q29tcGlsZUxpc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogR2V0cyB0aGUgbGlzdCBvZiBmaWxlcyB0byBiZSBjb21waWxlZC4gKi8KLSAgICBwdWJsaWMgRmlsZVtdIGdldEZpbGVMaXN0KCkgewotICAgICAgICByZXR1cm4gY29tcGlsZUxpc3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNKZGtDb21waWxlcihTdHJpbmcgY29tcGlsZXIpIHsKLSAgICAgICAgcmV0dXJuICJtb2Rlcm4iLmVxdWFscyhjb21waWxlcikgfHwKLSAgICAgICAgICAgICJjbGFzc2ljIi5lcXVhbHMoY29tcGlsZXIpIHx8Ci0gICAgICAgICAgICAiamF2YWMxLjEiLmVxdWFscyhjb21waWxlcikgfHwKLSAgICAgICAgICAgICJqYXZhYzEuMiIuZXF1YWxzKGNvbXBpbGVyKSB8fAotICAgICAgICAgICAgImphdmFjMS4zIi5lcXVhbHMoY29tcGlsZXIpIHx8Ci0gICAgICAgICAgICAiamF2YWMxLjQiLmVxdWFscyhjb21waWxlcik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhY091dHB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWNPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkZmI4NS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhY091dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLyAKLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFNlcnZlcyBhcyBhbiBvdXRwdXQgc3RyZWFtIHRvIEphdmFjLiBUaGlzIGxldCdzIHVzIHByaW50IG1lc3NhZ2VzCi0gKiBvdXQgdG8gdGhlIGxvZyBhbmQgZGV0ZWN0IHdoZXRoZXIgb3Igbm90IEphdmFjIGhhZCBhbiBlcnJvcgotICogd2hpbGUgY29tcGlsaW5nLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIChkdW5jYW5AeDE4MC5jb20pCi0gKiBAZGVwcmVjYXRlZCB1c2UgcmV0dXJudmFsdWUgb2YgY29tcGlsZSB0byBkZXRlY3QgY29tcGlsYXRpb24gZmFpbHVyZS4KLSAqLwotCi1jbGFzcyBKYXZhY091dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0KLSAgICBwcml2YXRlIFRhc2sgdGFzazsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBsaW5lOwotICAgIHByaXZhdGUgYm9vbGVhbiBlcnJvckZsYWcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSmF2YWNPdXRwdXRTdHJlYW0gd2l0aCB0aGUgZ2l2ZW4gdGFzawotICAgICAqIGFzIHRoZSBvdXRwdXQgc291cmNlIGZvciBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICAKLSAgICBKYXZhY091dHB1dFN0cmVhbShUYXNrIHRhc2spIHsKLSAgICAgICAgdGhpcy50YXNrID0gdGFzazsKLSAgICAgICAgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGNoYXJhY3RlciB0byB0aGUgb3V0cHV0IHN0cmVhbS4gVGhpcyBtZXRob2QgbG9va3MKLSAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpc24ndCBhbiBlcnJvciBiZWluZyByZXBvcnRlZCBhbmQKLSAgICAgKiB3aWxsIGZsdXNoIGVhY2ggbGluZSBvZiBpbnB1dCBvdXQgdG8gdGhlIHByb2plY3QncyBsb2cgc3RyZWFtLgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGFyIGNjID0gKGNoYXIpYzsKLSAgICAgICAgaWYgKGNjID09ICdccicgfHwgY2MgPT0gJ1xuJykgewotICAgICAgICAgICAgLy8gbGluZSBmZWVkCi0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzTGluZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZS5hcHBlbmQoY2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgbGluZSBvZiBpbnB1dCBhbmQgZGV0ZXJtaW5lcyBpZiBhbiBlcnJvciBvY2N1cmVkLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTGluZSgpIHsKLSAgICAgICAgU3RyaW5nIHMgPSBsaW5lLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChzLmluZGV4T2YoImVycm9yIikgPiAtMSkgewotICAgICAgICAgICAgZXJyb3JGbGFnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB0YXNrLmxvZyhzKTsKLSAgICAgICAgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBzdGF0dXMgb2YgdGhlIGNvbXBpbGUuIElmIG5vIGVycm9ycyBvY2N1cmVkLAotICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZhbHNlLCBlbHNlIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBnZXRFcnJvckZsYWcoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvckZsYWc7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhZG9jLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhZG9jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNjg0OTYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWRvYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLS8qKgotICogVGhpcyB0YXNrIG1ha2VzIGl0IGVhc3kgdG8gZ2VuZXJhdGUgSmF2YWRvYyBkb2N1bWVudGF0aW9uIGZvciBhIGNvbGxlY3Rpb24KLSAqIG9mIHNvdXJjZSBjb2RlLgotICoKLSAqIDxQPkN1cnJlbnQga25vd24gbGltaXRhdGlvbnMgYXJlOgotICoKLSAqIDxQPjxVTD4KLSAqICAgIDxMST5wYXR0ZXJucyBtdXN0IGJlIG9mIHRoZSBmb3JtICJ4eHguKiIsIGV2ZXJ5IG90aGVyIHBhdHRlcm4gZG9lc24ndAotICogICAgICAgIHdvcmsuCi0gKiAgICA8TEk+dGhlIGphdmEgY29tbWVudC1zdHJpcHBlciByZWFkZXIgaXMgaG9ycmlibHkgc2xvdwotICogICAgPExJPnRoZXJlIGlzIG5vIGNvbnRyb2wgb24gYXJndW1lbnRzIHNhbml0eSBzaW5jZSB0aGV5IGFyZSBsZWZ0Ci0gKiAgICAgICAgdG8gdGhlIGphdmFkb2MgaW1wbGVtZW50YXRpb24uCi0gKiAgICA8TEk+YXJndW1lbnQgSiBpbiBqYXZhZG9jMSBpcyBub3Qgc3VwcG9ydGVkICh3aGF0IGlzIHRoYXQgZm9yIGFueXdheT8pCi0gKiA8L1VMPgotICoKLSAqIDxQPklmIG5vIDxDT0RFPmRvY2xldDwvQ09ERT4gaXMgc2V0LCB0aGVuIHRoZSA8Q09ERT52ZXJzaW9uPC9DT0RFPiBhbmQKLSAqIDxDT0RFPmF1dGhvcjwvQ09ERT4gYXJlIGJ5IGRlZmF1bHQgPENPREU+InllcyI8L0NPREU+LgotICoKLSAqIDxQPk5vdGU6IFRoaXMgdGFzayBpcyBydW4gb24gYW5vdGhlciBWTSBiZWNhdXNlIHRoZSBKYXZhZG9jIGNvZGUgY2FsbHMKLSAqIDxDT0RFPlN5c3RlbS5leGl0KCk8L0NPREU+IHdoaWNoIHdvdWxkIGJyZWFrIEFudCBmdW5jdGlvbmFsaXR5LgotICoKLSAqIEBhdXRob3IgSm9uIFMuIFN0ZXZlbnMgPGEgaHJlZj0ibWFpbHRvOmpvbkBjbGVhcmluay5jb20iPmpvbkBjbGVhcmluay5jb208L2E+Ci0gKiBAYXV0aG9yIFN0ZWZhbm8gTWF6em9jY2hpIDxhIGhyZWY9Im1haWx0bzpzdGVmYW5vQGFwYWNoZS5vcmciPnN0ZWZhbm9AYXBhY2hlLm9yZzwvYT4KLSAqIEBhdXRob3IgUGF0cmljayBDaGFuZXpvbiA8YSBocmVmPSJtYWlsdG86Y2hhbmV6b25AbmV0c2NhcGUuY29tIj5jaGFuZXpvbkBuZXRzY2FwZS5jb208L2E+Ci0gKiBAYXV0aG9yIEVybnN0IGRlIEhhYW4gPGEgaHJlZj0ibWFpbHRvOmVybnN0QGpvbGxlbS5jb20iPmVybnN0QGpvbGxlbS5jb208L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEphdmFkb2MgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHB1YmxpYyBjbGFzcyBEb2NsZXRQYXJhbSB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBEb2NsZXRJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBQYXRoIHBhdGg7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFZlY3RvciBwYXJhbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoUGF0aCBwYXRoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5wYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhdGguYXBwZW5kKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXRoOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgUGF0aCBjcmVhdGVQYXRoKCkgewotICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBhdGguY3JlYXRlUGF0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBDTEFTU1BBVEggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgICAgICBjcmVhdGVQYXRoKCkuc2V0UmVmaWQocik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRG9jbGV0UGFyYW0gY3JlYXRlUGFyYW0oKSB7Ci0gICAgICAgICAgICBEb2NsZXRQYXJhbSBwYXJhbSA9IG5ldyBEb2NsZXRQYXJhbSgpOwotICAgICAgICAgICAgcGFyYW1zLmFkZEVsZW1lbnQocGFyYW0pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1zLmVsZW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhY2thZ2VOYW1lIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU291cmNlRmlsZSB7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEh0bWwgewotICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0KSB7Ci0gICAgICAgICAgICB0ZXh0LmFwcGVuZCh0KTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBY2Nlc3NUeXBlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICAvLyBQcm90ZWN0ZWQgZmlyc3Qgc28gaWYgYW55IEdVSSB0b29sIG9mZmVycyBhIGRlZmF1bHQKLSAgICAgICAgICAgIC8vIGJhc2VkIG9uIGVudW0gIzAsIGl0IHdpbGwgYmUgcmlnaHQuCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsicHJvdGVjdGVkIiwgInB1YmxpYyIsICJwYWNrYWdlIiwgInByaXZhdGUifTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBqYXZhZG9jMSA9IAotICAgICAgICAoUHJvamVjdC5nZXRKYXZhVmVyc2lvbigpID09IFByb2plY3QuSkFWQV8xXzEpOwotCi0KLSAgICBwcml2YXRlIHZvaWQgYWRkQXJnSWYoYm9vbGVhbiBiLCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIGlmIChiKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShhcmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZDEyQXJnSWZOb3RFbXB0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFqYXZhZG9jMSkgewotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGtleSk7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZyh0aGlzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogTGVhdmluZyBvdXQgZW1wdHkgYXJndW1lbnQgJyIgKyBrZXkgKyAiJyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGQxMUFyZ0lmKGJvb2xlYW4gYiwgU3RyaW5nIGFyZykgewotICAgICAgICBpZiAoamF2YWRvYzEgJiYgYikgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGQxMkFyZ0lmKGJvb2xlYW4gYiwgU3RyaW5nIGFyZykgewotICAgICAgICBpZiAoIWphdmFkb2MxICYmIGIpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZm91bmRKYXZhRmlsZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOwotICAgIHByaXZhdGUgUGF0aCBzb3VyY2VQYXRoID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgZGVzdERpciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBWZWN0b3Igc291cmNlRmlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgcGFja2FnZU5hbWVzID0gbmV3IFZlY3Rvcig1KTsKLSAgICBwcml2YXRlIFZlY3RvciBleGNsdWRlUGFja2FnZU5hbWVzID0gbmV3IFZlY3RvcigxKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gYXV0aG9yID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gdmVyc2lvbiA9IHRydWU7Ci0gICAgcHJpdmF0ZSBEb2NsZXRJbmZvIGRvY2xldCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQYXRoIGJvb3RjbGFzc3BhdGggPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwID0gbnVsbDsKLSAgICBwcml2YXRlIFZlY3RvciBjb21waWxlTGlzdCA9IG5ldyBWZWN0b3IoMTApOwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VMaXN0ID0gbnVsbDsKLSAgICBwcml2YXRlIFZlY3RvciBsaW5rcyA9IG5ldyBWZWN0b3IoMik7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZ3JvdXBzID0gbmV3IFZlY3RvcigyKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzID0gdHJ1ZTsKLSAgICBwcml2YXRlIEh0bWwgZG9jdGl0bGUgPSBudWxsOwotICAgIHByaXZhdGUgSHRtbCBoZWFkZXIgPSBudWxsOwotICAgIHByaXZhdGUgSHRtbCBmb290ZXIgPSBudWxsOwotICAgIHByaXZhdGUgSHRtbCBib3R0b20gPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VFeHRlcm5hbEZpbGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIEZpbGUgdG1wTGlzdCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrIGFyb3VuZCBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0IGJ5IHVzaW5nIGFuIGV4dGVybmFsIGZpbGUKLSAgICAgKiBmb3IgdGhlIHNvdXJjZWZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZUV4dGVybmFsRmlsZShib29sZWFuIGIpIHsKLSAgICAgICAgaWYgKCFqYXZhZG9jMSkgewotICAgICAgICAgICAgdXNlRXh0ZXJuYWxGaWxlID0gYjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIHVzZURlZmF1bHRFeGNsdWRlcyAidHJ1ZSJ8Im9uInwieWVzIiB3aGVuIGRlZmF1bHQgZXhjbHVzaW9ucyAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkLCAiZmFsc2UifCJvZmYifCJubyIgd2hlbiB0aGV5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRuJ3QgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0ZXhjbHVkZXMoYm9vbGVhbiB1c2VEZWZhdWx0RXhjbHVkZXMpIHsKLSAgICAgICB0aGlzLnVzZURlZmF1bHRFeGNsdWRlcyA9IHVzZURlZmF1bHRFeGNsdWRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhtZW1vcnkoU3RyaW5nIG1heCl7Ci0gICAgICAgIGlmKGphdmFkb2MxKXsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItSi1teCIgKyBtYXgpOwotICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLUotWG14IiArIG1heCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFscGFyYW0oU3RyaW5nIGFkZCl7Ci0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUoYWRkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlcGF0aChQYXRoIHNyYykgewotICAgICAgICBpZiAoc291cmNlUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzb3VyY2VQYXRoID0gc3JjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc291cmNlUGF0aC5hcHBlbmQoc3JjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVTb3VyY2VwYXRoKCkgewotICAgICAgICBpZiAoc291cmNlUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzb3VyY2VQYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvdXJjZVBhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBDTEFTU1BBVEggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVTb3VyY2VwYXRoKCkuc2V0UmVmaWQocik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGRpcikgewotICAgICAgICBkZXN0RGlyID0gZGlyOwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWQiKTsKLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShkZXN0RGlyKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0U291cmNlZmlsZXMoU3RyaW5nIHNyYykgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihzcmMsICIsIik7Ci0gICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZiA9IHRvay5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIFNvdXJjZUZpbGUgc2YgPSBuZXcgU291cmNlRmlsZSgpOwotICAgICAgICAgICAgc2Yuc2V0RmlsZShwcm9qZWN0LnJlc29sdmVGaWxlKGYpKTsKLSAgICAgICAgICAgIGFkZFNvdXJjZShzZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgYWRkU291cmNlKFNvdXJjZUZpbGUgc2YpIHsKLSAgICAgICAgc291cmNlRmlsZXMuYWRkRWxlbWVudChzZik7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VuYW1lcyhTdHJpbmcgc3JjKSB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNyYywgIiwiKTsKLSAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwID0gdG9rLm5leHRUb2tlbigpOwotICAgICAgICAgICAgUGFja2FnZU5hbWUgcG4gPSBuZXcgUGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgIHBuLnNldE5hbWUocCk7Ci0gICAgICAgICAgICBhZGRQYWNrYWdlKHBuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlKFBhY2thZ2VOYW1lIHBuKSB7Ci0gICAgICAgIHBhY2thZ2VOYW1lcy5hZGRFbGVtZW50KHBuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlUGFja2FnZU5hbWVzKFN0cmluZyBzcmMpIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3JjLCAiLCIpOwotICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHAgPSB0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICBQYWNrYWdlTmFtZSBwbiA9IG5ldyBQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgcG4uc2V0TmFtZShwKTsKLSAgICAgICAgICAgIGFkZEV4Y2x1ZGVQYWNrYWdlKHBuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeGNsdWRlUGFja2FnZShQYWNrYWdlTmFtZSBwbikgewotICAgICAgICBleGNsdWRlUGFja2FnZU5hbWVzLmFkZEVsZW1lbnQocG4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJ2aWV3KEZpbGUgZikgewotICAgICAgICBpZiAoIWphdmFkb2MxKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW92ZXJ2aWV3Iik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGYpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFB1YmxpYyhib29sZWFuIGIpIHsKLSAgICAgICAgYWRkQXJnSWYoYiwgIi1wdWJsaWMiKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvdGVjdGVkKGJvb2xlYW4gYikgewotICAgICAgICBhZGRBcmdJZihiLCAiLXByb3RlY3RlZCIpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKGJvb2xlYW4gYikgewotICAgICAgICBhZGRBcmdJZihiLCAiLXBhY2thZ2UiKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJpdmF0ZShib29sZWFuIGIpIHsKLSAgICAgICAgYWRkQXJnSWYoYiwgIi1wcml2YXRlIik7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIGF0KSB7Ci0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItIiArIGF0LmdldFZhbHVlKCkpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2NsZXQoU3RyaW5nIHNyYykgewotICAgICAgICBpZiAoZG9jbGV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGRvY2xldCA9IG5ldyBEb2NsZXRJbmZvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9jbGV0LnNldE5hbWUoc3JjKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RG9jbGV0UGF0aChQYXRoIHNyYykgewotICAgICAgICBpZiAoZG9jbGV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGRvY2xldCA9IG5ldyBEb2NsZXRJbmZvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9jbGV0LnNldFBhdGgoc3JjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2NsZXRQYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGlmIChkb2NsZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgZG9jbGV0ID0gbmV3IERvY2xldEluZm8oKTsKLSAgICAgICAgfQotICAgICAgICBkb2NsZXQuY3JlYXRlUGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2NsZXRJbmZvIGNyZWF0ZURvY2xldCgpIHsKLSAgICAgICAgZG9jbGV0ID0gbmV3IERvY2xldEluZm8oKTsKLSAgICAgICAgcmV0dXJuIGRvY2xldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGQoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGFkZDEyQXJnSWYoYiwgIi0xLjEiKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggc3JjKSB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NwYXRoID0gc3JjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChzcmMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb290Y2xhc3NwYXRoKFBhdGggc3JjKSB7Ci0gICAgICAgIGlmIChib290Y2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGJvb3RjbGFzc3BhdGggPSBzcmM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib290Y2xhc3NwYXRoLmFwcGVuZChzcmMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUJvb3RjbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChib290Y2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGJvb3RjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYm9vdGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb290Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUJvb3RjbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRkaXJzKFN0cmluZyBzcmMpIHsKLSAgICAgICAgaWYgKCFqYXZhZG9jMSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1leHRkaXJzIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzcmMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGFkZDEyQXJnSWYoYiwgIi12ZXJib3NlIik7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShTdHJpbmcgc3JjKSB7Ci0gICAgICAgIGlmICghamF2YWRvYzEpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbG9jYWxlIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzcmMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmMpIHsKLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1lbmNvZGluZyIpOwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShlbmMpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGJvb2xlYW4gc3JjKSB7Ci0gICAgICAgIHZlcnNpb24gPSBzcmM7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFVzZShib29sZWFuIGIpIHsKLSAgICAgICAgYWRkMTJBcmdJZihiLCAiLXVzZSIpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRob3IoYm9vbGVhbiBzcmMpIHsKLSAgICAgICAgYXV0aG9yID0gc3JjOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRTcGxpdGluZGV4KGJvb2xlYW4gYikgewotICAgICAgICBhZGQxMkFyZ0lmKGIsICItc3BsaXRpbmRleCIpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3d0aXRsZShTdHJpbmcgc3JjKSB7Ci0gICAgICAgIGFkZDEyQXJnSWZOb3RFbXB0eSgiLXdpbmRvd3RpdGxlIiwgc3JjKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0RG9jdGl0bGUoU3RyaW5nIHNyYykgewotICAgICAgICBIdG1sIGggPSBuZXcgSHRtbCgpOwotICAgICAgICBoLmFkZFRleHQoc3JjKTsKLSAgICAgICAgYWRkRG9jdGl0bGUoaCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGFkZERvY3RpdGxlKEh0bWwgdGV4dCkgewotICAgICAgICBpZiAoIWphdmFkb2MxKSB7Ci0gICAgICAgICAgICBkb2N0aXRsZSA9IHRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBzcmMpIHsKLSAgICAgICAgSHRtbCBoID0gbmV3IEh0bWwoKTsKLSAgICAgICAgaC5hZGRUZXh0KHNyYyk7Ci0gICAgICAgIGFkZEhlYWRlcihoKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKEh0bWwgdGV4dCkgewotICAgICAgICBpZiAoIWphdmFkb2MxKSB7Ci0gICAgICAgICAgICBoZWFkZXIgPSB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9vdGVyKFN0cmluZyBzcmMpIHsKLSAgICAgICAgSHRtbCBoID0gbmV3IEh0bWwoKTsKLSAgICAgICAgaC5hZGRUZXh0KHNyYyk7Ci0gICAgICAgIGFkZEZvb3RlcihoKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgYWRkRm9vdGVyKEh0bWwgdGV4dCkgewotICAgICAgICBpZiAoIWphdmFkb2MxKSB7Ci0gICAgICAgICAgICBmb290ZXIgPSB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Qm90dG9tKFN0cmluZyBzcmMpIHsKLSAgICAgICAgSHRtbCBoID0gbmV3IEh0bWwoKTsKLSAgICAgICAgaC5hZGRUZXh0KHNyYyk7Ci0gICAgICAgIGFkZEJvdHRvbShoKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgYWRkQm90dG9tKEh0bWwgdGV4dCkgewotICAgICAgICBpZiAoIWphdmFkb2MxKSB7Ci0gICAgICAgICAgICBib3R0b20gPSB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGlua29mZmxpbmUoU3RyaW5nIHNyYykgewotICAgICAgICBpZiAoIWphdmFkb2MxKSB7Ci0gICAgICAgICAgICBMaW5rQXJndW1lbnQgbGUgPSBjcmVhdGVMaW5rKCk7Ci0gICAgICAgICAgICBsZS5zZXRPZmZsaW5lKHRydWUpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmtPZmZsaW5lRXJyb3IgPSAiVGhlIGxpbmtvZmZsaW5lIGF0dHJpYnV0ZSBtdXN0IGluY2x1ZGUgYSBVUkwgYW5kICIgKyAKLSAgICAgICAgICAgICAgICAiYSBwYWNrYWdlLWxpc3QgZmlsZSBsb2NhdGlvbiBzZXBhcmF0ZWQgYnkgYSBzcGFjZSI7Ci0gICAgICAgICAgICBpZiAoc3JjLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGxpbmtPZmZsaW5lRXJyb3IpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNyYywgIiAiLCBmYWxzZSk7Ci0gICAgICAgICAgICBsZS5zZXRIcmVmKHRvay5uZXh0VG9rZW4oKSk7Ci0KLSAgICAgICAgICAgIGlmICghdG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihsaW5rT2ZmbGluZUVycm9yKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBsZS5zZXRQYWNrYWdlbGlzdExvYyhwcm9qZWN0LnJlc29sdmVGaWxlKHRvay5uZXh0VG9rZW4oKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwKFN0cmluZyBzcmMpIHsKLSAgICAgICAgZ3JvdXAgPSBzcmM7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIHNyYykgewotICAgICAgICBpZiAoIWphdmFkb2MxKSB7Ci0gICAgICAgICAgICBjcmVhdGVMaW5rKCkuc2V0SHJlZihzcmMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVwcmVjYXRlZChib29sZWFuIGIpIHsKLSAgICAgICAgYWRkQXJnSWYoYiwgIi1ub2RlcHJlY2F0ZWQiKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0Tm9kZXByZWNhdGVkbGlzdChib29sZWFuIGIpIHsKLSAgICAgICAgYWRkMTJBcmdJZihiLCAiLW5vZGVwcmVjYXRlZGxpc3QiKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0Tm90cmVlKGJvb2xlYW4gYikgewotICAgICAgICBhZGRBcmdJZihiLCAiLW5vdHJlZSIpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXROb2luZGV4KGJvb2xlYW4gYikgewotICAgICAgICBhZGRBcmdJZihiLCAiLW5vaW5kZXgiKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0Tm9oZWxwKGJvb2xlYW4gYikgewotICAgICAgICBhZGQxMkFyZ0lmKGIsICItbm9oZWxwIik7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldE5vbmF2YmFyKGJvb2xlYW4gYikgewotICAgICAgICBhZGQxMkFyZ0lmKGIsICItbm9uYXZiYXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0U2VyaWFsd2Fybihib29sZWFuIGIpIHsKLSAgICAgICAgYWRkMTJBcmdJZihiLCAiLXNlcmlhbHdhcm4iKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldGZpbGUoRmlsZSBmKSB7Ci0gICAgICAgIGlmICghamF2YWRvYzEpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc3R5bGVzaGVldGZpbGUiKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0SGVscGZpbGUoRmlsZSBmKSB7Ci0gICAgICAgIGlmICghamF2YWRvYzEpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItaGVscGZpbGUiKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0RG9jZW5jb2RpbmcoU3RyaW5nIGVuYykgewotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRvY2VuY29kaW5nIik7Ci0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGVuYyk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VMaXN0KFN0cmluZyBzcmMpIHsKLSAgICAgICAgcGFja2FnZUxpc3QgPSBzcmM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaW5rQXJndW1lbnQgY3JlYXRlTGluaygpIHsKLSAgICAgICAgTGlua0FyZ3VtZW50IGxhID0gbmV3IExpbmtBcmd1bWVudCgpOwotICAgICAgICBsaW5rcy5hZGRFbGVtZW50KGxhKTsKLSAgICAgICAgcmV0dXJuIGxhOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgY2xhc3MgTGlua0FyZ3VtZW50IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaHJlZjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG9mZmxpbmUgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIHBhY2thZ2VsaXN0TG9jOwotICAgICAgICAKLSAgICAgICAgcHVibGljIExpbmtBcmd1bWVudCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyKSB7Ci0gICAgICAgICAgICBocmVmID0gaHI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLSAgICAgICAgICAgIHJldHVybiBocmVmOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlbGlzdExvYyhGaWxlIHNyYykgewotICAgICAgICAgICAgcGFja2FnZWxpc3RMb2MgPSBzcmM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldFBhY2thZ2VsaXN0TG9jKCkgewotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VsaXN0TG9jOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPZmZsaW5lKGJvb2xlYW4gb2ZmbGluZSkgewotICAgICAgICAgICAgdGhpcy5vZmZsaW5lID0gb2ZmbGluZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMaW5rT2ZmbGluZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBvZmZsaW5lOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBHcm91cEFyZ3VtZW50IGNyZWF0ZUdyb3VwKCkgewotICAgICAgICBHcm91cEFyZ3VtZW50IGdhID0gbmV3IEdyb3VwQXJndW1lbnQoKTsKLSAgICAgICAgZ3JvdXBzLmFkZEVsZW1lbnQoZ2EpOwotICAgICAgICByZXR1cm4gZ2E7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEdyb3VwQXJndW1lbnQgewotICAgICAgICBwcml2YXRlIEh0bWwgdGl0bGU7Ci0gICAgICAgIHByaXZhdGUgVmVjdG9yIHBhY2thZ2VzID0gbmV3IFZlY3RvcigzKTsKLQotICAgICAgICBwdWJsaWMgR3JvdXBBcmd1bWVudCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyBzcmMpIHsKLSAgICAgICAgICAgIEh0bWwgaCA9IG5ldyBIdG1sKCk7Ci0gICAgICAgICAgICBoLmFkZFRleHQoc3JjKTsKLSAgICAgICAgICAgIGFkZFRpdGxlKGgpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFRpdGxlKEh0bWwgdGV4dCkgewotICAgICAgICAgICAgdGl0bGUgPSB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aXRsZSAhPSBudWxsID8gdGl0bGUuZ2V0VGV4dCgpIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VzKFN0cmluZyBzcmMpIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNyYywgIiwiKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHAgPSB0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgUGFja2FnZU5hbWUgcG4gPSBuZXcgUGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBwbi5zZXROYW1lKHApOwotICAgICAgICAgICAgICAgIGFkZFBhY2thZ2UocG4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2UoUGFja2FnZU5hbWUgcG4pIHsKLSAgICAgICAgICAgIHBhY2thZ2VzLmFkZEVsZW1lbnQocG4pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlcygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBwID0gbmV3IFN0cmluZ0J1ZmZlciggIlwiIiApOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICggaSA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAuYXBwZW5kKCAiOiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcC5hcHBlbmQoIHBhY2thZ2VzLmVsZW1lbnRBdChpKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwLmFwcGVuZCggIlwiIiApOwotICAgICAgICAgICAgcmV0dXJuIHAudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFyc2V0KFN0cmluZyBzcmMpIHsKLSAgICAgICAgdGhpcy5hZGQxMkFyZ0lmTm90RW1wdHkoIi1jaGFyc2V0Iiwgc3JjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgdGhlIGJ1aWxkIHByb2Nlc3MgZmFpbCBpZiBqYXZhZG9jIGZhaWxzIChhcyBpbmRpY2F0ZWQgYnkKLSAgICAgKiBhIG5vbiB6ZXJvIHJldHVybiBjb2RlKT8KLSAgICAgKgotICAgICAqIDxwPkRlZmF1bHQgaXMgZmFsc2UuPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gYikgewotICAgICAgICBmYWlsT25FcnJvciA9IGI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgiamF2YWRvYzIiLmVxdWFscyh0YXNrVHlwZSkpIHsKLSAgICAgICAgICAgIGxvZygiISEgamF2YWRvYzIgaXMgZGVwcmVjYXRlZC4gVXNlIGphdmFkb2MgaW5zdGVhZC4gISEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2VQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAic291cmNlUGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nKCJHZW5lcmF0aW5nIEphdmFkb2MiLCBQcm9qZWN0Lk1TR19JTkZPKTsKLQotICAgICAgICBpZiAoZG9jdGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kb2N0aXRsZSIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZXhwYW5kKGRvY3RpdGxlLmdldFRleHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1oZWFkZXIiKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGV4cGFuZChoZWFkZXIuZ2V0VGV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvb3RlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWZvb3RlciIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZXhwYW5kKGZvb3Rlci5nZXRUZXh0KCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYm90dG9tICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYm90dG9tIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShleHBhbmQoYm90dG9tLmdldFRleHQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29tbWFuZGxpbmUgdG9FeGVjdXRlID0gKENvbW1hbmRsaW5lKWNtZC5jbG9uZSgpOwotCXRvRXhlY3V0ZS5zZXRFeGVjdXRhYmxlKCBnZXRKYXZhZG9jRXhlY3V0YWJsZU5hbWUoKSApOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2VuZXJhbCBqYXZhZG9jIGFyZ3VtZW50cwotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpCi0gICAgICAgICAgICBjbGFzc3BhdGggPSBQYXRoLnN5c3RlbUNsYXNzcGF0aDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY2xhc3NwYXRoID0gY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7Ci0KLSAgICAgICAgaWYgKCFqYXZhZG9jMSkgewotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc291cmNlcGF0aCIpOwotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChzb3VyY2VQYXRoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzb3VyY2VQYXRoLnRvU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpICsgY2xhc3NwYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZlcnNpb24gJiYgZG9jbGV0ID09IG51bGwpCi0gICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXZlcnNpb24iKTsKLSAgICAgICAgaWYgKGF1dGhvciAmJiBkb2NsZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYXV0aG9yIik7Ci0KLSAgICAgICAgaWYgKGphdmFkb2MxIHx8IGRvY2xldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJkZXN0RGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gamF2YWRvYzIgYXJndW1lbnRzIGZvciBkZWZhdWx0IGRvY2xldAotCi0vLyBYWFg6IGhvdyBkbyB3ZSBoYW5kbGUgYSBjdXN0b20gZG9jbGV0PwotCi0gICAgICAgIGlmICghamF2YWRvYzEpIHsKLSAgICAgICAgICAgIGlmIChkb2NsZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChkb2NsZXQuZ2V0TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZG9jbGV0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZG9jbGV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGRvY2xldC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZG9jbGV0LmdldFBhdGgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRvY2xldHBhdGgiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoZG9jbGV0LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZG9jbGV0LmdldFBhcmFtcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgRG9jbGV0UGFyYW0gcGFyYW0gPSAoRG9jbGV0UGFyYW0pZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEb2NsZXQgcGFyYW1ldGVycyBtdXN0IGhhdmUgYSBuYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHBhcmFtLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUocGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgaWYgKGJvb3RjbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYm9vdGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoYm9vdGNsYXNzcGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFkZCB0aGUgbGlua3MgYXJndW1lbnRzCi0gICAgICAgICAgICBpZiAobGlua3Muc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBsaW5rcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlua0FyZ3VtZW50IGxhID0gKExpbmtBcmd1bWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChsYS5nZXRIcmVmKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJMaW5rcyBtdXN0IHByb3ZpZGUgdGhlIFVSTCB0byB0aGUgZXh0ZXJuYWwgY2xhc3MgZG9jdW1lbnRhdGlvbi4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAobGEuaXNMaW5rT2ZmbGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHBhY2thZ2VMaXN0TG9jYXRpb24gPSBsYS5nZXRQYWNrYWdlbGlzdExvYygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VMaXN0TG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHBhY2thZ2UgbGlzdCBsb2NhdGlvbiBmb3IgbGluayAiICsgbGEuZ2V0SHJlZigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtdXN0IGJlIHByb3ZpZGVkIGJlY2F1c2UgdGhlIGxpbmsgaXMgb2ZmbGluZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBwYWNrYWdlTGlzdCA9IG5ldyBGaWxlKHBhY2thZ2VMaXN0TG9jYXRpb24sICJwYWNrYWdlLWxpc3QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTGlzdC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbGlua29mZmxpbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShsYS5nZXRIcmVmKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHBhY2thZ2VMaXN0TG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBObyBwYWNrYWdlIGxpc3Qgd2FzIGZvdW5kIGF0ICIgKyBwYWNrYWdlTGlzdExvY2F0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWxpbmsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGxhLmdldEhyZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYWRkIHRoZSBzaW5nbGUgZ3JvdXAgYXJndW1lbnRzCi0gICAgICAgICAgICAvLyBKYXZhZG9jIDEuMiBydWxlczoKLSAgICAgICAgICAgIC8vICAgTXVsdGlwbGUgLWdyb3VwIGFyZ3MgYWxsb3dlZC4KLSAgICAgICAgICAgIC8vICAgRWFjaCBhcmcgaW5jbHVkZXMgMyBzdHJpbmdzOiAtZ3JvdXAgW25hbWVdIFtwYWNrYWdlbGlzdF0uCi0gICAgICAgICAgICAvLyAgIEVsZW1lbnRzIGluIFtwYWNrYWdlbGlzdF0gYXJlIGNvbG9uLWRlbGltaXRlZC4KLSAgICAgICAgICAgIC8vICAgQW4gZWxlbWVudCBpbiBbcGFja2FnZWxpc3RdIG1heSBlbmQgd2l0aCB0aGUgKiB3aWxkY2FyZC4KLQotICAgICAgICAgICAgLy8gQW50IGphdmFkb2MgdGFzayBydWxlcyBmb3IgZ3JvdXAgYXR0cmlidXRlOgotICAgICAgICAgICAgLy8gICBBcmdzIGFyZSBjb21tYS1kZWxpbWl0ZWQuCi0gICAgICAgICAgICAvLyAgIEVhY2ggYXJnIGlzIDIgc3BhY2UtZGVsaW1pdGVkIHN0cmluZ3MuCi0gICAgICAgICAgICAvLyAgIEUuZy4sIGdyb3VwPSJYU0xUX1BhY2thZ2VzIG9yZy5hcGFjaGUueGFsYW4ueHNsdCosWFBhdGhfUGFja2FnZXMgb3JnLmFwYWNoZS54YWxhbi54cGF0aCoiCi0gICAgICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdyb3VwLCAiLCIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JwID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNwYWNlID0gZ3JwLmluZGV4T2YoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNwYWNlID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdycC5zdWJzdHJpbmcoMCwgc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBrZ0xpc3QgPSBncnAuc3Vic3RyaW5nKHNwYWNlICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWdyb3VwIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHBrZ0xpc3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBhZGQgdGhlIGdyb3VwIGFyZ3VtZW50cwotICAgICAgICAgICAgaWYgKGdyb3Vwcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGdyb3Vwcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgR3JvdXBBcmd1bWVudCBnYSA9IChHcm91cEFyZ3VtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gZ2EuZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VzID0gZ2EuZ2V0UGFja2FnZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlID09IG51bGwgfHwgcGFja2FnZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgdGl0bGUgYW5kIHBhY2thZ2VzIG11c3QgYmUgc3BlY2lmaWVkIGZvciBncm91cCBlbGVtZW50cy4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWdyb3VwIik7Ci0gICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGV4cGFuZCh0aXRsZSkpOwotICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShwYWNrYWdlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICB0bXBMaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBWZWN0b3IgcGFja2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gcGFja2FnZU5hbWVzLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFBhY2thZ2VOYW1lIHBuID0gKFBhY2thZ2VOYW1lKSBlbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwbi5nZXROYW1lKCkudHJpbSgpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLmFkZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBWZWN0b3IgZXhjbHVkZVBhY2thZ2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgaWYgKGV4Y2x1ZGVQYWNrYWdlTmFtZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGVudW0gPSBleGNsdWRlUGFja2FnZU5hbWVzLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFja2FnZU5hbWUgcG4gPSAoUGFja2FnZU5hbWUpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVBhY2thZ2VzLmFkZEVsZW1lbnQocG4uZ2V0TmFtZSgpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhY2thZ2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBldmFsdWF0ZVBhY2thZ2VzKHRvRXhlY3V0ZSwgc291cmNlUGF0aCwgcGFja2FnZXMsIGV4Y2x1ZGVQYWNrYWdlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlRmlsZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgUHJpbnRXcml0ZXIgc3JjTGlzdFdyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV3JpdGUgc291cmNlZmlsZXMgdG8gYSB0ZW1wb3JhcnkgZmlsZSBpZiByZXF1ZXN0ZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHVzZUV4dGVybmFsRmlsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodG1wTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBMaXN0ID0gY3JlYXRlVGVtcEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJAIiArIHRtcExpc3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNyY0xpc3RXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIodG1wTGlzdC5nZXRBYnNvbHV0ZVBhdGgoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBzb3VyY2VGaWxlcy5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNvdXJjZUZpbGUgc2YgPSAoU291cmNlRmlsZSkgZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlRmlsZU5hbWUgPSBzZi5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VFeHRlcm5hbEZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0xpc3RXcml0ZXIucHJpbnRsbihzb3VyY2VGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzb3VyY2VGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY0xpc3RXcml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzcmNMaXN0V3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhY2thZ2VMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJAIiArIHBhY2thZ2VMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBsb2coIkphdmFkb2MgYXJnczogIiArIHRvRXhlY3V0ZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgbG9nKCJKYXZhZG9jIGV4ZWN1dGlvbiIsIFByb2plY3QuTVNHX0lORk8pOwotCi0gICAgICAgIEphdmFkb2NPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEphdmFkb2NPdXRwdXRTdHJlYW0oUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgIEphdmFkb2NPdXRwdXRTdHJlYW0gZXJyID0gbmV3IEphdmFkb2NPdXRwdXRTdHJlYW0oUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUobmV3IFB1bXBTdHJlYW1IYW5kbGVyKG91dCwgZXJyKSk7Ci0gICAgICAgIGV4ZS5zZXRBbnRSdW4ocHJvamVjdCk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBObyByZWFzb24gdG8gY2hhbmdlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhcyBhbGwgZmlsZW5hbWVzIGFuZAotICAgICAgICAgKiBwYXRoIGNvbXBvbmVudHMgaGF2ZSBiZWVuIHJlc29sdmVkIGFscmVhZHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEF2b2lkIHByb2JsZW1zIHdpdGggY29tbWFuZCBsaW5lIGxlbmd0aCBpbiBzb21lIGVudmlyb25tZW50cy4KLSAgICAgICAgICovCi0gICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KG51bGwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKHRvRXhlY3V0ZS5nZXRDb21tYW5kbGluZSgpKTsKLSAgICAgICAgICAgIGludCByZXQgPSBleGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgaWYgKHJldCAhPSAwICYmIGZhaWxPbkVycm9yKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJKYXZhZG9jIHJldHVybmVkICIrcmV0LCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSmF2YWRvYyBmYWlsZWQ6ICIgKyBlLCBlLCBsb2NhdGlvbik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0KLSAgICAgICAgICAgIGlmICh0bXBMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0bXBMaXN0LmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIHRtcExpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBvdXQubG9nRmx1c2goKTsKLSAgICAgICAgICAgIGVyci5sb2dGbHVzaCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBlcnIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIHNvdXJjZSBwYXRoLCBhIGxpc3Qgb2YgcGFja2FnZSBwYXR0ZXJucywgZmlsbCB0aGUgZ2l2ZW4gbGlzdAotICAgICAqIHdpdGggdGhlIHBhY2thZ2VzIGZvdW5kIGluIHRoYXQgcGF0aCBzdWJkaXJzIG1hdGNoaW5nIG9uZSBvZiB0aGUgZ2l2ZW4KLSAgICAgKiBwYXR0ZXJucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZXZhbHVhdGVQYWNrYWdlcyhDb21tYW5kbGluZSB0b0V4ZWN1dGUsIFBhdGggc291cmNlUGF0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIHBhY2thZ2VzLCBWZWN0b3IgZXhjbHVkZVBhY2thZ2VzKSB7Ci0gICAgICAgIGxvZygiU291cmNlIHBhdGggPSAiICsgc291cmNlUGF0aC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlBhY2thZ2VzID0gIik7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxwYWNrYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnLmFwcGVuZChwYWNrYWdlcy5lbGVtZW50QXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIGxvZyhtc2cudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgbXNnLnNldExlbmd0aCgwKTsKLSAgICAgICAgbXNnLmFwcGVuZCgiRXhjbHVkZSBQYWNrYWdlcyA9ICIpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXhjbHVkZVBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cuYXBwZW5kKGV4Y2x1ZGVQYWNrYWdlcy5lbGVtZW50QXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIGxvZyhtc2cudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgVmVjdG9yIGFkZGVkUGFja2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgU3RyaW5nW10gbGlzdCA9IHNvdXJjZVBhdGgubGlzdCgpOwotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSBsaXN0ID0gbmV3IFN0cmluZ1swXTsKLQotICAgICAgICBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgZnMuc2V0RGVmYXVsdGV4Y2x1ZGVzKHVzZURlZmF1bHRFeGNsdWRlcyk7Ci0KLSAgICAgICAgRW51bWVyYXRpb24gZSA9IHBhY2thZ2VzLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGtnID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwa2cgPSBwa2cucmVwbGFjZSgnLicsJy8nKTsKLSAgICAgICAgICAgIGlmIChwa2cuZW5kc1dpdGgoIioiKSkgewotICAgICAgICAgICAgICAgIHBrZyArPSAiKiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZzLmNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKHBrZyk7Ci0gICAgICAgIH0gLy8gd2hpbGUKLQotICAgICAgICBlID0gZXhjbHVkZVBhY2thZ2VzLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGtnID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwa2cgPSBwa2cucmVwbGFjZSgnLicsJy8nKTsKLSAgICAgICAgICAgIGlmIChwa2cuZW5kc1dpdGgoIioiKSkgewotICAgICAgICAgICAgICAgIHBrZyArPSAiKiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZzLmNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKHBrZyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFByaW50V3JpdGVyIHBhY2thZ2VMaXN0V3JpdGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh1c2VFeHRlcm5hbEZpbGUpIHsKLSAgICAgICAgICAgICAgICB0bXBMaXN0ID0gY3JlYXRlVGVtcEZpbGUoKTsKLSAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiQCIgKyB0bXBMaXN0LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBwYWNrYWdlTGlzdFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcih0bXBMaXN0KSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPGxpc3QubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBGaWxlIHNvdXJjZSA9IHByb2plY3QucmVzb2x2ZUZpbGUobGlzdFtqXSk7Ci0gICAgICAgICAgICAgICAgZnMuc2V0RGlyKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFja2FnZURpcnMgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHBhY2thZ2VEaXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgcGQgPSBuZXcgRmlsZShzb3VyY2UsIHBhY2thZ2VEaXJzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBwZC5saXN0KG5ldyBGaWxlbmFtZUZpbHRlciAoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyMSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi5qYXZhIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsJLy8gaWdub3JlIGRpcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnRGlyID0gcGFja2FnZURpcnNbaV0ucmVwbGFjZSgnLycsJy4nKS5yZXBsYWNlKCdcXCcsJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkZWRQYWNrYWdlcy5jb250YWlucyhwa2dEaXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUV4dGVybmFsRmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTGlzdFdyaXRlci5wcmludGxuKHBrZ0Rpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUocGtnRGlyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRQYWNrYWdlcy5hZGRFbGVtZW50KHBrZ0Rpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgdGVtcG9yYXJ5IGZpbGUiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb2V4LCBsb2NhdGlvbik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocGFja2FnZUxpc3RXcml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhY2thZ2VMaXN0V3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEphdmFkb2NPdXRwdXRTdHJlYW0gZXh0ZW5kcyBMb2dPdXRwdXRTdHJlYW0gewotICAgICAgICBKYXZhZG9jT3V0cHV0U3RyZWFtKGludCBsZXZlbCkgewotICAgICAgICAgICAgc3VwZXIoSmF2YWRvYy50aGlzLCBsZXZlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBPdmVycmlkZSB0aGUgbG9nZ2luZyBvZiBvdXRwdXQgaW4gb3JkZXIgdG8gZmlsdGVyIG91dCBHZW5lcmF0aW5nCi0gICAgICAgIC8vIG1lc3NhZ2VzLiAgR2VuZXJhdGluZyBtZXNzYWdlcyBhcmUgc2V0IHRvIGEgcHJpb3JpdHkgb2YgVkVSQk9TRQotICAgICAgICAvLyB1bmxlc3MgdGhleSBhcHBlYXIgYWZ0ZXIgd2hhdCBjb3VsZCBiZSBhbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuCi0gICAgICAgIC8vCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXVlZExpbmUgPSBudWxsOwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGluZShTdHJpbmcgbGluZSwgaW50IG1lc3NhZ2VMZXZlbCkgewotICAgICAgICAgICAgaWYgKG1lc3NhZ2VMZXZlbCA9PSBQcm9qZWN0Lk1TR19JTkZPICYmIGxpbmUuc3RhcnRzV2l0aCgiR2VuZXJhdGluZyAiKSkgewotICAgICAgICAgICAgICAgIGlmIChxdWV1ZWRMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIucHJvY2Vzc0xpbmUocXVldWVkTGluZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHF1ZXVlZExpbmUgPSBsaW5lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocXVldWVkTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIkJ1aWxkaW5nICIpKQotICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIucHJvY2Vzc0xpbmUocXVldWVkTGluZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnByb2Nlc3NMaW5lKHF1ZXVlZExpbmUsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgICAgICAgICBxdWV1ZWRMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3VwZXIucHJvY2Vzc0xpbmUobGluZSwgbWVzc2FnZUxldmVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBsb2dGbHVzaCgpIHsKLSAgICAgICAgICAgIGlmIChxdWV1ZWRMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5wcm9jZXNzTGluZShxdWV1ZWRMaW5lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICBxdWV1ZWRMaW5lID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBleHBhbmQgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4cGFuZChTdHJpbmcgY29udGVudCkgewotICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlci5yZXBsYWNlUHJvcGVydGllcyhwcm9qZWN0LCBjb250ZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlVGVtcEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZSgiamF2YWRvYyIgKyAobmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpLm5leHRMb25nKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEphdmFkb2NFeGVjdXRhYmxlTmFtZSgpCi0gICAgewotCS8vIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGV4dGVuc2lvbiBjYXNlIC0gZXhlIGZvciB3aW5kb3dzIGFuZCBPUy8yLCAKLSAgICAgICAgLy8gbm90aGluZyBmb3IgKm5peC4KLSAgICAgICAgU3RyaW5nIG9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgYm9vbGVhbiBkb3NCYXNlZCA9IAotICAgICAgICAgICAgb3MuaW5kZXhPZigid2luZG93cyIpID49IDAgfHwgb3MuaW5kZXhPZigib3MvMiIpID49IDA7Ci0JU3RyaW5nIGV4dGVuc2lvbiA9ICBkb3NCYXNlZD8gIi5leGUiIDogIiI7Ci0KLQkvLyBMb29rIGZvciBqYXZhZG9jIGluIHRoZSBqYXZhLmhvbWUvLi4vYmluIGRpcmVjdG9yeS4gIFVuZm9ydHVuYXRlbHkKLQkvLyBvbiBXaW5kb3dzIGphdmEuaG9tZSBkb2Vzbid0IGFsd2F5cyByZWZlciB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiwgCi0JLy8gc28gd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gYXNzdW1pbmcgamF2YWRvYyBpcyBzb21ld2hlcmUgb24gdGhlCi0JLy8gUEFUSC4KLQlGaWxlIGpkb2NFeGVjdXRhYmxlID0gbmV3IEZpbGUoIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKwotCQkiLy4uL2Jpbi9qYXZhZG9jIiArIGV4dGVuc2lvbiApOwotCi0JaWYgKGpkb2NFeGVjdXRhYmxlLmV4aXN0cygpKQotCXsKLQkgICAgcmV0dXJuIGpkb2NFeGVjdXRhYmxlLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQllbHNlCi0JewotCSAgICBsb2coICJVbmFibGUgdG8gbG9jYXRlICIgKyBqZG9jRXhlY3V0YWJsZS5nZXRBYnNvbHV0ZVBhdGgoKSArCi0JCSAgICAiLiBVc2luZyBcImphdmFkb2NcIiBpbnN0ZWFkLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UgKTsKLQkgICAgcmV0dXJuICJqYXZhZG9jIjsKLQl9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmlrZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ppa2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDQ2ZjUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmlrZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYSBKaWtlcyBjb21waWxlciwgYnkKLSAqIGRpcmVjdGx5IGV4ZWN1dGluZyBhbiBleHRlcm5hbCBwcm9jZXNzLgotICogQGF1dGhvciBza2FudGhha0BtdWVobGhlaW0uZGUKLSAqIEBkZXByZWNhdGVkIG1lcmdlZCBpbnRvIHRoZSBjbGFzcyBKYXZhYy4KLSAqLwotcHVibGljIGNsYXNzIEppa2VzIHsKLSAgICBwcm90ZWN0ZWQgSmlrZXNPdXRwdXRQYXJzZXIgam9wOwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tbWFuZDsKLSAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBKaWtlcyBvYmVjdC4KLSAgICAgKiBAcGFyYW0gam9wIC0gUGFyc2VyIHRvIHNlbmQgamlrZSdzIG91dHB1dCB0bwotICAgICAqIEBwYXJhbSBjb21tYW5kIC0gbmFtZSBvZiBqaWtlcyBleGVjdXRlYWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBKaWtlcyhKaWtlc091dHB1dFBhcnNlciBqb3AsU3RyaW5nIGNvbW1hbmQsIFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmpvcCA9IGpvcDsKLSAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyB0aGUgY29tcGlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLgotICAgICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHRvIHBhc3MgdG8gcHJvY2VzcyBvbiBjb21tYW5kIGxpbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21waWxlKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY29tbWFuZEFycmF5ID0gbnVsbDsKLSAgICAgICAgRmlsZSB0bXBGaWxlID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG15b3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQotICAgICAgICAgICAgLy8gV2luZG93cyBoYXMgYSAzMmsgbGltaXQgb24gdG90YWwgYXJnIHNpemUsIHNvCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBhbGwgdGhlIGFyZ3VtZW50cwotCi0gICAgICAgICAgICAvLyBUaGVyZSBoYXZlIGJlZW4gcmVwb3J0cyB0aGF0IDMwMCBmaWxlcyBjb3VsZCBiZSBjb21waWxlZAotICAgICAgICAgICAgLy8gc28gMjUwIGlzIGEgY29uc2VydmF0aXZlIGFwcHJvYWNoCi0gICAgICAgICAgICBpZiAobXlvcy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndpbmRvd3MiKSA+PSAwIAotICAgICAgICAgICAgICAgICYmIGFyZ3MubGVuZ3RoID4gMjUwKSB7Ci0gICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0bXBGaWxlID0gbmV3IEZpbGUoImppa2VzIisobmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpLm5leHRMb25nKCkpOwotICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIodG1wRmlsZSkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGFyZ3NbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kQXJyYXkgPSBuZXcgU3RyaW5nW10geyBjb21tYW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkAiICsgdG1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX07Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIiwgZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkge291dC5jbG9zZSgpO30gY2F0Y2ggKFRocm93YWJsZSB0KSB7fQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kQXJyYXkgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoKzFdOwotICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheVswXSA9IGNvbW1hbmQ7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcmdzLDAsY29tbWFuZEFycmF5LDEsYXJncy5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBXZSBhc3N1bWUsIHRoYXQgZXZlcnl0aGluZyBqaWtlcyB3cml0ZXMgZ29lcyB0bwotICAgICAgICAgICAgLy8gc3RhbmRhcmQgb3V0cHV0LCBub3QgdG8gc3RhbmRhcmQgZXJyb3IuIFRoZSBvcHRpb24KLSAgICAgICAgICAgIC8vIC1Yc3Rkb3V0IHRoYXQgaXMgZ2l2ZW4gdG8gSmlrZXMgaW4gSmF2YWMuZG9KaWtlc0NvbXBpbGUoKQotICAgICAgICAgICAgLy8gc2hvdWxkIGd1YXJhbnRlZSB0aGlzLiBBdCBsZWFzdCBJIGhvcGUgc28uIDopCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUoam9wKTsKLSAgICAgICAgICAgICAgICBleGUuc2V0QW50UnVuKHByb2plY3QpOwotICAgICAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KHByb2plY3QuZ2V0QmFzZURpcigpKTsKLSAgICAgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY29tbWFuZEFycmF5KTsKLSAgICAgICAgICAgICAgICBleGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgcnVubmluZyBKaWtlcyBjb21waWxlciIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHRtcEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KaWtlc091dHB1dFBhcnNlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmlrZXNPdXRwdXRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5MTY0My4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KaWtlc091dHB1dFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLSAgICAKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogUGFyc2VzIG91dHB1dCBmcm9tIGppa2VzIGFuZAotICogcGFzc2VzIGVycm9ycyBhbmQgd2FybmluZ3MKLSAqIGludG8gdGhlIHJpZ2h0IGxvZ2dpbmcgY2hhbm5lbHMgb2YgUHJvamVjdC4KLSAqCi0gKiBUT0RPOiAKLSAqIFBhcnNpbmcgY291bGQgYmUgbXVjaCBiZXR0ZXIKLSAqIEBhdXRob3Igc2thbnRoYWtAbXVlaGxoZWltLmRlCi0gKiBAZGVwcmVjYXRlZCB1c2UgSmlrZXMnIGV4aXQgdmFsdWUgdG8gZGV0ZWN0IGNvbXBpbGF0aW9uIGZhaWx1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKaWtlc091dHB1dFBhcnNlciBpbXBsZW1lbnRzIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHsKLSAgICBwcm90ZWN0ZWQgVGFzayB0YXNrOwotICAgIHByb3RlY3RlZCBib29sZWFuIGVycm9yRmxhZyA9IGZhbHNlOyAvLyBubyBlcnJvcnMgc28gZmFyCi0gICAgcHJvdGVjdGVkIGludCBlcnJvcnMsd2FybmluZ3M7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbWFjc01vZGU7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIGJyOwotCi0gICAgLyoqCi0gICAgICogSWdub3JlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NJbnB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBJZ25vcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKElucHV0U3RyZWFtIGlzKSB7fQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnB1dHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NPdXRwdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgcGFyc2VPdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBwYXJzZU91dHB1dChicik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWdub3JlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7fQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFBhcnNlciBvYmplY3QKLSAgICAgKiBAcGFyYW0gdGFzayAtIHRhc2sgaW4gd2hpY2hzIGNvbnRleHQgd2UgYXJlIGNhbGxlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBKaWtlc091dHB1dFBhcnNlcihUYXNrIHRhc2ssIGJvb2xlYW4gZW1hY3NNb2RlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMudGFzayA9IHRhc2s7Ci0gICAgICAgIHRoaXMuZW1hY3NNb2RlID0gZW1hY3NNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBvdXRwdXQgb2YgYSBqaWtlcyBjb21waWxlcgotICAgICAqIEBwYXJhbSByZWFkZXIgLSBSZWFkZXIgdXNlZCB0byByZWFkIGppa2VzJ3Mgb3V0cHV0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VPdXRwdXQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgIGlmIChlbWFjc01vZGUpCi0gICAgICAgICAgIHBhcnNlRW1hY3NPdXRwdXQocmVhZGVyKTsKLSAgICAgICBlbHNlCi0gICAgICAgICAgIHBhcnNlU3RhbmRhcmRPdXRwdXQocmVhZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VTdGFuZGFyZE91dHB1dChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBTdHJpbmcgbG93ZXI7Ci0gICAgICAgIC8vIFdlIGFzc3VtZSwgdGhhdCBldmVyeSBvdXRwdXQsIGppa2UgZG9lcywgc3RhbmRzIGZvciBhbiBlcnJvci93YXJuaW5nCi0gICAgICAgIC8vIFhYWCAKLSAgICAgICAgLy8gSXMgdGhpcyBjb3JyZWN0PwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzoKLSAgICAgICAgLy8gQSB3YXJuaW5nIGxpbmUsIHRoYXQgc2hvd3MgY29kZSwgd2hpY2ggY29udGFpbnMgYSB2YXJpYWJsZQotICAgICAgICAvLyBlcnJvciB3aWxsIGNhdXNlIHNvbWUgdHJvdWJsZS4gVGhlIHBhcnNlciBzaG91bGQgZGVmaW5pdGVseQotICAgICAgICAvLyBiZSBtdWNoIGJldHRlci4KLQotICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgbG93ZXIgPSBsaW5lLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAobGluZS50cmltKCkuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChsb3dlci5pbmRleE9mKCJlcnJvciIpICE9IC0xKQotICAgICAgICAgICAgICAgIHNldEVycm9yKHRydWUpOwotICAgICAgICAgICAgZWxzZSBpZiAobG93ZXIuaW5kZXhPZigid2FybmluZyIpICE9IC0xKQotICAgICAgICAgICAgICAgIHNldEVycm9yKGZhbHNlKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgdGhlIHR5cGUgb2YgdGhlIGxpbmUKLSAgICAgICAgICAgICAgICAvLyBhbmQgd2UgYXJlIGluIGVtYWNzIG1vZGUsIGl0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAvLyBhbiBlcnJvciwgYmVjYXVzZSBpbiB0aGlzIG1vZGUsIGppa2VzIHdvbid0Ci0gICAgICAgICAgICAgICAgLy8gYWx3YXlzIHByaW50ICJlcnJvciIsIGJ1dCBzb21ldGltZXMgb3RoZXIKLSAgICAgICAgICAgICAgICAvLyBrZXl3b3JkcyBsaWtlICJTeW50YXgiLiBXZSBzaG91bGQgbG9vayBmb3IKLSAgICAgICAgICAgICAgICAvLyBhbGwgdGhvc2Uga2V5d29yZHMuCi0gICAgICAgICAgICAgICAgaWYgKGVtYWNzTW9kZSkKLSAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VFbWFjc091dHB1dChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgLy8gVGhpcyBtYXkgY2hhbmdlLCBpZiB3ZSBhZGQgYWR2YW5jZWQgcGFyc2luZyBjYXBhYmlsaXRpZXMuCi0gICAgICAgcGFyc2VTdGFuZGFyZE91dHB1dChyZWFkZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRFcnJvcihib29sZWFuIGVycikgewotICAgICAgICBlcnJvciA9IGVycjsKLSAgICAgICAgaWYoZXJyb3IpCi0gICAgICAgICAgICBlcnJvckZsYWcgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIGxpbmUpIHsKLSAgICAgICBpZiAoIWVtYWNzTW9kZSkgewotICAgICAgICAgICB0YXNrLmxvZygiIiwgKGVycm9yID8gUHJvamVjdC5NU0dfRVJSIDogUHJvamVjdC5NU0dfV0FSTikpOwotICAgICAgIH0KLSAgICAgICB0YXNrLmxvZyhsaW5lLCAoZXJyb3IgPyBQcm9qZWN0Lk1TR19FUlIgOiBQcm9qZWN0Lk1TR19XQVJOKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIHRoZSBjb21waWxlCi0gICAgICogQHJldHVybiBpZiBlcnJvcnMgb2N1cmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RXJyb3JGbGFnKCkgewotICAgICAgICByZXR1cm4gZXJyb3JGbGFnOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0tleVN1YnN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9LZXlTdWJzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTczM2FlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0tleVN1YnN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEtleXdvcmQgc3Vic3RpdHV0aW9uLiBJbnB1dCBmaWxlIGlzIHdyaXR0ZW4gdG8gb3V0cHV0IGZpbGUuCi0gKiBEbyBub3QgbWFrZSBpbnB1dCBmaWxlIHNhbWUgYXMgb3V0cHV0IGZpbGUuCi0gKiBLZXl3b3JkcyBpbiBpbnB1dCBmaWxlcyBsb29rIGxpa2UgdGhpczogQGZvb0AuIFNlZSB0aGUgZG9jcyBmb3IgdGhlIAotICogc2V0S2V5cyBtZXRob2QgdG8gdW5kZXJzdGFuZCBob3cgdG8gZG8gdGhlIHN1YnN0aXR1dGlvbnMuCi0gKgotICogQGF1dGhvciBKb24gUy4gU3RldmVucyA8YSBocmVmPSJtYWlsdG86am9uQGNsZWFyaW5rLmNvbSI+am9uQGNsZWFyaW5rLmNvbTwvYT4KLSAqCi0gKiBAZGVwcmVjYXRlZCBLZXlTdWJzdCBpcyBkZXByZWNhdGVkLiBVc2UgRmlsdGVyICsgQ29weURpciBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgS2V5U3Vic3QgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcml2YXRlIEZpbGUgc291cmNlID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgZGVzdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VwID0gIioiOwotICAgIHByaXZhdGUgSGFzaHRhYmxlIHJlcGxhY2VtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgICAgRG8gdGhlIGV4ZWN1dGlvbi4KLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBsb2coIiEhIEtleVN1YnN0IGlzIGRlcHJlY2F0ZWQuIFVzZSBGaWx0ZXIgKyBDb3B5RGlyIGluc3RlYWQuICEhIik7Ci0gICAgICAgIGxvZygiUGVyZm9ybWluZyBTdWJzdGl0aW9ucyIpOwotICAgICAgICBpZiAoIHNvdXJjZSA9PSBudWxsIHx8IGRlc3QgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGxvZygiU291cmNlIGFuZCBkZXN0aW5hdGlvbnMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc291cmNlKSk7Ci0gICAgICAgICAgICBkZXN0LmRlbGV0ZSgpOwotICAgICAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZGVzdCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3bGluZSA9IG51bGw7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoOwotICAgICAgICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBsaW5lLmxlbmd0aCgpID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ3Lm5ld0xpbmUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuZXdsaW5lID0gS2V5U3Vic3QucmVwbGFjZSAoIGxpbmUsIHJlcGxhY2VtZW50cyApOwotICAgICAgICAgICAgICAgICAgICBidy53cml0ZSAoIG5ld2xpbmUgKTsKLSAgICAgICAgICAgICAgICAgICAgYncubmV3TGluZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ3LmZsdXNoKCk7Ci0gICAgICAgICAgICBidy5jbG9zZSgpOwotICAgICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gICAgICAgCi0gICAgfQotICAgIC8qKgotICAgICAgICBTZXQgdGhlIHNvdXJjZSBmaWxlLgotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgcykgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gZmlsZS4KLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkZXN0KSB7Ci0gICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAgIFNldHMgdGhlIHNlcGVyYXRvciBiZXR3ZWVuIG5hbWU9dmFsdWUgYXJndW1lbnRzCi0gICAgICAgIGluIHNldEtleXMoKS4gQnkgZGVmYXVsdCBpdCBpcyAiKiIuCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXAoU3RyaW5nIHNlcCkgewotICAgICAgICB0aGlzLnNlcCA9IHNlcDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICAgIEZvcm1hdCBzdHJpbmcgaXMgbGlrZSB0aGlzOgotICAgICAgICA8cD4KLSAgICAgICAgbmFtZT12YWx1ZSpuYW1lMj12YWx1ZQotICAgICAgICA8cD4KLSAgICAgICAgTmFtZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLgotICAgICAgICA8cD4KLSAgICAgICAgVXNlIHRoZSBzZXRTZXAoKSBtZXRob2QgdG8gY2hhbmdlIHRoZSAqIHRvIHNvbWV0aGluZyBlbHNlCi0gICAgICAgIGlmIHlvdSBuZWVkIHRvIHVzZSAqIGFzIGEgbmFtZSBvciB2YWx1ZS4KLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEtleXMoU3RyaW5nIGtleXMpIHsKLSAgICAgICAgaWYgKGtleXMgIT0gbnVsbCAmJiBrZXlzLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9Ci0gICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGtleXMsIHRoaXMuc2VwLCBmYWxzZSk7Ci0gICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRvay5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIGl0b2sgPQotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIodG9rZW4sICI9IiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gaXRvay5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBpdG9rLm5leHRUb2tlbigpOwotLy8gICAgICAgICAgICAgICAgbG9nICggIk5hbWU6ICIgKyBuYW1lICk7Ci0vLyAgICAgICAgICAgICAgICBsb2cgKCAiVmFsdWU6ICIgKyB2YWx1ZSApOwotICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQgKCBuYW1lLCB2YWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnl7Ci0gICAgICAgIEhhc2h0YWJsZSBoYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBoYXNoLnB1dCAoICJWRVJTSU9OIiwgIjEuMC4zIiApOwotICAgICAgICBoYXNoLnB1dCAoICJiIiwgImZmZmYiICk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoIEtleVN1YnN0LnJlcGxhY2UgKCAiJGYgJHtWRVJTSU9OfSBmICR7Yn0gamogJCIsIGhhc2ggKSApOwotICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgICBEb2VzIHJlcGxhY2VtZW50IG9uIHRleHQgdXNpbmcgdGhlIGhhc2h0YWJsZSBvZiBrZXlzLgotICAgICAgICAKLSAgICAgICAgQHJldHVybnMgdGhlIHN0cmluZyB3aXRoIHRoZSByZXBsYWNlbWVudHMgaW4gaXQuCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlICggU3RyaW5nIG9yaWdTdHJpbmcsIEhhc2h0YWJsZSBrZXlzICkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgZmluYWxTdHJpbmc9bmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpbnQgaW5kZXg9MDsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKChpbmRleCA9IG9yaWdTdHJpbmcuaW5kZXhPZigiJHsiLCBpKSkgPiAtMSkgewotICAgICAgICAgICAga2V5ID0gb3JpZ1N0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAyLCBvcmlnU3RyaW5nLmluZGV4T2YoIn0iLCBpbmRleCszKSk7Ci0gICAgICAgICAgICBmaW5hbFN0cmluZy5hcHBlbmQgKG9yaWdTdHJpbmcuc3Vic3RyaW5nKGksIGluZGV4KSk7Ci0gICAgICAgICAgICBpZiAoIGtleXMuY29udGFpbnNLZXkgKCBrZXkgKSApIHsKLSAgICAgICAgICAgICAgICBmaW5hbFN0cmluZy5hcHBlbmQgKGtleXMuZ2V0KGtleSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbFN0cmluZy5hcHBlbmQgKCAiJHsiICk7Ci0gICAgICAgICAgICAgICAgZmluYWxTdHJpbmcuYXBwZW5kICgga2V5ICk7Ci0gICAgICAgICAgICAgICAgZmluYWxTdHJpbmcuYXBwZW5kICggIn0iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpID0gaW5kZXggKyAzICsga2V5Lmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsU3RyaW5nLmFwcGVuZCAob3JpZ1N0cmluZy5zdWJzdHJpbmcoaSkpOwotICAgICAgICByZXR1cm4gZmluYWxTdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2dPdXRwdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ091dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTY2MDUwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ091dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi0KLS8qKgotICogTG9ncyBlYWNoIGxpbmUgd3JpdHRlbiB0byB0aGlzIHN0cmVhbSB0byB0aGUgbG9nIHN5c3RlbSBvZiBhbnQuCi0gKgotICogVHJpZXMgdG8gYmUgc21hcnQgYWJvdXQgbGluZSBzZXBhcmF0b3JzLjxicj4KLSAqIFRPRE86IFRoaXMgY2xhc3MgY2FuIGJlIHNwbGl0IHRvIGltcGxlbWVudCBvdGhlciBsaW5lIGJhc2VkIHByb2Nlc3NpbmcKLSAqIG9mIGRhdGEgd3JpdHRlbiB0byB0aGUgc3RyZWFtLgotICoKLSAqIEBhdXRob3IgdGhvbWFzLmhhYXNAc29mdHdpcmVkLWluYy5jb20KLSAqLwotcHVibGljIGNsYXNzIExvZ091dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0KLSAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXAgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgVGFzayB0YXNrOwotICAgIHByaXZhdGUgaW50IGxldmVsID0gUHJvamVjdC5NU0dfSU5GTzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIGZvciB3aG9tIHRvIGxvZwotICAgICAqIEBwYXJhbSBsZXZlbCBsb2dsZXZlbCB1c2VkIHRvIGxvZyBkYXRhIHdyaXR0ZW4gdG8gdGhpcyBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIExvZ091dHB1dFN0cmVhbShUYXNrIHRhc2ssIGludCBsZXZlbCkgewotICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwotICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgYnVmZmVyIGFuZCBmbHVzaCB0aGUgYnVmZmVyLCBpZiBhIGxpbmUKLSAgICAgKiBzZXBhcmF0b3IgaXMgZGV0ZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2MgZGF0YSB0byBsb2cgKGJ5dGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgYnl0ZSBjID0gKGJ5dGUpY2M7Ci0gICAgICAgIGlmICgoYyA9PSAnXG4nKSB8fCAoYyA9PSAnXHInKSkgewotICAgICAgICAgICAgaWYgKCFza2lwKSBwcm9jZXNzQnVmZmVyKCk7Ci0gICAgICAgIH0gZWxzZSBidWZmZXIud3JpdGUoY2MpOwotICAgICAgICBza2lwID0gKGMgPT0gJ1xyJyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgYnVmZmVyIHRvIGEgc3RyaW5nIGFuZCBzZW5kcyBpdCB0byA8Y29kZT5wcm9jZXNzTGluZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQnVmZmVyKCkgewotICAgICAgICBwcm9jZXNzTGluZShidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1ZmZlci5yZXNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBsaW5lIHRvIHRoZSBsb2cgc3lzdGVtIG9mIGFudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIGxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGluZShTdHJpbmcgbGluZSkgewotICAgICAgICBwcm9jZXNzTGluZShsaW5lLCBsZXZlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIGxpbmUgdG8gdGhlIGxvZyBzeXN0ZW0gb2YgYW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaW5lKFN0cmluZyBsaW5lLCBpbnQgbGV2ZWwpIHsKLSAgICAgICAgdGFzay5sb2cobGluZSwgbGV2ZWwpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFsbCByZW1haW5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChidWZmZXIuc2l6ZSgpID4gMCkgcHJvY2Vzc0J1ZmZlcigpOwotICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TWVzc2FnZUxldmVsKCkgewotICAgICAgICByZXR1cm4gbGV2ZWw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9nU3RyZWFtSGFuZGxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9nU3RyZWFtSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNjNzkzLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ1N0cmVhbUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogTG9ncyBzdGFuZGFyZCBvdXRwdXQgYW5kIGVycm9yIG9mIGEgc3VicHJvY2VzcyB0byB0aGUgbG9nIHN5c3RlbSBvZiBhbnQuCi0gKgotICogQGF1dGhvciB0aG9tYXMuaGFhc0Bzb2Z0d2lyZWQtaW5jLmNvbQotICovCi1wdWJsaWMgY2xhc3MgTG9nU3RyZWFtSGFuZGxlciBleHRlbmRzIFB1bXBTdHJlYW1IYW5kbGVyIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIGZvciB3aG9tIHRvIGxvZwotICAgICAqIEBwYXJhbSBvdXRsZXZlbCB0aGUgbG9nbGV2ZWwgdXNlZCB0byBsb2cgc3RhbmRhcmQgb3V0cHV0Ci0gICAgICogQHBhcmFtIGVycmxldmVsIHRoZSBsb2dsZXZlbCB1c2VkIHRvIGxvZyBzdGFuZGFyZCBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBMb2dTdHJlYW1IYW5kbGVyKFRhc2sgdGFzaywgaW50IG91dGxldmVsLCBpbnQgZXJybGV2ZWwpIHsKLSAgICAgICAgc3VwZXIobmV3IExvZ091dHB1dFN0cmVhbSh0YXNrLCBvdXRsZXZlbCksCi0gICAgICAgICAgICAgIG5ldyBMb2dPdXRwdXRTdHJlYW0odGFzaywgZXJybGV2ZWwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBzdXBlci5zdG9wKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRFcnIoKS5jbG9zZSgpOwotICAgICAgICAgICAgZ2V0T3V0KCkuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcGxhaW4gaW1wb3NzaWJsZQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0N2FhOTcuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgdG8gbWFuYWdlIE1hbmlmZXN0IGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3QgewotICAgIC8qKiBUaGUgc3RhbmRhcmQgbWFuaWZlc3QgdmVyc2lvbiBoZWFkZXIgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTUFOSUZFU1RfVkVSU0lPTiA9ICJNYW5pZmVzdC1WZXJzaW9uIjsKLSAgICAKLSAgICAvKiogVGhlIHN0YW5kYXJkIFNpZ25hdHVyZSBWZXJzaW9uIGhlYWRlciAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9TSUdOQVRVUkVfVkVSU0lPTiA9ICJTaWduYXR1cmUtVmVyc2lvbiI7Ci0gICAgCi0gICAgLyoqIFRoZSBOYW1lIEF0dHJpYnV0ZSBpcyB0aGUgZmlyc3QgaW4gYSBuYW1lZCBzZWN0aW9uICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAiTmFtZSI7Ci0gICAgCi0gICAgLyoqIFRIZSBGcm9tIEhlYWRlciBpcyBkaXNhbGxvd2VkIGluIGEgTWFuaWZlc3QgKi8gICAgCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZST00gPSAiRnJvbSI7Ci0gICAgCi0gICAgLyoqIERlZmF1bHQgTWFuaWZlc3QgdmVyc2lvbiBpZiBvbmUgaXMgbm90IHNwZWNpZmllZCAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUFOSUZFU1RfVkVSU0lPTiA9ICIxLjAiOwotICAgIAotICAgIC8qKiBUaGUgbWF4IGxlbmd0aCBvZiBhIGxpbmUgaW4gYSBNYW5pZmVzdCAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IE1BWF9MSU5FX0xFTkdUSCA9IDcwOwotICAgIAotICAgIC8qKgotICAgICAqIENsYXNzIHRvIGhvbGQgbWFuaWZlc3QgYXR0cmlidXRlcwotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgQXR0cmlidXRlIHsKLSAgICAgICAgLyoqIFRoZSBhdHRyaWJ1dGUncyBuYW1lICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZSAqLwotICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgYXR0cmlidXRlICovCi0gICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3QgYW4gYXR0cmlidXRlIGJ5IHBhcnNpbmcgYSBsaW5lIGZyb20gdGhlIE1hbmlmZXN0Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdmFsdWUKLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgbGluZSBpcyBub3QgdmFsaWQgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQXR0cmlidXRlKFN0cmluZyBsaW5lKSB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24gewotICAgICAgICAgICAgcGFyc2UobGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3QgYSBtYW5pZmVzdCBieSBzcGVjaWZ5aW5nIGl0cyBuYW1lIGFuZCB2YWx1ZSAKLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhdHRyaWJ1dGUncyBuYW1lCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgQXR0cmlidXRlJ3MgdmFsdWUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCByaHMpIHsKLSAgICAgICAgICAgIGlmICghKHJocyBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEF0dHJpYnV0ZSByaHNBdHRyaWJ1dGUgPSAoQXR0cmlidXRlKXJoczsKLSAgICAgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsICYmIHJoc0F0dHJpYnV0ZS5uYW1lICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscyhyaHNBdHRyaWJ1dGUubmFtZS50b0xvd2VyQ2FzZSgpKSAmJgotICAgICAgICAgICAgICAgICAgICB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhyaHNBdHRyaWJ1dGUudmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlIGEgbGluZSBpbnRvIG5hbWUgYW5kIHZhbHVlIHBhaXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIGJlIHBhcnNlZAotICAgICAgICAgKgotICAgICAgICAgKiBAdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIGlmIHRoZSBsaW5lIGRvZXMgbm90IGNvbnRhaW4gYSBjb2xvbgotICAgICAgICAgKiBzZXBhcmF0aW5nIHRoZSBuYW1lIGFuZCB2YWx1ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGxpbmUpIHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoIjogIik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFuaWZlc3RFeGNlcHRpb24oIk1hbmlmZXN0IGxpbmUgXCIiICsgbGluZSArICJcIiBpcyBub3QgdmFsaWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBsaW5lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICB2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgMik7Ci0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBBdHRyaWJ1dGUncyBuYW1lCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlJ3MgbmFtZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgQXR0cmlidXRlJ3MgbmFtZQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIEF0dHJpYnV0ZSdzIHZhbHVlCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgQXR0cmlidXRlJ3MgdmFsdWUKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGEgY29udGludWF0aW9uIGxpbmUgZnJvbSB0aGUgTWFuaWZlc3QgZmlsZQotICAgICAgICAgKgotICAgICAgICAgKiBXaGVuIGxpbmVzIGFyZSB0b28gbG9uZyBpbiBhIG1hbmlmZXN0LCB0aGV5IGFyZSBjb250aW51ZWQgb24gdGhlIAotICAgICAgICAgKiBuZXh0IGxpbmUgYnkgc3RhcnRpbmcgd2l0aCBhIHNwYWNlLiBUaGlzIG1ldGhvZCBhZGRzIHRoZSBjb250aW51YXRpb24KLSAgICAgICAgICogZGF0YSB0byB0aGUgYXR0cmlidXRlIHZhbHVlIGJ5IHNraXBwaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb250aW51YXRpb24oU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgICAgIHZhbHVlICs9IGxpbmUuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgdGhlIGF0dHJpYnV0ZSBvdXQgdG8gYSBwcmludCB3cml0ZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB3cml0ZXIgdGhlIFdyaXRlciB0byB3aGljaCB0aGUgYXR0cmlidXRlIGlzIHdyaXR0ZW4KLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidGUgdmFsdWUgY2Fubm90IGJlIHdyaXR0ZW4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKFByaW50V3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbmFtZSArICI6ICIgKyB2YWx1ZTsKLSAgICAgICAgICAgIHdoaWxlIChsaW5lLmdldEJ5dGVzKCkubGVuZ3RoID4gTUFYX0xJTkVfTEVOR1RIKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBNQVhfTElORV9MRU5HVEggYnl0ZSBzZWN0aW9uCi0gICAgICAgICAgICAgICAgaW50IGJyZWFrSW5kZXggPSBNQVhfTElORV9MRU5HVEg7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb24gPSBsaW5lLnN1YnN0cmluZygwLCBicmVha0luZGV4KTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoc2VjdGlvbi5nZXRCeXRlcygpLmxlbmd0aCA+IE1BWF9MSU5FX0xFTkdUSCAmJiBicmVha0luZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVha0luZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBsaW5lLnN1YnN0cmluZygwLCBicmVha0luZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJyZWFrSW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBtYW5pZmVzdCBsaW5lICIgKyBuYW1lICsgIjogIiArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2VjdGlvbik7Ci0gICAgICAgICAgICAgICAgbGluZSA9ICIgIiArIGxpbmUuc3Vic3RyaW5nKGJyZWFrSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obGluZSk7Ci0gICAgICAgIH0gICAgCi0gICAgfQotCi0gICAgLyoqIAotICAgICAqIENsYXNzIHRvIHJlcHJlc2VudCBhbiBpbmRpdmlkdWFsIHNlY3Rpb24gaW4gdGhlIAotICAgICAqIE1hbmlmZXN0LiBBIHNlY3Rpb24gY29uc2lzdHMgb2YgYSBzZXQgb2YgYXR0cmlidXRlIHZhbHVlcywKLSAgICAgKiBzZXBhcmF0ZWQgZnJvbSBvdGhlciBzZWN0aW9ucyBieSBhIGJsYW5rIGxpbmUuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBTZWN0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3Igd2FybmluZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHNlY3Rpb24ncyBuYW1lIGlmIGFueS4gVGhlIG1haW4gc2VjdGlvbiBpbiBhIG1hbmlmZXN0IGlzIHVubmFtZWQuKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHNlY3Rpb24ncyBhdHRyaWJ1dGVzLiovCi0gICAgICAgIHByaXZhdGUgSGFzaHRhYmxlIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBTZWN0aW9uJ3MgbmFtZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIHNlY3Rpb24ncyBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBTZWN0aW9uJ3MgbmFtZQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBzZWN0aW9uJ3MgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIHNlY3Rpb24gdGhyb3VnaCBhIHJlYWRlciAKLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciBmcm9tIHdoaWNoIHRoZSBzZWN0aW9uIGlzIHJlYWQKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbmV4dCBzZWN0aW9uIGlmIGl0IGhhcyBiZWVuIHJlYWQgYXMgcGFydCBvZiB0aGlzIAotICAgICAgICAgKiAgICAgICAgIHNlY3Rpb24gLSBUaGlzIG9ubHkgaGFwcGVucyBpZiB0aGUgTWFuaWZlc3QgaXMgbWFsZm9ybWVkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgc2VjdGlvbiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBKQVIgc3BlYwotICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzZWN0aW9uIGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIHJlYWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgcmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeyAKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwgfHwgbGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBsaW5lCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKCJDYW4ndCBzdGFydCBhbiBhdHRyaWJ1dGUgd2l0aCBhIGNvbnRpbnVhdGlvbiBsaW5lICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuYWRkQ29udGludWF0aW9uKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVSZWFkQWhlYWQgPSBhZGRBdHRyaWJ1dGVBbmRDaGVjayhhdHRyaWJ1dGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVJlYWRBaGVhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZVJlYWRBaGVhZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1lcmdlIGluIGFub3RoZXIgc2VjdGlvbgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VjdGlvbiB0aGUgc2VjdGlvbiB0byBiZSBtZXJnZWQgd2l0aCB0aGlzIG9uZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgc2VjdGlvbnMgY2Fubm90IGJlIG1lcmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG1lcmdlKFNlY3Rpb24gc2VjdGlvbikgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgc2VjdGlvbi5nZXROYW1lKCkgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBuYW1lICE9IG51bGwgJiYgIShuYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc2VjdGlvbi5nZXROYW1lKCkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYW5pZmVzdEV4Y2VwdGlvbigiVW5hYmxlIHRvIG1lcmdlIHNlY3Rpb25zIHdpdGggZGlmZmVyZW50IG5hbWVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHNlY3Rpb24uYXR0cmlidXRlcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAvLyB0aGUgbWVyZ2UgZmlsZSBhbHdheXMgd2lucwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZU5hbWUsIHNlY3Rpb24uYXR0cmlidXRlcy5nZXQoYXR0cmlidXRlTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBhZGQgaW4gdGhlIHdhcm5pbmdzCi0gICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBzZWN0aW9uLndhcm5pbmdzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgd2FybmluZ3MuYWRkRWxlbWVudChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgdGhlIHNlY3Rpb24gb3V0IHRvIGEgcHJpbnQgd3JpdGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gd3JpdGVyIHRoZSBXcml0ZXIgdG8gd2hpY2ggdGhlIHNlY3Rpb24gaXMgd3JpdHRlbgotICAgICAgICAgKgotICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzZWN0aW9uIGNhbm5vdCBiZSB3cml0dGVuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShQcmludFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlIG5hbWVBdHRyID0gbmV3IEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgbmFtZUF0dHIud3JpdGUod3JpdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGF0dHJpYnV0ZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlLndyaXRlKHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgbmFtZSBnaXZlbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSByZXR1cm5lZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0Ci0gICAgICAgICAqICAgICAgICAgaW4gdGhlIHNlY3Rpb24KLSAgICAgICAgICovICAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKWF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZW1vdmUgdGdlIGdpdmVuIGF0dHJpYnV0ZSBmcm9tIHRoZSBzZWN0aW9uIAotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkQXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hlY2sgPSBhZGRBdHRyaWJ1dGVBbmRDaGVjayhhdHRyaWJ1dGUpOwotICAgICAgICAgICAgaWYgKGNoZWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVzZSB0aGUgXCJuYW1lXCIgYXR0cmlidXRlIG9mIHRoZSA8c2VjdGlvbj4gZWxlbWVudCByYXRoZXIgdGhhbiB1c2luZyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBcIk5hbWVcIiBhdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIHNlY3Rpb24KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIGJlIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlmIGl0IGlzIGEgbmFtZSBhdHRyaWJ1dGUgLSBudWxsIG90aGVyIHdpc2UKLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgc2VjdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgYWRkQXR0cmlidXRlQW5kQ2hlY2soQXR0cmlidXRlIGF0dHJpYnV0ZSkgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0TmFtZSgpID09IG51bGwgfHwgYXR0cmlidXRlLmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXR0cmlidXRlcyBtdXN0IGhhdmUgbmFtZSBhbmQgdmFsdWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoQVRUUklCVVRFX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgd2FybmluZ3MuYWRkRWxlbWVudCgiXCIiICsgQVRUUklCVVRFX05BTUUgKyAiXCIgYXR0cmlidXRlcyBzaG91bGQgbm90IG9jY3VyIGluIHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWluIHNlY3Rpb24gYW5kIG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYWxsICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciBzZWN0aW9uczogXCIiICthdHRyaWJ1dGUuZ2V0TmFtZSgpICsgIjogIiArIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpICsgIlwiIik7ICAKLSAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChBVFRSSUJVVEVfRlJPTS50b0xvd2VyQ2FzZSgpKSkgewotICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZEVsZW1lbnQoIk1hbmlmZXN0IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBzdGFydCB3aXRoIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSSUJVVEVfRlJPTSArICJcIiBpbiBcIiIgK2F0dHJpYnV0ZS5nZXROYW1lKCkgKyAiOiAiICsgYXR0cmlidXRlLmdldFZhbHVlKCkgKyAiXCIiKTsgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleShhdHRyaWJ1dGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKCJUaGUgYXR0cmlidXRlIFwiIiArIGF0dHJpYnV0ZS5nZXROYW1lKCkgKyAiXCIgbWF5IG5vdCAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvY2N1ciBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSBzZWN0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCksIGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRXYXJuaW5ncygpIHsKLSAgICAgICAgICAgIHJldHVybiB3YXJuaW5ncy5lbGVtZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHJocykgewotICAgICAgICAgICAgaWYgKCEocmhzIGluc3RhbmNlb2YgU2VjdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlY3Rpb24gcmhzU2VjdGlvbiA9IChTZWN0aW9uKXJoczsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnNpemUoKSAhPSByaHNTZWN0aW9uLmF0dHJpYnV0ZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGF0dHJpYnV0ZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlICA9IChBdHRyaWJ1dGUpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSByc2hBdHRyaWJ1dGUgPSAoQXR0cmlidXRlKXJoc1NlY3Rpb24uYXR0cmlidXRlcy5nZXQoYXR0cmlidXRlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZS5lcXVhbHMocnNoQXR0cmlidXRlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gICAgICAgIAotCi0KLSAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhpcyBtYW5pZmVzdCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1hbmlmZXN0VmVyc2lvbiA9IERFRkFVTFRfTUFOSUZFU1RfVkVSU0lPTjsKLSAgICAKLSAgICAvKiogVGhlIG1haW4gc2VjdGlvbiBvZiB0aGlzIG1hbmlmZXN0ICovIAotICAgIHByaXZhdGUgU2VjdGlvbiBtYWluU2VjdGlvbiA9IG5ldyBTZWN0aW9uKCk7Ci0gICAgCi0gICAgLyoqIFRoZSBuYW1lZCBzZWN0aW9ucyBvZiB0aGlzIG1hbmlmZXN0ICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgc2VjdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAvKiogQ29uc3RydWN0IGFuIGVtcHR5IG1hbmlmZXN0ICovCi0gICAgcHVibGljIE1hbmlmZXN0KCkgewotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWFkIGEgbWFuaWZlc3QgZmlsZSBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBpcyB0aGUgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggdGhlIE1hbmlmZXN0IGlzIHJlYWQgCi0gICAgICogCi0gICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgbWFuaWZlc3QgaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB0aGUgSkFSIHNwZWMKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBtYW5pZmVzdCBjYW5ub3QgYmUgcmVhZCBmcm9tIHRoZSByZWFkZXIuCi0gICAgICovCi0gICAgcHVibGljIE1hbmlmZXN0KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwotICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBtYW5pZmVzdCB2ZXJzaW9uCi0gICAgICAgIFN0cmluZyBuZXh0U2VjdGlvbk5hbWUgPSBtYWluU2VjdGlvbi5yZWFkKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyByZWFkTWFuaWZlc3RWZXJzaW9uID0gbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoQVRUUklCVVRFX01BTklGRVNUX1ZFUlNJT04pOwotICAgICAgICBpZiAocmVhZE1hbmlmZXN0VmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYW5pZmVzdFZlcnNpb24gPSByZWFkTWFuaWZlc3RWZXJzaW9uOwotICAgICAgICAgICAgbWFpblNlY3Rpb24ucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9NQU5JRkVTVF9WRVJTSU9OKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlY3Rpb24gc2VjdGlvbiA9IG5ldyBTZWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAobmV4dFNlY3Rpb25OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgc2VjdGlvbk5hbWUgPSBuZXcgQXR0cmlidXRlKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmICghc2VjdGlvbk5hbWUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoQVRUUklCVVRFX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYW5pZmVzdEV4Y2VwdGlvbigiTWFuaWZlc3Qgc2VjdGlvbnMgc2hvdWxkIHN0YXJ0IHdpdGggYSBcIiIgKyBBVFRSSUJVVEVfTkFNRSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGF0dHJpYnV0ZSBhbmQgbm90IFwiIiArIHNlY3Rpb25OYW1lLmdldE5hbWUoKSArICJcIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXh0U2VjdGlvbk5hbWUgPSBzZWN0aW9uTmFtZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhbHJlYWR5IHN0YXJ0ZWQgcmVhZGluZyB0aGlzIHNlY3Rpb24KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGxpbmUgaXMgdGhlIGZpcnN0IGF0dHJpYnV0ZS4gc2V0IGl0IGFuZCB0aGVuIGxldCB0aGUgbm9ybWFsCi0gICAgICAgICAgICAgICAgLy8gcmVhZCBoYW5kbGUgdGhlIHJlc3QKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgZmlyc3RBdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKGxpbmUpOwotICAgICAgICAgICAgICAgIHNlY3Rpb24uYWRkQXR0cmlidXRlQW5kQ2hlY2soZmlyc3RBdHRyaWJ1dGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHNlY3Rpb24uc2V0TmFtZShuZXh0U2VjdGlvbk5hbWUpOwotICAgICAgICAgICAgbmV4dFNlY3Rpb25OYW1lID0gc2VjdGlvbi5yZWFkKHJlYWRlcik7Ci0gICAgICAgICAgICBhZGRDb25maWd1cmVkU2VjdGlvbihzZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkU2VjdGlvbihTZWN0aW9uIHNlY3Rpb24pIHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzZWN0aW9uLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNlY3Rpb25zIG11c3QgaGF2ZSBhIG5hbWUiKTsKLSAgICAgICAgfQotICAgICAgICBzZWN0aW9ucy5wdXQoc2VjdGlvbi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSwgc2VjdGlvbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHJpYnV0ZSkgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKLSAgICAgICAgbWFpblNlY3Rpb24uYWRkQ29uZmlndXJlZEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXJnZSB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIG1hbmlmZXN0IGludG8gdGhpcyBtYW5pZmVzdAotICAgICAqCi0gICAgICogQHBhcmFtIG90aGVyIHRoZSBNYW5pZmVzdCB0byBiZSBtZXJnZWQgd2l0aCB0aGlzIG9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIG1lcmdpbmcgdGhlIG1hbmZlc3QgYWNjb3JkaW5nCi0gICAgICogICAgICAgICB0byB0aGUgTWFuaWZlc3Qgc3BlYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXJnZShNYW5pZmVzdCBvdGhlcikgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKLSAgICAgICAgbWFuaWZlc3RWZXJzaW9uID0gb3RoZXIubWFuaWZlc3RWZXJzaW9uOwotICAgICAgICBtYWluU2VjdGlvbi5tZXJnZShvdGhlci5tYWluU2VjdGlvbik7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IG90aGVyLnNlY3Rpb25zLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uTmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU2VjdGlvbiBvdXJTZWN0aW9uID0gKFNlY3Rpb24pc2VjdGlvbnMuZ2V0KHNlY3Rpb25OYW1lKTsKLSAgICAgICAgICAgIFNlY3Rpb24gb3RoZXJTZWN0aW9uID0gKFNlY3Rpb24pb3RoZXIuc2VjdGlvbnMuZ2V0KHNlY3Rpb25OYW1lKTsKLSAgICAgICAgICAgIGlmIChvdXJTZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXQoc2VjdGlvbk5hbWUudG9Mb3dlckNhc2UoKSwgb3RoZXJTZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG91clNlY3Rpb24ubWVyZ2Uob3RoZXJTZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgbWFuaWZlc3Qgb3V0IHRvIGEgcHJpbnQgd3JpdGVyLgotICAgICoKLSAgICAqIEBwYXJhbSB3cml0ZXIgdGhlIFdyaXRlciB0byB3aGljaCB0aGUgbWFuaWZlc3QgaXMgd3JpdHRlbgotICAgICoKLSAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSB3cml0dGVuCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShQcmludFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKEFUVFJJQlVURV9NQU5JRkVTVF9WRVJTSU9OICsgIjogIiArIG1hbmlmZXN0VmVyc2lvbik7Ci0gICAgICAgIFN0cmluZyBzaWduYXR1cmVWZXJzaW9uID0gbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoQVRUUklCVVRFX1NJR05BVFVSRV9WRVJTSU9OKTsKLSAgICAgICAgaWYgKHNpZ25hdHVyZVZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oQVRUUklCVVRFX1NJR05BVFVSRV9WRVJTSU9OICsgIjogIiArIHNpZ25hdHVyZVZlcnNpb24pOwotICAgICAgICAgICAgbWFpblNlY3Rpb24ucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9TSUdOQVRVUkVfVkVSU0lPTik7Ci0gICAgICAgIH0KLSAgICAgICAgbWFpblNlY3Rpb24ud3JpdGUod3JpdGVyKTsKLSAgICAgICAgaWYgKHNpZ25hdHVyZVZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtYWluU2VjdGlvbi5hZGRDb25maWd1cmVkQXR0cmlidXRlKG5ldyBBdHRyaWJ1dGUoQVRUUklCVVRFX1NJR05BVFVSRV9WRVJTSU9OLCBzaWduYXR1cmVWZXJzaW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTWFuaWZlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4gLSBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gc2VjdGlvbnMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHNlY3Rpb24ud3JpdGUod3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHRoZSBtYW5pZmVzdCB0byBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbXVsdGlsaW5lIHN0cmluZyB3aXRoIHRoZSBNYW5pZmVzdCBhcyBpdCBhcHBlYXJzIGluIGEgTWFuaWZlc3QgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3cml0ZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgd2FybmluZ3MgZm9yIHRoaXMgbWFuaWZlc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHdhcm5pbmcgc3RyaW5ncwotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRXYXJuaW5ncygpIHsKLSAgICAgICAgVmVjdG9yIHdhcm5pbmdzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlMiA9IG1haW5TZWN0aW9uLmdldFdhcm5pbmdzKCk7IGUyLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgd2FybmluZ3MuYWRkRWxlbWVudChlMi5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY3JlYXRlIGEgdmVjdG9yIGFuZCBhZGQgaW4gdGhlIHdhcm5pbmdzIGZvciBhbGwgdGhlIHNlY3Rpb25zCi0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHNlY3Rpb25zLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTZWN0aW9uIHNlY3Rpb24gPSAoU2VjdGlvbillLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUyID0gc2VjdGlvbi5nZXRXYXJuaW5ncygpOyBlMi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy5hZGRFbGVtZW50KGUyLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gd2FybmluZ3MuZWxlbWVudHMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCByaHMpIHsKLSAgICAgICAgaWYgKCEocmhzIGluc3RhbmNlb2YgTWFuaWZlc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1hbmlmZXN0IHJoc01hbmlmZXN0ID0gKE1hbmlmZXN0KXJoczsKLSAgICAgICAgaWYgKCFtYW5pZmVzdFZlcnNpb24uZXF1YWxzKHJoc01hbmlmZXN0Lm1hbmlmZXN0VmVyc2lvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VjdGlvbnMuc2l6ZSgpICE9IHJoc01hbmlmZXN0LnNlY3Rpb25zLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIW1haW5TZWN0aW9uLmVxdWFscyhyaHNNYW5pZmVzdC5tYWluU2VjdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gc2VjdGlvbnMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFNlY3Rpb24gcmhzU2VjdGlvbiA9IChTZWN0aW9uKXJoc01hbmlmZXN0LnNlY3Rpb25zLmdldChzZWN0aW9uLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgIGlmICghc2VjdGlvbi5lcXVhbHMocmhzU2VjdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0RXhjZXB0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2IwODdmLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gaW5kaWNhdGluZyBwcm9ibGVtcyBpbiBhIEpBUiBNYW5pZmVzdAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIE1hbmlmZXN0RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYXRjaGluZ1Rhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hdGNoaW5nVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZjN2ExLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hdGNoaW5nVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhpcyBpcyBhbiBhYnN0cmFjdCB0YXNrIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgYWxsIHRob3NlIHRhc2tzIHRoYXQgCi0gKiByZXF1aXJlIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBmaWxlcyBiYXNlZCBvbiBwYXR0ZXJuIG1hdGNoaW5nLgotICoKLSAqIEBhdXRob3IgQXJub3V0IEouIEt1aXBlciA8YSBocmVmPSJtYWlsdG86YWprdWlwZXJAd3hzLm5sIj5hamt1aXBlckB3eHMubmw8L2E+IAotICogQGF1dGhvciBTdGVmYW5vIE1henpvY2NoaSA8YSBocmVmPSJtYWlsdG86c3RlZmFub0BhcGFjaGUub3JnIj5zdGVmYW5vQGFwYWNoZS5vcmc8L2E+Ci0gKiBAYXV0aG9yIFNhbSBSdWJ5IDxhIGhyZWY9Im1haWx0bzpydWJ5c0B1cy5pYm0uY29tIj5ydWJ5c0B1cy5pYm0uY29tPC9hPgotICogQGF1dGhvciBKb24gUy4gU3RldmVucyA8YSBocmVmPSJtYWlsdG86am9uQGNsZWFyaW5rLmNvbSI+am9uQGNsZWFyaW5rLmNvbTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWF0Y2hpbmdUYXNrIGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VEZWZhdWx0RXhjbHVkZXMgPSB0cnVlOwotICAgIHByb3RlY3RlZCBGaWxlU2V0IGZpbGVzZXQgPSBuZXcgRmlsZVNldCgpOwotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlc2V0LmNyZWF0ZUluY2x1ZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBmaWxlcyBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGVzRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVzZXQuY3JlYXRlSW5jbHVkZXNGaWxlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgewotICAgICAgICByZXR1cm4gZmlsZXNldC5jcmVhdGVFeGNsdWRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBmaWxlcyBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUV4Y2x1ZGVzRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVzZXQuY3JlYXRlRXhjbHVkZXNGaWxlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZCBhIHNldCBvZiBwYXR0ZXJucwotICAgICAqLwotICAgIHB1YmxpYyBQYXR0ZXJuU2V0IGNyZWF0ZVBhdHRlcm5TZXQoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlc2V0LmNyZWF0ZVBhdHRlcm5TZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCi0gICAgICogb3IgYSBzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmNsdWRlcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGUgcGF0dGVybnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmcgaW5jbHVkZXMpIHsKLSAgICAgICAgZmlsZXNldC5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgdG8gYmUgdGhlIGl0ZW1zIGluIHRoZSBiYXNlIGRpcmVjdG9yeSB0aGF0IHlvdSB3YW50IHRvIGJlCi0gICAgICogaW5jbHVkZWQuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5ICIqIiBmb3IgdGhlIGl0ZW1zIChpZTogaXRlbXM9IioiKSAKLSAgICAgKiBhbmQgaXQgd2lsbCBpbmNsdWRlIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGJhc2UgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1TdHJpbmcgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlcyB0byBpbmNsdWRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIFhzZXRJdGVtcyhTdHJpbmcgaXRlbVN0cmluZykgewotICAgICAgICBsb2coIlRoZSBpdGVtcyBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZC4gIiArCi0gICAgICAgICAgICAiUGxlYXNlIHVzZSB0aGUgaW5jbHVkZXMgYXR0cmlidXRlLiIsCi0gICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgaWYgKGl0ZW1TdHJpbmcgPT0gbnVsbCB8fCBpdGVtU3RyaW5nLmVxdWFscygiKiIpIAotICAgICAgICAgICAgfHwgaXRlbVN0cmluZy5lcXVhbHMoIi4iKSkgewotICAgICAgICAgICAgY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUoIioqIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihpdGVtU3RyaW5nLCAiLCAiKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSB0b2submV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmNsdWRlKCkuc2V0TmFtZShwYXR0ZXJuKyIvKioiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKSB7Ci0gICAgICAgIGZpbGVzZXQuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgZmlsZW5hbWVzIGFuZCBkaXJlY3RvcnkgbmFtZXMgdG8gbm90IGluY2x1ZGUuIFRoZXkgc2hvdWxkIGJlIAotICAgICAqIGVpdGhlciAsIG9yICIgIiAoc3BhY2UpIHNlcGFyYXRlZC4gVGhlIGlnbm9yZWQgZmlsZXMgd2lsbCBiZSBsb2dnZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWdub3JlU3RyaW5nIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gaWdub3JlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIFhzZXRJZ25vcmUoU3RyaW5nIGlnbm9yZVN0cmluZykgewotICAgICAgICBsb2coIlRoZSBpZ25vcmUgYXR0cmlidXRlIGlzIGRlcHJlY2F0ZWQuIiArIAotICAgICAgICAgICAgIlBsZWFzZSB1c2UgdGhlIGV4Y2x1ZGVzIGF0dHJpYnV0ZS4iLAotICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIGlmIChpZ25vcmVTdHJpbmcgIT0gbnVsbCAmJiBpZ25vcmVTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBWZWN0b3IgdG1wRXhjbHVkZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihpZ25vcmVTdHJpbmcsICIsICIsIGZhbHNlKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlRXhjbHVkZSgpLnNldE5hbWUoIioqLyIrdG9rLm5leHRUb2tlbigpLnRyaW0oKSsiLyoqIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlRGVmYXVsdEV4Y2x1ZGVzICJ0cnVlInwib24ifCJ5ZXMiIHdoZW4gZGVmYXVsdCBleGNsdXNpb25zIAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQsICJmYWxzZSJ8Im9mZiJ8Im5vIiB3aGVuIHRoZXkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZG4ndCBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRleGNsdWRlcyhib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlcykgewotICAgICAgICB0aGlzLnVzZURlZmF1bHRFeGNsdWRlcyA9IHVzZURlZmF1bHRFeGNsdWRlczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IHNjYW5uZXIgbmVlZGVkIHRvIGFjY2VzcyB0aGUgZmlsZXMgdG8gcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGlyZWN0b3J5U2Nhbm5lciBnZXREaXJlY3RvcnlTY2FubmVyKEZpbGUgYmFzZURpcikgewotICAgICAgICBmaWxlc2V0LnNldERpcihiYXNlRGlyKTsKLSAgICAgICAgZmlsZXNldC5zZXREZWZhdWx0ZXhjbHVkZXModXNlRGVmYXVsdEV4Y2x1ZGVzKTsKLSAgICAgICAgcmV0dXJuIGZpbGVzZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGluY2x1ZGVzZmlsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZSB0byBmZXRjaAotICAgICAqIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uICAKLSAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXNmaWxlKEZpbGUgaW5jbHVkZXNmaWxlKSB7Ci0gICAgICAgICBmaWxlc2V0LnNldEluY2x1ZGVzZmlsZShpbmNsdWRlc2ZpbGUpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVzZmlsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZSB0byBmZXRjaAotICAgICAqIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uICAKLSAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXNmaWxlKEZpbGUgZXhjbHVkZXNmaWxlKSB7Ci0gICAgICAgICBmaWxlc2V0LnNldEV4Y2x1ZGVzZmlsZShleGNsdWRlc2ZpbGUpOwotICAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01rZGlyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Na2Rpci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViODY2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01rZGlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLyAKLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLS8qKgotICogQ3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS4KLSAqCi0gKiBAYXV0aG9yIGR1bmNhbkB4MTgwLmNvbQotICovCi0KLXB1YmxpYyBjbGFzcyBNa2RpciBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBGaWxlIGRpcjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRpciBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlyLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5IGFzIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoYXQgbmFtZTogIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7Ci0JICAgIGJvb2xlYW4gcmVzdWx0ID0gZGlyLm1rZGlycygpOwotCSAgICBpZiAocmVzdWx0ID09IGZhbHNlKSB7Ci0JCVN0cmluZyBtc2cgPSAiRGlyZWN0b3J5ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGNyZWF0aW9uIHdhcyBub3QgIiArCi0JCSAgICAic3VjY2Vzc2Z1bCBmb3IgYW4gdW5rbm93biByZWFzb24iOwotCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0JICAgIH0KLQkgICAgbG9nKCJDcmVhdGVkIGRpcjogIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgewotCXRoaXMuZGlyID0gZGlyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01vdmUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01vdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjNhOS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Nb3ZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBNb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCwKLSAqIHRoZSBkZXN0aW5hdGlvbiBpcyBvdmVyd3JpdGVuIHdoZW4gZXhpc3RpbmcuICBXaGVuIG92ZXJ3cml0ZSBpcwotICogdHVybmVkIG9mZiwgdGhlbiBmaWxlcyBhcmUgb25seSBtb3ZlZCBpZiB0aGUgc291cmNlIGZpbGUgaXMKLSAqIG5ld2VyIHRoYW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUsIG9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgZG9lcwotICogbm90IGV4aXN0LjwvcD4KLSAqCi0gKiA8cD5Tb3VyY2UgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSBvbmx5IGRlbGV0ZWQgd2hlbiB0aGUgZmlsZSBvcgotICogZGlyZWN0b3J5IGhhcyBiZWVuIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gc3VjY2Vzc2Z1bGx5LiAgRmlsdGVyaW5nCi0gKiBhbHNvIHdvcmtzLjwvcD4KLSAqCi0gKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFybm91dCBLdWlwZXIncyBpbml0aWFsIGRlc2lnbgotICogZG9jdW1lbnQsIHRoZSBmb2xsb3dpbmcgbWFpbGluZyBsaXN0IGRpc2N1c3Npb25zLCBhbmQgdGhlCi0gKiBjb3B5ZmlsZS9jb3B5ZGlyIHRhc2tzLjwvcD4KLSAqCi0gKiBAYXV0aG9yIEdsZW5uIE1jQWxsaXN0ZXIgPGEgaHJlZj0ibWFpbHRvOmdsZW5ubUBjYS5pYm0uY29tIj5nbGVubm1AY2EuaWJtLmNvbTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnVtYWdlc2hAcmVkaWZmbWFpbC5jb20iPk1hZ2VzaCBVbWFzYW5rYXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlIGV4dGVuZHMgQ29weSB7Ci0KLSAgICBwdWJsaWMgTW92ZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgZm9yY2VPdmVyd3JpdGUgPSB0cnVlOwotICAgIH0KLQotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICBwcm90ZWN0ZWQgYW5kIHByaXZhdGUgbWV0aG9kcwotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRmlsZU9wZXJhdGlvbnMoKSB7Ci0gICAgICAgIGlmIChmaWxlQ29weU1hcC5zaXplKCkgPiAwKSB7ICAgLy8gZmlsZXMgdG8gbW92ZQotICAgICAgICAgICAgbG9nKCJNb3ZpbmcgIiArIGZpbGVDb3B5TWFwLnNpemUoKSArICIgZmlsZXMgdG8gIiArCi0gICAgICAgICAgICAgICAgZGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSApOwotCi0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZmlsZUNvcHlNYXAua2V5cygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnJvbUZpbGUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRvRmlsZSA9IChTdHJpbmcpIGZpbGVDb3B5TWFwLmdldChmcm9tRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJvbUZpbGUuZXF1YWxzKCB0b0ZpbGUgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyBzZWxmLW1vdmUgb2YgIiArIGZyb21GaWxlLCB2ZXJib3NpdHkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZnJvbUZpbGUpOwotICAgICAgICAgICAgICAgIEZpbGUgZCA9IG5ldyBGaWxlKHRvRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsb2coIkF0dGVtcHRpbmcgdG8gcmVuYW1lOiAiICsgZnJvbUZpbGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiB0byAiICsgdG9GaWxlLCB2ZXJib3NpdHkpOwotICAgICAgICAgICAgICAgICAgICBtb3ZlZCA9IHJlbmFtZUZpbGUoZiwgZCwgZmlsdGVyaW5nLCBmb3JjZU92ZXJ3cml0ZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIHJlbmFtZSAiICsgZnJvbUZpbGUgCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgdG8gIiArIHRvRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGR1ZSB0byAiICsgaW9lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJNb3ZpbmcgIiArIGZyb21GaWxlICsgIiB0byAiICsgdG9GaWxlLCB2ZXJib3NpdHkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZXhlY3V0aW9uRmlsdGVycyA9IG5ldyBGaWx0ZXJTZXRDb2xsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uRmlsdGVycy5hZGRGaWx0ZXJTZXQocHJvamVjdC5nZXRHbG9iYWxGaWx0ZXJTZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGZpbHRlckVudW0gPSBnZXRGaWx0ZXJTZXRzKCkuZWxlbWVudHMoKTsgZmlsdGVyRW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25GaWx0ZXJzLmFkZEZpbHRlclNldCgoRmlsdGVyU2V0KWZpbHRlckVudW0ubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5jb3B5RmlsZShmLCBkLCBleGVjdXRpb25GaWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VPdmVyd3JpdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmID0gbmV3IEZpbGUoZnJvbUZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLmRlbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBjb3B5ICIgKyBmcm9tRmlsZSArICIgdG8gIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRvRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkdWUgdG8gIiArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmNsdWRlRW1wdHkpIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBkaXJDb3B5TWFwLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZC5ta2RpcnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeSAiICsgZC5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBsb2coIk1vdmVkICIgKyBjb3VudCArICIgZW1wdHkgZGlyZWN0b3JpZXMgdG8gIiArIGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGVzZXRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBmaWxlc2V0cy5lbGVtZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gZnMuZ2V0RGlyKHByb2plY3QpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9rVG9EZWxldGUoZGlyKSkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGVEaXIoZGlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJdHMgb25seSBvayB0byBkZWxldGUgYSBkaXJlY3RvcnkgdHJlZSBpZiB0aGVyZSBhcmUKLSAgICAgKiBubyBmaWxlcyBpbiBpdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBva1RvRGVsZXRlKEZpbGUgZCkgewotICAgICAgICBTdHJpbmdbXSBsaXN0ID0gZC5saXN0KCk7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHJldHVybiBmYWxzZTsgICAgIC8vIG1heWJlIGlvIGVycm9yPwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBsaXN0W2ldOwotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZCwgcyk7Ci0gICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFva1RvRGVsZXRlKGYpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBmb3VuZCBhIGZpbGUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdvIGFuZCBkZWxldGUgdGhlIGRpcmVjdG9yeSB0cmVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZURpcihGaWxlIGQpIHsKLSAgICAgICAgU3RyaW5nW10gbGlzdCA9IGQubGlzdCgpOwotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSByZXR1cm47ICAgICAgLy8gb24gYW4gaW8gZXJyb3IgbGlzdCgpIGNhbiByZXR1cm4gbnVsbAotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBsaXN0W2ldOwotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZCwgcyk7Ci0gICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlRGlyKGYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVORVhQRUNURUQgRVJST1IgLSBUaGUgZmlsZSAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSArICIgc2hvdWxkIG5vdCBleGlzdCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2coIkRlbGV0aW5nIGRpcmVjdG9yeSAiICsgZC5nZXRBYnNvbHV0ZVBhdGgoKSwgdmVyYm9zaXR5KTsKLSAgICAgICAgaWYgKCFkLmRlbGV0ZSgpKSB7Ci0gICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGRlbGV0ZSBkaXJlY3RvcnkgIiArIGQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byByZW5hbWUgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYSBkZXN0aW5hdGlvbi4KLSAgICAgKiBJZiBvdmVyd3JpdGUgaXMgc2V0IHRvIHRydWUsIHRoaXMgbWV0aG9kIG92ZXJ3cml0ZXMgZXhpc3RpbmcgZmlsZQotICAgICAqIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgbmV3ZXIuICBPdGhlcndpc2UsIHRoZSBzb3VyY2UgZmlsZSBpcwotICAgICAqIHJlbmFtZWQgb25seSBpZiB0aGUgZGVzdGluYXRpb24gZmlsZSBpcyBvbGRlciB0aGFuIGl0LgotICAgICAqIE1ldGhvZCB0aGVuIGNoZWNrcyBpZiB0b2tlbiBmaWx0ZXJpbmcgaXMgdXNlZC4gIElmIGl0IGlzLCB0aGlzIG1ldGhvZAotICAgICAqIHJldHVybnMgZmFsc2UgYXNzdW1pbmcgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHRoZSBjb3B5RmlsZSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVuYW1lRmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpbHRlcmluZywgYm9vbGVhbiBvdmVyd3JpdGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIGJvb2xlYW4gcmVuYW1lZCA9IHRydWU7Ci0gICAgICAgIGlmICghZmlsdGVyaW5nKSB7Ci0gICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBwYXJlbnQgZGlyIG9mIGRlc3QgZmlsZSBleGlzdHMhCi0gICAgICAgICAgICAvLyBub3QgdXNpbmcgZ2V0UGFyZW50RmlsZSBtZXRob2QgdG8gc3RheSAxLjEgY29tcGF0Ci0gICAgICAgICAgICBTdHJpbmcgcGFyZW50UGF0aCA9IGRlc3RGaWxlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEZpbGUgcGFyZW50ID0gbmV3IEZpbGUocGFyZW50UGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRlc3RGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXN0RmlsZS5kZWxldGUoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZW1vdmUgZXhpc3RpbmcgZmlsZSAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXN0RmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVuYW1lZCA9IHNvdXJjZUZpbGUucmVuYW1lVG8oZGVzdEZpbGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVuYW1lZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZW5hbWVkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhcmFsbGVsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXJhbGxlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzgzYjRlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhcmFsbGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb247Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIG11bHRpIHRocmVhZGVkIHRhc2sgZXhlY3V0aW9uLgotICogPHA+Ci0gKiBAYXV0aG9yIFRob21hcyBDaHJpc3RlbiA8YSBocmVmPSJtYWlsdG86Y2hyQGFjdGl2ZS5jaCI+Y2hyQGFjdGl2ZS5jaDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsIDwvYT4KLSAqLwotcHVibGljIGNsYXNzIFBhcmFsbGVsIGV4dGVuZHMgVGFzawotICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7Ci0KLSAgICAvKiogQ29sbGVjdGlvbiBob2xkaW5nIHRoZSBuZXN0ZWQgdGFza3MgKi8KLSAgICBwcml2YXRlIFZlY3RvciBuZXN0ZWRUYXNrcyA9IG5ldyBWZWN0b3IoKTsKLQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbmVzdGVkIHRhc2sgdG8gZXhlY3V0ZSBwYXJhbGxlbCAoYXN5bmNocm9uKS4KLSAgICAgKiA8cD4KLSAgICAgKiBAcGFyYW0gbmVzdGVkVGFzayAgTmVzdGVkIHRhc2sgdG8gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgbmVzdGVkVGFzaykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgbmVzdGVkVGFza3MuYWRkRWxlbWVudChuZXN0ZWRUYXNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCbG9jayBleGVjdXRpb24gdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lIG9yIGZvciBhCi0gICAgICogc3BlY2lmaWVkIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgYW5kIGlmIGRlZmluZWQsCi0gICAgICogZXhlY3V0ZSB0aGUgd2FpdCBzdGF0dXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRhc2tUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRhc2tUaHJlYWRbbmVzdGVkVGFza3Muc2l6ZSgpXTsKLSAgICAgICAgaW50IHRocmVhZE51bWJlciA9IDA7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IG5lc3RlZFRhc2tzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IHRocmVhZE51bWJlcisrKSB7Ci0gICAgICAgICAgICBUYXNrIG5lc3RlZFRhc2sgPSAoVGFzayllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB0aHJlYWRzW3RocmVhZE51bWJlcl0gPSBuZXcgVGFza1RocmVhZCh0aHJlYWROdW1iZXIsIG5lc3RlZFRhc2spOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IHN0YXJ0IGFsbCB0aHJlYWRzICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICB0aHJlYWRzW2ldLnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgam9pbiB0byBhbGwgdGhlIHRocmVhZHMgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aHJlYWRzW2ldLmpvaW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIC8vIHdobyB3b3VsZCBpbnRlcnJ1cHQgbWUgYXQgYSB0aW1lIGxpa2UgdGhpcz8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbm93IGRpZCBhbnkgb2YgdGhlIHRocmVhZHMgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIFN0cmluZ0J1ZmZlciBleGNlcHRpb25NZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgaW50IG51bUV4Y2VwdGlvbnMgPSAwOwotICAgICAgICBUaHJvd2FibGUgZmlyc3RFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBMb2NhdGlvbiBmaXJzdExvY2F0aW9uID0gTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTjs7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSB0aHJlYWRzW2ldLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG51bUV4Y2VwdGlvbnMrKzsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RFeGNlcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdEV4Y2VwdGlvbiA9IHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24gJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdExvY2F0aW9uID09IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RMb2NhdGlvbiA9ICgoQnVpbGRFeGNlcHRpb24pdCkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZS5hcHBlbmQobFNlcCk7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZS5hcHBlbmQodC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobnVtRXhjZXB0aW9ucyA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3RFeGNlcHRpb24gaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbilmaXJzdEV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihmaXJzdEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobnVtRXhjZXB0aW9ucyA+IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGNlcHRpb25NZXNzYWdlLnRvU3RyaW5nKCksIGZpcnN0TG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgVGFza1RocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgIHByaXZhdGUgVGhyb3dhYmxlIGV4Y2VwdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBUYXNrIHRhc2s7Ci0gICAgICAgIHByaXZhdGUgaW50IHRhc2tOdW1iZXI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdCBhIG5ldyBUYXNrVGhyZWFkPHA+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0YXNrIHRoZSBUYXNrIHRvIGJlIGV4ZWN1dGVkIGluIGEgc2VwZXJhdGUgdGhyZWFkCi0gICAgICAgICAqLwotICAgICAgICBUYXNrVGhyZWFkKGludCB0YXNrTnVtYmVyLCBUYXNrIHRhc2spIHsKLSAgICAgICAgICAgIHRoaXMudGFzayA9IHRhc2s7Ci0gICAgICAgICAgICB0aGlzLnRhc2tOdW1iZXIgPSB0YXNrTnVtYmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrIHdpdGhpbiBhIHRocmVhZCBhbmQgdGFrZXMgY2FyZSBhYm91dAotICAgICAgICAgKiBFeGNlcHRpb25zIHJhaXNlZCB3aXRoaW4gdGhlIHRhc2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRhc2sucGVyZm9ybSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oKSB7IAotICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGNoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQzMjZhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVGFzayBhcyBhIGxheWVyIG9uIHRvcCBvZiBwYXRjaC4gUGF0Y2ggYXBwbGllcyBhIGRpZmYgZmlsZSB0byBhbiBvcmlnaW5hbC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXRjaCBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBGaWxlIG9yaWdpbmFsRmlsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZVBhdGNoZmlsZSA9IGZhbHNlOwotICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlsZSB0byBwYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPcmlnaW5hbGZpbGUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIG9yaWdpbmFsRmlsZSA9IGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGUgY29udGFpbmluZyB0aGUgZGlmZiBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0Y2hmaWxlKEZpbGUgZmlsZSkgewotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicGF0Y2hmaWxlICIrZmlsZSsiIGRvZXNuXCd0IGV4aXN0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItaSIpOwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGZpbGUpOwotICAgICAgICBoYXZlUGF0Y2hmaWxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaGFsbCBwYXRjaCB3cml0ZSBiYWNrdXBzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhY2t1cHMoYm9vbGVhbiBiYWNrdXBzKSB7Ci0gICAgICAgIGlmIChiYWNrdXBzKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElnbm9yZSB3aGl0ZXNwYWNlIGRpZmZlcmVuY2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZXdoaXRlc3BhY2UoYm9vbGVhbiBpZ25vcmUpIHsKLSAgICAgICAgaWYgKGlnbm9yZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1sIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpcCB0aGUgc21hbGxlc3QgcHJlZml4IGNvbnRhaW5pbmcgPGk+bnVtPC9pPiBsZWFkaW5nIHNsYXNoZXMKLSAgICAgKiBmcm9tIGZpbGVuYW1lcy4KLSAgICAgKgotICAgICAqIDxwPnBhdGNoJ3MgPGk+LXA8L2k+IG9wdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpcChpbnQgbnVtKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAobnVtIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzdHJpcCBoYXMgdG8gYmUgPj0gMCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXAiK251bSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29yayBzaWxlbnRseSB1bmxlc3MgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcSkgewotICAgICAgICBpZiAocSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3N1bWUgcGF0Y2ggd2FzIGNyZWF0ZWQgd2l0aCBvbGQgYW5kIG5ldyBmaWxlcyBzd2FwcGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJldmVyc2UoYm9vbGVhbiByKSB7Ci0gICAgICAgIGlmIChyKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhdmVQYXRjaGZpbGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicGF0Y2hmaWxlIGFyZ3VtZW50IGlzIHJlcXVpcmVkIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgQ29tbWFuZGxpbmUgdG9FeGVjdXRlID0gKENvbW1hbmRsaW5lKWNtZC5jbG9uZSgpOwotICAgICAgICB0b0V4ZWN1dGUuc2V0RXhlY3V0YWJsZSgicGF0Y2giKTsKLQotICAgICAgICBpZiAob3JpZ2luYWxGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUob3JpZ2luYWxGaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywgUHJvamVjdC5NU0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZSh0b0V4ZWN1dGUuZ2V0Q29tbWFuZGxpbmUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGUuZXhlY3V0ZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi19Ly8gUGF0Y2gKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGhDb252ZXJ0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRoQ29udmVydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBhM2MwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGhDb252ZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFRoaXMgdGFzayBjb252ZXJ0cyBwYXRoIGFuZCBjbGFzc3BhdGggaW5mb3JtYXRpb24gdG8gYSBzcGVjaWZpYyB0YXJnZXQgT1MgZm9ybWF0LgotICogVGhlIHJlc3VsdGluZyBmb3JtYXR0ZWQgcGF0aCBpcyBwbGFjZWQgaW50byBhIHNwZWNpZmllZCBwcm9wZXJ0eS4KLSAqIDxwPgotICogTElNSVRBVElPTjogQ3VycmVudGx5IHRoaXMgaW1wbGVtZW50YXRpb24gZ3JvdXBzIGFsbCBtYWNoaW5lcyBpbnRvIG9uZSBvZiB0d28KLSAqIHR5cGVzOiBVbml4IG9yIFdpbmRvd3MuICBVbml4IGlzIGRlZmluZWQgYXMgTk9UIHdpbmRvd3MuCi0gKgotICogQGF1dGhvciBMYXJyeSBTdHJlZXB5IDxhIGhyZWY9Im1haWx0bzpzdHJlZXB5QGhlYWx0aGxhbmd1YWdlLmNvbSI+c3RyZWVweUBoZWFsdGhsYW5ndWFnZS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoQ29udmVydCBleHRlbmRzIFRhc2sgewotCi0gICAgLyoqCi0gICAgICogSGVscGVyIGNsYXNzLCBob2xkcyB0aGUgbmVzdGVkIDxtYXA+IHZhbHVlcy4gIEVsZW1lbnRzIHdpbGwgbG9vayBsaWtlIHRoaXM6Ci0gICAgICogJmx0O21hcCBmcm9tPSJkOiIgdG89Ii9mb28iLz4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHJ1bm5pbmcgb24gd2luZG93cywgdGhlIHByZWZpeCBjb21wYXJpc29uIHdpbGwgYmUgY2FzZSBpbnNlbnNpdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgTWFwRW50cnkgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlICJmcm9tIiBhdHRyaWJ1dGUgb2YgdGhlIG1hcCBlbnRyeQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RnJvbSggU3RyaW5nIGZyb20gKSB7Ci0gICAgICAgICAgICB0aGlzLmZyb20gPSBmcm9tOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgInRvIiBhdHRyaWJ1dGUgb2YgdGhlIG1hcCBlbnRyeQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VG8oIFN0cmluZyB0byApIHsKLSAgICAgICAgICAgIHRoaXMudG8gPSB0bzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcHBseSB0aGlzIG1hcCBlbnRyeSB0byBhIGdpdmVuIHBhdGggZWxlbWVudAotICAgICAgICAgKiBAcGFyYW0gZWxlbSBQYXRoIGVsZW1lbnQgdG8gcHJvY2VzcwotICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyBVcGRhdGVkIHBhdGggZWxlbWVudCBhZnRlciBtYXBwaW5nCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KCBTdHJpbmcgZWxlbSApIHsKLSAgICAgICAgICAgIGlmKCBmcm9tID09IG51bGwgfHwgdG8gPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJCb3RoICdmcm9tJyBhbmQgJ3RvJyBtdXN0IGJlIHNldCBpbiBhIG1hcCBlbnRyeSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgd2UncmUgb24gd2luZG93cywgdGhlbiBkbyB0aGUgY29tcGFyaXNvbiBpZ25vcmluZyBjYXNlCi0gICAgICAgICAgICBTdHJpbmcgY21wRWxlbSA9IG9uV2luZG93cyA/IGVsZW0udG9Mb3dlckNhc2UoKSA6IGVsZW07Ci0gICAgICAgICAgICBTdHJpbmcgY21wRnJvbSA9IG9uV2luZG93cyA/IGZyb20udG9Mb3dlckNhc2UoKSA6IGZyb207Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IHN0YXJ0cyB3aXRoIHRoZSBjb25maWd1cmVkIHByZWZpeCwgdGhlbiBjb252ZXJ0IHRoZSBwcmVmaXgKLSAgICAgICAgICAgIC8vIHRvIHRoZSBjb25maWd1cmVkICd0bycgdmFsdWUuCi0KLSAgICAgICAgICAgIGlmKCBjbXBFbGVtLnN0YXJ0c1dpdGgoIGNtcEZyb20gKSApIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gZnJvbS5sZW5ndGgoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBsZW4gPj0gZWxlbS5sZW5ndGgoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbSA9IHRvOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0gPSB0byArIGVsZW0uc3Vic3RyaW5nKCBsZW4gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlbGVtOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWVtYmVycwotICAgICAgICBwcml2YXRlIFN0cmluZyBmcm9tID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG8gPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5lc3RlZCBQQVRIIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVQYXRoKCkgewotCi0gICAgICAgIGlmKCBpc1JlZmVyZW5jZSgpICkKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0KLSAgICAgICAgaWYoIHBhdGggPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgTUFQIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwRW50cnkgY3JlYXRlTWFwKCkgewotCi0gICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gbmV3IE1hcEVudHJ5KCk7Ci0gICAgICAgIHByZWZpeE1hcC5hZGRFbGVtZW50KCBlbnRyeSApOwotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0b3MgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0b3MoIFN0cmluZyB0YXJnZXQgKSB7Ci0KLSAgICAgICAgdGFyZ2V0T1MgPSB0YXJnZXQudG9Mb3dlckNhc2UoKTsKLQotICAgICAgICBpZiggISB0YXJnZXRPUy5lcXVhbHMoICJ3aW5kb3dzIiApICYmICEgdGFyZ2V0LmVxdWFscyggInVuaXgiICkgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJ0YXJnZXRvcyBtdXN0IGJlIG9uZSBvZiAndW5peCcgb3IgJ3dpbmRvd3MnIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3VycmVudGx5LCB3ZSBkZWFsIHdpdGggb25seSB0d28gcGF0aCBmb3JtYXRzOiBVbml4IGFuZCBXaW5kb3dzCi0gICAgICAgIC8vIEFuZCBVbml4IGlzIGV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgV2luZG93cwotCi0gICAgICAgIHRhcmdldFdpbmRvd3MgPSB0YXJnZXRPUy5lcXVhbHMoIndpbmRvd3MiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wcnR5IGF0dHJpYnV0ZSAtIHRoaXMgaXMgdGhlIHByb3BlcnR5IGludG8gd2hpY2ggb3VyCi0gICAgICogY29udmVydGVkIHBhdGggd2lsbCBiZSBwbGFjZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoIFN0cmluZyBwICkgewotICAgICAgICBwcm9wZXJ0eSA9IHA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIFBBVEggb3IgRklMRVNFVCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgewotICAgICAgICBpZiggcGF0aCAhPSBudWxsICkKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0KLSAgICAgICAgcmVmaWQgPSByOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhdGggc2VwYXJhdG9yIHN0cmluZyBmb3IgdGhlIHRhcmdldCBvcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdGhTZXAoIFN0cmluZyBzZXAgKSB7Ci0gICAgICAgIHBhdGhTZXAgPSBzZXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IHNlcGFyYXRvciBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgb3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJTZXAoIFN0cmluZyBzZXAgKSB7Ci0gICAgICAgIGRpclNlcCA9IHNlcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYXMgdGhlIHJlZmlkIGF0dHJpYnV0ZSBvZiB0aGlzIGVsZW1lbnQgYmVlbiBzZXQ/Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKSB7Ci0gICAgICAgIHJldHVybiByZWZpZCAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSBleGVjdXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gSWYgd2UgYXJlIGEgcmVmZXJlbmNlLCB0aGUgY3JlYXRlIGEgUGF0aCBmcm9tIHRoZSByZWZlcmVuY2UKLSAgICAgICAgaWYoIGlzUmVmZXJlbmNlKCkgKSB7Ci0gICAgICAgICAgICBwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKS5jcmVhdGVQYXRoKCk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBvYmogPSByZWZpZC5nZXRSZWZlcmVuY2VkT2JqZWN0KGdldFByb2plY3QoKSk7Ci0KLSAgICAgICAgICAgIGlmKCBvYmogaW5zdGFuY2VvZiBQYXRoICkgewotICAgICAgICAgICAgICAgIHBhdGguc2V0UmVmaWQocmVmaWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmKCBvYmogaW5zdGFuY2VvZiBGaWxlU2V0ICkgewotICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldClvYmo7Ci0gICAgICAgICAgICAgICAgcGF0aC5hZGRGaWxlc2V0KCBmcyApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICIncmVmaWQnIGRvZXMgbm90IHJlZmVyIHRvIGEgcGF0aCBvciBmaWxlc2V0IiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVTZXR1cCgpOyAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGUgb3VyIHNldHVwCi0KLSAgICAgICAgLy8gQ3VycmVudGx5LCB3ZSBkZWFsIHdpdGggb25seSB0d28gcGF0aCBmb3JtYXRzOiBVbml4IGFuZCBXaW5kb3dzCi0gICAgICAgIC8vIEFuZCBVbml4IGlzIGV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgV2luZG93cwotCi0gICAgICAgIFN0cmluZyBvc25hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBvbldpbmRvd3MgPSAoIG9zbmFtZS5pbmRleE9mKCJ3aW5kb3dzIikgPj0gMCApOwotCi0gICAgICAgIC8vIERldGVybWluZSB0aGUgZnJvbS90byBjaGFyIG1hcHBpbmdzIGZvciBkaXIgc2VwCi0gICAgICAgIGNoYXIgZnJvbURpclNlcCA9IG9uV2luZG93cyA/ICdcXCcgOiAnLyc7Ci0gICAgICAgIGNoYXIgdG9EaXJTZXAgICA9IGRpclNlcC5jaGFyQXQoMCk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJzbHQgPSBuZXcgU3RyaW5nQnVmZmVyKCAxMDAgKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGF0aCBjb21wb25lbnRzIGluIGNhbm9uaWNhbCBmb3JtCi0gICAgICAgIFN0cmluZ1tdIGVsZW1zID0gcGF0aC5saXN0KCk7Ci0KLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpIDwgZWxlbXMubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbSA9IGVsZW1zW2ldOwotCi0gICAgICAgICAgICBlbGVtID0gbWFwRWxlbWVudCggZWxlbSApOyAgICAgIC8vIEFwcGx5IHRoZSBwYXRoIHByZWZpeCBtYXAKLQotICAgICAgICAgICAgLy8gTm93IGNvbnZlcnQgdGhlIHBhdGggYW5kIGZpbGUgc2VwYXJhdG9yIGNoYXJhY3RlcnMgZnJvbSB0aGUKLSAgICAgICAgICAgIC8vIGN1cnJlbnQgb3MgdG8gdGhlIHRhcmdldCBvcy4KLQotICAgICAgICAgICAgZWxlbSA9IGVsZW0ucmVwbGFjZSggZnJvbURpclNlcCwgdG9EaXJTZXAgKTsKLQotICAgICAgICAgICAgaWYoIGkgIT0gMCApIHJzbHQuYXBwZW5kKCBwYXRoU2VwICk7Ci0gICAgICAgICAgICByc2x0LmFwcGVuZCggZWxlbSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUGxhY2UgdGhlIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcnNsdC50b1N0cmluZygpOwotCi0gICAgICAgIGxvZyggIlNldCBwcm9wZXJ0eSAiICsgcHJvcGVydHkgKyAiID0gIiArIHZhbHVlLCBQcm9qZWN0Lk1TR19WRVJCT1NFICk7Ci0KLSAgICAgICAgZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCBwcm9wZXJ0eSwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBseSB0aGUgY29uZmlndXJlZCBtYXAgdG8gYSBwYXRoIGVsZW1lbnQuICBUaGUgbWFwIGlzIHVzZWQgdG8gY29udmVydAotICAgICAqIGJldHdlZW4gV2luZG93cyBkcml2ZSBsZXR0ZXJzIGFuZCBVbml4IHBhdGhzLiAgSWYgbm8gbWFwIGlzIGNvbmZpZ3VyZWQsCi0gICAgICogdGhlbiB0aGUgaW5wdXQgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtIFRoZSBwYXRoIGVsZW1lbnQgdG8gYXBwbHkgdGhlIG1hcCB0bwotICAgICAqIEByZXR1cm4gU3RyaW5nIFVwZGF0ZWQgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1hcEVsZW1lbnQoIFN0cmluZyBlbGVtICkgewotCi0gICAgICAgIGludCBzaXplID0gcHJlZml4TWFwLnNpemUoKTsKLQotICAgICAgICBpZiggc2l6ZSAhPSAwICkgewotCi0gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIG1hcCBlbnRyaWVzIGFuZCBhcHBseSBlYWNoIG9uZS4gIFN0b3Agd2hlbiBvbmUgb2YgdGhlCi0gICAgICAgICAgICAvLyBlbnRyaWVzIGFjdHVhbGx5IGNoYW5nZXMgdGhlIGVsZW1lbnQKLQotICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpIDwgc2l6ZTsgaSsrICkgewotICAgICAgICAgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gKE1hcEVudHJ5KXByZWZpeE1hcC5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0VsZW0gPSBlbnRyeS5hcHBseSggZWxlbSApOwotCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBJJ20gdXNpbmcgIiE9IiB0byBzZWUgaWYgd2UgZ290IGEgbmV3IG9iamVjdCBiYWNrIGZyb20KLSAgICAgICAgICAgICAgICAvLyB0aGUgYXBwbHkgbWV0aG9kLgotCi0gICAgICAgICAgICAgICAgaWYoIG5ld0VsZW0gIT0gZWxlbSApIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbSA9IG5ld0VsZW07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8vIFdlIGFwcGxpZWQgb25lLCBzbyB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhhdCBhbGwgb3VyIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGlzIG5vdCBzZXR1cCBwcm9wZXJseQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVNldHVwKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiggcGF0aCA9PSBudWxsICkKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIllvdSBtdXN0IHNwZWNpZnkgYSBwYXRoIHRvIGNvbnZlcnQiICk7Ci0KLSAgICAgICAgaWYoIHByb3BlcnR5ID09IG51bGwgKQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiWW91IG11c3Qgc3BlY2lmeSBhIHByb3BlcnR5IiApOwotCi0gICAgICAgIC8vIE11c3QgZWl0aGVyIGhhdmUgYSB0YXJnZXQgT1Mgb3IgYm90aCBhIGRpclNlcCBhbmQgcGF0aFNlcAotCi0gICAgICAgIGlmKCB0YXJnZXRPUyA9PSBudWxsICYmIHBhdGhTZXAgPT0gbnVsbCAmJiBkaXJTZXAgPT0gbnVsbCApCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBvZiB0YXJnZXRPUywgZGlyU2VwLCBvciBwYXRoU2VwIiApOwotCi0gICAgICAgIC8vIERldGVybWluZSB0aGUgc2VwYXJhdG9yIHN0cmluZ3MuICBUaGUgZGlyc2VwIGFuZCBwYXRoc2VwIGF0dHJpYnV0ZXMKLSAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIHRhcmdldE9TIHNldHRpbmdzLgotICAgICAgICBTdHJpbmcgZHNlcCA9IEZpbGUuc2VwYXJhdG9yOwotICAgICAgICBTdHJpbmcgcHNlcCA9IEZpbGUucGF0aFNlcGFyYXRvcjsKLQotICAgICAgICBpZiggdGFyZ2V0T1MgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHBzZXAgPSB0YXJnZXRXaW5kb3dzID8gIjsiIDogIjoiOwotICAgICAgICAgICAgZHNlcCA9IHRhcmdldFdpbmRvd3MgPyAiXFwiIDogIi8iOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBhdGhTZXAgIT0gbnVsbCApIHsgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgd2l0aCBwYXRoc2VwPQotICAgICAgICAgICAgcHNlcCA9IHBhdGhTZXA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggZGlyU2VwICE9IG51bGwgKSB7ICAgICAgICAgICAgICAvLyBvdmVycmlkZSB3aXRoIGRpcnNlcD0KLSAgICAgICAgICAgIGRzZXAgPSBkaXJTZXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXRoU2VwID0gcHNlcDsKLSAgICAgICAgZGlyU2VwID0gZHNlcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGV4Y2VwdGlvbiB0aGF0IGluZGljYXRlcyB0aGF0IHRoaXMgWE1MIGVsZW1lbnQgbXVzdAotICAgICAqIG5vdCBoYXZlIGNoaWxkIGVsZW1lbnRzIGlmIHRoZSByZWZpZCBhdHRyaWJ1dGUgaXMgc2V0LiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSBCdWlsZEV4Y2VwdGlvbiBub0NoaWxkcmVuQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIFBBVEggZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOwotICAgIH0KLQotCi0gICAgLy8gTWVtYmVycwotICAgIHByaXZhdGUgUGF0aCBwYXRoID0gbnVsbDsgICAgICAgICAgICAgICAvLyBQYXRoIHRvIGJlIGNvbnZlcnRlZAotICAgIHByaXZhdGUgUmVmZXJlbmNlIHJlZmlkID0gbnVsbDsgICAgICAgICAvLyBSZWZlcmVuY2UgdG8gcGF0aC9maWxlc2V0IHRvIGNvbnZlcnQKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRPUyA9IG51bGw7ICAgICAgICAgLy8gVGhlIHRhcmdldCBPUyB0eXBlCi0gICAgcHJpdmF0ZSBib29sZWFuIHRhcmdldFdpbmRvd3MgPSBmYWxzZTsgIC8vIFNldCB3aGVuIHRhcmdldE9TIGlzIHNldAotICAgIHByaXZhdGUgYm9vbGVhbiBvbldpbmRvd3MgPSBmYWxzZTsgICAgICAvLyBTZXQgaWYgd2UncmUgcnVubmluZyBvbiB3aW5kb3dzCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkgPSBudWxsOyAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSB0byByZWNlaXZlIHRoZSByZXN1bHRzCi0gICAgcHJpdmF0ZSBWZWN0b3IgcHJlZml4TWFwID0gbmV3IFZlY3RvcigpOyAgLy8gUGF0aCBwcmVmaXggbWFwCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFNlcCA9IG51bGw7ICAgICAgICAgIC8vIFVzZXIgb3ZlcnJpZGUgb24gcGF0aCBzZXAgY2hhcgotICAgIHByaXZhdGUgU3RyaW5nIGRpclNlcCA9IG51bGw7ICAgICAgICAgICAvLyBVc2VyIG92ZXJyaWRlIG9uIGRpcmVjdG9yeSBzZXAgY2hhcgotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzc1YzAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogV2lsbCBzZXQgYSBQcm9qZWN0IHByb3BlcnR5LiBVc2VkIHRvIGJlIGEgaGFjayBpbiBQcm9qZWN0SGVscGVyCi0gKiBXaWxsIG5vdCBvdmVycmlkZSB2YWx1ZXMgc2V0IGJ5IHRoZSBjb21tYW5kIGxpbmUgb3IgcGFyZW50IHByb2plY3RzLgotICoKLSAqIEBhdXRob3IgY29zdGluQGRudC5ybwotICogQGF1dGhvciBTYW0gUnVieSA8cnVieXNAdXMuaWJtLmNvbT4KLSAqIEBhdXRob3IgR2xlbm4gTWNBbGxpc3RlciA8Z2xlbm5tQGNhLmlibS5jb20+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eSBleHRlbmRzIFRhc2sgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0gICAgcHJvdGVjdGVkIEZpbGUgZmlsZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlOwotICAgIHByb3RlY3RlZCBQYXRoIGNsYXNzcGF0aDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVudjsKLSAgICBwcm90ZWN0ZWQgUmVmZXJlbmNlIHJlZiA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VyUHJvcGVydHk9ZmFsc2U7IC8vIHNldCByZWFkLW9ubHkgcHJvcGVydGllcwotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oRmlsZSBsb2NhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShsb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIHRoaXMucmVmID0gcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWZlcmVuY2UgZ2V0UmVmaWQoKSB7Ci0gICAgICAgIHJldHVybiByZWY7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlKSB7Ci0gICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoU3RyaW5nIGVudikgewotICAgICAgICB0aGlzLmVudiA9IGVudjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVudmlyb25tZW50KCkgewotICAgICAgICByZXR1cm4gZW52OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgewotICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUHJvcGVydHkoYm9vbGVhbiB1c2VyUHJvcGVydHkpIHsKLSAgICAgICAgdGhpcy51c2VyUHJvcGVydHkgPSB1c2VyUHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKHZhbHVlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIGxvYWRGaWxlKGZpbGUpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIGxvYWRSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZW52ICE9IG51bGwpIGxvYWRFbnZpcm9ubWVudChlbnYpOwotICAgICAgICAKLSAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChyZWYgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSByZWYuZ2V0UmVmZXJlbmNlZE9iamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHkobmFtZSwgb2JqLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9hZEZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgbG9nKCJMb2FkaW5nICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7IAotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgICAgIHRyeSB7IAotICAgICAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGZpcyk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7IAotICAgICAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydGllcyhwcm9wcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGZpbmQgcHJvcGVydHkgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIAotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4LCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGxvZygiUmVzb3VyY2UgTG9hZGluZyAiICsgbmFtZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjTCA9IG51bGw7IAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsgCi0gICAgICAgICAgICAgICAgY0wgPSBuZXcgQW50Q2xhc3NMb2FkZXIocHJvamVjdCwgY2xhc3NwYXRoKTsgCi0gICAgICAgICAgICB9IGVsc2UgeyAKLSAgICAgICAgICAgICAgICBjTCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOyAKLSAgICAgICAgICAgIH0gCi0KLSAgICAgICAgICAgIGlmIChjTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKG5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpcyA9IGNMLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcHMubG9hZChpcyk7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydGllcyhwcm9wcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGZpbmQgcmVzb3VyY2UgIiArIG5hbWUsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4LCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkRW52aXJvbm1lbnQoIFN0cmluZyBwcmVmaXggKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBpZiAoIXByZWZpeC5lbmRzV2l0aCgiLiIpKSBwcmVmaXggKz0gIi4iOwotICAgICAgICBsb2coIkxvYWRpbmcgRW52aXJvbm1lbnQgIiArIHByZWZpeCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIFZlY3RvciBvc0VudiA9IEV4ZWN1dGUuZ2V0UHJvY0Vudmlyb25tZW50KCk7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IG9zRW52LmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotICAgICAgICAgICAgU3RyaW5nIGVudHJ5ID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZW50cnkuaW5kZXhPZignPScpOwotICAgICAgICAgICAgaWYgKHBvcyA9PSAtMSkgewotICAgICAgICAgICAgICAgIGxvZygiSWdub3Jpbmc6ICIgKyBlbnRyeSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb3BzLnB1dChwcmVmaXggKyBlbnRyeS5zdWJzdHJpbmcoMCwgcG9zKSwgCi0gICAgICAgICAgICAgICAgZW50cnkuc3Vic3RyaW5nKHBvcyArIDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhZGRQcm9wZXJ0aWVzKHByb3BzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHsKLSAgICAgICAgcmVzb2x2ZUFsbFByb3BlcnRpZXMocHJvcHMpOwotICAgICAgICBFbnVtZXJhdGlvbiBlID0gcHJvcHMua2V5cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lKTsKLQotICAgICAgICAgICAgU3RyaW5nIHYgPSBQcm9qZWN0SGVscGVyLnJlcGxhY2VQcm9wZXJ0aWVzKHByb2plY3QsIHZhbHVlLCBwcm9qZWN0LmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eShuYW1lLCB2KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBuLCBTdHJpbmcgdikgewotICAgICAgICBpZiggdXNlclByb3BlcnR5ICkgewotICAgICAgICAgICAgaWYgKHByb2plY3QuZ2V0VXNlclByb3BlcnR5KG4pID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eShuLCB2KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJPdmVycmlkZSBpZ25vcmVkIGZvciAiICsgbiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHByb2plY3QuZ2V0UHJvcGVydHkobikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkobiwgdik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygiT3ZlcnJpZGUgaWdub3JlZCBmb3IgIiArIG4sIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVBbGxQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHByb3BzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lKTsKLQotICAgICAgICAgICAgYm9vbGVhbiByZXNvbHZlZCA9IGZhbHNlOwotICAgICAgICAgICAgd2hpbGUgKCFyZXNvbHZlZCkgewotICAgICAgICAgICAgICAgIFZlY3RvciBmcmFnbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgVmVjdG9yIHByb3BlcnR5UmVmcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBQcm9qZWN0SGVscGVyLnBhcnNlUHJvcGVydHlTdHJpbmcodmFsdWUsIGZyYWdtZW50cywgcHJvcGVydHlSZWZzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5UmVmcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGkgPSBmcmFnbWVudHMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gaiA9IHByb3BlcnR5UmVmcy5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50ID0gKFN0cmluZylpLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKWoubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBuYW1lICsgIiB3YXMgY2lyY3VsYXJseSBkZWZpbmVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHByb3BzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSAiJHsiICsgcHJvcGVydHlOYW1lICsgIn0iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGZyYWdtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1B1bXBTdHJlYW1IYW5kbGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QdW1wU3RyZWFtSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUyNzRlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1B1bXBTdHJlYW1IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBDb3BpZXMgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvciBvZiBzdWJwcm9jZXNzZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZAotICogZXJyb3Igb2YgdGhlIHBhcmVudCBwcm9jZXNzLgotICoKLSAqIFRPRE86IHN0YW5kYXJkIGlucHV0IG9mIHRoZSBzdWJwcm9jZXNzIGlzIG5vdCBpbXBsZW1lbnRlZC4KLSAqCi0gKiBAYXV0aG9yIHRob21hcy5oYWFzQHNvZnR3aXJlZC1pbmMuY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBQdW1wU3RyZWFtSGFuZGxlciBpbXBsZW1lbnRzIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHsKLQotICAgIHByaXZhdGUgVGhyZWFkIGlucHV0VGhyZWFkOwotICAgIHByaXZhdGUgVGhyZWFkIGVycm9yVGhyZWFkOwotCi0gICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0LCBlcnI7Ci0KLSAgICBwdWJsaWMgUHVtcFN0cmVhbUhhbmRsZXIoT3V0cHV0U3RyZWFtIG91dCwgT3V0cHV0U3RyZWFtIGVycikgewotICAgICAgICB0aGlzLm91dCA9IG91dDsKLSAgICAgICAgdGhpcy5lcnIgPSBlcnI7Ci0gICAgfQotCi0gICAgcHVibGljIFB1bXBTdHJlYW1IYW5kbGVyKE91dHB1dFN0cmVhbSBvdXRBbmRFcnIpIHsKLSAgICAgICAgdGhpcyhvdXRBbmRFcnIsIG91dEFuZEVycik7Ci0gICAgfQotCi0gICAgcHVibGljIFB1bXBTdHJlYW1IYW5kbGVyKCkgewotICAgICAgICB0aGlzKFN5c3RlbS5vdXQsIFN5c3RlbS5lcnIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NPdXRwdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgY3JlYXRlUHJvY2Vzc091dHB1dFB1bXAoaXMsIG91dCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzRXJyb3JTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgY3JlYXRlUHJvY2Vzc0Vycm9yUHVtcChpcywgZXJyKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NJbnB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpbnB1dFRocmVhZC5zdGFydCgpOwotICAgICAgICBlcnJvclRocmVhZC5zdGFydCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlucHV0VGhyZWFkLmpvaW4oKTsKLSAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXJyb3JUaHJlYWQuam9pbigpOwotICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlcnIuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgIH0KLQotICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0RXJyKCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0T3V0KCkgewotICAgICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2Nlc3NPdXRwdXRQdW1wKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICAgICAgaW5wdXRUaHJlYWQgPSBjcmVhdGVQdW1wKGlzLCBvcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvY2Vzc0Vycm9yUHVtcChJbnB1dFN0cmVhbSBpcywgT3V0cHV0U3RyZWFtIG9zKSB7Ci0gICAgICAgIGVycm9yVGhyZWFkID0gY3JlYXRlUHVtcChpcywgb3MpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHN0cmVhbSBwdW1wZXIgdG8gY29weSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUaHJlYWQgY3JlYXRlUHVtcChJbnB1dFN0cmVhbSBpcywgT3V0cHV0U3RyZWFtIG9zKSB7Ci0gICAgICAgIGZpbmFsIFRocmVhZCByZXN1bHQgPSBuZXcgVGhyZWFkKG5ldyBTdHJlYW1QdW1wZXIoaXMsIG9zKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREYWVtb24odHJ1ZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWNvcmRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwNWQzNi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgdGFzayBpcyB0aGUgbWFuYWdlciBmb3IgUmVjb3JkZXJFbnRyeSdzLiAgSXQgaXMgdGhpcyBjbGFzcwotICogdGhhdCBob2xkcyBhbGwgZW50cmllcywgbW9kaWZpZXMgdGhlbSBldmVyeSB0aW1lIHRoZSA8cmVjb3JkZXI+Ci0gKiB0YXNrIGlzIGNhbGxlZCwgYW5kIGFkZGVzIHRoZW0gdG8gdGhlIGJ1aWxkIGxpc3RlbmVyIHByb2Nlc3MuCi0gKiBAc2VlIFJlY29yZGVyRW50cnkKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpheWdsYW52aWxsZUBob21lLmNvbSI+SiBEIEdsYW52aWxsZTwvYT4KLSAqIEB2ZXJzaW9uIDAuNQotICoKLSAqLwotcHVibGljIGNsYXNzIFJlY29yZGVyIGV4dGVuZHMgVGFzayB7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQVRUUklCVVRFUwotCi0gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHJlY29yZCB0by4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0gICAgLyoqIFdoZXRoZXIgb3Igbm90IHRvIGFwcGVuZC4gIE5lZWQgQm9vbGVhbiB0byByZWNvcmQgYW4gdW5zZXQKLSAgICAgKiAgc3RhdGUgKG51bGwpLgotICAgICAqLwotICAgIHByaXZhdGUgQm9vbGVhbiBhcHBlbmQgPSBudWxsOwotICAgIC8qKiBXaGV0aGVyIHRvIHN0YXJ0IG9yIHN0b3AgcmVjb3JkaW5nLiAgTmVlZCBCb29sZWFuIHRvIHJlY29yZCBhbgotICAgICAqICB1bnNldCBzdGF0ZSAobnVsbCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBCb29sZWFuIHN0YXJ0ID0gbnVsbDsKLSAgICAvKiogV2hhdCBsZXZlbCB0byBsb2c/ICAtMSBtZWFucyBub3QgaW5pdGlhbGl6ZWQgeWV0LiAqLwotICAgIHByaXZhdGUgaW50IGxvZ2xldmVsID0gLTE7Ci0gICAgLyoqIFRoZSBsaXN0IG9mIHJlY29yZGVyIGVudHJpZXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHJlY29yZGVyRW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBDT05TVFJVQ1RPUlMgLyBJTklUSUFMSVpFUlMKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBQ0NFU1NPUiBNRVRIT0RTCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvZyB0bywgYW5kIHRoZSBuYW1lIG9mIHRoZSByZWNvcmRlciBlbnRyeS4KLSAgICAgKiBAcGFyYW0gZm5hbWUgRmlsZSBuYW1lIG9mIGxvZ2ZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZSggU3RyaW5nIGZuYW1lICkgewotICAgICAgICBmaWxlbmFtZSA9IGZuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgcmVjb3JkZXIgZW50cnkuCi0gICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIGZvciB0aGUgZW50cnkgdG8gdGFrZTogc3RhcnQgb3Igc3RvcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oIEFjdGlvbkNob2ljZXMgYWN0aW9uICkgewotICAgICAgICBpZiAoIGFjdGlvbi5nZXRWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoICJzdGFydCIgKSApIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gQm9vbGVhbi5UUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhcnQgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hldGhlciBvciBub3QgdGhlIGxvZ2dlciBzaG91bGQgYXBwZW5kIHRvIGEgcHJldmlvdXMgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcHBlbmQoIGJvb2xlYW4gYXBwZW5kICkgewotICAgICAgICB0aGlzLmFwcGVuZCA9IG5ldyBCb29sZWFuKGFwcGVuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGV2ZWwgdG8gd2hpY2ggdGhpcyByZWNvcmRlciBlbnRyeSBzaG91bGQgbG9nIHRvLgotICAgICAqIEBzZWUgVmVyYm9zaXR5TGV2ZWxDaG9pY2VzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9nbGV2ZWwoIFZlcmJvc2l0eUxldmVsQ2hvaWNlcyBsZXZlbCApewotICAgICAgICAvL0kgaGF0ZSBjYXNjYWRpbmcgaWYvZWxzZWlmIGNsYXVzZXMgISEhCi0gICAgICAgIFN0cmluZyBsZXYgPSBsZXZlbC5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAoIGxldi5lcXVhbHNJZ25vcmVDYXNlKCJlcnJvciIpICkgewotICAgICAgICAgICAgbG9nbGV2ZWwgPSBQcm9qZWN0Lk1TR19FUlI7Ci0gICAgICAgIH0gZWxzZSBpZiAoIGxldi5lcXVhbHNJZ25vcmVDYXNlKCJ3YXJuIikgKXsKLSAgICAgICAgICAgIGxvZ2xldmVsID0gUHJvamVjdC5NU0dfV0FSTjsKLSAgICAgICAgfSBlbHNlIGlmICggbGV2LmVxdWFsc0lnbm9yZUNhc2UoImluZm8iKSApewotICAgICAgICAgICAgbG9nbGV2ZWwgPSBQcm9qZWN0Lk1TR19JTkZPOwotICAgICAgICB9IGVsc2UgaWYgKCBsZXYuZXF1YWxzSWdub3JlQ2FzZSgidmVyYm9zZSIpICl7Ci0gICAgICAgICAgICBsb2dsZXZlbCA9IFByb2plY3QuTVNHX1ZFUkJPU0U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIGxldi5lcXVhbHNJZ25vcmVDYXNlKCJkZWJ1ZyIpICl7Ci0gICAgICAgICAgICBsb2dsZXZlbCA9IFByb2plY3QuTVNHX0RFQlVHOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIENPUkUgLyBNQUlOIEJPRFkKLQotICAgIC8qKgotICAgICAqIFRoZSBtYWluIGV4ZWN1dGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCBmaWxlbmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIk5vIGZpbGVuYW1lIHNwZWNpZmllZCIgKTsKLQotICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCAic2V0dGluZyBhIHJlY29yZGVyIGZvciBuYW1lICIgKyBmaWxlbmFtZSwKLSAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHICk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSByZWNvcmRlciBlbnRyeQotICAgICAgICBSZWNvcmRlckVudHJ5IHJlY29yZGVyID0gZ2V0UmVjb3JkZXIoIGZpbGVuYW1lLCBnZXRQcm9qZWN0KCkgKTsKLSAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZXMgb24gdGhlIHJlY29yZGVyCi0gICAgICAgIHJlY29yZGVyLnNldE1lc3NhZ2VPdXRwdXRMZXZlbCggbG9nbGV2ZWwgKTsKLSAgICAgICAgcmVjb3JkZXIuc2V0UmVjb3JkU3RhdGUoIHN0YXJ0ICk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIElOTkVSIENMQVNTRVMKLQotICAgIC8qKgotICAgICAqIEEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5zZXRBY3Rpb24oKTwvY29kZT4gbWV0aG9kLgotICAgICAqIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiBzdGFydCBhbmQgc3RvcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjdGlvbkNob2ljZXMgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gdmFsdWVzID0geyJzdGFydCIsICJzdG9wIn07Ci0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIDxjb2RlPnNldExvZ2xldmVsKCk8L2NvZGU+IG1ldGhvZC4KLSAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogZXJyb3IsIHdhcm4sIGluZm8sIHZlcmJvc2UsIGRlYnVnLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmVyYm9zaXR5TGV2ZWxDaG9pY2VzIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHZhbHVlcyA9IHsgImVycm9yIiwgIndhcm4iLCAiaW5mbyIsCi0gICAgICAgICAgICAidmVyYm9zZSIsICJkZWJ1ZyJ9OwotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJlY29yZGVyIHRoYXQncyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhc3NlZCBpbiBuYW1lLgotICAgICAqIElmIHRoZSByZWNvcmRlciBkb2Vzbid0IGV4aXN0LCB0aGVuIGEgbmV3IG9uZSBpcyBjcmVhdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZWNvcmRlckVudHJ5IGdldFJlY29yZGVyKCBTdHJpbmcgbmFtZSwgUHJvamVjdCBwcm9qICkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IG8gPSByZWNvcmRlckVudHJpZXMuZ2V0KG5hbWUpOwotICAgICAgICBSZWNvcmRlckVudHJ5IGVudHJ5OwotICAgICAgICBpZiAoIG8gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHJlY29yZGVyIGVudHJ5Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IFJlY29yZGVyRW50cnkoIG5hbWUgKTsKLSAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICggYXBwZW5kID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShuYW1lLCBhcHBlbmQuYm9vbGVhblZhbHVlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0RXJyb3JQcmludFN0cmVhbShvdXQpOwotICAgICAgICAgICAgICAgIGVudHJ5LnNldE91dHB1dFByaW50U3RyZWFtKG91dCk7Ci0gICAgICAgICAgICB9IGNhdGNoICggSU9FeGNlcHRpb24gaW9lICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIlByb2JsZW1zIGNyZWF0aW5nIGEgcmVjb3JkZXIgZW50cnkiLAotICAgICAgICAgICAgICAgICAgICBpb2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2ouYWRkQnVpbGRMaXN0ZW5lcihlbnRyeSk7Ci0gICAgICAgICAgICByZWNvcmRlckVudHJpZXMucHV0KG5hbWUsIGVudHJ5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVudHJ5ID0gKFJlY29yZGVyRW50cnkpIG87Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJFbnRyeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGE3OTRmLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlY29yZGVyRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhpcyBpcyBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHJlY29yZGVyLiAgVGhpcyBpcyB0aGUgbGlzdGVuZXIKLSAqIHRvIHRoZSBidWlsZCBwcm9jZXNzLgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amF5Z2xhbnZpbGxlQGhvbWUuY29tIj5KIEQgR2xhbnZpbGxlPC9hPgotICogQHZlcnNpb24gMC41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVjb3JkZXJFbnRyeSBpbXBsZW1lbnRzIEJ1aWxkTG9nZ2VyICB7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQVRUUklCVVRFUwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVjb3JkZXIgZW50cnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotICAgIC8qKgotICAgICAqIFRoZSBzdGF0ZSBvZiB0aGUgcmVjb3JkZXIgKHJlY29yZGVyIG9uIG9yIG9mZikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlY29yZCA9IHRydWU7Ci0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgdmVyYm9zaXR5IGxldmVsIHRvIHJlY29yZCBhdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBsb2dsZXZlbCA9IFByb2plY3QuTVNHX0lORk87Ci0gICAgLyoqCi0gICAgICogVGhlIG91dHB1dCBQcmludFN0cmVhbSB0byByZWNvcmQgdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQgPSBudWxsOwotICAgIC8qKgotICAgICAqIFRoZSBzdGFydCB0aW1lIG9mIHRoZSBsYXN0IGtub3cgdGFyZ2V0LgotICAgICAqLwotICAgIHByaXZhdGUgbG9uZyB0YXJnZXRTdGFydFRpbWUgPSAwbDsKLSAgICAvKioKLSAgICAgKiBMaW5lIHNlcGFyYXRvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBDT05TVFJVQ1RPUlMgLyBJTklUSUFMSVpFUlMKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgcmVjb3JkZXIgKHVzZWQgYXMgdGhlIGZpbGVuYW1lKS4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZWNvcmRlckVudHJ5KCBTdHJpbmcgbmFtZSApIHsKLSAgICAgICAgZmlsZW5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBQ0NFU1NPUiBNRVRIT0RTCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoZSBvdXRwdXQgaXMgc2VudCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotICAgICAgICByZXR1cm4gZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybnMgb2ZmIG9yIG9uIHRoaXMgcmVjb3JkZXIuCi0gICAgICogQHBhcmFtIHN0YXRlIHRydWUgZm9yIG9uLCBmYWxzZSBmb3Igb2ZmLCBudWxsIGZvciBubyBjaGFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVjb3JkU3RhdGUoIEJvb2xlYW4gc3RhdGUgKSB7Ci0gICAgICAgIGlmICggc3RhdGUgIT0gbnVsbCApCi0gICAgICAgICAgICByZWNvcmQgPSBzdGF0ZS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBsb2coICI+IEJVSUxEIFNUQVJURUQiLCBQcm9qZWN0Lk1TR19ERUJVRyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBsb2coICI8IEJVSUxEIEZJTklTSEVEIiwgUHJvamVjdC5NU0dfREVCVUcgKTsKLQotICAgICAgICBUaHJvd2FibGUgZXJyb3IgPSBldmVudC5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGxTZXAgKyAiQlVJTEQgU1VDQ0VTU0ZVTCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LnByaW50bG4obFNlcCArICJCVUlMRCBGQUlMRUQiICsgbFNlcCk7Ci0gICAgICAgICAgICBlcnJvci5wcmludFN0YWNrVHJhY2Uob3V0KTsKLSAgICAgICAgfQotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGxvZyggIj4+IFRBUkdFVCBTVEFSVEVEIC0tICIgKyBldmVudC5nZXRUYXJnZXQoKSwgUHJvamVjdC5NU0dfREVCVUcgKTsKLSAgICAgICAgbG9nKCBsU2VwICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpICsgIjoiLCBQcm9qZWN0Lk1TR19JTkZPICk7Ci0gICAgICAgIHRhcmdldFN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgbG9nKCAiPDwgVEFSR0VUIEZJTklTSEVEIC0tICIgKyBldmVudC5nZXRUYXJnZXQoKSwgUHJvamVjdC5NU0dfREVCVUcgKTsKLSAgICAgICAgU3RyaW5nIHRpbWUgPSBmb3JtYXRUaW1lKCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRhcmdldFN0YXJ0VGltZSApOwotICAgICAgICBsb2coIGV2ZW50LmdldFRhcmdldCgpICsgIjogIGR1cmF0aW9uICIgKyB0aW1lLCBQcm9qZWN0Lk1TR19WRVJCT1NFICk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgbG9nKCAiPj4+IFRBU1QgU1RBUlRFRCAtLSAiICsgZXZlbnQuZ2V0VGFzaygpLCBQcm9qZWN0Lk1TR19ERUJVRyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGxvZyggIjw8PCBUQVNLIEZJTklTSEVEIC0tICIgKyBldmVudC5nZXRUYXNrKCksIFByb2plY3QuTVNHX0RFQlVHICk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBsb2coICItLS0gTUVTU0FHRSBMT0dHRUQiLCBQcm9qZWN0Lk1TR19ERUJVRyApOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmICggZXZlbnQuZ2V0VGFzaygpICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJbIiArIGV2ZW50LmdldFRhc2soKS5nZXRUYXNrTmFtZSgpICsgIl0iOwotICAgICAgICAgICAgLyoqIEB0b2RvIHJlcGxhY2UgMTIgd2l0aCBEZWZhdWx0TG9nZ2VyLkxFRlRfQ09MVU1OX1NJWkUgKi8KLSAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8ICgxMiAtIG5hbWUubGVuZ3RoKCkpOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggIiAiICk7Ci0gICAgICAgICAgICB9IC8vIGZvcgotICAgICAgICAgICAgYnVmLmFwcGVuZCggbmFtZSApOwotICAgICAgICB9IC8vIGlmCi0gICAgICAgIGJ1Zi5hcHBlbmQoIGV2ZW50LmdldE1lc3NhZ2UoKSApOwotCi0gICAgICAgIGxvZyggYnVmLnRvU3RyaW5nKCksIGV2ZW50LmdldFByaW9yaXR5KCkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGhpbmcgdGhhdCBhY3R1YWxseSBzZW5kcyB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG91dHB1dC4KLSAgICAgKiBAcGFyYW0gbWVzZyBUaGUgbWVzc2FnZSB0byBsb2cuCi0gICAgICogQHBhcmFtIGxldmVsIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvZyggU3RyaW5nIG1lc2csIGludCBsZXZlbCApIHsKLSAgICAgICAgaWYgKCByZWNvcmQgJiYgKGxldmVsIDw9IGxvZ2xldmVsKSApIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihtZXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQgbGV2ZWwpIHsKLSAgICAgICAgaWYgKCBsZXZlbCA+PSBQcm9qZWN0Lk1TR19FUlIgICYmICBsZXZlbCA8PSBQcm9qZWN0Lk1TR19ERUJVRyApCi0gICAgICAgICAgICBsb2dsZXZlbCA9IGxldmVsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dFByaW50U3RyZWFtKFByaW50U3RyZWFtIG91dHB1dCkgewotICAgICAgICBvdXQgPSBvdXRwdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKSB7Ci0gICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbigiTWV0aG9kIHNldEVtYWNzTW9kZSgpIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpIHsKLSAgICAgICAgb3V0ID0gZXJyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRUaW1lKGxvbmcgbWlsbGlzKSB7Ci0gICAgICAgIGxvbmcgc2Vjb25kcyA9IG1pbGxpcyAvIDEwMDA7Ci0gICAgICAgIGxvbmcgbWludXRlcyA9IHNlY29uZHMgLyA2MDsKLQotCi0gICAgICAgIGlmIChtaW51dGVzID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcobWludXRlcykgKyAiIG1pbnV0ZSIKLSAgICAgICAgICAgICAgICArIChtaW51dGVzID09IDEgPyAiICIgOiAicyAiKQotICAgICAgICAgICAgICAgICsgTG9uZy50b1N0cmluZyhzZWNvbmRzJTYwKSArICIgc2Vjb25kIgotICAgICAgICAgICAgICAgICsgKHNlY29uZHMlNjAgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHNlY29uZHMpICsgIiBzZWNvbmQiCi0gICAgICAgICAgICAgICAgKyAoc2Vjb25kcyU2MCA9PSAxID8gIiIgOiAicyIpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZW5hbWUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmVmZjM4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFJlbmFtZXMgYSBmaWxlLgotICoKLSAqIEBhdXRob3IgaGFhc0Bzb2Z0d2lyZWQuY2gKLSAqCi0gKiBAZGVwcmVjYXRlZCBUaGUgcmVuYW1lIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBtb3ZlIGluc3RlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWUgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgRmlsZSBzcmM7Ci0gICAgcHJpdmF0ZSBGaWxlIGRlc3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2UgPSB0cnVlOwotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlIHRvIGJlIHJlbmFtZWQuCi0gICAgICogQHBhcmFtIHNyYyB0aGUgZmlsZSB0byByZW5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmMpIHsKLSAgICAgICAgdGhpcy5zcmMgPSBzcmM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmV3IG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgICogQHBhcmFtIGRlc3QgdGhlIG5ldyBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkZXN0KSB7Ci0gICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0ZXIgYW4gZXhpc3RpbmcgZmlsZSBzaG91bGQgYmUgcmVwbGFjZWQuCi0gICAgICogQHBhcmFtIHJlcGxhY2UgPGNvZGU+b248L2NvZGU+LCBpZiBhbiBleGlzdGluZyBmaWxlIHNob3VsZCBiZSByZXBsYWNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlKFN0cmluZyByZXBsYWNlKSB7Ci0gICAgICAgIHRoaXMucmVwbGFjZSA9IHByb2plY3QudG9Cb29sZWFuKHJlcGxhY2UpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVuYW1lcyB0aGUgZmlsZSA8Y29kZT5zcmM8L2NvZGU+IHRvIDxjb2RlPmRlc3Q8L2NvZGU+Ci0gICAgICogQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGlzCi0gICAgICogdGhyb3duLCBpZiB0aGUgcmVuYW1lIG9wZXJhdGlvbiBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHJlbmFtZSB0YXNrIGlzIGRlcHJlY2F0ZWQuICBVc2UgbW92ZSBpbnN0ZWFkLiIpOwotCi0gICAgICAgIGlmIChkZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzdCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXBsYWNlICYmIGRlc3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGlmICghZGVzdC5kZWxldGUoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlbW92ZSBleGlzdGluZyBmaWxlICIgKwotICAgICAgICAgICAgICAgICAgICAgIGRlc3QpOwotICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAgaWYgKCFzcmMucmVuYW1lVG8oZGVzdCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlbmFtZSAiICsgc3JjICsgIiB0byAiICsKLSAgICAgICAgICAgICAgICAgIGRlc3QpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA0OWYyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlcGxhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBSZXBsYWNlcyBhbGwgb2NjdXJyZW5jZXMgb2Ygb25lIG9yIG1vcmUgc3RyaW5nIHRva2VucyB3aXRoIGdpdmVuCi0gKiB2YWx1ZXMgaW4gdGhlIGluZGljYXRlZCBmaWxlcy4gRWFjaCB2YWx1ZSBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIAotICogb3IgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgYXZhaWxhYmxlIGluIGEgZGVzaWduYXRlZCBwcm9wZXJ0eSBmaWxlLgotICoKLSAqIEBhdXRob3IgU3RlZmFubyBNYXp6b2NjaGkgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbm9AYXBhY2hlLm9yZyI+c3RlZmFub0BhcGFjaGUub3JnPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZXJpa0BkZXNrbmV0aW5jLmNvbSI+RXJpayBMYW5nZW5iYWNoPC9hPgotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZSBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0gICAgCi0gICAgcHJpdmF0ZSBGaWxlIHNyYyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBOZXN0ZWRTdHJpbmcgdG9rZW4gPSBudWxsOwotICAgIHByaXZhdGUgTmVzdGVkU3RyaW5nIHZhbHVlID0gbmV3IE5lc3RlZFN0cmluZygpOwotCi0gICAgcHJpdmF0ZSBGaWxlIHByb3BlcnR5RmlsZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBudWxsOwotICAgIHByaXZhdGUgVmVjdG9yIHJlcGxhY2VmaWx0ZXJzID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHJpdmF0ZSBGaWxlIGRpciA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGludCBmaWxlQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgcmVwbGFjZUNvdW50OyAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc3VtbWFyeSA9IGZhbHNlOwotICAgIAotICAgIC8vSW5uZXIgY2xhc3MKLSAgICBwdWJsaWMgY2xhc3MgTmVzdGVkU3RyaW5nIHsKLQotICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdmFsKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHZhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL0lubmVyIGNsYXNzCi0gICAgcHVibGljIGNsYXNzIFJlcGxhY2VmaWx0ZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRva2VuOwotICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgICAgLy9WYWxpZGF0ZSBtYW5kYXRvcnkgYXR0cmlidXRlcwotICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJ0b2tlbiBpcyBhIG1hbmRhdG9yeSBhdHRyaWJ1dGUgIiArICJvZiByZXBsYWNlZmlsdGVyLiI7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIiIuZXF1YWxzKHRva2VuKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0iVGhlIHRva2VuIGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuIjsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vdmFsdWUgYW5kIHByb3BlcnR5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYXR0cmlidXRlcwotICAgICAgICAgICAgaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAocHJvcGVydHkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFaXRoZXIgdmFsdWUgb3IgcHJvcGVydHkgIiArICJjYW4gYmUgc3BlY2lmaWVkLCBidXQgYSByZXBsYWNlZmlsdGVyICIgKyAiZWxlbWVudCBjYW5ub3QgaGF2ZSBib3RoLiI7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKHByb3BlcnR5ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgLy90aGUgcHJvcGVydHkgYXR0cmlidXRlIG11c3QgaGF2ZSBhY2Nlc3MgdG8gYSBwcm9wZXJ0eSBmaWxlCi0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlRoZSByZXBsYWNlZmlsdGVyJ3MgcHJvcGVydHkgYXR0cmlidXRlICIgKyAiY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSByZXBsYWNldGFzaydzICIgKyAicHJvcGVydHlGaWxlIGF0dHJpYnV0ZS4iOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9NYWtlIHN1cmUgcHJvcGVydHkgZXhpc3RzIGluIHByb3BlcnR5IGZpbGUKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gInByb3BlcnR5IFwiIiArIHByb3BlcnR5ICsgIlwiIHdhcyBub3QgZm91bmQgaW4gIiArIHByb3BlcnR5RmlsZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpcHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUmVwbGFjZS50aGlzLnZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVwbGFjZS50aGlzLnZhbHVlLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vRGVmYXVsdCBpcyBlbXB0eSBzdHJpbmcKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZygiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgdG9rZW4pIHsKLSAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyB0aGUgZXhlY3V0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBpZiAocHJvcGVydHlGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKHByb3BlcnR5RmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWxpZGF0ZVJlcGxhY2VmaWx0ZXJzKCk7Ci0gICAgICAgIGZpbGVDb3VudCA9IDA7Ci0gICAgICAgIHJlcGxhY2VDb3VudCA9IDA7Ci0KLSAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9jZXNzRmlsZShzcmMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihkaXIpOwotICAgICAgICAgICAgU3RyaW5nW10gc3JjcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8c3Jjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcixzcmNzW2ldKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHN1bW1hcnkpIHsKLSAgICAgICAgICAgIGxvZygiUmVwbGFjZWQgIiArIHJlcGxhY2VDb3VudCArICIgb2NjdXJyZW5jZXMgaW4gIiArIGZpbGVDb3VudCArICIgZmlsZXMuIiwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgYXR0cmlidXRlcyBwcm92aWRlZCBmb3IgdGhpcyB0YXNrIGluIC54bWwgYnVpbGQgZmlsZS4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW55IHN1cHBsaWVkIGF0dHJpYnV0ZSBpcyBpbnZhbGlkIG9yIGFueQotICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGUgaXMgbWlzc2luZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQXR0cmlidXRlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmMgPT0gbnVsbCAmJiBkaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRWl0aGVyIHRoZSBmaWxlIG9yIHRoZSBkaXIgYXR0cmlidXRlICIgKyAibXVzdCBiZSBzcGVjaWZpZWQiOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHlGaWxlICE9IG51bGwgJiYgIXByb3BlcnR5RmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiUHJvcGVydHkgZmlsZSAiICsgcHJvcGVydHlGaWxlLmdldFBhdGgoKSArICIgZG9lcyBub3QgZXhpc3QuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRva2VuID09IG51bGwgJiYgcmVwbGFjZWZpbHRlcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkVpdGhlciB0b2tlbiBvciBhIG5lc3RlZCByZXBsYWNlZmlsdGVyICIKLSAgICAgICAgICAgICAgICArICJtdXN0IGJlIHNwZWNpZmllZCI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmICIiLmVxdWFscyh0b2tlbi5nZXRUZXh0KCkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IlRoZSB0b2tlbiBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgbmVzdGVkIGVsZW1lbnRzLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbnkgc3VwcGxpZWQgYXR0cmlidXRlIGlzIGludmFsaWQgb3IgYW55Ci0gICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZSBpcyBtaXNzaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGVSZXBsYWNlZmlsdGVycygpCi0gICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBSZXBsYWNlZmlsdGVyIGVsZW1lbnQgPSAoUmVwbGFjZWZpbHRlcikgcmVwbGFjZWZpbHRlcnMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgZWxlbWVudC52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhGaWxlIHByb3BlcnR5RmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGVydHlGaWxlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJQcm9wZXJ0eSBmaWxlICgiICsgcHJvcGVydHlGaWxlLmdldFBhdGgoKSArICIpIG5vdCBmb3VuZC4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJQcm9wZXJ0eSBmaWxlICgiICsgcHJvcGVydHlGaWxlLmdldFBhdGgoKSArICIpIGNhbm5vdCBiZSBsb2FkZWQuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHJlcGxhY2VtZW50IG9uIHRoZSBnaXZlbiBmaWxlLgotICAgICAqCi0gICAgICogVGhlIHJlcGxhY2VtZW50IGlzIHBlcmZvcm1lZCBvbiBhIHRlbXBvcmFyeSBmaWxlIHdoaWNoIHRoZW4KLSAgICAgKiByZXBsYWNlcyB0aGUgb3JpZ2luYWwgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgc3JjKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIXNyYy5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXBsYWNlOiBzb3VyY2UgZmlsZSAiICsgc3JjLmdldFBhdGgoKSArICIgZG9lc24ndCBleGlzdCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgdGVtcCA9IG5ldyBGaWxlKHNyYy5nZXRQYXRoKCkgKyAiLnRlbXAiKTsKLQotICAgICAgICBpZiAodGVtcC5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXBsYWNlOiB0ZW1wb3JhcnkgZmlsZSAiICsgdGVtcC5nZXRQYXRoKCkgKyAiIGFscmVhZHkgZXhpc3RzIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHNyYykpOwotICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIodGVtcCkpOwotCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBlbnRpcmUgZmlsZSBpbnRvIGEgU3RyaW5nQnVmZmVyCi0gICAgICAgICAgICAvLyAgIHNpemUgb2Ygd29yayBidWZmZXIgbWF5IGJlIGJpZ2dlciB0aGFuIG5lZWRlZAotICAgICAgICAgICAgLy8gICB3aGVuIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGV4aXN0IGluIHRoZSBzb3VyY2UgZmlsZQotICAgICAgICAgICAgLy8gICBidXQgdGhlbiBhZ2FpbiwgaXQgbWlnaHQgYmUgc21hbGxlciB0aGFuIG5lZWRlZCBvbgotICAgICAgICAgICAgLy8gICBwbGF0Zm9ybXMgbGlrZSBXaW5kb3dzIHdoZXJlIGxlbmd0aCBjYW4ndCBiZSB0cnVzdGVkCi0gICAgICAgICAgICBpbnQgZmlsZUxlbmd0aEluQnl0ZXMgPSAoaW50KShzcmMubGVuZ3RoKCkpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHRtcEJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZUxlbmd0aEluQnl0ZXMpOwotICAgICAgICAgICAgaW50IHJlYWRDaGFyID0gMDsKLSAgICAgICAgICAgIGludCB0b3RyZWFkID0gMDsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgcmVhZENoYXIgPSBici5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRDaGFyIDwgMCkgeyBicmVhazsgfQotICAgICAgICAgICAgICAgIHRtcEJ1Zi5hcHBlbmQoKGNoYXIpcmVhZENoYXIpOwotICAgICAgICAgICAgICAgIHRvdHJlYWQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgU3RyaW5nIHNvIHdlIGNhbiB1c2UgaW5kZXhPZgotICAgICAgICAgICAgU3RyaW5nIGJ1ZiA9IHRtcEJ1Zi50b1N0cmluZygpOwotCi0gICAgICAgICAgICAvL1ByZXNlcnZlIG9yaWdpbmFsIHN0cmluZyAoYnVmKSBzbyB3ZSBjYW4gY29tcGFyZSB0aGUgcmVzdWx0Ci0gICAgICAgICAgICBTdHJpbmcgbmV3U3RyaW5nID0gbmV3IFN0cmluZyhidWYpOwotCi0gICAgICAgICAgICBpZiAodG9rZW4gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBsaW5lIHNlcGFyYXRvcnMgaW4gdmFsdWVzIGFuZCB0b2tlbnMgYXJlICJcbiIKLSAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBjb21wYXJlIHdpdGggdGhlIGZpbGUgY29udGVudHMsIHJlcGxhY2UgdGhlbQotICAgICAgICAgICAgICAgIC8vIGFzIG5lZWRlZAotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lc2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLmdldFRleHQoKSwgIlxuIiwgbGluZXNlcCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRvayA9IHN0cmluZ1JlcGxhY2UodG9rZW4uZ2V0VGV4dCgpLCAiXG4iLCBsaW5lc2VwKTsKLQotICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIGZvdW5kIHRva2VuLCByZXBsYWNlIHdpdGggdmFsdWUKLSAgICAgICAgICAgICAgICBsb2coIlJlcGxhY2luZyBpbiAiICsgc3JjLmdldFBhdGgoKSArICI6ICIgKyB0b2tlbi5nZXRUZXh0KCkgKyAiIC0tPiAiICsgdmFsdWUuZ2V0VGV4dCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICBuZXdTdHJpbmcgPSBzdHJpbmdSZXBsYWNlKG5ld1N0cmluZywgdG9rLCB2YWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVwbGFjZWZpbHRlcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIG5ld1N0cmluZyA9IHByb2Nlc3NSZXBsYWNlZmlsdGVycyhuZXdTdHJpbmcsIHNyYy5nZXRQYXRoKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGNoYW5nZXMgPSAhbmV3U3RyaW5nLmVxdWFscyhidWYpOwotICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHsKLSAgICAgICAgICAgICAgICBidy53cml0ZShuZXdTdHJpbmcsMCxuZXdTdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGJ3LmZsdXNoKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNsZWFudXAKLSAgICAgICAgICAgIGJ3LmNsb3NlKCk7Ci0gICAgICAgICAgICBici5jbG9zZSgpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIGNoYW5nZXMsIG1vdmUgdGhlIG5ldyBvbmUgdG8gdGhlIG9sZCBvbmU7Ci0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIGRlbGV0ZSB0aGUgbmV3IG9uZQotICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHsKLSAgICAgICAgICAgICAgICArK2ZpbGVDb3VudDsKLSAgICAgICAgICAgICAgICBzcmMuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgdGVtcC5yZW5hbWVUbyhzcmMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZW1wLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NSZXBsYWNlZmlsdGVycyhTdHJpbmcgYnVmZmVyLCBTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG5ld1N0cmluZyA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBSZXBsYWNlZmlsdGVyIGZpbHRlciA9IChSZXBsYWNlZmlsdGVyKSByZXBsYWNlZmlsdGVycy5lbGVtZW50QXQoaSk7Ci0KLSAgICAgICAgICAgIC8vZm9yIGVhY2ggZm91bmQgdG9rZW4sIHJlcGxhY2Ugd2l0aCB2YWx1ZQotICAgICAgICAgICAgbG9nKCJSZXBsYWNpbmcgaW4gIiArIGZpbGVuYW1lICsgIjogIiArIGZpbHRlci5nZXRUb2tlbigpICsgIiAtLT4gIiArIGZpbHRlci5nZXRSZXBsYWNlVmFsdWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBuZXdTdHJpbmcgPSBzdHJpbmdSZXBsYWNlKG5ld1N0cmluZywgZmlsdGVyLmdldFRva2VuKCksIGZpbHRlci5nZXRSZXBsYWNlVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3U3RyaW5nOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzb3VyY2UgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzLnNyYyA9IGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCBhIHN1bW1hcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdW1tYXJ5IHRydWUgaWYgeW91IHdvdWxkIGxpa2UgYSBzdW1tYXJ5IGxvZ2dlZCBvZiB0aGUgcmVwbGFjZSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KGJvb2xlYW4gc3VtbWFyeSkgewotICAgICAgICB0aGlzLnN1bW1hcnkgPSBzdW1tYXJ5OwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvdXJjZSBmaWxlcyBwYXRoIHdoZW4gdXNpbmcgbWF0Y2hpbmcgdGFza3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZGlyKSB7Ci0gICAgICAgIHRoaXMuZGlyID0gZGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RyaW5nIHRva2VuIHRvIHJlcGxhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9rZW4oU3RyaW5nIHRva2VuKSB7Ci0gICAgICAgIGNyZWF0ZVJlcGxhY2VUb2tlbigpLmFkZFRleHQodG9rZW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RyaW5nIHZhbHVlIHRvIHVzZSBhcyB0b2tlbiByZXBsYWNlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgY3JlYXRlUmVwbGFjZVZhbHVlKCkuYWRkVGV4dCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTmVzdGVkIDxyZXBsYWNldG9rZW4+IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE5lc3RlZFN0cmluZyBjcmVhdGVSZXBsYWNlVG9rZW4oKSB7Ci0gICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0b2tlbiA9IG5ldyBOZXN0ZWRTdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTmVzdGVkIDxyZXBsYWNldmFsdWU+IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE5lc3RlZFN0cmluZyBjcmVhdGVSZXBsYWNlVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZmlsZSB0byBiZSBzZWFyY2hlZCBmb3IgcHJvcGVydHkgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RmlsZShGaWxlIGZpbGVuYW1lKSB7Ci0gICAgICAgIHByb3BlcnR5RmlsZSA9IGZpbGVuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBuZXN0ZWQgPHJlcGxhY2VmaWx0ZXI+IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFJlcGxhY2VmaWx0ZXIgY3JlYXRlUmVwbGFjZWZpbHRlcigpIHsKLSAgICAgICAgUmVwbGFjZWZpbHRlciBmaWx0ZXIgPSBuZXcgUmVwbGFjZWZpbHRlcigpOwotICAgICAgICByZXBsYWNlZmlsdGVycy5hZGRFbGVtZW50KGZpbHRlcik7Ci0gICAgICAgIHJldHVybiBmaWx0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSBvY2N1cnJlbmNlcyBvZiBzdHIxIGluIHN0cmluZyBzdHIgd2l0aCBzdHIyCi0gICAgICovICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZ1JlcGxhY2UoU3RyaW5nIHN0ciwgU3RyaW5nIHN0cjEsIFN0cmluZyBzdHIyKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGludCBmb3VuZCA9IHN0ci5pbmRleE9mKHN0cjEpOwotICAgICAgICB3aGlsZSAoZm91bmQgPj0gMCkgewotICAgICAgICAgICAgLy8gd3JpdGUgZXZlcnl0aGluZyB1cCB0byB0aGUgZm91bmQgc3RyMQotICAgICAgICAgICAgaWYgKGZvdW5kID4gc3RhcnQpIHsKLSAgICAgICAgICAgICAgICByZXQuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGZvdW5kKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIHRoZSByZXBsYWNlbWVudCBzdHIyCi0gICAgICAgICAgICBpZiAoc3RyMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0LmFwcGVuZChzdHIyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2VhcmNoIGFnYWluCi0gICAgICAgICAgICBzdGFydCA9IGZvdW5kICsgc3RyMS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvdW5kID0gc3RyLmluZGV4T2Yoc3RyMSxzdGFydCk7Ci0gICAgICAgICAgICArK3JlcGxhY2VDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdyaXRlIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycwotICAgICAgICBpZiAoc3RyLmxlbmd0aCgpID4gc3RhcnQpIHsKLSAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCwgc3RyLmxlbmd0aCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SbWljLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SbWljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGZjOTIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUm1pYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuKjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRhc2sgdG8gY29tcGlsZSBSTUkgc3R1YnMgYW5kIHNrZWxldG9ucy4gVGhpcyB0YXNrIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKLSAqIGFyZ3VtZW50czoKLSAqIDx1bD4KLSAqIDxsaT5iYXNlOiBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBjb21waWxlZCBzdHVicyBhbmQgc2tlbGV0b25zCi0gKiA8bGk+Y2xhc3M6IFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBnZW5lcmF0ZSB0aGUgc3R1YnMgZnJvbQotICogPGxpPnN0dWJWZXJzaW9uOiBUaGUgdmVyc2lvbiBvZiB0aGUgc3R1YiBwcm90b3RvbCB0byB1c2UgKDEuMSwgMS4yLCBjb21wYXQpCi0gKiA8bGk+c291cmNlQmFzZTogVGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgZ2VuZXJhdGVkIHN0dWJzIGFuZCBza2VsZXRvbnMKLSAqIDxsaT5jbGFzc3BhdGg6IEFkZGl0aW9uYWwgY2xhc3NwYXRoLCBhcHBlbmRlZCBiZWZvcmUgdGhlIHN5c3RlbSBjbGFzc3BhdGgKLSAqIDxsaT5paW9wOiBHZW5lcmF0ZSBJSU9QIGNvbXBhdGFibGUgb3V0cHV0IAotICogPGxpPmlpb3BvcHRzOiBJbmNsdWRlIElJT1Agb3B0aW9ucyAKLSAqIDxsaT5pZGw6IEdlbmVyYXRlIElETCBvdXRwdXQgCi0gKiA8bGk+aWRsb3B0czogSW5jbHVkZSBJREwgb3B0aW9ucyAKLSAqIDxsaT5pbmNsdWRlYW50cnVudGltZQotICogPGxpPmluY2x1ZGVqYXZhcnVudGltZQotICogPGxpPmV4dGRpcnMKLSAqIDwvdWw+Ci0gKiBPZiB0aGVzZSBhcmd1bWVudHMsIDxiPmJhc2U8L2I+IGlzIHJlcXVpcmVkLgotICogPHA+Ci0gKiBJZiBjbGFzc25hbWUgaXMgc3BlY2lmaWVkIHRoZW4gb25seSB0aGF0IGNsYXNzbmFtZSB3aWxsIGJlIGNvbXBpbGVkLiBJZiBpdAotICogaXMgYWJzZW50LCB0aGVuIDxiPmJhc2U8L2I+IGlzIHRyYXZlcnNlZCBmb3IgY2xhc3NlcyBhY2NvcmRpbmcgdG8gcGF0dGVybnMuCi0gKiA8cD4KLSAqCi0gKiBAYXV0aG9yIGR1bmNhbkB4MTgwLmNvbQotICogQGF1dGhvciBsdWRvdmljLmNsYXVkZUB3ZWJzaXRld2F0Y2hlcnMuY28udWsKLSAqIEBhdXRob3IgRGF2aWQgTWFjbGVhbiA8YSBocmVmPSJtYWlsdG86ZGF2aWRAY20uY28uemEiPmRhdmlkQGNtLmNvLnphPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqIEBhdXRob3IgVGFrYXNoaSBPa2Ftb3RvIHRva2Ftb3RvQHJkLm50dGRhdGEuY28uanAKLSAqLwotCi1wdWJsaWMgY2xhc3MgUm1pYyBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTF9NU0cgCi0gICAgICAgID0gIlJtaWMgZmFpbGVkLCBtZXNzYWdlcyBzaG91bGQgaGF2ZSBiZWVuIHByb3ZpZGVkLiI7Ci0KLSAgICBwcml2YXRlIEZpbGUgYmFzZURpcjsKLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7Ci0gICAgcHJpdmF0ZSBGaWxlIHNvdXJjZUJhc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3R1YlZlcnNpb247Ci0gICAgcHJpdmF0ZSBQYXRoIGNvbXBpbGVDbGFzc3BhdGg7Ci0gICAgcHJpdmF0ZSBQYXRoIGV4dGRpcnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHZlcmlmeSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJpbmcgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpaW9wID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgIGlpb3BvcHRzOwotICAgIHByaXZhdGUgYm9vbGVhbiBpZGwgID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgIGlkbG9wdHM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnICA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlQW50UnVudGltZSA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVKYXZhUnVudGltZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBWZWN0b3IgY29tcGlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGxvYWRlciA9IG51bGw7Ci0KLSAgICAvKiogU2V0cyB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gb3V0cHV0IGdlbmVyYXRlZCBjbGFzcy4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlKEZpbGUgYmFzZSkgewotICAgICAgICB0aGlzLmJhc2VEaXIgPSBiYXNlOwotICAgIH0KLQotICAgIC8qKiBHZXRzIHRoZSBiYXNlIGRpcmVjdG9yeSB0byBvdXRwdXQgZ2VuZXJhdGVkIGNsYXNzLiAqLwotICAgIHB1YmxpYyBGaWxlIGdldEJhc2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2VEaXI7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGNsYXNzIG5hbWUgdG8gY29tcGlsZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogR2V0cyB0aGUgY2xhc3MgbmFtZSB0byBjb21waWxlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NuYW1lKCkgewotICAgICAgICByZXR1cm4gY2xhc3NuYW1lOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBzb3VyY2UgZGlycyB0byBmaW5kIHRoZSBzb3VyY2UgamF2YSBmaWxlcy4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VCYXNlKEZpbGUgc291cmNlQmFzZSkgewotICAgICAgICB0aGlzLnNvdXJjZUJhc2UgPSBzb3VyY2VCYXNlOwotICAgIH0KLQotICAgIC8qKiBHZXRzIHRoZSBzb3VyY2UgZGlycyB0byBmaW5kIHRoZSBzb3VyY2UgamF2YSBmaWxlcy4gKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRTb3VyY2VCYXNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlQmFzZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgc3R1YiB2ZXJzaW9uLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0dWJWZXJzaW9uKFN0cmluZyBzdHViVmVyc2lvbikgewotICAgICAgICB0aGlzLnN0dWJWZXJzaW9uID0gc3R1YlZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHViVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHN0dWJWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcmluZyhib29sZWFuIGZpbHRlcikgewotICAgICAgICBmaWx0ZXJpbmcgPSBmaWx0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RmlsdGVyaW5nKCkgewotICAgICAgICByZXR1cm4gZmlsdGVyaW5nOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBkZWJ1ZyBmbGFnLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKLSAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOwotICAgIH0KLQotICAgIC8qKiBHZXRzIHRoZSBkZWJ1ZyBmbGFnLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlYnVnKCkgewotICAgICAgICByZXR1cm4gZGVidWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKLSAgICAgICAgaWYgKGNvbXBpbGVDbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGNvbXBpbGVDbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21waWxlQ2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjbGFzc3BhdGguIAotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVDbGFzc3BhdGg7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjbGFzc2VzIGZvdW5kIGJ5IHRoZSBkaXJlY3RvcnkgbWF0Y2ggc2hvdWxkIGJlCi0gICAgICogY2hlY2tlZCB0byBzZWUgaWYgdGhleSBpbXBsZW1lbnQgamF2YS5ybWkuUmVtb3RlLgotICAgICAqIFRoaXMgZGVmYXVsdHMgdG8gZmFsc2UgaWYgbm90IHNldC4gICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyaWZ5KGJvb2xlYW4gdmVyaWZ5KSB7Ci0gICAgICAgIHRoaXMudmVyaWZ5ID0gdmVyaWZ5OwotICAgIH0KLQotICAgIC8qKiBHZXQgdmVyaWZ5IGZsYWcuICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0VmVyaWZ5KCkgewotICAgICAgICByZXR1cm4gdmVyaWZ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IElJT1AgY29tcGF0aWJsZSBzdHVicyBzaG91bGQKLSAgICAgKiBiZSBnZW5lcmF0ZWQuICBUaGlzIGRlZmF1bHRzIHRvIGZhbHNlIAotICAgICAqIGlmIG5vdCBzZXQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJaW9wKGJvb2xlYW4gaWlvcCkgewotICAgICAgICB0aGlzLmlpb3AgPSBpaW9wOwotICAgIH0KLQotICAgIC8qKiBHZXRzIGlpb3AgZmxhZ3MuICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SWlvcCgpIHsKLSAgICAgICAgcmV0dXJuIGlpb3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGFzcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgaWlvcCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJaW9wb3B0cyhTdHJpbmcgaWlvcG9wdHMpIHsKLSAgICAgICAgdGhpcy5paW9wb3B0cyA9IGlpb3BvcHRzOwotICAgIH0KLQotICAgIC8qKiBHZXRzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpaW9wLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWlvcG9wdHMoKSB7Ci0gICAgICAgIHJldHVybiBpaW9wb3B0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCBJREwgb3V0cHV0IHNob3VsZCBiZSAKLSAgICAgKiBnZW5lcmF0ZWQuICBUaGlzIGRlZmF1bHRzIHRvIGZhbHNlIAotICAgICAqIGlmIG5vdCBzZXQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZGwoYm9vbGVhbiBpZGwpIHsKLSAgICAgICAgdGhpcy5pZGwgPSBpZGw7Ci0gICAgfQotCi0gICAgLyogR2V0cyBJREwgZmxhZ3MuICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SWRsKCkgewotICAgICAgICByZXR1cm4gaWRsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHBhc3MgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGlkbCBjb21waWxlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkbG9wdHMoU3RyaW5nIGlkbG9wdHMpIHsKLSAgICAgICAgdGhpcy5pZGxvcHRzID0gaWRsb3B0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpZGwgY29tcGlsZS4gCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZGxvcHRzKCkgewotICAgICAgICByZXR1cm4gaWRsb3B0czsKLSAgICB9Ci0KLSAgICAvKiogR2V0cyBmaWxlIGxpc3QgdG8gY29tcGlsZS4gKi8KLSAgICBwdWJsaWMgVmVjdG9yIGdldEZpbGVMaXN0KCkgewotICAgICAgICByZXR1cm4gY29tcGlsZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5jbHVkZSBhbnQncyBvd24gY2xhc3NwYXRoIGluIHRoaXMgdGFzaydzIGNsYXNzcGF0aD8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlYW50cnVudGltZSggYm9vbGVhbiBpbmNsdWRlICkgewotICAgICAgICBpbmNsdWRlQW50UnVudGltZSA9IGluY2x1ZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIG9yIG5vdCB0aGUgYW50IGNsYXNzcGF0aCBpcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICAgKiB0YXNrJ3MgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVhbnRydW50aW1lKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZUFudFJ1bnRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSBqYXZhIHJ1bnRpbWUgbGlicmFyaWVzIHRvIHRoaXMKLSAgICAgKiB0YXNrJ3MgY2xhc3NwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVqYXZhcnVudGltZSggYm9vbGVhbiBpbmNsdWRlICkgewotICAgICAgICBpbmNsdWRlSmF2YVJ1bnRpbWUgPSBpbmNsdWRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBvciBub3QgdGhlIGphdmEgcnVudGltZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhpcwotICAgICAqIHRhc2sncyBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZWphdmFydW50aW1lKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZUphdmFSdW50aW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCi0gICAgICogY29tcGlsYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZGlycyhQYXRoIGV4dGRpcnMpIHsKLSAgICAgICAgaWYgKHRoaXMuZXh0ZGlycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmV4dGRpcnMgPSBleHRkaXJzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5leHRkaXJzLmFwcGVuZChleHRkaXJzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1heWJlIGNyZWF0ZXMgYSBuZXN0ZWQgZXh0ZGlycyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUV4dGRpcnMoKSB7Ci0gICAgICAgIGlmIChleHRkaXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4dGRpcnMgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXh0ZGlycy5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUKLSAgICAgKiBjb21waWxhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBnZXRFeHRkaXJzKCkgewotICAgICAgICByZXR1cm4gZXh0ZGlyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldENvbXBpbGVMaXN0KCkgewotICAgICAgICByZXR1cm4gY29tcGlsZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChiYXNlRGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmFzZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYmFzZURpci5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJiYXNlIGRvZXMgbm90IGV4aXN0ISIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2ZXJpZnkpIHsKLSAgICAgICAgICAgIGxvZygiVmVyaWZ5IGhhcyBiZWVuIHR1cm5lZCBvbi4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjb21waWxlciA9IHByb2plY3QuZ2V0UHJvcGVydHkoImJ1aWxkLnJtaWMiKTsKLSAgICAgICAgUm1pY0FkYXB0ZXIgYWRhcHRlciA9IFJtaWNBZGFwdGVyRmFjdG9yeS5nZXRSbWljKGNvbXBpbGVyLCB0aGlzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcG9wdWxhdGUgdGhlIGNvbXBpbGVyIGFkYXB0ZXIKLSAgICAgICAgYWRhcHRlci5zZXRSbWljKCB0aGlzICk7Ci0KLSAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBhZGFwdGVyLmdldENsYXNzcGF0aCgpOwotICAgICAgICBsb2FkZXIgPSBuZXcgQW50Q2xhc3NMb2FkZXIocHJvamVjdCwgY2xhc3NwYXRoKTsKLQotICAgICAgICAvLyBzY2FuIGJhc2UgZGlycyB0byBidWlsZCB1cCBjb21waWxlIGxpc3RzIG9ubHkgaWYgYQotICAgICAgICAvLyBzcGVjaWZpYyBjbGFzc25hbWUgaXMgbm90IGdpdmVuCi0gICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHRoaXMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihiYXNlRGlyKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgc2NhbkRpcihiYXNlRGlyLCBmaWxlcywgYWRhcHRlci5nZXRNYXBwZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBvdGhlcndpc2UgcGVyZm9ybSBhIHRpbWVzdGFtcCBjb21wYXJpc29uIC0gYXQgbGVhc3QKLSAgICAgICAgICAgIHNjYW5EaXIoYmFzZURpciwgCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Y2xhc3NuYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyJ9LAotICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLmdldE1hcHBlcigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGZpbGVDb3VudCA9IGNvbXBpbGVMaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKGZpbGVDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGxvZygiUk1JIENvbXBpbGluZyAiICsgZmlsZUNvdW50ICsKLSAgICAgICAgICAgICAgICAiIGNsYXNzIisgKGZpbGVDb3VudCA+IDEgPyAiZXMiIDogIiIpKyIgdG8gIiArIGJhc2VEaXIsIAotICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOwotCi0gICAgICAgICAgICAvLyBmaW5hbGx5LCBsZXRzIGV4ZWN1dGUgdGhlIGNvbXBpbGVyISEKLSAgICAgICAgICAgIGlmICghYWRhcHRlci5leGVjdXRlKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRkFJTF9NU0csIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIAotICAgICAgICAgKiBNb3ZlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LiAgSWYKLSAgICAgICAgICogYmFzZSBkaXJlY3RvcnkgYW5kIHNvdXJjZWJhc2UgYXJlIHRoZSBzYW1lLCB0aGUgZ2VuZXJhdGVkCi0gICAgICAgICAqIHNvdXJjZXMgYXJlIGFscmVhZHkgaW4gcGxhY2UuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobnVsbCAhPSBzb3VyY2VCYXNlICYmICFiYXNlRGlyLmVxdWFscyhzb3VyY2VCYXNlKSkgewotICAgICAgICAgICAgaWYgKGlkbCkgewotICAgICAgICAgICAgICAgIGxvZygiQ2Fubm90IGRldGVybWluZSBzb3VyY2VmaWxlcyBpbiBpZGwgbW9kZSwgIiwgCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgIGxvZygic291cmNlYmFzZSBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkLiIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbGVDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVHZW5lcmF0ZWRGaWxlKGJhc2VEaXIsIHNvdXJjZUJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGNvbXBpbGVMaXN0LmVsZW1lbnRBdChqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbXBpbGVMaXN0LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlKHMpIHRvIHRoZSBiYXNlIGRpcmVjdG9yeQotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBXaGVuIGVycm9yIGNvcHlpbmcvcmVtb3ZpbmcgZmlsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVHZW5lcmF0ZWRGaWxlIChGaWxlIGJhc2VEaXIsIEZpbGUgc291cmNlQmFzZUZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm1pY0FkYXB0ZXIgYWRhcHRlcikKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgY2xhc3NGaWxlTmFtZSA9IAotICAgICAgICAgICAgY2xhc3NuYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7Ci0gICAgICAgIFN0cmluZ1tdIGdlbmVyYXRlZEZpbGVzID0gCi0gICAgICAgICAgICBhZGFwdGVyLmdldE1hcHBlcigpLm1hcEZpbGVOYW1lKGNsYXNzRmlsZU5hbWUpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxnZW5lcmF0ZWRGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGVOYW1lID0gCi0gICAgICAgICAgICAgICAgY2xhc3NGaWxlTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NGaWxlTmFtZS5sZW5ndGgoKS02KSArICIuamF2YSI7Ci0gICAgICAgICAgICBGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShiYXNlRGlyLCBzb3VyY2VGaWxlTmFtZSk7Ci0gICAgICAgICAgICBGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShzb3VyY2VCYXNlRmlsZSwgc291cmNlRmlsZU5hbWUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmNvcHlGaWxlKG9sZEZpbGUsIG5ld0ZpbGUsIGZpbHRlcmluZyk7Ci0gICAgICAgICAgICAgICAgb2xkRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGNvcHkgIiArIG9sZEZpbGUgKyAiIHRvICIgKwotICAgICAgICAgICAgICAgICAgICBuZXdGaWxlICsgIiBkdWUgdG8gIiArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FucyB0aGUgZGlyZWN0b3J5IGxvb2tpbmcgZm9yIGNsYXNzIGZpbGVzIHRvIGJlIGNvbXBpbGVkLgotICAgICAqIFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgaW4gdGhlIGNsYXNzIHZhcmlhYmxlIGNvbXBpbGVMaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNjYW5EaXIoRmlsZSBiYXNlRGlyLCBTdHJpbmcgZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlcikgewotCi0gICAgICAgIFN0cmluZ1tdIG5ld0ZpbGVzID0gZmlsZXM7Ci0gICAgICAgIGlmIChpZGwpIHsKLSAgICAgICAgICAgIGxvZygid2lsbCBsZWF2ZSB1cHRvZGF0ZSB0ZXN0IHRvIHJtaWMgaW1wbGVtZW50YXRpb24gaW4gaWRsIG1vZGUuIiwKLSAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgfSBlbHNlIGlmIChpaW9wIAotICAgICAgICAgICAgICAgICAgICYmIGlpb3BvcHRzICE9IG51bGwgJiYgaWlvcG9wdHMuaW5kZXhPZigiLWFsd2F5cyIpID4gLTEpIHsKLSAgICAgICAgICAgIGxvZygibm8gdXB0b2RhdGUgdGVzdCBhcyAtYWx3YXlzIG9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOwotICAgICAgICAgICAgbmV3RmlsZXMgPSBzZnMucmVzdHJpY3QoZmlsZXMsIGJhc2VEaXIsIGJhc2VEaXIsIG1hcHBlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld0ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gbmV3RmlsZXNbaV0ucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7Ci0gICAgICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUuc3Vic3RyaW5nKDAsIGNsYXNzbmFtZS5sYXN0SW5kZXhPZigiLmNsYXNzIikpOwotICAgICAgICAgICAgY29tcGlsZUxpc3QuYWRkRWxlbWVudChjbGFzc25hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCBuYW1lZCBjbGFzcyBhbmQgdGVzdCB3aGV0aGVyIGl0IGNhbiBiZSBybWljJ2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFJtaVJlbW90ZShTdHJpbmcgY2xhc3NuYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBsb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICAvLyBPbmUgY2Fubm90IFJNSUMgYW4gaW50ZXJmYWNlIGZvciAiY2xhc3NpYyIgUk1JIChKUk1QKQotICAgICAgICAgICAgaWYgKHRlc3RDbGFzcy5pc0ludGVyZmFjZSgpICYmICFpaW9wICYmICFpZGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaXNWYWxpZFJtaVJlbW90ZSh0ZXN0Q2xhc3MpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIHZlcmlmeSBjbGFzcyAiICsgY2xhc3NuYW1lICsgCi0gICAgICAgICAgICAgICAgIi4gSXQgY291bGQgbm90IGJlIGZvdW5kLiIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0gICAgICAgICAgICBsb2coIlVuYWJsZSB0byB2ZXJpZnkgY2xhc3MgIiArIGNsYXNzbmFtZSArIAotICAgICAgICAgICAgICAgICIuIEl0IGlzIG5vdCBkZWZpbmVkLiIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gdmVyaWZ5IGNsYXNzICIgKyBjbGFzc25hbWUgKyAKLSAgICAgICAgICAgICAgICAiLiBMb2FkaW5nIGNhdXNlZCBFeGNlcHRpb246ICIgKwotICAgICAgICAgICAgICAgIHQuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfQotICAgICAgICAvLyB3ZSBvbmx5IGdldCBoZXJlIGlmIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvcG1vc3QgaW50ZXJmYWNlIHRoYXQgZXh0ZW5kcyBSZW1vdGUgZm9yIGEgZ2l2ZW4KLSAgICAgKiBjbGFzcyAtIGlmIG9uZSBleGlzdHMuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldFJlbW90ZUludGVyZmFjZShDbGFzcyB0ZXN0Q2xhc3MpIHsKLSAgICAgICAgaWYgKFJlbW90ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RDbGFzcykpIHsKLSAgICAgICAgICAgIENsYXNzIFtdIGludGVyZmFjZXMgPSB0ZXN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpOwotICAgICAgICAgICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoUmVtb3RlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW50ZXJmYWNlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VzW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgY2xhc3Mgb3IgKHN1cGVyKWludGVyZmFjZXMgaW1wbGVtZW50Ci0gICAgICogamF2YS5ybWkuUmVtb3RlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUm1pUmVtb3RlIChDbGFzcyB0ZXN0Q2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGdldFJlbW90ZUludGVyZmFjZSh0ZXN0Q2xhc3MpICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xhc3Nsb2FkZXIgZm9yIHRoZSB1c2VyLXNwZWNpZmllZCBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHtyZXR1cm4gbG9hZGVyO30KLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVkNDQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU1FMRXhlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci1pbXBvcnQgamF2YS5zcWwuKjsKLQotLyoqCi0gKiBSZWFkcyBpbiBhIHRleHQgZmlsZSBjb250YWluaW5nIFNRTCBzdGF0ZW1lbnRzIHNlcGVyYXRlZCB3aXRoIHNlbWljb2xvbnMKLSAqIGFuZCBleGVjdXRlcyBpdCBpbiBhIGdpdmVuIGRiLgotICogQ29tbWVudHMgbWF5IGJlIGNyZWF0ZWQgd2l0aCBSRU0gLS0gb3IgLy8uCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplZmZAY3VzdG9tbW9ua2V5Lm9yZyI+SmVmZiBNYXJ0aW48L2E+Ci0gKiBAYXV0aG9yIDxBIGhyZWY9Im1haWx0bzpnaG9sYW1AeHRyYS5jby5ueiI+TWljaGFlbCBNY0NhbGx1bTwvQT4KLSAqIEBhdXRob3IgPEEgaHJlZj0ibWFpbHRvOnRpbS5zdGVwaGVuc29uQHN5YmFzZS5jb20iPlRpbSBTdGVwaGVuc29uPC9BPgotICovCi1wdWJsaWMgY2xhc3MgU1FMRXhlYyBleHRlbmRzIFRhc2sgewotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBEZWxpbWl0ZXJUeXBlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7Ci0gICAgICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIE5PUk1BTCA9ICJub3JtYWwiOwotICAgICAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBST1cgPSAicm93IjsKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge05PUk1BTCwgUk9XfTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIGludCBnb29kU3FsID0gMCwgdG90YWxTcWwgPSAwOwotCi0gICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aDsKLQotICAgIHByaXZhdGUgQW50Q2xhc3NMb2FkZXIgbG9hZGVyOwotCi0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEYXRhYmFzZSBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm4gPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIEF1dG9jb21taXQgZmxhZy4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBhdXRvY29tbWl0PWZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFNRTCBzdGF0ZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogREIgZHJpdmVyLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRyaXZlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBEQiB1cmwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFVzZXIgbmFtZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB1c2VySWQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogUGFzc3dvcmQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTUUwgaW5wdXQgZmlsZQotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBzcmNGaWxlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFNRTCBpbnB1dCBjb21tYW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3FsQ29tbWFuZCA9ICIiOwotCi0gICAgLyoqCi0gICAgICogU1FMIHRyYW5zYWN0aW9ucyB0byBwZXJmb3JtCi0gICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgdHJhbnNhY3Rpb25zID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyoqCi0gICAgICogU1FMIFN0YXRlbWVudCBkZWxpbWl0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZWxpbWl0ZXIgPSAiOyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGRlbGltaXRlciB0eXBlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZGVsaW1pdGVyIHdpbGwKLSAgICAgKiBvbmx5IGJlIHJlY29nbml6ZWQgb24gYSBsaW5lIGJ5IGl0c2VsZgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlbGltaXRlclR5cGUgPSBEZWxpbWl0ZXJUeXBlLk5PUk1BTDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmludCBTUUwgcmVzdWx0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJpbnQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFByaW50IGhlYWRlciBjb2x1bW5zLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93aGVhZGVycyA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBSZXN1bHRzIE91dHB1dCBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogUkRCTVMgUHJvZHVjdCBuZWVkZWQgZm9yIHRoaXMgU1FMLgotICAgICAqKi8KLSAgICBwcml2YXRlIFN0cmluZyByZGJtcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBSREJNUyBWZXJzaW9uIG5lZWRlZCBmb3IgdGhpcyBTUUwuCi0gICAgICoqLwotICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQWN0aW9uIHRvIHBlcmZvcm0gaWYgYW4gZXJyb3IgaXMgZm91bmQKLSAgICAgKiovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb25FcnJvciA9ICJhYm9ydCI7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCBmb3IgbG9hZGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgewotICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgY2xhc3NwYXRoIGZvciBsb2FkaW5nIHRoZSBkcml2ZXIuCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5jbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIGZvciBsb2FkaW5nIHRoZSBkcml2ZXIgdXNpbmcgdGhlIGNsYXNzcGF0aCByZWZlcmVuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHNxbCBmaWxlIHRvIGJlIHJ1bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmNGaWxlKSB7Ci0gICAgICAgIHRoaXMuc3JjRmlsZSA9IHNyY0ZpbGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3FsIGNvbW1hbmQgdG8gZXhlY3V0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHNxbCkgewotICAgICAgICB0aGlzLnNxbENvbW1hbmQgKz0gc3FsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKLSAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzcWwgY29tbWFuZCB0byBleGVjdXRlCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zYWN0aW9uIGNyZWF0ZVRyYW5zYWN0aW9uKCkgewotICAgICAgICBUcmFuc2FjdGlvbiB0ID0gbmV3IFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIHRyYW5zYWN0aW9ucy5hZGRFbGVtZW50KHQpOwotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBKREJDIGRyaXZlciB0byBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERyaXZlcihTdHJpbmcgZHJpdmVyKSB7Ci0gICAgICAgIHRoaXMuZHJpdmVyID0gZHJpdmVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIERCIGNvbm5lY3Rpb24gdXJsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIHRoaXMudXJsID0gdXJsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHVzZXIgbmFtZSBmb3IgdGhlIERCIGNvbm5lY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcmlkKFN0cmluZyB1c2VySWQpIHsKLSAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGFzc3dvcmQgZm9yIHRoZSBEQiBjb25uZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgYXV0b2NvbW1pdCBmbGFnIGZvciB0aGUgREIgY29ubmVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvY29tbWl0KGJvb2xlYW4gYXV0b2NvbW1pdCkgewotICAgICAgICB0aGlzLmF1dG9jb21taXQgPSBhdXRvY29tbWl0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RhdGVtZW50IGRlbGltaXRlci4KLSAgICAgKgotICAgICAqIDxwPkZvciBleGFtcGxlLCBzZXQgdGhpcyB0byAiZ28iIGFuZCBkZWxpbWl0ZXJ0eXBlIHRvICJST1ciIGZvcgotICAgICAqIFN5YmFzZSBBU0Ugb3IgTVMgU1FMIFNlcnZlci48L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLSAgICAgICAgdGhpcy5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBEZWxpbWl0ZXIgdHlwZSBmb3IgdGhpcyBzcWwgdGFzay4gVGhlIGRlbGltaXRlciB0eXBlIHRha2VzCi0gICAgICogdHdvIHZhbHVlcyAtIG5vcm1hbCBhbmQgcm93LiBOb3JtYWwgbWVhbnMgdGhhdCBhbnkgb2NjdXJlbmNlIG9mIHRoZSBkZWxpbWl0ZXIKLSAgICAgKiB0ZXJtaW5hdGUgdGhlIFNRTCBjb21tYW5kIHdoZXJlYXMgd2l0aCByb3csIG9ubHkgYSBsaW5lIGNvbnRhaW5pbmcganVzdCB0aGUKLSAgICAgKiBkZWxpbWl0ZXIgaXMgcmVjb2duaXplZCBhcyB0aGUgZW5kIG9mIHRoZSBjb21tYW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlbGltaXRlclR5cGUoRGVsaW1pdGVyVHlwZSBkZWxpbWl0ZXJUeXBlKSB7Ci0gICAgICAgIHRoaXMuZGVsaW1pdGVyVHlwZSA9IGRlbGltaXRlclR5cGUuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwcmludCBmbGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByaW50KGJvb2xlYW4gcHJpbnQpIHsKLSAgICAgICAgdGhpcy5wcmludCA9IHByaW50OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNob3doZWFkZXJzIGZsYWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2hvd2hlYWRlcnMoYm9vbGVhbiBzaG93aGVhZGVycykgewotICAgICAgICB0aGlzLnNob3doZWFkZXJzID0gc2hvd2hlYWRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoRmlsZSBvdXRwdXQpIHsKLSAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSByZGJtcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJkYm1zKFN0cmluZyB2ZW5kb3IpIHsKLSAgICAgICAgdGhpcy5yZGJtcyA9IHZlbmRvci50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmVyc2lvbiByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbi50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgYWN0aW9uIHRvIHBlcmZvcm0gb25lcnJvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9uZXJyb3IoT25FcnJvciBhY3Rpb24pIHsKLSAgICAgICAgdGhpcy5vbkVycm9yID0gYWN0aW9uLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgc3FsIGZpbGUgYW5kIHRoZW4gZXhlY3V0ZSBpdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBzcWxDb21tYW5kID0gc3FsQ29tbWFuZC50cmltKCk7Ci0KLSAgICAgICAgaWYgKHNyY0ZpbGUgPT0gbnVsbCAmJiBzcWxDb21tYW5kLmxlbmd0aCgpPT0wICYmIGZpbGVzZXRzLmlzRW1wdHkoKSkgeyAKLSAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNvdXJjZSBmaWxlIG9yIGZpbGVzZXQsIHRyYW5zYWN0aW9ucyBvciBzcWwgc3RhdGVtZW50IG11c3QgYmUgc2V0ISIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgCi0gICAgICAgICAgICAvLyBkZWFsIHdpdGggdGhlIGZpbGVzZXRzCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZmlsZXNldHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBGaWxlIHNyY0RpciA9IGZzLmdldERpcihwcm9qZWN0KTsKLQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNyY0ZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBhIHRyYW5zYWN0aW9uIGZvciBlYWNoIGZpbGUKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaj0wIDsgajxzcmNGaWxlcy5sZW5ndGggOyBqKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uIHQgPSBjcmVhdGVUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB0LnNldFNyYyhuZXcgRmlsZShzcmNEaXIsIHNyY0ZpbGVzW2pdKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNYWtlIGEgdHJhbnNhY3Rpb24gZ3JvdXAgZm9yIHRoZSBvdXRlciBjb21tYW5kCi0gICAgICAgICAgICBUcmFuc2FjdGlvbiB0ID0gY3JlYXRlVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIHQuc2V0U3JjKHNyY0ZpbGUpOwotICAgICAgICAgICAgdC5hZGRUZXh0KHNxbENvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRyaXZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRyaXZlciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1c2VySWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVc2VyIElkIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGFzc3dvcmQgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVXJsIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY0ZpbGUgIT0gbnVsbCAmJiAhc3JjRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTb3VyY2UgZmlsZSBkb2VzIG5vdCBleGlzdCEiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgRHJpdmVyIGRyaXZlckluc3RhbmNlID0gbnVsbDsKLSAgICAgICAgLy8gTG9hZCB0aGUgZHJpdmVyIHVzaW5nIHRoZSAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGRjOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCAiTG9hZGluZyAiICsgZHJpdmVyICsgIiB1c2luZyBBbnRDbGFzc0xvYWRlciB3aXRoIGNsYXNzcGF0aCAiICsgY2xhc3NwYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UgKTsKLQotICAgICAgICAgICAgICAgIGxvYWRlciA9IG5ldyBBbnRDbGFzc0xvYWRlcihwcm9qZWN0LCBjbGFzc3BhdGgpOwotICAgICAgICAgICAgICAgIGRjID0gbG9hZGVyLmxvYWRDbGFzcyhkcml2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJMb2FkaW5nICIgKyBkcml2ZXIgKyAiIHVzaW5nIHN5c3RlbSBsb2FkZXIuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgZGMgPSBDbGFzcy5mb3JOYW1lKGRyaXZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcml2ZXJJbnN0YW5jZSA9IChEcml2ZXIpIGRjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH1jYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDbGFzcyBOb3QgRm91bmQ6IEpEQkMgZHJpdmVyICIgKyBkcml2ZXIgKyAiIGNvdWxkIG5vdCBiZSBsb2FkZWQiLCBsb2NhdGlvbik7Ci0gICAgICAgIH1jYXRjaChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbGxlZ2FsIEFjY2VzczogSkRCQyBkcml2ZXIgIiArIGRyaXZlciArICIgY291bGQgbm90IGJlIGxvYWRlZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfWNhdGNoKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnN0YW50aWF0aW9uIEV4Y2VwdGlvbjogSkRCQyBkcml2ZXIgIiArIGRyaXZlciArICIgY291bGQgbm90IGJlIGxvYWRlZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIGxvZygiY29ubmVjdGluZyB0byAiICsgdXJsLCBQcm9qZWN0Lk1TR19WRVJCT1NFICk7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIGluZm8gPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgaW5mby5wdXQoInVzZXIiLCB1c2VySWQpOwotICAgICAgICAgICAgaW5mby5wdXQoInBhc3N3b3JkIiwgcGFzc3dvcmQpOwotICAgICAgICAgICAgY29ubiA9IGRyaXZlckluc3RhbmNlLmNvbm5lY3QodXJsLCBpbmZvKTsKLQotICAgICAgICAgICAgaWYgKGNvbm4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIERyaXZlciBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIFVSTAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oIk5vIHN1aXRhYmxlIERyaXZlciBmb3IgIit1cmwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWRSZGJtcyhjb25uKSkgcmV0dXJuOwotCi0gICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQoYXV0b2NvbW1pdCk7Ci0KLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7Ci0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gU3lzdGVtLm91dDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiT3BlbmluZyBQcmludFN0cmVhbSB0byBvdXRwdXQgZmlsZSAiICsgb3V0cHV0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXQpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBhbGwgdHJhbnNhY3Rpb25zCi0gICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gdHJhbnNhY3Rpb25zLmVsZW1lbnRzKCk7IAotICAgICAgICAgICAgICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICgoVHJhbnNhY3Rpb24pIGUubmV4dEVsZW1lbnQoKSkucnVuVHJhbnNhY3Rpb24ob3V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhdXRvY29tbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkNvbW1pdGluZyB0cmFuc2FjdGlvbiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5jb21taXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCAmJiBvdXQgIT0gU3lzdGVtLm91dCkgewotICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBpZiAoIWF1dG9jb21taXQgJiYgY29ubiAhPSBudWxsICYmIG9uRXJyb3IuZXF1YWxzKCJhYm9ydCIpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBsb2NhdGlvbik7Ci0gICAgICAgIH0gY2F0Y2goU1FMRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgaWYgKCFhdXRvY29tbWl0ICYmIGNvbm4gIT0gbnVsbCAmJiBvbkVycm9yLmVxdWFscygiYWJvcnQiKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZXgpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KLSAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICBsb2coZ29vZFNxbCArICIgb2YgIiArIHRvdGFsU3FsICsgCi0gICAgICAgICAgICAiIFNRTCBzdGF0ZW1lbnRzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJ1blN0YXRlbWVudHMoUmVhZGVyIHJlYWRlciwgUHJpbnRTdHJlYW0gb3V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzcWwgPSAiIjsKLSAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKLSAKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKLSAKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgd2hpbGUgKChsaW5lPWluLnJlYWRMaW5lKCkpICE9IG51bGwpewotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBsaW5lID0gUHJvamVjdEhlbHBlci5yZXBsYWNlUHJvcGVydGllcyhwcm9qZWN0LCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCIvLyIpKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCItLSIpKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgbGluZS5zdWJzdHJpbmcoMCwzKS5lcXVhbHNJZ25vcmVDYXNlKCJSRU0iKSkgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBzcWwgKz0gIiAiICsgbGluZTsKLSAgICAgICAgICAgICAgICBzcWwgPSBzcWwudHJpbSgpOwotCi0gICAgICAgICAgICAgICAgLy8gU1FMIGRlZmluZXMgIi0tIiBhcyBhIGNvbW1lbnQgdG8gRU9MCi0gICAgICAgICAgICAgICAgLy8gYW5kIGluIE9yYWNsZSBpdCBtYXkgY29udGFpbiBhIGhpbnQKLSAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW5ub3QganVzdCByZW1vdmUgaXQsIGluc3RlYWQgd2UgbXVzdCBlbmQgaXQKLSAgICAgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCItLSIpID49IDApIHNxbCArPSAiXG4iOwotCi0gICAgICAgICAgICAgICAgaWYgKGRlbGltaXRlclR5cGUuZXF1YWxzKERlbGltaXRlclR5cGUuTk9STUFMKSAmJiBzcWwuZW5kc1dpdGgoZGVsaW1pdGVyKSB8fAotICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXJUeXBlLmVxdWFscyhEZWxpbWl0ZXJUeXBlLlJPVykgJiYgbGluZS5lcXVhbHMoZGVsaW1pdGVyKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlNRTDogIiArIHNxbCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4ZWNTUUwoc3FsLnN1YnN0cmluZygwLCBzcWwubGVuZ3RoKCkgLSBkZWxpbWl0ZXIubGVuZ3RoKCkpLCBvdXQpOwotICAgICAgICAgICAgICAgICAgICBzcWwgPSAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gCi0gICAgICAgICAgICAvLyBDYXRjaCBhbnkgc3RhdGVtZW50cyBub3QgZm9sbG93ZWQgYnkgOwotICAgICAgICAgICAgaWYoIXNxbC5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgICAgICBleGVjU1FMKHNxbCwgb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfWNhdGNoKFNRTEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLQotICAgIH0KLSAKLSAgICAvKioKLSAgICAgKiBWZXJpZnkgaWYgY29ubmVjdGVkIHRvIHRoZSBjb3JyZWN0IFJEQk1TCi0gICAgICoqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRSZGJtcyhDb25uZWN0aW9uIGNvbm4pIHsKLSAgICAgICAgaWYgKHJkYm1zID09IG51bGwgJiYgdmVyc2lvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgRGF0YWJhc2VNZXRhRGF0YSBkbWQgPSBjb25uLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChyZGJtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRoZVZlbmRvciA9IGRtZC5nZXREYXRhYmFzZVByb2R1Y3ROYW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBsb2coIlJEQk1TID0gIiArIHRoZVZlbmRvciwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoZVZlbmRvciA9PSBudWxsIHx8IHRoZVZlbmRvci5pbmRleE9mKHJkYm1zKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJOb3QgdGhlIHJlcXVpcmVkIFJEQk1TOiAiK3JkYm1zLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0aGVWZXJzaW9uID0gZG1kLmdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGxvZygiVmVyc2lvbiA9ICIgKyB0aGVWZXJzaW9uLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICBpZiAodGhlVmVyc2lvbiA9PSBudWxsIHx8IAotICAgICAgICAgICAgICAgICAgICAhKHRoZVZlcnNpb24uc3RhcnRzV2l0aCh2ZXJzaW9uKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgICB0aGVWZXJzaW9uLmluZGV4T2YoIiAiICsgdmVyc2lvbikgPj0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJOb3QgdGhlIHJlcXVpcmVkIHZlcnNpb246IFwiIisgdmVyc2lvbiArIlwiIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDb3VsZCBub3QgZ2V0IHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbgotICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gb2J0YWluIHJlcXVpcmVkIFJEQk1TIGluZm9ybWF0aW9uIiwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWMgdGhlIHNxbCBzdGF0ZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsLCBQcmludFN0cmVhbSBvdXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICAvLyBDaGVjayBhbmQgaWdub3JlIGVtcHR5IHN0YXRlbWVudHMKLSAgICAgICAgaWYgKCIiLmVxdWFscyhzcWwudHJpbSgpKSkgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsgIAotICAgICAgICAgICAgdG90YWxTcWwrKzsKLSAgICAgICAgICAgIGlmICghc3RhdGVtZW50LmV4ZWN1dGUoc3FsKSkgewotICAgICAgICAgICAgICAgIGxvZyhzdGF0ZW1lbnQuZ2V0VXBkYXRlQ291bnQoKSsiIHJvd3MgYWZmZWN0ZWQiLCAKLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJpbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRzKG91dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTUUxXYXJuaW5nIHdhcm5pbmcgPSBjb25uLmdldFdhcm5pbmdzKCk7Ci0gICAgICAgICAgICB3aGlsZSh3YXJuaW5nIT1udWxsKXsKLSAgICAgICAgICAgICAgICBsb2cod2FybmluZyArICIgc3FsIHdhcm5pbmciLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICB3YXJuaW5nPXdhcm5pbmcuZ2V0TmV4dFdhcm5pbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbm4uY2xlYXJXYXJuaW5ncygpOwotICAgICAgICAgICAgZ29vZFNxbCsrOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gZXhlY3V0ZTogIiArIHNxbCwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIGlmICghb25FcnJvci5lcXVhbHMoImNvbnRpbnVlIikpIHRocm93IGU7Ci0gICAgICAgICAgICBsb2coZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHByaW50IGFueSByZXN1bHRzIGluIHRoZSBzdGF0ZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRSZXN1bHRzKFByaW50U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuc3FsLlNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmdldFJlc3VsdFNldCgpOwotICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coIlByb2Nlc3NpbmcgbmV3IHJlc3VsdCBzZXQuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgUmVzdWx0U2V0TWV0YURhdGEgbWQgPSBycy5nZXRNZXRhRGF0YSgpOwotICAgICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCA9IG1kLmdldENvbHVtbkNvdW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGxpbmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3doZWFkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDE7IGNvbCA8IGNvbHVtbkNvdW50OyBjb2wrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKG1kLmdldENvbHVtbk5hbWUoY29sKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZChtZC5nZXRDb2x1bW5OYW1lKGNvbHVtbkNvdW50KSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBsaW5lLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMTsgY29sIDw9IGNvbHVtbkNvdW50OyBjb2wrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtblZhbHVlID0gcnMuZ2V0U3RyaW5nKGNvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlID0gY29sdW1uVmFsdWUudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZChjb2x1bW5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4obGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoc3RhdGVtZW50LmdldE1vcmVSZXN1bHRzKCkpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVudW1lcmF0ZWQgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlcyAiY29udGludWUiLCAic3RvcCIgYW5kICJhYm9ydCIKLSAgICAgKiBmb3IgdGhlIG9uZXJyb3IgYXR0cmlidXRlLiAgCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBPbkVycm9yIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiY29udGludWUiLCAic3RvcCIsICJhYm9ydCJ9OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBuZXcgdHJhbnNhY3Rpb24gZWxlbWVudC4KLSAgICAgKiBUcmFuc2FjdGlvbnMgYWxsb3cgc2V2ZXJhbCBmaWxlcyBvciBibG9ja3Mgb2Ygc3RhdGVtZW50cwotICAgICAqIHRvIGJlIGV4ZWN1dGVkIHVzaW5nIHRoZSBzYW1lIEpEQkMgY29ubmVjdGlvbiBhbmQgY29tbWl0Ci0gICAgICogb3BlcmF0aW9uIGluIGJldHdlZW4uCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIHRTcmNGaWxlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdFNxbENvbW1hbmQgPSAiIjsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmMpIHsKLSAgICAgICAgICAgIHRoaXMudFNyY0ZpbGUgPSBzcmM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyBzcWwpIHsKLSAgICAgICAgICAgIHRoaXMudFNxbENvbW1hbmQgKz0gc3FsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJ1blRyYW5zYWN0aW9uKFByaW50U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHRTcWxDb21tYW5kLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBsb2coIkV4ZWN1dGluZyBjb21tYW5kcyIsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgICAgIHJ1blN0YXRlbWVudHMobmV3IFN0cmluZ1JlYWRlcih0U3FsQ29tbWFuZCksIG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAKLSAgICAgICAgICAgIGlmICh0U3JjRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJFeGVjdXRpbmcgZmlsZTogIiArIHRTcmNGaWxlLmdldEFic29sdXRlUGF0aCgpLCAKLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcih0U3JjRmlsZSk7Ci0gICAgICAgICAgICAgICAgcnVuU3RhdGVtZW50cyhyZWFkZXIsIG91dCk7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NlbmRFbWFpbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VuZEVtYWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDUwNDQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VuZEVtYWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLSAKLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5tYWlsLk1haWxNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHRhc2sgdG8gc2VuZCBTTVRQIGVtYWlsLgotICogPHA+Ci0gKiA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotICogPHRyIGJnY29sb3I9IiNDQ0NDRkYiPgotICogPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gKiA8dGg+RGVzY3JpcHRpb248L3RoPgotICogPHRoPlJlcXVpcmVkPC90aD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+ZnJvbTwvdGQ+Ci0gKiA8dGQ+RW1haWwgYWRkcmVzcyBvZiBzZW5kZXIuPC90ZD4KLSAqIDx0ZD5ZZXM8L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD5tYWlsaG9zdDwvdGQ+Ci0gKiA8dGQ+SG9zdCBuYW1lIG9mIHRoZSBtYWlsIHNlcnZlci48L3RkPgotICogPHRkPk5vLCBkZWZhdWx0IHRvICZxdW90O2xvY2FsaG9zdCZxdW90OzwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPnRvTGlzdDwvdGQ+Ci0gKiA8dGQ+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVjaXBpZW50cy48L3RkPgotICogPHRkPlllczwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPnN1YmplY3Q8L3RkPgotICogPHRkPkVtYWlsIHN1YmplY3QgbGluZS48L3RkPgotICogPHRkPk5vPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+ZmlsZXM8L3RkPgotICogPHRkPkZpbGVuYW1lKHMpIG9mIHRleHQgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwuIE11bHRpcGxlIGZpbGVzIGFyZQotICogICAgIGNvbW1hLXNlcGFyYXRlZC48L3RkPgotICogPHRkIHJvd3NwYW49IjIiPk9uZSBvZiB0aGVzZSB0d28gYXR0cmlidXRlczwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPm1lc3NhZ2U8L3RkPgotICogPHRkPk1lc3NhZ2UgdG8gc2VuZCBpbnRoZSBib2R5IG9mIHRoZSBlbWFpbC48L3RkPgotICogPC90cj4KLSAqIDwvdGFibGU+Ci0gKiA8cD4KLSAqCi0gKiBAYXV0aG9yIGdsZW5uX3R3aWdnc0BibWMuY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBTZW5kRW1haWwgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcml2YXRlIFN0cmluZyBmcm9tOwotICAgIHByaXZhdGUgU3RyaW5nIG1haWxob3N0ID0gImxvY2FsaG9zdCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyB0b0xpc3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3ViamVjdDsKLSAgICBwcml2YXRlIFZlY3RvciBmaWxlcyA9IG5ldyBWZWN0b3IoKTsKLSAgCi0gICAgLyoqIENyZWF0ZXMgbmV3IFNlbmRFbWFpbCAqLwotICAgIHB1YmxpYyBTZW5kRW1haWwoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdG9MaXN0IHBhcmFtZXRlciBvZiB0aGlzIGJ1aWxkIHRhc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdG9MaXN0IENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGVtYWlsIHJlY2lwaWVudCBhZGRyZXNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0xpc3QoU3RyaW5nIHRvTGlzdCkgewotICAgICAgICB0aGlzLnRvTGlzdCA9IHRvTGlzdDsKLSAgICB9Ci0gIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZyb20gcGFyYW1ldGVyIG9mIHRoaXMgYnVpbGQgdGFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcm9tIEVtYWlsIGFkZHJlc3Mgb2Ygc2VuZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKLSAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKLSAgICB9Ci0gIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1haWxob3N0IHBhcmFtZXRlciBvZiB0aGlzIGJ1aWxkIHRhc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFpbGhvc3QgTWFpbCBob3N0IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFpbGhvc3QoU3RyaW5nIG1haWxob3N0KSB7Ci0gICAgICAgIHRoaXMubWFpbGhvc3QgPSBtYWlsaG9zdDsKLSAgICB9Ci0gIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgcGFyYW1ldGVyIG9mIHRoaXMgYnVpbGQgdGFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgYm9keSBvZiB0aGlzIGVtYWlsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0gIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN1YmplY3QgcGFyYW1ldGVyIG9mIHRoaXMgYnVpbGQgdGFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdWJqZWN0IFN1YmplY3Qgb2YgdGhpcyBlbWFpbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFN0cmluZyBzdWJqZWN0KSB7Ci0gICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBwYXJhbWV0ZXIgb2YgdGhpcyBidWlsZCB0YXNrLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVuYW1lcyBGaWxlbmFtZXMgdG8gaW5jbHVkZSBhcyB0aGUgbWVzc2FnZSBib2R5IG9mIHRoaXMgZW1haWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZXMoU3RyaW5nIGZpbGVuYW1lcykgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZmlsZW5hbWVzLCAiLCAiKTsKLSAgICAKLSAgICAgICAgd2hpbGUgKHQuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBmaWxlcy5hZGRFbGVtZW50KHByb2plY3QucmVzb2x2ZUZpbGUodC5uZXh0VG9rZW4oKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhpcyBidWlsZCB0YXNrLgotICAgICAqCi0gICAgICogdGhyb3dzIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0YXNrCi0gICAgICogICAgICAgIGV4ZWN1dGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFpbE1lc3NhZ2UgbWFpbE1lc3NhZ2UgPSBuZXcgTWFpbE1lc3NhZ2UobWFpbGhvc3QpOwotCi0gICAgICAgICAgICBpZiAoZnJvbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2UuZnJvbShmcm9tKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBdHRyaWJ1dGUgXCJmcm9tXCIgaXMgcmVxdWlyZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0b0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0b0xpc3QsICIsICIsIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICh0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICBtYWlsTWVzc2FnZS50byh0Lm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXR0cmlidXRlIFwidG9MaXN0XCIgaXMgcmVxdWlyZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdWJqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYWlsTWVzc2FnZS5zZXRTdWJqZWN0KHN1YmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIG91dCA9IG1haWxNZXNzYWdlLmdldFByaW50U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpZS5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmc2l6ZSA9IDEwMjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2J1ZnNpemVdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgYnVmc2l6ZSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPSBpbi5yZWFkKGJ1ZiwgMCwgYnVmc2l6ZSkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlIFwiIiArIGZpbGUuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWRhYmxlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBtYWlsTWVzc2FnZS5nZXRQcmludFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIG91dC5wcmludChtZXNzYWdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBdHRyaWJ1dGUgXCJmaWxlXCIgb3IgXCJtZXNzYWdlXCIgaXMgcmVxdWlyZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZygiU2VuZGluZyBlbWFpbCIpOwotICAgICAgICAgICAgbWFpbE1lc3NhZ2Uuc2VuZEFuZENsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJTyBlcnJvciBzZW5kaW5nIG1haWw6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VxdWVudGlhbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VxdWVudGlhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjY2M2Y0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NlcXVlbnRpYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOwotCi0vKioKLSAqIEltcGxlbWVudHMgYSBzaW5nbGUgdGhyZWFkZWQgdGFzayBleGVjdXRpb24uCi0gKiA8cD4KLSAqIEBhdXRob3IgVGhvbWFzIENocmlzdGVuIDxhIGhyZWY9Im1haWx0bzpjaHJAYWN0aXZlLmNoIj5jaHJAYWN0aXZlLmNoPC9hPgotICovCi1wdWJsaWMgY2xhc3MgU2VxdWVudGlhbCBleHRlbmRzIFRhc2sKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7Ci0KLSAgICAvKiogT3B0aW9uYWwgVmVjdG9yIGhvbGRpbmcgdGhlIG5lc3RlZCB0YXNrcyAqLwotICAgIHByaXZhdGUgVmVjdG9yIG5lc3RlZFRhc2tzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbmVzdGVkIHRhc2sgdG8gU2VxdWVudGlhbC4KLSAgICAgKiA8cD4KLSAgICAgKiBAcGFyYW0gbmVzdGVkVGFzayAgTmVzdGVkIHRhc2sgdG8gZXhlY3V0ZSBTZXF1ZW50aWFsCi0gICAgICogPHA+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIG5lc3RlZFRhc2spIHsKLSAgICAgICAgbmVzdGVkVGFza3MuYWRkRWxlbWVudChuZXN0ZWRUYXNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIGFsbCBuZXN0ZWRUYXNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gbmVzdGVkVGFza3MuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFRhc2sgbmVzdGVkVGFzayA9IChUYXNrKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIG5lc3RlZFRhc2sucGVyZm9ybSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2lnbkphci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2lnbkphci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc1ZjQwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NpZ25KYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLQotLyoqCi0gKiBTaWduIGEgYXJjaGl2ZS4KLSAqCi0gKiBAYXV0aG9yIFBldGVyIERvbmFsZCA8YSBocmVmPSJtYWlsdG86ZG9uYWxkcEBhcGFjaGUub3JnIj5kb25hbGRwQGFwYWNoZS5vcmc8L2E+Ci0gKiBAYXV0aG9yIE5pY2sgRm9ydGVzY3VlIDxhIGhyZWY9Im1haWx0bzpuaWNrQG94LmNvbXBzb2MubmV0Ij5uaWNrQG94LmNvbXBzb2MubmV0PC9hPgotICovCi1wdWJsaWMgY2xhc3MgU2lnbkphciBleHRlbmRzIFRhc2sgewotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGphciBmaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgamFyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGFsaWFzIG9mIHNpZ25lci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsaWFzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2Yga2V5c3RvcmUgZmlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleXN0b3JlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcmVwYXNzOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcmV0eXBlOwotICAgIHByb3RlY3RlZCBTdHJpbmcga2V5cGFzczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNpZ2ZpbGU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzaWduZWRqYXI7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcm5hbHNmOwotICAgIHByb3RlY3RlZCBib29sZWFuIHNlY3Rpb25zb25seTsKLQotICAgIC8qKgotICAgICAqIHRoZSBmaWxlc2V0cyBvZiB0aGUgamFycyB0byBzaWduCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRvIGFzc3VtZSBhIGphciB3aGljaCBoYXMgYW4gYXBwcm9wcmlhdGUgLlNGIGZpbGUgaW4gaXMgYWxyZWFkeQotICAgICAqIHNpZ25lZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsYXp5OwotCi0gICAgcHVibGljIHZvaWQgc2V0SmFyKGZpbmFsIFN0cmluZyBqYXIpIHsKLSAgICAgICAgdGhpcy5qYXIgPSBqYXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxpYXMoZmluYWwgU3RyaW5nIGFsaWFzKSB7Ci0gICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXlzdG9yZShmaW5hbCBTdHJpbmcga2V5c3RvcmUpIHsKLSAgICAgICAgdGhpcy5rZXlzdG9yZSA9IGtleXN0b3JlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlcGFzcyhmaW5hbCBTdHJpbmcgc3RvcmVwYXNzKSB7Ci0gICAgICAgIHRoaXMuc3RvcmVwYXNzID0gc3RvcmVwYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0b3JldHlwZShmaW5hbCBTdHJpbmcgc3RvcmV0eXBlKSB7Ci0gICAgICAgIHRoaXMuc3RvcmV0eXBlID0gc3RvcmV0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleXBhc3MoZmluYWwgU3RyaW5nIGtleXBhc3MpIHsKLSAgICAgICAgdGhpcy5rZXlwYXNzID0ga2V5cGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaWdmaWxlKGZpbmFsIFN0cmluZyBzaWdmaWxlKSB7Ci0gICAgICAgIHRoaXMuc2lnZmlsZSA9IHNpZ2ZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2lnbmVkamFyKGZpbmFsIFN0cmluZyBzaWduZWRqYXIpIHsKLSAgICAgICAgdGhpcy5zaWduZWRqYXIgPSBzaWduZWRqYXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShmaW5hbCBib29sZWFuIHZlcmJvc2UpIHsKLSAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbHNmKGZpbmFsIGJvb2xlYW4gaW50ZXJuYWxzZikgewotICAgICAgICB0aGlzLmludGVybmFsc2YgPSBpbnRlcm5hbHNmOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlY3Rpb25zb25seShmaW5hbCBib29sZWFuIHNlY3Rpb25zb25seSkgewotICAgICAgICB0aGlzLnNlY3Rpb25zb25seSA9IHNlY3Rpb25zb25seTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXp5KGZpbmFsIGJvb2xlYW4gbGF6eSkgewotICAgICAgICB0aGlzLmxhenkgPSBsYXp5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChmaW5hbCBGaWxlU2V0IHNldCkgewotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG51bGwgPT0gamFyICYmIG51bGwgPT0gZmlsZXNldHMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiamFyIG11c3QgYmUgc2V0IHRocm91Z2ggamFyIGF0dHJpYnV0ZSBvciBuZXN0ZWQgZmlsZXNldHMiKTsKLSAgICAgICAgfQotICAgICAgICBpZiggbnVsbCAhPSBqYXIgKSB7Ci0gICAgICAgICAgICBkb09uZUphcihqYXIsIHNpZ25lZGphcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL0Fzc3VtZSBudWxsICE9IGZpbGVzZXRzCi0KLSAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgZmlsZXNldHMKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmaWxlc2V0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGphckZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgICAgIGZvcihpbnQgaj0wOyBqPGphckZpbGVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvT25lSmFyKGphckZpbGVzW2pdLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9PbmVKYXIoU3RyaW5nIGphclNvdXJjZSwgU3RyaW5nIGphclRhcmdldCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb2plY3QuZ2V0SmF2YVZlcnNpb24oKS5lcXVhbHMoUHJvamVjdC5KQVZBXzFfMSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHNpZ25qYXIgdGFzayBpcyBvbmx5IGF2YWlsYWJsZSBvbiBKREsgdmVyc2lvbnMgMS4yIG9yIGdyZWF0ZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudWxsID09IGFsaWFzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFsaWFzIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gc3RvcmVwYXNzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInN0b3JlcGFzcyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGlzVXBUb0RhdGUoamFyU291cmNlLCBqYXJUYXJnZXQpKSByZXR1cm47Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZpbmFsIEV4ZWNUYXNrIGNtZCA9IChFeGVjVGFzaykgcHJvamVjdC5jcmVhdGVUYXNrKCJleGVjIik7Ci0gICAgICAgIGNtZC5zZXRFeGVjdXRhYmxlKCJqYXJzaWduZXIiKTsKLQotICAgICAgICBpZiAobnVsbCAhPSBrZXlzdG9yZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZygpLnNldFZhbHVlKCIta2V5c3RvcmUiKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmcoKS5zZXRWYWx1ZShrZXlzdG9yZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBzdG9yZXBhc3MpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXN0b3JlcGFzcyIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZygpLnNldFZhbHVlKHN0b3JlcGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBzdG9yZXR5cGUpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXN0b3JldHlwZSIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZygpLnNldFZhbHVlKHN0b3JldHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBrZXlwYXNzKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1rZXlwYXNzIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJnKCkuc2V0VmFsdWUoa2V5cGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBzaWdmaWxlKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1zaWdmaWxlIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJnKCkuc2V0VmFsdWUoc2lnZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBqYXJUYXJnZXQpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXNpZ25lZGphciIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZygpLnNldFZhbHVlKGphclRhcmdldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItdmVyYm9zZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGludGVybmFsc2YpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWludGVybmFsc2YiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZWN0aW9uc29ubHkpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXNlY3Rpb25zb25seSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY21kLmNyZWF0ZUFyZygpLnNldFZhbHVlKGphclNvdXJjZSk7Ci0KLQotICAgICAgICBjbWQuY3JlYXRlQXJnKCkuc2V0VmFsdWUoYWxpYXMpOwotCi0gICAgICAgIGxvZygiU2lnbmluZyBKYXIgOiAiICsgKG5ldyBGaWxlKGphclNvdXJjZSkpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgY21kLnNldEZhaWxvbmVycm9yKHRydWUpOwotICAgICAgICBjbWQuc2V0VGFza05hbWUoIGdldFRhc2tOYW1lKCkgKTsKLSAgICAgICAgY21kLmV4ZWN1dGUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwVG9EYXRlKFN0cmluZyBqYXJTb3VyY2UsIFN0cmluZyBqYXJUYXJnZXQpIHsKLSAgICAgICAgaWYoIG51bGwgPT0gamFyU291cmNlICkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG51bGwgIT0gamFyVGFyZ2V0ICkgewotCi0gICAgICAgICAgICBmaW5hbCBGaWxlIGphckZpbGUgPSBuZXcgRmlsZShqYXJTb3VyY2UpOwotICAgICAgICAgICAgZmluYWwgRmlsZSBzaWduZWRqYXJGaWxlID0gbmV3IEZpbGUoamFyVGFyZ2V0KTsKLQotICAgICAgICAgICAgaWYoIWphckZpbGUuZXhpc3RzKCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmKCFzaWduZWRqYXJGaWxlLmV4aXN0cygpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZihqYXJGaWxlLmVxdWFscyhzaWduZWRqYXJGaWxlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYoc2lnbmVkamFyRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGphckZpbGUubGFzdE1vZGlmaWVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiggbGF6eSApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNTaWduZWQoamFyU291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpZ25lZChTdHJpbmcgamFyRmlsZW5hbWUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIFNJR19TVEFSVCA9ICJNRVRBLUlORi8iOwotICAgICAgICBmaW5hbCBTdHJpbmcgU0lHX0VORCA9ICIuU0YiOwotCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGphckZpbGVuYW1lKTsKLSAgICAgICAgaWYoICFmaWxlLmV4aXN0cygpICkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFppcEZpbGUgamFyRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXJGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICBpZihudWxsID09IGFsaWFzKSB7Ci0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOwotICAgICAgICAgICAgICAgIHdoaWxlKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAgKChaaXBFbnRyeSllbnRyaWVzLm5leHRFbGVtZW50KCkpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobmFtZS5zdGFydHNXaXRoKFNJR19TVEFSVCkgJiYgbmFtZS5lbmRzV2l0aChTSUdfRU5EKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamFyRmlsZS5nZXRFbnRyeShTSUdfU1RBUlQrYWxpYXMudG9VcHBlckNhc2UoKSsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSUdfRU5EKSAhPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmKGphckZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7amFyRmlsZS5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2xlZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNjI2Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHRhc2sgdG8gc2xlZXAgZm9yIGEgcGVyaW9kIG9mIHRpbWUKLSAqCi0gKiBAYXV0aG9yIHN0ZXZlX2xAaXNlcmFuLmNvbSBzdGV2ZSBsb3VnaHJhbgotICogQGNyZWF0ZWQgMDEgTWF5IDIwMDEKLSAqLwotCi1wdWJsaWMgY2xhc3MgU2xlZXAgZXh0ZW5kcyBUYXNrIHsKLSAgICAvKioKLSAgICAgKiBmYWlsdXJlIGZsYWcKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIEZpZWxkCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgc2Vjb25kcyA9IDA7Ci0gICAgLyoqCi0gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIEZpZWxkCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaG91cnMgPSAwOwotICAgIC8qKgotICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBGaWVsZAotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1pbnV0ZXMgPSAwOwotICAgIC8qKgotICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBGaWVsZAotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1pbGxpc2Vjb25kcyA9IDA7Ci0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU2xlZXAoKSB7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTZWNvbmRzIGF0dHJpYnV0ZSBvZiB0aGUgU2xlZXAgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vjb25kcyBUaGUgbmV3IFNlY29uZHMgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWNvbmRzKGludCBzZWNvbmRzKSB7Ci0gICAgICAgIHRoaXMuc2Vjb25kcyA9IHNlY29uZHM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBIb3VycyBhdHRyaWJ1dGUgb2YgdGhlIFNsZWVwIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGhvdXJzIFRoZSBuZXcgSG91cnMgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIb3VycyhpbnQgaG91cnMpIHsKLSAgICAgICAgdGhpcy5ob3VycyA9IGhvdXJzOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgTWludXRlcyBhdHRyaWJ1dGUgb2YgdGhlIFNsZWVwIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIG1pbnV0ZXMgVGhlIG5ldyBNaW51dGVzIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWludXRlcyhpbnQgbWludXRlcykgewotICAgICAgICB0aGlzLm1pbnV0ZXMgPSBtaW51dGVzOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgTWlsbGlzZWNvbmRzIGF0dHJpYnV0ZSBvZiB0aGUgU2xlZXAgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzIFRoZSBuZXcgTWlsbGlzZWNvbmRzIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmRzKGludCBtaWxsaXNlY29uZHMpIHsKLSAgICAgICAgdGhpcy5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBzbGVlcCBmb3IgYSBwZXJpb2Qgb2YgdGltZQotICAgICAqCi0gICAgICogQHBhcmFtIG1pbGxpcyB0aW1lIHRvIHNsZWVwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9TbGVlcChsb25nIG1pbGxpcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcChtaWxsaXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBGYWlsT25FcnJvciBhdHRyaWJ1dGUgb2YgdGhlIE1pbWVNYWlsIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGZhaWxPbkVycm9yIFRoZSBuZXcgRmFpbE9uRXJyb3IgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxPbkVycm9yKSB7Ci0gICAgICAgIHRoaXMuZmFpbE9uRXJyb3IgPSBmYWlsT25FcnJvcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHJldHVybiB0aW1lIHRvIHNsZWVwCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNsZWVwIHRpbWUuIGlmIGJlbG93IDAgdGhlbiB0aGVyZSBpcyBhbiBlcnJvcgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBsb25nIGdldFNsZWVwVGltZSgpIHsKLSAgICAgICAgcmV0dXJuICgoKChsb25nKSBob3VycyAqIDYwKSArIG1pbnV0ZXMpICogNjAgKyBzZWNvbmRzKSAqIDEwMDAgKyBtaWxsaXNlY29uZHM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB2ZXJpZnkgcGFyYW1ldGVycwotICAgICAqCi0gICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgc2xlZXBUaW1lID0gZ2V0U2xlZXBUaW1lKCk7Ci0gICAgICAgIGlmIChnZXRTbGVlcFRpbWUoKSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTmVnYXRpdmUgc2xlZXAgcGVyaW9kcyBhcmUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGlzIGJ1aWxkIHRhc2suIHRocm93cyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbgotICAgICAqIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0YXNrIGV4ZWN1dGlvbi4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gRGVzY3JpcHRpb24gb2YgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgbG9uZyBzbGVlcFRpbWU9Z2V0U2xlZXBUaW1lKCk7Ci0gICAgICAgICAgICBsb2coInNsZWVwaW5nIGZvciAiK3NsZWVwVGltZSsiIG1pbGxpc2Vjb25kcyIsCi0gICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBkb1NsZWVwKHNsZWVwVGltZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsb2codGV4dCwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdHJlYW1QdW1wZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N0cmVhbVB1bXBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRhZDc5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N0cmVhbVB1bXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQ29waWVzIGFsbCBkYXRhIGZyb20gYW4gaW5wdXQgc3RyZWFtIHRvIGFuIG91dHB1dCBzdHJlYW0uCi0gKgotICogQGF1dGhvciB0aG9tYXMuaGFhc0Bzb2Z0d2lyZWQtaW5jLmNvbQotICovCi1wdWJsaWMgY2xhc3MgU3RyZWFtUHVtcGVyIGltcGxlbWVudHMgUnVubmFibGUgewotCi0gICAgLy8gVE9ETzogbWFrZSBTSVpFIGFuZCBTTEVFUCBpbnN0YW5jZSB2YXJpYWJsZXMuCi0gICAgLy8gVE9ETzogYWRkIGEgc3RhdHVzIGZsYWcgdG8gbm90ZSBpZiBhbiBlcnJvciBvY2N1cmVkIGluIHJ1bi4KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUCA9IDU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNJWkUgPSAxMjg7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpczsKLSAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvczsKLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IHN0cmVhbSBwdW1wZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIG9zIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyZWFtUHVtcGVyKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICAgICAgdGhpcy5pcyA9IGlzOwotICAgICAgICB0aGlzLm9zID0gb3M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBUZXJtaW5hdGVzIGFzIHNvb24gYXMgdGhlIGlucHV0IHN0cmVhbSBpcyBjbG9zZWQgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW1NJWkVdOwotCi0gICAgICAgIGludCBsZW5ndGg7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoKGxlbmd0aCA9IGlzLnJlYWQoYnVmKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgb3Mud3JpdGUoYnVmLCAwLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGE4MGUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnRhci4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLS8qKgotICogQ3JlYXRlcyBhIFRBUiBhcmNoaXZlLgotICoKLSAqIEBhdXRob3IgU3RlZmFubyBNYXp6b2NjaGkgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbm9AYXBhY2hlLm9yZyI+c3RlZmFub0BhcGFjaGUub3JnPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBUYXIgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotCi0gICAgLy8gcGVybWlzc2FibGUgdmFsdWVzIGZvciBsb25nZmlsZSBhdHRyaWJ1dGUKLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBXQVJOID0gIndhcm4iOwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEZBSUwgPSAiZmFpbCI7Ci0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgVFJVTkNBVEUgPSAidHJ1bmNhdGUiOwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEdOVSA9ICJnbnUiOwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIE9NSVQgPSAib21pdCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHZhbGlkTW9kZXMgPSBuZXcgU3RyaW5nW10ge1dBUk4sIEZBSUwsIFRSVU5DQVRFLCBHTlUsIE9NSVR9OwotCi0gICAgRmlsZSB0YXJGaWxlOwotICAgIEZpbGUgYmFzZURpcjsKLSAgICAKLSAgICBTdHJpbmcgbG9uZ0ZpbGVNb2RlID0gV0FSTjsKLSAgICAKLSAgICBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgVmVjdG9yIGZpbGVTZXRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBoYXMgYmVlbiB3YXJuZWQgYWJvdXQgbG9uZyBmaWxlcyBhbHJlYWR5LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBsb25nV2FybmluZ0dpdmVuID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVGFyRmlsZVNldCBjcmVhdGVUYXJGaWxlU2V0KCkgewotICAgICAgICBUYXJGaWxlU2V0IGZpbGVzZXQgPSBuZXcgVGFyRmlsZVNldCgpOwotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KGZpbGVzZXQpOwotICAgICAgICByZXR1cm4gZmlsZXNldDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB0aGUgbmFtZS9sb2NhdGlvbiBvZiB3aGVyZSB0byBjcmVhdGUgdGhlIHRhciBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmZpbGUoRmlsZSB0YXJGaWxlKSB7Ci0gICAgICAgIHRoaXMudGFyRmlsZSA9IHRhckZpbGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGxvb2sgaW4gZm9yIHRoaW5ncyB0byB0YXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZWRpcihGaWxlIGJhc2VEaXIpIHsKLSAgICAgICAgdGhpcy5iYXNlRGlyID0gYmFzZURpcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IGhvdyB0byBoYW5kbGUgbG9uZyBmaWxlcy4KLSAgICAgKgotICAgICAqIEFsbG93YWJsZSB2YWx1ZXMgYXJlCi0gICAgICogICB0cnVuY2F0ZSAtIHBhdGhzIGFyZSB0cnVuY2F0ZWQgdG8gdGhlIG1heGltdW0gbGVuZ3RoCi0gICAgICogICBmYWlsIC0gcGF0c2ggZ3JlYXRlciB0aGFuIHRoZSBtYXhpbWltIGNhdXNlIGEgYnVpbGQgZXhjZXB0aW9uCi0gICAgICogICB3YXJuIC0gcGF0aHMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGNhdXNlIGEgd2FybmluZyBhbmQgR05VIGlzIHVzZWQKLSAgICAgKiAgIGdudSAtIEdOVSBleHRlbnNpb25zIGFyZSB1c2VkIGZvciBhbnkgcGF0aHMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtLgotICAgICAqICAgb21pdCAtIHBhdGhzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBhcmUgb21pdHRlZCBmcm9tIHRoZSBhcmNoaXZlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9uZ2ZpbGUoU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZE1vZGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAobW9kZS5lcXVhbHNJZ25vcmVDYXNlKHZhbGlkTW9kZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb25nRmlsZU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBsb25nZmlsZSB2YWx1ZSAiICsgbW9kZSArICIgaXMgbm90IGEgdmFsaWQgdmFsdWUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRhckZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0YXJmaWxlIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFyRmlsZS5leGlzdHMoKSAmJiB0YXJGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGFyZmlsZSBpcyBhIGRpcmVjdG9yeSEiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFyRmlsZS5leGlzdHMoKSAmJiAhdGFyRmlsZS5jYW5Xcml0ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbiBub3Qgd3JpdGUgdG8gdGhlIHNwZWNpZmllZCB0YXJmaWxlISIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghYmFzZURpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmFzZWRpciBkb2VzIG5vdCBleGlzdCEiLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFkZCB0aGUgbWFpbiBmaWxlc2V0IHRvIHRoZSBsaXN0IG9mIGZpbGVzZXRzIHRvIHByb2Nlc3MuCi0gICAgICAgICAgICBUYXJGaWxlU2V0IG1haW5GaWxlU2V0ID0gbmV3IFRhckZpbGVTZXQoZmlsZXNldCk7Ci0gICAgICAgICAgICBtYWluRmlsZVNldC5zZXREaXIoYmFzZURpcik7Ci0gICAgICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KG1haW5GaWxlU2V0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGZpbGVzZXRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IHN1cHBseSBlaXRoZXIgYSBiYXNkaXIgYXR0cmlidXRlIG9yIHNvbWUgbmVzdGVkIGZpbGVzZXRzLiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgaWYgdHIgaXMgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvIGVhY2gKLSAgICAgICAgLy8gZmlsZXNldAotICAgICAgICBib29sZWFuIHVwVG9EYXRlID0gdHJ1ZTsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZmlsZXNldHMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFRhckZpbGVTZXQgZnMgPSAoVGFyRmlsZVNldCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGZzLmdldEZpbGVzKHByb2plY3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWFyY2hpdmVJc1VwVG9EYXRlKGZpbGVzKSkgewotICAgICAgICAgICAgICAgIHVwVG9EYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFyRmlsZS5lcXVhbHMobmV3IEZpbGUoZnMuZ2V0RGlyKHByb2plY3QpLCBmaWxlc1tpXSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQSB0YXIgZmlsZSBjYW5ub3QgaW5jbHVkZSBpdHNlbGYiLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVwVG9EYXRlKSB7Ci0gICAgICAgICAgICBsb2coIk5vdGhpbmcgdG8gZG86ICIrdGFyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSsiIGlzIHVwIHRvIGRhdGUuIiwKLSAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZygiQnVpbGRpbmcgdGFyOiAiKyB0YXJGaWxlLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19JTkZPKTsKLQotICAgICAgICBUYXJPdXRwdXRTdHJlYW0gdE91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0T3V0ID0gbmV3IFRhck91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJGaWxlKSk7Ci0gICAgICAgICAgICB0T3V0LnNldERlYnVnKHRydWUpOwotICAgICAgICAgICAgaWYgKGxvbmdGaWxlTW9kZS5lcXVhbHNJZ25vcmVDYXNlKFRSVU5DQVRFKSkgewotICAgICAgICAgICAgICAgIHRPdXQuc2V0TG9uZ0ZpbGVNb2RlKFRhck91dHB1dFN0cmVhbS5MT05HRklMRV9UUlVOQ0FURSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsb25nRmlsZU1vZGUuZXF1YWxzSWdub3JlQ2FzZShGQUlMKSB8fAotICAgICAgICAgICAgICAgICAgICAgbG9uZ0ZpbGVNb2RlLmVxdWFsc0lnbm9yZUNhc2UoT01JVCkpIHsKLSAgICAgICAgICAgICAgICB0T3V0LnNldExvbmdGaWxlTW9kZShUYXJPdXRwdXRTdHJlYW0uTE9OR0ZJTEVfRVJST1IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gd2FybiBvciBHTlUKLSAgICAgICAgICAgICAgICB0T3V0LnNldExvbmdGaWxlTW9kZShUYXJPdXRwdXRTdHJlYW0uTE9OR0ZJTEVfR05VKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICBsb25nV2FybmluZ0dpdmVuID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlc2V0cy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIFRhckZpbGVTZXQgZnMgPSAoVGFyRmlsZVNldCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBmcy5nZXRGaWxlcyhwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZzLmdldERpcihwcm9qZWN0KSwgZmlsZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGVzW2ldLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIHRhckZpbGUoZiwgdE91dCwgbmFtZSwgZnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gY3JlYXRpbmcgVEFSOiAiICsgaW9lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSwgbG9jYXRpb24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHRPdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVwCi0gICAgICAgICAgICAgICAgICAgIHRPdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0YXJGaWxlKEZpbGUgZmlsZSwgVGFyT3V0cHV0U3RyZWFtIHRPdXQsIFN0cmluZyB2UGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhckZpbGVTZXQgdGFyRmlsZVNldCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZkluID0gbnVsbDsKLQotICAgICAgICAvLyBkb24ndCBhZGQgIiIgdG8gdGhlIGFyY2hpdmUKLSAgICAgICAgaWYgKHZQYXRoLmxlbmd0aCgpIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSAmJiAhdlBhdGguZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgdlBhdGggKz0gIi8iOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh2UGF0aC5sZW5ndGgoKSA+PSBUYXJDb25zdGFudHMuTkFNRUxFTikgewotICAgICAgICAgICAgICAgIGlmIChsb25nRmlsZU1vZGUuZXF1YWxzSWdub3JlQ2FzZShPTUlUKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIk9taXR0aW5nOiAiKyB2UGF0aCwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdGaWxlTW9kZS5lcXVhbHNJZ25vcmVDYXNlKFdBUk4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiRW50cnk6ICIrIHZQYXRoICsgIiBsb25nZXIgdGhhbiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICBUYXJDb25zdGFudHMuTkFNRUxFTiArICIgY2hhcmFjdGVycy4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFsb25nV2FybmluZ0dpdmVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIlJlc3VsdGluZyB0YXIgZmlsZSBjYW4gb25seSBiZSBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBieSBHTlUgY29tcGF0aWJsZSB0YXIgY29tbWFuZHMiLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdXYXJuaW5nR2l2ZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb25nRmlsZU1vZGUuZXF1YWxzSWdub3JlQ2FzZShGQUlMKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRW50cnk6ICIrIHZQYXRoICsgIiBsb25nZXIgdGhhbiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICBUYXJDb25zdGFudHMuTkFNRUxFTiArICJjaGFyYWN0ZXJzLiIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRhckVudHJ5IHRlID0gbmV3IFRhckVudHJ5KHZQYXRoKTsKLSAgICAgICAgICAgIHRlLnNldE1vZFRpbWUoZmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHRlLnNldFNpemUoZmlsZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgdGUuc2V0TW9kZSh0YXJGaWxlU2V0LmdldE1vZGUoKSk7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgdGUuc2V0VXNlck5hbWUodGFyRmlsZVNldC5nZXRVc2VyTmFtZSgpKTsKLSAgICAgICAgICAgIHRlLnNldEdyb3VwTmFtZSh0YXJGaWxlU2V0LmdldEdyb3VwKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0T3V0LnB1dE5leHRFbnRyeSh0ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgZkluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4ICogMTAyNF07Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIHRPdXQud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gZkluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRPdXQuY2xvc2VFbnRyeSgpOyAgICAgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZkluICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZkluLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcmNoaXZlSXNVcFRvRGF0ZShTdHJpbmdbXSBmaWxlcykgewotICAgICAgICBTb3VyY2VGaWxlU2Nhbm5lciBzZnMgPSBuZXcgU291cmNlRmlsZVNjYW5uZXIodGhpcyk7Ci0gICAgICAgIE1lcmdpbmdNYXBwZXIgbW0gPSBuZXcgTWVyZ2luZ01hcHBlcigpOwotICAgICAgICBtbS5zZXRUbyh0YXJGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgcmV0dXJuIHNmcy5yZXN0cmljdChmaWxlcywgYmFzZURpciwgbnVsbCwgbW0pLmxlbmd0aCA9PSAwOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgVGFyRmlsZVNldCBleHRlbmRzIEZpbGVTZXQgewotICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGZpbGVzID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgaW50IG1vZGUgPSAwMTAwNjQ0OwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlck5hbWUgPSAiIjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ3JvdXBOYW1lID0gIiI7Ci0gICAgICAgIAotICAgICAgICAgICAKLSAgICAgICAgcHVibGljIFRhckZpbGVTZXQoRmlsZVNldCBmaWxlc2V0KSB7Ci0gICAgICAgICAgICBzdXBlcihmaWxlc2V0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFRhckZpbGVTZXQoKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogIEdldCBhIGxpc3Qgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiB0aGUgZmlsZXNldC4KLSAgICAgICAgICogIEByZXR1cm4gYSBsaXN0IG9mIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcywgcmVsYXRpdmUgdG8KLSAgICAgICAgICogICAgdGhlIGJhc2VEaXIgZm9yIHRoZSBwcm9qZWN0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldEZpbGVzKFByb2plY3QgcCkgewotICAgICAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlc1BlclNlID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgICAgIGZpbGVzID0gbmV3IFN0cmluZyBbZGlyZWN0b3JpZXMubGVuZ3RoICsgZmlsZXNQZXJTZS5sZW5ndGhdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGlyZWN0b3JpZXMsIDAsIGZpbGVzLCAwLCBkaXJlY3Rvcmllcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZmlsZXNQZXJTZSwgMCwgZmlsZXMsIGRpcmVjdG9yaWVzLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzUGVyU2UubGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKFN0cmluZyBvY3RhbFN0cmluZykgewotICAgICAgICAgICAgdGhpcy5tb2RlID0gMDEwMDAwMCB8IEludGVnZXIucGFyc2VJbnQob2N0YWxTdHJpbmcsIDgpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgcHVibGljIGludCBnZXRNb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFVzZXJOYW1lKFN0cmluZyB1c2VyTmFtZSkgewotICAgICAgICAgICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJOYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRHcm91cChTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IGdyb3VwTmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRHcm91cCgpIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza091dHB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza091dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTVkNTRhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFJlZGlyZWN0cyB0ZXh0IHdyaXR0ZW4gdG8gYSBzdHJlYW0gdGhydSB0aGUgc3RhbmRhcmQKLSAqIGFudCBsb2dnaW5nIG1lY2hhbmlzbS4gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIGludGVncmF0aW5nCi0gKiB3aXRoIHRvb2xzIHRoYXQgd3JpdGUgdG8gU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyci4gRm9yIGV4YW1wbGUsCi0gKiB0aGUgZm9sbG93aW5nIHdpbGwgY2F1c2UgYWxsIHRleHQgd3JpdHRlbiB0byBTeXN0ZW0ub3V0IHRvIGJlCi0gKiBsb2dnZWQgd2l0aCAiaW5mbyIgcHJpb3JpdHk6Ci0gKiA8cHJlPlN5c3RlbS5zZXRPdXQobmV3IFByaW50U3RyZWFtKG5ldyBUYXNrT3V0cHV0U3RyZWFtKHByb2plY3QsIFByb2plY3QuTVNHX0lORk8pKSk7PC9wcmU+Ci0gKgotICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gKGR1bmNhbkB4MTgwLmNvbSkKLSAqIEBkZXByZWNhdGVkIHVzZSBMb2dPdXRwdXRTdHJlYW0gaW5zdGVhZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVGFza091dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0KLSAgICBwcml2YXRlIFRhc2sgdGFzazsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBsaW5lOwotICAgIHByaXZhdGUgaW50IG1zZ091dHB1dExldmVsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBKYXZhY091dHB1dFN0cmVhbSB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0Ci0gICAgICogYXMgdGhlIG91dHB1dCBzb3VyY2UgZm9yIG1lc3NhZ2VzLgotICAgICAqLwotCi0gICAgVGFza091dHB1dFN0cmVhbShUYXNrIHRhc2ssIGludCBtc2dPdXRwdXRMZXZlbCkgewotICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwotICAgICAgICB0aGlzLm1zZ091dHB1dExldmVsID0gbXNnT3V0cHV0TGV2ZWw7Ci0KLSAgICAgICAgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGNoYXJhY3RlciB0byB0aGUgb3V0cHV0IHN0cmVhbS4gVGhpcyBtZXRob2QgbG9va3MKLSAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpc24ndCBhbiBlcnJvciBiZWluZyByZXBvcnRlZCBhbmQKLSAgICAgKiB3aWxsIGZsdXNoIGVhY2ggbGluZSBvZiBpbnB1dCBvdXQgdG8gdGhlIHByb2plY3QncyBsb2cgc3RyZWFtLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoYXIgY2MgPSAoY2hhciljOwotICAgICAgICBpZiAoY2MgPT0gJ1xyJyB8fCBjYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAvLyBsaW5lIGZlZWQKLSAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NMaW5lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lLmFwcGVuZChjYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBsaW5lIG9mIGlucHV0IGFuZCBkZXRlcm1pbmVzIGlmIGFuIGVycm9yIG9jY3VyZWQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0xpbmUoKSB7Ci0gICAgICAgIFN0cmluZyBzID0gbGluZS50b1N0cmluZygpOwotICAgICAgICB0YXNrLmxvZyhzLCBtc2dPdXRwdXRMZXZlbCk7Ci0gICAgICAgIGxpbmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNzJmMzMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotLyoqCi0gKiBEZWZpbmUgYSBuZXcgdGFzay4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tkZWYgZXh0ZW5kcyBEZWZpbmVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGREZWZpbml0aW9uKFN0cmluZyBuYW1lLCBDbGFzcyBjKSB7Ci0gICAgICAgIHByb2plY3QuYWRkVGFza0RlZmluaXRpb24obmFtZSwgYyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVG91Y2guamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RvdWNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTcwYzYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVG91Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuKjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUb3VjaCBhIGZpbGUgYW5kL29yIGZpbGVzZXQocykgLS0gY29ycmVzcG9uZHMgdG8gdGhlIFVuaXggdG91Y2ggY29tbWFuZC4KLSAqCi0gKiA8cD5JZiB0aGUgZmlsZSB0byB0b3VjaCBkb2Vzbid0IGV4aXN0LCBhbiBlbXB0eSBvbmUgaXMKLSAqIGNyZWF0ZWQuIDwvcD4KLSAqCi0gKiA8cD5Ob3RlOiBTZXR0aW5nIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBmaWxlcyBpcyBub3Qgc3VwcG9ydGVkIGluCi0gKiBKREsgMS4xLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bWpAc2VydmlkaXVtLmNvbSI+TWljaGFlbCBKLiBTaWtvcnNreTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoYXdAc2VydmlkaXVtLmNvbSI+Um9iZXJ0IFNoYXc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUb3VjaCBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBGaWxlIGZpbGU7ICAgICAgICAgICAgICAvLyByZXF1aXJlZAotICAgIHByaXZhdGUgbG9uZyBtaWxsaXMgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBkYXRlVGltZTsKLSAgICBwcml2YXRlIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcml2YXRlIEZpbGVVdGlscyBmaWxlVXRpbHM7Ci0KLSAgICBwdWJsaWMgVG91Y2goKSB7Ci0gICAgICAgIGZpbGVVdGlscyA9IEZpbGVVdGlscy5uZXdGaWxlVXRpbHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIHRvdWNoLiAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QKLSAgICAgKiBhbiAgZW1wdHkgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNaWxsaXNlY29uZHMgc2luY2UgMDEvMDEvMTk3MCAwMDowMCBhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaWxsaXMobG9uZyBtaWxsaXMpIHsKLSAgICAgICAgdGhpcy5taWxsaXMgPSBtaWxsaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGF0ZSBpbiB0aGUgZm9ybWF0IE1NL0REL1lZWVkgSEg6TU0gQU1fUE0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZXRpbWUoU3RyaW5nIGRhdGVUaW1lKSB7Ci0gICAgICAgIHRoaXMuZGF0ZVRpbWUgPSBkYXRlVGltZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKLSAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhlIHRvdWNoIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiBmaWxlc2V0cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgCi0gICAgICAgICAgICAgICAgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UgLSBhIGZpbGUgb3IgYSBmaWxlc2V0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVc2UgYSBmaWxlc2V0IHRvIHRvdWNoIGRpcmVjdG9yaWVzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRhdGVUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIERhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZUZvcm1hdC5TSE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlLlVTKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2V0TWlsbGlzKGRmLnBhcnNlKGRhdGVUaW1lKS5nZXRUaW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChtaWxsaXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGF0ZSBvZiAiICsgZGF0ZVRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXN1bHRzIGluIG5lZ2F0aXZlIG1pbGxpc2Vjb25kcyB2YWx1ZSByZWxhdGl2ZSB0byBlcG9jaCAoSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCBHTVQpLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHBlLmdldE1lc3NhZ2UoKSwgcGUsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRvdWNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgYWN0dWFsIHdvcmsuIEVudHJ5IHBvaW50IGZvciBVbnRhciBhbmQgRXhwYW5kIGFzIHdlbGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdG91Y2goKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkNyZWF0aW5nICIrZmlsZSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKG5ldyBieXRlWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSAiK2ZpbGUsIGlvZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG91Y2goZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWlsbGlzID49IDAgJiYgcHJvamVjdC5nZXRKYXZhVmVyc2lvbigpID09IFByb2plY3QuSkFWQV8xXzEpIHsKLSAgICAgICAgICAgIGxvZygibW9kaWZpY2F0aW9uIHRpbWUgb2YgZmlsZXMgY2Fubm90IGJlIHNldCBpbiBKREsgMS4xIiwKLSAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgZmlsZXNldHMKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZmlsZXNldHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgICBGaWxlIGZyb21EaXIgPSBmcy5nZXREaXIocHJvamVjdCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHNyY0ZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgU3RyaW5nW10gc3JjRGlycyA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKLQotICAgICAgICAgICAgZm9yKGludCBqPTA7IGogPCBzcmNGaWxlcy5sZW5ndGggOyBqKyspIHsKLSAgICAgICAgICAgICAgICB0b3VjaChuZXcgRmlsZShmcm9tRGlyLCBzcmNGaWxlc1tqXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgICAgICBmb3IoaW50IGo9MDsgaiA8IHNyY0RpcnMubGVuZ3RoIDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgdG91Y2gobmV3IEZpbGUoZnJvbURpciwgc3JjRGlyc1tqXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdG91Y2goRmlsZSBmaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWZpbGUuY2FuV3JpdGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4gbm90IGNoYW5nZSBtb2RpZmljYXRpb24gZGF0ZSBvZiByZWFkLW9ubHkgZmlsZSAiICsgZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvamVjdC5nZXRKYXZhVmVyc2lvbigpID09IFByb2plY3QuSkFWQV8xXzEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtaWxsaXMgPCAwKSB7Ci0gICAgICAgICAgICBmaWxlVXRpbHMuc2V0RmlsZUxhc3RNb2RpZmllZChmaWxlLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWxlVXRpbHMuc2V0RmlsZUxhc3RNb2RpZmllZChmaWxlLCBtaWxsaXMpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UcmFuc2Zvcm0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RyYW5zZm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDIwZGQyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RyYW5zZm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotLyoqCi0gKiBIYXMgYmVlbiBtZXJnZWQgaW50byBFeGVjdXRlT24sIGVtcHR5IGNsYXNzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgRXhlY3V0ZU9uIHt9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Uc3RhbXAuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RzdGFtcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFjNWU2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RzdGFtcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLQotLyoqCi0gKiBTZXRzIFRTVEFNUCwgRFNUQU1QIGFuZCBUT0RBWQotICoKLSAqIEBhdXRob3IgY29zdGluQGRudC5ybwotICogQGF1dGhvciBzdGVmYW5vQGFwYWNoZS5vcmcKLSAqIEBhdXRob3Igcm94c3ByaW5nQHlhaG9vLmNvbQotICogQGF1dGhvciBjb25vckBjb2duZXQuY29tLmF1Ci0gKi8KLXB1YmxpYyBjbGFzcyBUc3RhbXAgZXh0ZW5kcyBUYXNrIHsKLSAgICAKLSAgICBwcml2YXRlIFZlY3RvciBjdXN0b21Gb3JtYXRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEYXRlIGQgPSBuZXcgRGF0ZSgpOwotCi0gICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRzdGFtcCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgieXl5eU1NZGQiKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoIkRTVEFNUCIsIGRzdGFtcC5mb3JtYXQoZCkpOwotCi0gICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHRzdGFtcCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgiSEhtbSIpOwotICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiVFNUQU1QIiwgdHN0YW1wLmZvcm1hdChkKSk7Ci0KLSAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgdG9kYXkgID0gbmV3IFNpbXBsZURhdGVGb3JtYXQgKCJNTU1NIGQgeXl5eSIsIExvY2FsZS5VUyk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJUT0RBWSIsIHRvZGF5LmZvcm1hdChkKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGkgPSBjdXN0b21Gb3JtYXRzLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZShpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgQ3VzdG9tRm9ybWF0IGN0cyA9IChDdXN0b21Gb3JtYXQpaS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGN0cy5leGVjdXRlKHByb2plY3QsZCwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEN1c3RvbUZvcm1hdCBjcmVhdGVGb3JtYXQoKQotICAgIHsKLSAgICAgICAgQ3VzdG9tRm9ybWF0IGN0cyA9IG5ldyBDdXN0b21Gb3JtYXQoKTsKLSAgICAgICAgY3VzdG9tRm9ybWF0cy5hZGRFbGVtZW50KGN0cyk7Ci0gICAgICAgIHJldHVybiBjdHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBjbGFzcyBDdXN0b21Gb3JtYXQKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGFuZ3VhZ2U7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGNvdW50cnk7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHZhcmlhbnQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IGZpZWxkID0gQ2FsZW5kYXIuREFURTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBDdXN0b21Gb3JtYXQoKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIGxvY2FsZSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplciggbG9jYWxlLCAiIFx0XG5cclxmLCIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsYW5ndWFnZSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGlmIChzdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiYmFkIGxvY2FsZSBmb3JtYXQiLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9ICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJiYWQgbG9jYWxlIGZvcm1hdCIsIGUsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFVuaXQoU3RyaW5nIHVuaXQpIHsKLSAgICAgICAgICAgIGlmICh1bml0LmVxdWFsc0lnbm9yZUNhc2UoIm1pbGxpc2Vjb25kIikpIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLk1JTExJU0VDT05EOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodW5pdC5lcXVhbHNJZ25vcmVDYXNlKCJzZWNvbmQiKSkgewotICAgICAgICAgICAgICAgIGZpZWxkID0gQ2FsZW5kYXIuU0VDT05EOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodW5pdC5lcXVhbHNJZ25vcmVDYXNlKCJtaW51dGUiKSkgewotICAgICAgICAgICAgICAgIGZpZWxkID0gQ2FsZW5kYXIuTUlOVVRFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodW5pdC5lcXVhbHNJZ25vcmVDYXNlKCJob3VyIikpIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLkhPVVJfT0ZfREFZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodW5pdC5lcXVhbHNJZ25vcmVDYXNlKCJkYXkiKSkgewotICAgICAgICAgICAgICAgIGZpZWxkID0gQ2FsZW5kYXIuREFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHVuaXQuZXF1YWxzSWdub3JlQ2FzZSgid2VlayIpKSB7Ci0gICAgICAgICAgICAgICAgZmllbGQgPSBDYWxlbmRhci5XRUVLX09GX1lFQVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh1bml0LmVxdWFsc0lnbm9yZUNhc2UoIm1vbnRoIikpIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLk1PTlRIOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodW5pdC5lcXVhbHNJZ25vcmVDYXNlKCJ5ZWFyIikpIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLllFQVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odW5pdCArICIgaXMgbm90IGEgdW5pdCBzdXBwb3J0ZWQgYnkgdGhlIHRzdGFtcCB0YXNrIiwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUHJvamVjdCBwcm9qZWN0LCBEYXRlIGRhdGUsIExvY2F0aW9uIGxvY2F0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb3BlcnR5IGF0dHJpYnV0ZSBtdXN0IGJlIHByb3ZpZGVkIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYXR0ZXJuIGF0dHJpYnV0ZSBtdXN0IGJlIHByb3ZpZGVkIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNkZjsKLSAgICAgICAgICAgIGlmIChsYW5ndWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQocGF0dGVybik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YXJpYW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChwYXR0ZXJuLCBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChwYXR0ZXJuLCBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgY2FsZW5kYXIuc2V0VGltZShkYXRlKTsKLSAgICAgICAgICAgICAgICBjYWxlbmRhci5hZGQoZmllbGQsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgZGF0ZSA9IGNhbGVuZGFyLmdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHNkZi5mb3JtYXQoZGF0ZSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHlwZWRlZi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHlwZWRlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTM4OWQyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1R5cGVkZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLS8qKgotICogRGVmaW5lIGEgbmV3IGRhdGEgdHlwZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIFR5cGVkZWYgZXh0ZW5kcyBEZWZpbmVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGREZWZpbml0aW9uKFN0cmluZyBuYW1lLCBDbGFzcyBjKSB7Ci0gICAgICAgIHByb2plY3QuYWRkRGF0YVR5cGVEZWZpbml0aW9uKG5hbWUsIGMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VudGFyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnRhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODBlYTlmLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VudGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy50YXIuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogVW50YXIgYSBmaWxlLgotICoKLSAqIEhlYXZpbHkgYmFzZWQgb24gdGhlIEV4cGFuZCB0YXNrLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIFVudGFyIGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBGaWxlIGRlc3Q7IC8vIHJlcQotICAgIHByaXZhdGUgRmlsZSBzb3VyY2U7IC8vIHJlcQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZSA9IHRydWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRG8gdGhlIHdvcmsuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIFRocm93biBpbiB1bnJlY292ZXJhYmxlIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIFRvdWNoIHRvdWNoID0gKFRvdWNoKSBwcm9qZWN0LmNyZWF0ZVRhc2soInRvdWNoIik7Ci0gICAgICAgIHRvdWNoLnNldE93bmluZ1RhcmdldCh0YXJnZXQpOwotICAgICAgICB0b3VjaC5zZXRUYXNrTmFtZShnZXRUYXNrTmFtZSgpKTsKLSAgICAgICAgdG91Y2guc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBGaWxlIHNyY0YgPSBzb3VyY2U7Ci0KLSAgICAgICAgVGFySW5wdXRTdHJlYW0gdGlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gc291cmNlIHNwZWNpZmllZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc3JjRi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic291cmNlICIrc3JjRisiIGRvZXNuJ3QgZXhpc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgZGlyID0gZGVzdDsKLQotICAgICAgICAgICAgbG9nKCJFeHBhbmRpbmc6ICIgKyBzcmNGICsgIiBpbnRvICIgKyBkaXIsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgdGlzID0gbmV3IFRhcklucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjRikpOwotICAgICAgICAgICAgVGFyRW50cnkgdGUgPSBudWxsOwotCi0gICAgICAgICAgICB3aGlsZSAoKHRlID0gdGlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBwcm9qZWN0LnRyYW5zbGF0ZVBhdGgodGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb3ZlcndyaXRlICYmIGYuZXhpc3RzKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBmLmxhc3RNb2RpZmllZCgpID49IHRlLmdldE1vZFRpbWUoKS5nZXRUaW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiU2tpcHBpbmcgIiArIGYgKyAiIGFzIGl0IGlzIHVwLXRvLWRhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBsb2coImV4cGFuZGluZyAiICsgdGUuZ2V0TmFtZSgpICsgIiB0byAiKyBmLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIGRpckY9bmV3IEZpbGUoZi5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpckYubWtkaXJzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gdGlzLnJlYWQoYnVmZmVyKSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3QuZ2V0SmF2YVZlcnNpb24oKSAhPSBQcm9qZWN0LkpBVkFfMV8xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3VjaC5zZXRGaWxlKGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2guc2V0TWlsbGlzKHRlLmdldE1vZFRpbWUoKS5nZXRUaW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2gudG91Y2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJGaWxlTm90Rm91bmRFeGNlcHRpb246ICIgKyB0ZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBleHBhbmRpbmcgIiArIHNyY0YuZ2V0UGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvZSwgbG9jYXRpb24pOwotCX0gZmluYWxseSB7Ci0JICAgIGlmICh0aXMgIT0gbnVsbCkgewotCSAgICAgICAgdHJ5IHsKLQkgICAgICAgICAgICB0aXMuY2xvc2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LiBGaWxlIHdpbGwgYmUgdW50YXJlZCBpbnRvIHRoZQotICAgICAqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkIFBhdGggdG8gdGhlIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0KEZpbGUgZCkgewotICAgICAgICB0aGlzLmRlc3QgPSBkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aCB0byB0YXItZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIFBhdGggdG8gdGFyLWZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgcykgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdWxkIHdlIG92ZXJ3cml0ZSBmaWxlcyBpbiBkZXN0LCBldmVuIGlmIHRoZXkgYXJlIG5ld2VyIHRoYW4KLSAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSBhcmNoaXZlPwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZShib29sZWFuIGIpIHsKLSAgICAgICAgb3ZlcndyaXRlID0gYjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VwVG9EYXRlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VcFRvRGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmJiZWE2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VwVG9EYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogV2lsbCBzZXQgdGhlIGdpdmVuIHByb3BlcnR5IGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGhhcyBhIHRpbWVzdGFtcAotICogZ3JlYXRlciB0aGFuIGFsbCBvZiB0aGUgc291cmNlIGZpbGVzLgotICoKLSAqIEBhdXRob3IgV2lsbGlhbSBGZXJndXNvbiA8YSBocmVmPSJtYWlsdG86d2lsbGlhbWZAbWluY29tLmNvbSI+d2lsbGlhbWZAbWluY29tLmNvbTwvYT4gCi0gKiBAYXV0aG9yIEhpcm9ha2kgTmFrYW11cmEgPGEgaHJlZj0ibWFpbHRvOmhuYWthbXVyQG1jLm5ld2ViLm5lLmpwIj5obmFrYW11ckBtYy5uZXdlYi5uZS5qcDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVXBUb0RhdGUgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgaW1wbGVtZW50cyBDb25kaXRpb24gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnR5OwotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLSAgICBwcml2YXRlIEZpbGUgX3RhcmdldEZpbGU7Ci0gICAgcHJpdmF0ZSBWZWN0b3Igc291cmNlRmlsZVNldHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwcGVyIG1hcHBlckVsZW1lbnQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIHByb3BlcnR5IHRvIHNldCBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgbW9yZSB1cCB0byBkYXRlIHRoYW4gZWFjaCBvZgotICAgICAqIHRoZSBzb3VyY2UgZmlsZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBpZiBUYXJnZXQgaXMgdXAgdG8gZGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgX3Byb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlIHRvIHNldCB0aGUgbmFtZWQgcHJvcGVydHkgdG8gaWYgdGhlIHRhcmdldCBmaWxlIGlzIG1vcmUgdXAgdG8KLSAgICAgKiBkYXRlIHRoYW4gZWFjaCBvZiB0aGUgc291cmNlIGZpbGVzLiBEZWZhdWx0cyB0byAndHJ1ZScuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8gaWYgVGFyZ2V0IGlzIHVwIHRvIGRhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUsIG9yICJ0cnVlIiBpZiBhIHNwZWNpZmljIHZhbHVlIHdhc24ndCBwcm92aWRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuICggX3ZhbHVlICE9IG51bGwgKSA/IF92YWx1ZSA6ICJ0cnVlIjsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGUgd2hpY2ggbXVzdCBiZSBtb3JlIHVwIHRvIGRhdGUgdGhhbiBlYWNoIG9mIHRoZSBzb3VyY2UgZmlsZXMKLSAgICAgKiBpZiB0aGUgcHJvcGVydHkgaXMgdG8gYmUgc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgd2hpY2ggd2UgYXJlIGNoZWNraW5nIGFnYWluc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgX3RhcmdldEZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5lc3RlZCAmbHQ7c3JjZmlsZXMmZ3Q7IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU3JjZmlsZXMoRmlsZVNldCBmcykgewotICAgICAgICBzb3VyY2VGaWxlU2V0cy5hZGRFbGVtZW50KGZzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBGaWxlTmFtZU1hcHBlciB0byB1c2UgKG5lc3RlZCBtYXBwZXIgZWxlbWVudCkuCi0gICAgICovCi0gICAgcHVibGljIE1hcHBlciBjcmVhdGVNYXBwZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAobWFwcGVyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSBtYXBwZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBtYXBwZXJFbGVtZW50ID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIG1hcHBlckVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGUgYWxsIHRhcmdldCBhbmQgc291cmNlIGZpbGVzLCBzZWUgaWYgdGhlIHRhcmdldHMgYXJlIHVwLXRvLWRhdGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKLSAgICAgICAgaWYgKHNvdXJjZUZpbGVTZXRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBdCBsZWFzdCBvbmUgPHNyY2ZpbGVzPiBlbGVtZW50IG11c3QgYmUgc2V0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3RhcmdldEZpbGUgPT0gbnVsbCAmJiBtYXBwZXJFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSB0YXJnZXRmaWxlIGF0dHJpYnV0ZSBvciBhIG5lc3RlZCBtYXBwZXIgZWxlbWVudCBtdXN0IGJlIHNldCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbm90IHRoZXJlIHRoZW4gaXQgY2FuJ3QgYmUgdXAgdG8gZGF0ZQotICAgICAgICBpZiAoX3RhcmdldEZpbGUgIT0gbnVsbCAmJiAhX3RhcmdldEZpbGUuZXhpc3RzKCkpIHJldHVybiBmYWxzZTsgCi0KLSAgICAgICAgRW51bWVyYXRpb24gZW51bSA9IHNvdXJjZUZpbGVTZXRzLmVsZW1lbnRzKCk7Ci0gICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgPSB0cnVlOwotICAgICAgICB3aGlsZSAodXBUb0RhdGUgJiYgZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBlbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKLSAgICAgICAgICAgIHVwVG9EYXRlID0gdXBUb0RhdGUgJiYgc2NhbkRpcihmcy5nZXREaXIocHJvamVjdCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzLmdldEluY2x1ZGVkRmlsZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVwVG9EYXRlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyBwcm9wZXJ0eSB0byB0cnVlIGlmIHRhcmdldCBmaWxlcyBoYXZlIGEgbW9yZSByZWNlbnQgdGltZXN0YW1wIHRoYW4KLSAgICAgKiBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiB1cFRvRGF0ZSA9IGV2YWwoKTsKLSAgICAgICAgaWYgKHVwVG9EYXRlKSB7Ci0gICAgICAgICAgICB0aGlzLnByb2plY3Quc2V0UHJvcGVydHkoX3Byb3BlcnR5LCB0aGlzLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZygiRmlsZSBcIiIgKyBfdGFyZ2V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICJcIiBpcyB1cCB0byBkYXRlLiIsCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkFsbCB0YXJnZXQgZmlsZXMgaGF2ZSBiZWVuIHVwIHRvIGRhdGUuIiwKLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzY2FuRGlyKEZpbGUgc3JjRGlyLCBTdHJpbmcgZmlsZXNbXSkgewotICAgICAgICBTb3VyY2VGaWxlU2Nhbm5lciBzZnMgPSBuZXcgU291cmNlRmlsZVNjYW5uZXIodGhpcyk7Ci0gICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IG51bGw7Ci0gICAgICAgIEZpbGUgZGlyID0gc3JjRGlyOwotICAgICAgICBpZiAobWFwcGVyRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBNZXJnaW5nTWFwcGVyIG1tID0gbmV3IE1lcmdpbmdNYXBwZXIoKTsKLSAgICAgICAgICAgIG1tLnNldFRvKF90YXJnZXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIG1hcHBlciA9IG1tOwotICAgICAgICAgICAgZGlyID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hcHBlciA9IG1hcHBlckVsZW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2ZzLnJlc3RyaWN0KGZpbGVzLCBzcmNEaXIsIGRpciwgbWFwcGVyKS5sZW5ndGggPT0gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XYXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTEyZDU0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIENyZWF0ZXMgYSBXQVIgYXJjaGl2ZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIFdhciBleHRlbmRzIEphciB7Ci0KLSAgICBwcml2YXRlIEZpbGUgZGVwbG95bWVudERlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0b3JBZGRlZDsgICAgCi0KLSAgICBwdWJsaWMgV2FyKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBhcmNoaXZlVHlwZSA9ICJ3YXIiOwotICAgICAgICBlbXB0eUJlaGF2aW9yID0gImNyZWF0ZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2FyZmlsZShGaWxlIHdhckZpbGUpIHsKLSAgICAgICAgc3VwZXIuc2V0WmlwZmlsZSh3YXJGaWxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0V2VieG1sKEZpbGUgZGVzY3IpIHsKLSAgICAgICAgZGVwbG95bWVudERlc2NyaXB0b3IgPSBkZXNjcjsgCi0gICAgICAgIGlmICghZGVwbG95bWVudERlc2NyaXB0b3IuZXhpc3RzKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlcGxveW1lbnQgZGVzY3JpcHRvcjogIiArIGRlcGxveW1lbnREZXNjcmlwdG9yICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBaaXBGaWxlU2V0IGZvciB0aGlzIGZpbGUsIGFuZCBwYXNzIGl0IHVwLgotICAgICAgICBaaXBGaWxlU2V0IGZzID0gbmV3IFppcEZpbGVTZXQoKTsKLSAgICAgICAgZnMuc2V0RGlyKG5ldyBGaWxlKGRlcGxveW1lbnREZXNjcmlwdG9yLmdldFBhcmVudCgpKSk7Ci0gICAgICAgIGZzLnNldEluY2x1ZGVzKGRlcGxveW1lbnREZXNjcmlwdG9yLmdldE5hbWUoKSk7Ci0gICAgICAgIGZzLnNldEZ1bGxwYXRoKCJXRUItSU5GL3dlYi54bWwiKTsKLSAgICAgICAgc3VwZXIuYWRkRmlsZXNldChmcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGliKFppcEZpbGVTZXQgZnMpIHsKLSAgICAgICAgLy8gV2UganVzdCBzZXQgdGhlIHByZWZpeCBmb3IgdGhpcyBmaWxlc2V0LCBhbmQgcGFzcyBpdCB1cC4KLSAgICAgICAgZnMuc2V0UHJlZml4KCJXRUItSU5GL2xpYi8iKTsKLSAgICAgICAgc3VwZXIuYWRkRmlsZXNldChmcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ2xhc3NlcyhaaXBGaWxlU2V0IGZzKSB7Ci0gICAgICAgIC8vIFdlIGp1c3Qgc2V0IHRoZSBwcmVmaXggZm9yIHRoaXMgZmlsZXNldCwgYW5kIHBhc3MgaXQgdXAuCi0gICAgICAgIGZzLnNldFByZWZpeCgiV0VCLUlORi9jbGFzc2VzLyIpOwotICAgICAgICBzdXBlci5hZGRGaWxlc2V0KGZzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXZWJpbmYoWmlwRmlsZVNldCBmcykgewotICAgICAgICAvLyBXZSBqdXN0IHNldCB0aGUgcHJlZml4IGZvciB0aGlzIGZpbGVzZXQsIGFuZCBwYXNzIGl0IHVwLgotICAgICAgICBmcy5zZXRQcmVmaXgoIldFQi1JTkYvIik7Ci0gICAgICAgIHN1cGVyLmFkZEZpbGVzZXQoZnMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRaaXBPdXRwdXRTdHJlYW0oWmlwT3V0cHV0U3RyZWFtIHpPdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIElmIG5vIHdlYnhtbCBmaWxlIGlzIHNwZWNpZmllZCwgaXQncyBhbiBlcnJvci4KLSAgICAgICAgaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigid2VieG1sIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3VwZXIuaW5pdFppcE91dHB1dFN0cmVhbSh6T3V0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKEZpbGUgZmlsZSwgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBJZiB0aGUgZmlsZSBiZWluZyBhZGRlZCBpcyBXRUItSU5GL3dlYi54bWwsIHdlIHdhcm4gaWYgaXQncyBub3QgdGhlCi0gICAgICAgIC8vIG9uZSBzcGVjaWZpZWQgaW4gdGhlICJ3ZWJ4bWwiIGF0dHJpYnV0ZSAtIG9yIGlmIGl0J3MgYmVpbmcgYWRkZWQgdHdpY2UsIAotICAgICAgICAvLyBtZWFuaW5nIHRoZSBzYW1lIGZpbGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSAid2VieG1sIiBhdHRyaWJ1dGUgYW5kIGluCi0gICAgICAgIC8vIGEgPGZpbGVzZXQ+IGVsZW1lbnQuCi0gICAgICAgIGlmICh2UGF0aC5lcXVhbHNJZ25vcmVDYXNlKCJXRUItSU5GL3dlYi54bWwiKSkgIHsKLSAgICAgICAgICAgIGlmIChkZXBsb3ltZW50RGVzY3JpcHRvciA9PSBudWxsIHx8ICFkZXBsb3ltZW50RGVzY3JpcHRvci5lcXVhbHMoZmlsZSkgfHwgZGVzY3JpcHRvckFkZGVkKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBzZWxlY3RlZCAiK2FyY2hpdmVUeXBlKyIgZmlsZXMgaW5jbHVkZSBhIFdFQi1JTkYvd2ViLnhtbCB3aGljaCB3aWxsIGJlIGlnbm9yZWQgIiArCi0gICAgICAgICAgICAgICAgICAgICIocGxlYXNlIHVzZSB3ZWJ4bWwgYXR0cmlidXRlIHRvICIrYXJjaGl2ZVR5cGUrIiB0YXNrKSIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdXBlci56aXBGaWxlKGZpbGUsIHpPdXQsIHZQYXRoKTsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuemlwRmlsZShmaWxlLCB6T3V0LCB2UGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdGhpbmsgd2UgYWxyZWFkeSBoYXZlIGEgd2ViLnhtbCBuZXh0IHRpbWUgdGhpcyB0YXNrCi0gICAgICogZ2V0cyBleGVjdXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgewotICAgICAgICBkZXNjcmlwdG9yQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgc3VwZXIuY2xlYW5VcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzI1ZjQyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBQcm94eSBpbnRlcmZhY2UgZm9yIFhTTFQgcHJvY2Vzc29ycy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpydWJ5c0B1cy5pYm0uY29tIj5TYW0gUnVieTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBhcGFjaGUub3JnIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqIEBzZWUgI1hTTFRQcm9jZXNzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWFNMVExpYWlzb24gewotCi0gICAgLyoqCi0gICAgICogdGhlIGZpbGUgcHJvdG9jb2wgcHJlZml4IGZvciBzeXN0ZW1pZC4KLSAgICAgKiBUaGlzIGZpbGUgcHJvdG9jb2wgbXVzdCBiZSBhcHBlbmRlZCB0byBhbiBhYnNvbHV0ZSBwYXRoLgotICAgICAqIFR5cGljYWxseTogPHR0PkZJTEVfUFJPVE9DT0xfUFJFRklYICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTwvdHQ+Ci0gICAgICogVGhpcyBpcyBub3QgY29ycmVjdCBpbiBzcGVjaWZpY2F0aW9uIHRlcm1zIHNpbmNlIGFuIGFic29sdXRlCi0gICAgICogdXJsIGluIFVuaXggaXMgZmlsZTovLyArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgd2hpbGUgaXQgaXMKLSAgICAgKiBmaWxlOi8vLyArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgdW5kZXIgV2luZG93cy4KLSAgICAgKiBXaGF0ZXZlciwgaXQgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gdG8gcHV0IGZpbGU6Ly8vIGluIGV2ZXJ5Ci0gICAgICogY2FzZSBzaW5jZSBtb3N0IHBhcnNlcnMgZm9yIG5vdyBpbmNvcnJlY3RseSBtYWtlcyBubyBkaWZmZXJlbmNlCi0gICAgICogYmV0d2VlbiBpdC4uIGFuZCB1c2VycyBhbHNvIGhhdmUgcHJvYmxlbSB3aXRoIHRoYXQgOikKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1BST1RPQ09MX1BSRUZJWCA9ICJmaWxlOi8vLyI7Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgdGhlIHN0eWxlc2hlZXQgdG8gdXNlIGZvciB0aGUgdHJhbnNmb3JtYXRpb24uCi0gICAgICogQHBhcmFtIHN0eWxlc2hlZXQgdGhlIHN0eWxlc2hlZXQgdG8gYmUgdXNlZCBmb3IgdHJhbnNmb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldChGaWxlIHN0eWxlc2hlZXQpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBwYXJhbWV0ZXIgdG8gYmUgc2V0IGR1cmluZyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgcGFyYW1ldGVyIHZhbHVlIGFzIGFuIGV4cHJlc3Npb24gc3RyaW5nLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHRocm93biBpZiBhbnkgcHJvYmxlbXMgaGFwcGVucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbShTdHJpbmcgbmFtZSwgU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhIGZpbGUgaW50byBhbm90aGVyLgotICAgICAqIEBwYXJhbSBpbmZpbGUgdGhlIGlucHV0IGZpbGUsIHByb2JhYmx5IGFuIFhNTCBvbmUuIDotKQotICAgICAqIEBwYXJhbSBvdXRmaWxlIHRoZSBvdXRwdXQgZmlsZSByZXN1bHRpbmcgZnJvbSB0aGUgdHJhbnNmb3JtYXRpb24KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB0aHJvd24gaWYgYW55IHByb2JsZW1zIGhhcHBlbnMuCi0gICAgICogQHNlZSAjc2V0U3R5bGVzaGVldChGaWxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShGaWxlIGluZmlsZSwgRmlsZSBvdXRmaWxlKSB0aHJvd3MgRXhjZXB0aW9uOwotCi19IC8vLS0gWFNMVExpYWlzb24KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRQcm9jZXNzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE0NTgyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwotCi0KLS8qKgotICogQSBUYXNrIHRvIHByb2Nlc3MgdmlhIFhTTFQgYSBzZXQgb2YgWE1MIGRvY3VtZW50cy4gVGhpcyBpcwotICogdXNlZnVsIGZvciBidWlsZGluZyB2aWV3cyBvZiBYTUwgYmFzZWQgZG9jdW1lbnRhdGlvbi4KLSAqIGFyZ3VtZW50czoKLSAqIDx1bD4KLSAqIDxsaT5iYXNlZGlyCi0gKiA8bGk+ZGVzdGRpcgotICogPGxpPnN0eWxlCi0gKiA8bGk+aW5jbHVkZXMKLSAqIDxsaT5leGNsdWRlcwotICogPC91bD4KLSAqIE9mIHRoZXNlIGFyZ3VtZW50cywgdGhlIDxiPnNvdXJjZWRpcjwvYj4gYW5kIDxiPmRlc3RkaXI8L2I+IGFyZSByZXF1aXJlZC4KLSAqIDxwPgotICogVGhpcyB0YXNrIHdpbGwgcmVjdXJzaXZlbHkgc2NhbiB0aGUgc291cmNlZGlyIGFuZCBkZXN0ZGlyCi0gKiBsb29raW5nIGZvciBYTUwgZG9jdW1lbnRzIHRvIHByb2Nlc3MgdmlhIFhTTFQuIEFueSBvdGhlciBmaWxlcywKLSAqIHN1Y2ggYXMgaW1hZ2VzLCBvciBodG1sIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHdpbGwgYmUKLSAqIGNvcGllZCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a3Zpc2NvQGV4b2ZmaWNlLmNvbSI+S2VpdGggVmlzY288L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpydWJ5c0B1cy5pYm0uY29tIj5TYW0gUnVieTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJ1c3Nnb2xkQGFjbS5vcmciPlJ1c3NlbGwgR29sZDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ic3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFhTTFRQcm9jZXNzIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKLQotICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyID0gbnVsbDsKLQotICAgIHByaXZhdGUgRmlsZSBiYXNlRGlyID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhzbEZpbGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RXh0ZW5zaW9uID0gIi5odG1sIjsKLSAgICBwcml2YXRlIFZlY3RvciBwYXJhbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwcml2YXRlIEZpbGUgaW5GaWxlID0gbnVsbDsKLQotICAgIHByaXZhdGUgRmlsZSBvdXRGaWxlID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NvcjsKLSAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoID0gbnVsbDsKLSAgICBwcml2YXRlIFhTTFRMaWFpc29uIGxpYWlzb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN0eWxlc2hlZXRMb2FkZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBGaWxlVXRpbHMgZmlsZVV0aWxzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBYU0xUUHJvY2VzcyBUYXNrLgotICAgICAqKi8KLSAgICBwdWJsaWMgWFNMVFByb2Nlc3MoKSB7Ci0gICAgICAgIGZpbGVVdGlscyA9IEZpbGVVdGlscy5uZXdGaWxlVXRpbHMoKTsKLSAgICB9IC8vLS0gWFNMVFByb2Nlc3MKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lcjsKLSAgICAgICAgU3RyaW5nW10gICAgICAgICBsaXN0OwotICAgICAgICBTdHJpbmdbXSAgICAgICAgIGRpcnM7Ci0KLSAgICAgICAgaWYgKHhzbEZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyBzdHlsZXNoZWV0IHNwZWNpZmllZCIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlRGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIGJhc2VEaXIgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCIuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsaWFpc29uID0gZ2V0TGlhaXNvbigpOwotICAgICAgICBsb2coIlVzaW5nICIrbGlhaXNvbi5nZXRDbGFzcygpLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCi0gICAgICAgIEZpbGUgc3R5bGVzaGVldCA9IHByb2plY3QucmVzb2x2ZUZpbGUoeHNsRmlsZSk7Ci0gICAgICAgIGlmICghc3R5bGVzaGVldC5leGlzdHMoKSkgewotICAgICAgICAgICAgc3R5bGVzaGVldCA9IGZpbGVVdGlscy5yZXNvbHZlRmlsZShiYXNlRGlyLCB4c2xGaWxlKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBzaG91bGRuJ3QgdGhyb3cgb3V0IGRlcHJlY2F0aW9uIHdhcm5pbmdzIGJlZm9yZSB3ZSBrbm93LAotICAgICAgICAgICAgICogdGhlIHdyb25nIHZlcnNpb24gaGFzIGJlZW4gdXNlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHN0eWxlc2hlZXQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSB0aGUgc3R5bGUgYXR0cmlidXRlIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcHJvamVjdFwncyIpOwotICAgICAgICAgICAgICAgIGxvZygiICAgICAgICAgICAgIGJhc2VkaXIsIG5vdCB0aGUgdGFza3NcJ3MgYmFzZWRpci4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gaW4gZmlsZSBhbmQgb3V0IHRoZW4gcHJvY2VzcyB0aGVtCi0gICAgICAgIGlmIChpbkZpbGUgIT0gbnVsbCAmJiBvdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2Nlc3MoaW5GaWxlLCBvdXRGaWxlLCBzdHlsZXNoZWV0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGlmIHdlIGdldCBoZXJlLCBpbiBhbmQgb3V0IGhhdmUgbm90IGJlZW4gc3BlY2lmaWVkLCB3ZSBhcmUKLSAgICAgICAgICogaW4gYmF0Y2ggcHJvY2Vzc2luZyBtb2RlLgotICAgICAgICAgKi8KLQotICAgICAgICAvLy0tIG1ha2Ugc3VyZSBTb3VyY2UgZGlyZWN0b3J5IGV4aXN0cy4uLgotICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsICkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJkZXN0ZGlyIGF0dHJpYnV0ZXMgbXVzdCBiZSBzZXQhIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9Ci0gICAgICAgIHNjYW5uZXIgPSBnZXREaXJlY3RvcnlTY2FubmVyKGJhc2VEaXIpOwotICAgICAgICBsb2coIlRyYW5zZm9ybWluZyBpbnRvICIrZGVzdERpciwgUHJvamVjdC5NU0dfSU5GTyk7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBhbGwgdGhlIGZpbGVzIG1hcmtlZCBmb3Igc3R5bGluZwotICAgICAgICBsaXN0ID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwO2kgPCBsaXN0Lmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBwcm9jZXNzKCBiYXNlRGlyLCBsaXN0W2ldLCBkZXN0RGlyLCBzdHlsZXNoZWV0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcm9jZXNzIGFsbCB0aGUgZGlyZWN0b3JpZWQgbWFya2VkIGZvciBzdHlsaW5nCi0gICAgICAgIGRpcnMgPSBzY2FubmVyLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7aiA8IGRpcnMubGVuZ3RoOysrail7Ci0gICAgICAgICAgICBsaXN0PW5ldyBGaWxlKGJhc2VEaXIsZGlyc1tqXSkubGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSA8IGxpc3QubGVuZ3RoOysraSkKLSAgICAgICAgICAgICAgICBwcm9jZXNzKCBiYXNlRGlyLCBsaXN0W2ldLCBkZXN0RGlyLCBzdHlsZXNoZWV0ICk7Ci0gICAgICAgIH0KLSAgICB9IC8vLS0gZXhlY3V0ZQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdG8gY2hlY2sgZGVwZW5kZW5jaWVzLCBvciBhbHdheXMgZ2VuZXJhdGUuCi0gICAgICoqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgdGhpcy5mb3JjZSA9IGZvcmNlOwotICAgIH0gLy8tLSBzZXRGb3JjZQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBiYXNlIGRpcmVjdG9yeS4KLSAgICAgKiovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZWRpcihGaWxlIGRpcikgewotICAgICAgICBiYXNlRGlyID0gZGlyOwotICAgIH0gLy8tLSBzZXRTb3VyY2VEaXIKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIFhTTCByZXN1bHQKLSAgICAgKiBmaWxlcyBzaG91bGQgYmUgY29waWVkIHRvCi0gICAgICogQHBhcmFtIGRpck5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQotICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKEZpbGUgZGlyKSB7Ci0gICAgICAgIGRlc3REaXIgPSBkaXI7Ci0gICAgfSAvLy0tIHNldERlc3REaXIKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVzaXJlZCBmaWxlIGV4dGVuc2lvbiB0byBiZSB1c2VkIGZvciB0aGUgdGFyZ2V0Ci0gICAgICogQHBhcmFtIG5hbWUgdGhlIGV4dGVuc2lvbiB0byB1c2UKLSAgICAgKiovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRhcmdldEV4dGVuc2lvbiA9IG5hbWU7Ci0gICAgfSAvLy0tIHNldERlc3REaXIKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGUgdG8gdXNlIGZvciBzdHlsaW5nIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeQotICAgICAqIG9mIHRoaXMgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHJpbmcgeHNsRmlsZSkgewotICAgICAgICB0aGlzLnhzbEZpbGUgPSB4c2xGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGxvYWQgdGhlIFByb2Nlc3NvciB0aHJvdWdoIChhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5hcHBlbmQoY2xhc3NwYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBsb2FkIHRoZSBQcm9jZXNzb3IgdGhyb3VnaCAobmVzdGVkIGVsZW1lbnQpLgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBsb2FkIHRoZSBQcm9jZXNzb3IgdGhyb3VnaCB2aWEgcmVmZXJlbmNlCi0gICAgICogKGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc29yKFN0cmluZyBwcm9jZXNzb3IpIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCBwcm9jZXNzb3IgaGVyZSBpbnN0ZWFkIG9mIGluIHNldFByb2Nlc3NvciAtIHRoaXMgd2lsbCBiZQotICAgICAqIGNhbGxlZCBmcm9tIHdpdGhpbiBleGVjdXRlLCBzbyB3ZSBoYXZlIGFjY2VzcyB0byB0aGUgbGF0ZXN0Ci0gICAgICogY2xhc3NwYXRoLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNvbHZlUHJvY2Vzc29yKFN0cmluZyBwcm9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb2MuZXF1YWxzKCJ0cmF4IikpIHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzIGNsYXp6ID0KLSAgICAgICAgICAgICAgICBsb2FkQ2xhc3MoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlRyYVhMaWFpc29uIik7Ci0gICAgICAgICAgICBsaWFpc29uID0gKFhTTFRMaWFpc29uKWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvYy5lcXVhbHMoInhzbHAiKSkgewotICAgICAgICAgICAgZmluYWwgQ2xhc3MgY2xhenogPQotICAgICAgICAgICAgICAgIGxvYWRDbGFzcygib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuWHNscExpYWlzb24iKTsKLSAgICAgICAgICAgIGxpYWlzb24gPSAoWFNMVExpYWlzb24pIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvYy5lcXVhbHMoInhhbGFuIikpIHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzIGNsYXp6ID0KLSAgICAgICAgICAgICAgICBsb2FkQ2xhc3MoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlhhbGFuTGlhaXNvbiIpOwotICAgICAgICAgICAgbGlhaXNvbiA9IChYU0xUTGlhaXNvbiljbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGlhaXNvbiA9IChYU0xUTGlhaXNvbikgbG9hZENsYXNzKHByb2MpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIG5hbWVkIGNsYXNzIGVpdGhlciB2aWEgdGhlIHN5c3RlbSBjbGFzc2xvYWRlciBvciBhIGdpdmVuCi0gICAgICogY3VzdG9tIGNsYXNzbG9hZGVyLgotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc25hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBhbCA9IG5ldyBBbnRDbGFzc0xvYWRlcihwcm9qZWN0LCBjbGFzc3BhdGgpOwotICAgICAgICAgICAgQ2xhc3MgYyA9IGFsLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIuaW5pdGlhbGl6ZUNsYXNzKGMpOwotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGFuIG91dCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0KEZpbGUgb3V0RmlsZSl7Ci0gICAgICAgIHRoaXMub3V0RmlsZSA9IG91dEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhbiBpbnB1dCB4bWwgZmlsZSB0byBiZSBzdHlsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbihGaWxlIGluRmlsZSl7Ci0gICAgICAgIHRoaXMuaW5GaWxlID0gaW5GaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gaW5wdXQgWE1MIGZpbGUgYW5kIHN0b3JlcyB0aGUgcmVzdWx0Ci0gICAgICogaW4gdGhlIGdpdmVuIHJlc3VsdEZpbGUuCi0gICAgICoqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKEZpbGUgYmFzZURpciwgU3RyaW5nIHhtbEZpbGUsIEZpbGUgZGVzdERpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHN0eWxlc2hlZXQpCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVFeHQ9dGFyZ2V0RXh0ZW5zaW9uOwotICAgICAgICBGaWxlICAgb3V0RmlsZT1udWxsOwotICAgICAgICBGaWxlICAgaW5GaWxlPW51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvbmcgc3R5bGVTaGVldExhc3RNb2RpZmllZCA9IHN0eWxlc2hlZXQubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICBpbkZpbGUgPSBuZXcgRmlsZShiYXNlRGlyLHhtbEZpbGUpOwotICAgICAgICAgICAgaW50IGRvdFBvcyA9IHhtbEZpbGUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmKGRvdFBvcz4wKXsKLSAgICAgICAgICAgICAgICBvdXRGaWxlID0gbmV3IEZpbGUoZGVzdERpcix4bWxGaWxlLnN1YnN0cmluZygwLHhtbEZpbGUubGFzdEluZGV4T2YoJy4nKSkrZmlsZUV4dCk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBvdXRGaWxlID0gbmV3IEZpbGUoZGVzdERpcix4bWxGaWxlK2ZpbGVFeHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvcmNlIHx8Ci0gICAgICAgICAgICAgICAgaW5GaWxlLmxhc3RNb2RpZmllZCgpID4gb3V0RmlsZS5sYXN0TW9kaWZpZWQoKSB8fAotICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRMYXN0TW9kaWZpZWQgPiBvdXRGaWxlLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5zdXJlRGlyZWN0b3J5Rm9yKCBvdXRGaWxlICk7Ci0gICAgICAgICAgICAgICAgbG9nKCJUcmFuc2Zvcm1pbmcgaW50byAiK2Rlc3REaXIpOwotCi0gICAgICAgICAgICAgICAgY29uZmlndXJlTGlhaXNvbihzdHlsZXNoZWV0KTsKLSAgICAgICAgICAgICAgICBsaWFpc29uLnRyYW5zZm9ybShpbkZpbGUsIG91dEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIElmIGZhaWxlZCB0byBwcm9jZXNzIGRvY3VtZW50LCBtdXN0IGRlbGV0ZSB0YXJnZXQgZG9jdW1lbnQsCi0gICAgICAgICAgICAvLyBvciBpdCB3aWxsIG5vdCBhdHRlbXB0IHRvIHByb2Nlc3MgaXQgdGhlIHNlY29uZCB0aW1lCi0gICAgICAgICAgICBsb2coIkZhaWxlZCB0byBwcm9jZXNzICIgKyBpbkZpbGUsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgaWYgKG91dEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLQotICAgIH0gLy8tLSBwcm9jZXNzWE1MCi0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2VzcyhGaWxlIGluRmlsZSwgRmlsZSBvdXRGaWxlLCBGaWxlIHN0eWxlc2hlZXQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIGxvbmcgc3R5bGVTaGVldExhc3RNb2RpZmllZCA9IHN0eWxlc2hlZXQubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICBsb2coIkluIGZpbGUgIitpbkZpbGUrIiB0aW1lOiAiICsgaW5GaWxlLmxhc3RNb2RpZmllZCgpICwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgbG9nKCJPdXQgZmlsZSAiK291dEZpbGUrIiB0aW1lOiAiICsgb3V0RmlsZS5sYXN0TW9kaWZpZWQoKSAsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIGxvZygiU3R5bGUgZmlsZSAiK3hzbEZpbGUrIiB0aW1lOiAiICsgc3R5bGVTaGVldExhc3RNb2RpZmllZCAsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIGlmIChmb3JjZSB8fAotICAgICAgICAgICAgICAgIGluRmlsZS5sYXN0TW9kaWZpZWQoKSA+IG91dEZpbGUubGFzdE1vZGlmaWVkKCkgfHwKLSAgICAgICAgICAgICAgICBzdHlsZVNoZWV0TGFzdE1vZGlmaWVkID4gb3V0RmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgIGVuc3VyZURpcmVjdG9yeUZvciggb3V0RmlsZSApOwotICAgICAgICAgICAgICAgIGxvZygiUHJvY2Vzc2luZyAiICsgaW5GaWxlICsgIiB0byAiICsgb3V0RmlsZSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlTGlhaXNvbihzdHlsZXNoZWV0KTsKLSAgICAgICAgICAgICAgICBsaWFpc29uLnRyYW5zZm9ybShpbkZpbGUsIG91dEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gcHJvY2VzcyAiICsgaW5GaWxlLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgIGlmKG91dEZpbGUhPW51bGwpb3V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlRGlyZWN0b3J5Rm9yKCBGaWxlIHRhcmdldEZpbGUgKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKCB0YXJnZXRGaWxlLmdldFBhcmVudCgpICk7Ci0gICAgICAgIGlmICghZGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBpZiAoIWRpcmVjdG9yeS5ta2RpcnMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3Rvcnk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBYU0xUTGlhaXNvbiBnZXRMaWFpc29uKCkgewotICAgICAgICAvLyBpZiBwcm9jZXNzb3Igd2Fzbid0IHNwZWNpZmllZCwgc2VlIGlmIFRyYVggaXMgYXZhaWxhYmxlLiAgSWYgbm90LAotICAgICAgICAvLyBkZWZhdWx0IGl0IHRvIHhzbHAgb3IgeGFsYW4sIGRlcGVuZGluZyBvbiB3aGljaCBpcyBpbiB0aGUgY2xhc3NwYXRoCi0gICAgICAgIGlmIChsaWFpc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwcm9jZXNzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9jZXNzb3IocHJvY2Vzc29yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvY2Vzc29yKCJ0cmF4Iik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvY2Vzc29yKCJ4c2xwIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvY2Vzc29yKCJ4YWxhbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlhaXNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW0gY3JlYXRlUGFyYW0oKSB7Ci0gICAgICAgIFBhcmFtIHAgPSBuZXcgUGFyYW0oKTsKLSAgICAgICAgcGFyYW1zLmFkZEVsZW1lbnQocCk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBQYXJhbSB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU9bnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbj1udWxsOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbnsKLSAgICAgICAgICAgIGlmKG5hbWU9PW51bGwpdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOYW1lIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLiIpOwotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb257Ci0gICAgICAgICAgICBpZihleHByZXNzaW9uPT1udWxsKXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhwcmVzc2lvbiBhdHRyaWJ1dGUgaXMgbWlzc2luZy4iKTsKLSAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIHN0eWxlc2hlZXQgYW5kIHNldCB4c2w6cGFyYW0gcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVMaWFpc29uKEZpbGUgc3R5bGVzaGVldCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0eWxlc2hlZXRMb2FkZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdHlsZXNoZWV0TG9hZGVkID0gdHJ1ZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9nKCAiTG9hZGluZyBzdHlsZXNoZWV0ICIgKyBzdHlsZXNoZWV0LCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgIGxpYWlzb24uc2V0U3R5bGVzaGVldCggc3R5bGVzaGVldCApOwotICAgICAgICAgICAgZm9yKEVudW1lcmF0aW9uIGUgPSBwYXJhbXMuZWxlbWVudHMoKTtlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIFBhcmFtIHAgPSAoUGFyYW0pZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGxpYWlzb24uYWRkUGFyYW0oIHAuZ2V0TmFtZSgpLCBwLmdldEV4cHJlc3Npb24oKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIHJlYWQgc3R5bGVzaGVldCAiICsgc3R5bGVzaGVldCwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgfQotCi19IC8vLS0gWFNMVFByb2Nlc3MKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ppcC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OTFkYjQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC4qOwotCi0vKioKLSAqIENyZWF0ZSBhIFpJUCBhcmNoaXZlLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRGF2aWRzb24gPGEgaHJlZj0ibWFpbHRvOmR1bmNhbkB4MTgwLmNvbSI+ZHVuY2FuQHgxODAuY29tPC9hPgotICogQGF1dGhvciBKb24gUy4gU3RldmVucyA8YSBocmVmPSJtYWlsdG86am9uQGNsZWFyaW5rLmNvbSI+am9uQGNsZWFyaW5rLmNvbTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIFppcCBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0KLSAgICBwcml2YXRlIEZpbGUgemlwRmlsZTsKLSAgICBwcml2YXRlIEZpbGUgYmFzZURpcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZG9Db21wcmVzcyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRvVXBkYXRlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRvRmlsZXNvbmx5ID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBhcmNoaXZlVHlwZSA9ICJ6aXAiOwotICAgIC8vIEZvciBkaXJlY3RvcmllczoKLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGVtcHR5Q3JjID0gbmV3IENSQzMyICgpLmdldFZhbHVlICgpOwotICAgIHByb3RlY3RlZCBTdHJpbmcgZW1wdHlCZWhhdmlvciA9ICJza2lwIjsKLSAgICBwcml2YXRlIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IgKCk7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgYWRkZWREaXJzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgVmVjdG9yIGFkZGVkRmlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgLyoqIHRydWUgd2hlbiB3ZSBhcmUgYWRkaW5nIG5ldyBmaWxlcyBpbnRvIHRoZSBaaXAgZmlsZSwgYXMgb3Bwb3NlZCB0byAKLSAgICAgICAgYWRkaW5nIGJhY2sgdGhlIHVuY2hhbmdlZCBmaWxlcyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBhZGRpbmdOZXdGaWxlczsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MKLSAgICAgKiBkZWZhdWx0IGVuY29kaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIG5hbWUvbG9jYXRpb24gb2Ygd2hlcmUgdG8gCi0gICAgICogY3JlYXRlIHRoZSAuemlwIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WmlwZmlsZShGaWxlIHppcEZpbGUpIHsKLSAgICAgICAgdGhpcy56aXBGaWxlID0gemlwRmlsZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBpbiBmb3IgCi0gICAgICogdGhpbmdzIHRvIHppcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKEZpbGUgYmFzZURpcikgewotICAgICAgICB0aGlzLmJhc2VEaXIgPSBiYXNlRGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB3ZSB3YW50IHRvIGNvbXByZXNzIHRoZSBmaWxlcyBvciBvbmx5IHN0b3JlIHRoZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3MoYm9vbGVhbiBjKSB7Ci0gICAgICAgIGRvQ29tcHJlc3MgPSBjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtdWxhdGUgU3VuJ3MgamFyIHV0aWxpdHkgYnkgbm90IGFkZGluZyBwYXJlbnQgZGlycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVzb25seShib29sZWFuIGYpIHsKLSAgICAgICAgZG9GaWxlc29ubHkgPSBmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZmlsZSAoaWYgaXQgZXhpc3RzKQotICAgICAqIG9yIGNyZWF0ZSBhIG5ldyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXBkYXRlKGJvb2xlYW4gYykgewotICAgICAgICBkb1VwZGF0ZSA9IGM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7Ci0gICAgICAgIGZpbGVzZXRzLmFkZEVsZW1lbnQoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgemlwZmlsZXNldCBhdHRyaWJ1dGUpIHRoYXQgY2FuIGJlCi0gICAgICogcmVhZCBmcm9tIGFuIGFyY2hpdmUgYW5kIGJlIGdpdmVuIGEgcHJlZml4L2Z1bGxwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFppcGZpbGVzZXQoWmlwRmlsZVNldCBzZXQpIHsKLSAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOwotICAgIH0KLQotCi0gICAgLyoqIFBvc3NpYmxlIGJlaGF2aW9ycyB3aGVuIHRoZXJlIGFyZSBubyBtYXRjaGluZyBmaWxlcyBmb3IgdGhlIHRhc2suICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBXaGVuRW1wdHkgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJmYWlsIiwgInNraXAiLCAiY3JlYXRlIn07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGJlaGF2aW9yIG9mIHRoZSB0YXNrIHdoZW4gbm8gZmlsZXMgbWF0Y2guCi0gICAgICogUG9zc2libGUgdmFsdWVzIGFyZTogPGNvZGU+ZmFpbDwvY29kZT4gKHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAqIGFuZCBoYWx0IHRoZSBidWlsZCk7IDxjb2RlPnNraXA8L2NvZGU+IChkbyBub3QgY3JlYXRlCi0gICAgICogYW55IGFyY2hpdmUsIGJ1dCBpc3N1ZSBhIHdhcm5pbmcpOyA8Y29kZT5jcmVhdGU8L2NvZGU+Ci0gICAgICogKG1ha2UgYW4gYXJjaGl2ZSB3aXRoIG5vIGVudHJpZXMpLgotICAgICAqIERlZmF1bHQgZm9yIHppcCB0YXNrcyBpcyA8Y29kZT5za2lwPC9jb2RlPjsKLSAgICAgKiBmb3IgamFyIHRhc2tzLCA8Y29kZT5jcmVhdGU8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdoZW5lbXB0eShXaGVuRW1wdHkgd2UpIHsKLSAgICAgICAgZW1wdHlCZWhhdmlvciA9IHdlLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMsIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzCi0gICAgICogZGVmYXVsdCBlbmNvZGluZy4KLSAgICAgKgotICAgICAqIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChiYXNlRGlyID09IG51bGwgJiYgZmlsZXNldHMuc2l6ZSgpID09IDAgJiYgInppcCIuZXF1YWxzKGFyY2hpdmVUeXBlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiYmFzZWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQsIG9yIGF0IGxlYXN0ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uZSBmaWxlc2V0IG11c3QgYmUgZ2l2ZW4hIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHppcEZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IHRoZSAiICsgYXJjaGl2ZVR5cGUgKyAiIGZpbGUgdG8gY3JlYXRlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVuYW1lZCB2ZXJzaW9uIG9mIG9yaWdpbmFsIGZpbGUsIGlmIGl0IGV4aXN0cwotICAgICAgICBGaWxlIHJlbmFtZWRGaWxlID0gbnVsbDsKLSAgICAgICAgLy8gV2hldGhlciBvciBub3QgYW4gYWN0dWFsIHVwZGF0ZSBpcyByZXF1aXJlZCAtCi0gICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIGlmIHRoZSBvcmlnaW5hbCBmaWxlIGRvZXNuJ3QgZXhpc3QKLSAgICAgICAgCi0gICAgICAgIGFkZGluZ05ld0ZpbGVzID0gdHJ1ZTsKLSAgICAgICAgYm9vbGVhbiByZWFsbHlEb1VwZGF0ZSA9IGZhbHNlOwotICAgICAgICBpZiAoZG9VcGRhdGUgJiYgemlwRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhbGx5RG9VcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgMTAwMDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlbmFtZWRGaWxlID0gbmV3IEZpbGUoemlwRmlsZS5nZXRQYXJlbnQoKSwgInRtcC4iK2kpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghcmVuYW1lZEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPT0gMTAwMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgZmluZCBhdmFpbGFibGUgdGVtcG9yYXJ5IGZpbGVuYW1lIHRvIHdoaWNoIHRvIHJlbmFtZSBvbGQgZmlsZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCF6aXBGaWxlLnJlbmFtZVRvKHJlbmFtZWRGaWxlKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZW5hbWUgb2xkIGZpbGUgdG8gdGVtcG9yYXJ5IGZpbGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vdCBhbGxvd2VkIHRvIHJlbmFtZSBvbGQgZmlsZSB0byB0ZW1wb3JhcnkgZmlsZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIHNjYW5uZXJzIHRvIHBhc3MgdG8gaXNVcFRvRGF0ZSgpLgotICAgICAgICBWZWN0b3IgZHNzID0gbmV3IFZlY3RvciAoKTsKLSAgICAgICAgaWYgKGJhc2VEaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZHNzLmFkZEVsZW1lbnQoZ2V0RGlyZWN0b3J5U2Nhbm5lcihiYXNlRGlyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGRzcy5hZGRFbGVtZW50IChmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZHNzU2l6ZSA9IGRzcy5zaXplKCk7Ci0gICAgICAgIEZpbGVTY2FubmVyW10gc2Nhbm5lcnMgPSBuZXcgRmlsZVNjYW5uZXJbZHNzU2l6ZV07Ci0gICAgICAgIGRzcy5jb3B5SW50byhzY2FubmVycyk7Ci0KLSAgICAgICAgLy8gcXVpY2sgZXhpdCBpZiB0aGUgdGFyZ2V0IGlzIHVwIHRvIGRhdGUKLSAgICAgICAgLy8gY2FuIGFsc28gaGFuZGxlIGVtcHR5IGFyY2hpdmVzCi0gICAgICAgIGlmIChpc1VwVG9EYXRlKHNjYW5uZXJzLCB6aXBGaWxlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFjdGlvbiA9IHJlYWxseURvVXBkYXRlID8gIlVwZGF0aW5nICIgOiAiQnVpbGRpbmcgIjsKLSAgICAgICAgCi0gICAgICAgIGxvZyhhY3Rpb24gKyBhcmNoaXZlVHlwZSArIjogIisgemlwRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0gek91dCA9IAotICAgICAgICAgICAgICBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpKTsKLSAgICAgICAgICAgIHpPdXQuc2V0RW5jb2RpbmcoZW5jb2RpbmcpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZG9Db21wcmVzcykgewotICAgICAgICAgICAgICAgICAgICB6T3V0LnNldE1ldGhvZChaaXBPdXRwdXRTdHJlYW0uREVGTEFURUQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHpPdXQuc2V0TWV0aG9kKFppcE91dHB1dFN0cmVhbS5TVE9SRUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbml0WmlwT3V0cHV0U3RyZWFtKHpPdXQpOwotCi0gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBpbXBsaWNpdCBmaWxlc2V0IHRvIHRoZSBhcmNoaXZlLgotICAgICAgICAgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRmlsZXMoZ2V0RGlyZWN0b3J5U2Nhbm5lcihiYXNlRGlyKSwgek91dCwgIiIsICIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBleHBsaWNpdCBmaWxlc2V0cyB0byB0aGUgYXJjaGl2ZS4KLSAgICAgICAgICAgICAgICBhZGRGaWxlcyhmaWxlc2V0cywgek91dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseURvVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGluZ05ld0ZpbGVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIFppcEZpbGVTZXQgb2xkRmlsZXMgPSBuZXcgWmlwRmlsZVNldCgpOwotICAgICAgICAgICAgICAgICAgICBvbGRGaWxlcy5zZXRTcmMocmVuYW1lZEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGV4Y2x1c2lvblBhdHRlcm4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGFkZGVkRmlsZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25QYXR0ZXJuLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9uUGF0dGVybi5hcHBlbmQoKFN0cmluZylhZGRlZEZpbGVzLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2xkRmlsZXMuc2V0RXhjbHVkZXMoZXhjbHVzaW9uUGF0dGVybi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yIHRtcCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wLmFkZEVsZW1lbnQob2xkRmlsZXMpOwotICAgICAgICAgICAgICAgICAgICBhZGRGaWxlcyh0bXAsIHpPdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGl6ZVppcE91dHB1dFN0cmVhbSh6T3V0KTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG91dHB1dCBzdHJlYW0uCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHpPdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgek91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBpbiB0aGlzIGZpbmFsbHkgY2xhdXNlIGJlY2F1c2Ugb2YgYW4gZXhjZXB0aW9uLCB3ZSBkb24ndCAKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGx5IGNhcmUgaWYgdGhlcmUncyBhbiBleGNlcHRpb24gd2hlbiBjbG9zaW5nIHRoZSBzdHJlYW0uIEUuZy4gaWYgaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3dzICJaSVAgZmlsZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5IiwgYmVjYXVzZSBhbiBleGNlcHRpb24gaGFwcGVuZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIGFkZGVkIGFueSBmaWxlcywgdGhlbiB3ZSBtdXN0IHN3YWxsb3cgdGhpcyBleGNlcHRpb24uIE90aGVyd2lzZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVycm9yIHRoYXQncyByZXBvcnRlZCB3aWxsIGJlIHRoZSBjbG9zZSgpIGVycm9yLCB3aGljaCBpcyBub3QgdGhlIHJlYWwgCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlIG9mIHRoZSBwcm9ibGVtLgotICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gY3JlYXRpbmcgIiArIGFyY2hpdmVUeXBlICsgIjogIiArIGlvZS5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIC8vIGRlbGV0ZSBhIGJvZ3VzIFpJUCBmaWxlCi0gICAgICAgICAgICBpZiAoIXppcEZpbGUuZGVsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICBtc2cgKz0gIiAoYW5kIHRoZSBhcmNoaXZlIGlzIHByb2JhYmx5IGNvcnJ1cHQgYnV0IEkgY291bGQgbm90IGRlbGV0ZSBpdCkiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhbGx5RG9VcGRhdGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXJlbmFtZWRGaWxlLnJlbmFtZVRvKHppcEZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZys9IiAoYW5kIEkgY291bGRuJ3QgcmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lZEZpbGUuZ2V0TmFtZSgpKyIgYmFjaykiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBsb2NhdGlvbik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbGVhblVwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlJ3ZlIGJlZW4gc3VjY2Vzc2Z1bCBvbiBhbiB1cGRhdGUsIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcmVhbGx5RG9VcGRhdGUpIHsKLSAgICAgICAgICAgIGlmICghcmVuYW1lZEZpbGUuZGVsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cgKCJXYXJuaW5nOiB1bmFibGUgdG8gZGVsZXRlIHRlbXBvcmFyeSBmaWxlICIgKwotICAgICAgICAgICAgICAgICAgICAgcmVuYW1lZEZpbGUuZ2V0TmFtZSgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgdGFzayBpcyBhZGRpbmcgbmV3IGZpbGVzIGludG8gdGhlIGFyY2hpdmUgYXMgb3Bwb3NlZCB0bwotICAgICAqIGNvcHlpbmcgYmFjayB1bmNoYW5nZWQgZmlsZXMgZnJvbSB0aGUgYmFja3VwIGNvcHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FkZGluZ05ld0ZpbGVzKCkgewotICAgICAgICByZXR1cm4gYWRkaW5nTmV3RmlsZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhbGwgZmlsZXMgb2YgdGhlIGdpdmVuIEZpbGVTY2FubmVyIHRvIHRoZSBaaXBPdXRwdXRTdHJlYW0KLSAgICAgKiBwcmVwZW5kaWcgdGhlIGdpdmVuIHByZWZpeCB0byBlYWNoIGZpbGVuYW1lLgotICAgICAqCi0gICAgICogPHA+RW5zdXJlIHBhcmVudCBkaXJlY3RvcmllcyBoYXZlIGJlZW4gYWRkZWQgYXMgd2VsbC4gIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpbGVzKEZpbGVTY2FubmVyIHNjYW5uZXIsIFppcE91dHB1dFN0cmVhbSB6T3V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4LCBTdHJpbmcgZnVsbHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwICYmIGZ1bGxwYXRoLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkJvdGggcHJlZml4IGFuZCBmdWxscGF0aCBhdHRyaWJ1dGVzIG1heSBub3QgYmUgc2V0IG9uIHRoZSBzYW1lIGZpbGVzZXQuIik7Ci0KLSAgICAgICAgRmlsZSB0aGlzQmFzZURpciA9IHNjYW5uZXIuZ2V0QmFzZWRpcigpOwotCi0gICAgICAgIC8vIGRpcmVjdG9yaWVzIHRoYXQgbWF0Y2hlZCBpbmNsdWRlIHBhdHRlcm5zCi0gICAgICAgIFN0cmluZ1tdIGRpcnMgPSBzY2FubmVyLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKLSAgICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCAmJiBmdWxscGF0aC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZ1bGxwYXRoIGF0dHJpYnV0ZSBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGZpbGVzZXRzIHRoYXQgc3BlY2lmeSBhIHNpbmdsZSBmaWxlLiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgiIi5lcXVhbHMoZGlyc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGlyc1tpXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwnLycpOwotICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICBuYW1lICs9ICIvIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBhcmVudERpcnModGhpc0Jhc2VEaXIsIG5hbWUsIHpPdXQsIHByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaWxlcyB0aGF0IG1hdGNoZWQgaW5jbHVkZSBwYXR0ZXJucwotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDEgJiYgZnVsbHBhdGgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmdWxscGF0aCBhdHRyaWJ1dGUgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBmaWxlc2V0cyB0aGF0IHNwZWNpZnkgYSBzaW5nbGUgZmlsZS4iKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodGhpc0Jhc2VEaXIsIGZpbGVzW2ldKTsKLSAgICAgICAgICAgIGlmIChmdWxscGF0aC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotICAgICAgICAgICAgICAgIGFkZFBhcmVudERpcnMobnVsbCwgZnVsbHBhdGgsIHpPdXQsICIiKTsKLSAgICAgICAgICAgICAgICB6aXBGaWxlKGYsIHpPdXQsIGZ1bGxwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwnLycpOwotICAgICAgICAgICAgICAgIGFkZFBhcmVudERpcnModGhpc0Jhc2VEaXIsIG5hbWUsIHpPdXQsIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgemlwRmlsZShmLCB6T3V0LCBwcmVmaXgrbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRaaXBFbnRyaWVzKFppcEZpbGVTZXQgZnMsIERpcmVjdG9yeVNjYW5uZXIgZHMsCi0gICAgICBaaXBPdXRwdXRTdHJlYW0gek91dCwgU3RyaW5nIHByZWZpeCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBaaXBTY2FubmVyIHppcFNjYW5uZXIgPSAoWmlwU2Nhbm5lcikgZHM7Ci0gICAgICAgIEZpbGUgemlwU3JjID0gZnMuZ2V0U3JjKCk7Ci0KLSAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgIGphdmEudXRpbC56aXAuWmlwRW50cnkgb3JpZ0VudHJ5OwotICAgICAgICBaaXBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHppcFNyYykpOwotCi0gICAgICAgICAgICB3aGlsZSAoKG9yaWdFbnRyeSA9IGluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgWmlwRW50cnkob3JpZ0VudHJ5KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdlBhdGggPSBlbnRyeS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHppcFNjYW5uZXIubWF0Y2godlBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFBhcmVudERpcnMobnVsbCwgdlBhdGgsIHpPdXQsIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghIGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGUoaW4sIHpPdXQsIHByZWZpeCt2UGF0aCwgZW50cnkuZ2V0VGltZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRaaXBPdXRwdXRTdHJlYW0oWmlwT3V0cHV0U3RyZWFtIHpPdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemVaaXBPdXRwdXRTdHJlYW0oWmlwT3V0cHV0U3RyZWFtIHpPdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGVtcHR5IHppcCBmaWxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgaXMgdGhlbiBjb25zaWRlcmVkIHVwIHRvIGRhdGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlRW1wdHlaaXAoRmlsZSB6aXBGaWxlKSB7Ci0gICAgICAgIC8vIEluIHRoaXMgY2FzZSB1c2luZyBqYXZhLnV0aWwuemlwIHdpbGwgbm90IHdvcmsKLSAgICAgICAgLy8gYmVjYXVzZSBpdCBkb2VzIG5vdCBwZXJtaXQgYSB6ZXJvLWVudHJ5IGFyY2hpdmUuCi0gICAgICAgIC8vIE11c3QgY3JlYXRlIGl0IG1hbnVhbGx5LgotICAgICAgICBsb2coIk5vdGU6IGNyZWF0aW5nIGVtcHR5ICIrYXJjaGl2ZVR5cGUrIiBhcmNoaXZlICIgKyB6aXBGaWxlLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBDZi4gUEtaSVAgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgICAgICAgICBieXRlW10gZW1wdHkgPSBuZXcgYnl0ZVsyMl07Ci0gICAgICAgICAgICAgICAgZW1wdHlbMF0gPSA4MDsgLy8gUAotICAgICAgICAgICAgICAgIGVtcHR5WzFdID0gNzU7IC8vIEsKLSAgICAgICAgICAgICAgICBlbXB0eVsyXSA9IDU7Ci0gICAgICAgICAgICAgICAgZW1wdHlbM10gPSA2OwotICAgICAgICAgICAgICAgIC8vIHJlbWFpbmRlciB6ZXJvcwotICAgICAgICAgICAgICAgIG9zLndyaXRlKGVtcHR5KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgZW1wdHkgWklQIGFyY2hpdmUiLCBpb2UsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciB0aGUgYXJjaGl2ZSBpcyB1cC10by1kYXRlOyBhbmQgaGFuZGxlIGJlaGF2aW9yIGZvciBlbXB0eSBhcmNoaXZlcy4KLSAgICAgKiBAcGFyYW0gc2Nhbm5lcnMgbGlzdCBvZiBwcmVwYXJlZCBzY2FubmVycyBjb250YWluaW5nIGZpbGVzIHRvIGFyY2hpdmUKLSAgICAgKiBAcGFyYW0gemlwRmlsZSBpbnRlbmRlZCBhcmNoaXZlIGZpbGUgKG1heSBvciBtYXkgbm90IGV4aXN0KQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBub3RoaW5nIG5lZWQgYmUgZG9uZSAobWF5IGhhdmUgZG9uZSBzb21ldGhpbmcgYWxyZWFkeSk7IGZhbHNlIGlmCi0gICAgICogICAgICAgICBhcmNoaXZlIGNyZWF0aW9uIHNob3VsZCBwcm9jZWVkCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBpdCBsaWtlcwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVXBUb0RhdGUoRmlsZVNjYW5uZXJbXSBzY2FubmVycywgRmlsZSB6aXBGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdW10gZmlsZU5hbWVzID0gZ3JhYkZpbGVOYW1lcyhzY2FubmVycyk7Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGdyYWJGaWxlcyhzY2FubmVycywgZmlsZU5hbWVzKTsKLSAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoZW1wdHlCZWhhdmlvci5lcXVhbHMoInNraXAiKSkgewotICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogc2tpcHBpbmcgIithcmNoaXZlVHlwZSsiIGFyY2hpdmUgIiArIHppcEZpbGUgKwotICAgICAgICAgICAgICAgICAgICAiIGJlY2F1c2Ugbm8gZmlsZXMgd2VyZSBpbmNsdWRlZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW1wdHlCZWhhdmlvci5lcXVhbHMoImZhaWwiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSAiK2FyY2hpdmVUeXBlKyIgYXJjaGl2ZSAiICsgemlwRmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IG5vIGZpbGVzIHdlcmUgaW5jbHVkZWQuIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUuCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVtcHR5WmlwKHppcEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lcXVhbHMoemlwRmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBIHppcCBmaWxlIGNhbm5vdCBpbmNsdWRlIGl0c2VsZiIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghemlwRmlsZS5leGlzdHMoKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBTb3VyY2VGaWxlU2Nhbm5lciBzZnMgPSBuZXcgU291cmNlRmlsZVNjYW5uZXIodGhpcyk7Ci0gICAgICAgICAgICBNZXJnaW5nTWFwcGVyIG1tID0gbmV3IE1lcmdpbmdNYXBwZXIoKTsKLSAgICAgICAgICAgIG1tLnNldFRvKHppcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNjYW5uZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNmcy5yZXN0cmljdChmaWxlTmFtZXNbaV0sIHNjYW5uZXJzW2ldLmdldEJhc2VkaXIoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgRmlsZVtdIGdyYWJGaWxlcyhGaWxlU2Nhbm5lcltdIHNjYW5uZXJzKSB7Ci0gICAgICAgIHJldHVybiBncmFiRmlsZXMoc2Nhbm5lcnMsIGdyYWJGaWxlTmFtZXMoc2Nhbm5lcnMpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEZpbGVbXSBncmFiRmlsZXMoRmlsZVNjYW5uZXJbXSBzY2FubmVycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdW10gZmlsZU5hbWVzKSB7Ci0gICAgICAgIFZlY3RvciBmaWxlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgdGhpc0Jhc2VEaXIgPSBzY2FubmVyc1tpXS5nZXRCYXNlZGlyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbGVOYW1lc1tpXS5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICBmaWxlcy5hZGRFbGVtZW50KG5ldyBGaWxlKHRoaXNCYXNlRGlyLCBmaWxlTmFtZXNbaV1bal0pKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlW10gdG9yZXQgPSBuZXcgRmlsZVtmaWxlcy5zaXplKCldOwotICAgICAgICBmaWxlcy5jb3B5SW50byh0b3JldCk7Ci0gICAgICAgIHJldHVybiB0b3JldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdW10gZ3JhYkZpbGVOYW1lcyhGaWxlU2Nhbm5lcltdIHNjYW5uZXJzKSB7Ci0gICAgICAgIFN0cmluZ1tdW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzY2FubmVycy5sZW5ndGhdW107Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzY2FubmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBzY2FubmVyc1tpXS5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBkaXJzID0gc2Nhbm5lcnNbaV0uZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOwotICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IFN0cmluZ1tmaWxlcy5sZW5ndGggKyBkaXJzLmxlbmd0aF07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZpbGVzLCAwLCByZXN1bHRbaV0sIDAsIGZpbGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRpcnMsIDAsIHJlc3VsdFtpXSwgZmlsZXMubGVuZ3RoLCBkaXJzLmxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB6aXBEaXIoRmlsZSBkaXIsIFppcE91dHB1dFN0cmVhbSB6T3V0LCBTdHJpbmcgdlBhdGgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGFkZGVkRGlycy5nZXQodlBhdGgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGRvbid0IGFkZCBkaXJlY3RvcmllcyB3ZSd2ZSBhbHJlYWR5IGFkZGVkLgotICAgICAgICAgICAgLy8gbm8gd2FybmluZyBpZiB3ZSB0cnksIGl0IGlzIGhhcm1sZXNzIGluIGFuZCBvZiBpdHNlbGYKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhZGRlZERpcnMucHV0KHZQYXRoLCB2UGF0aCk7Ci0gICAgICAgIAotICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeSAodlBhdGgpOwotICAgICAgICBpZiAoZGlyICE9IG51bGwgJiYgZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB6ZS5zZXRUaW1lKGRpci5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB6ZS5zZXRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgICAgICAgfQotICAgICAgICB6ZS5zZXRTaXplICgwKTsKLSAgICAgICAgemUuc2V0TWV0aG9kIChaaXBFbnRyeS5TVE9SRUQpOwotICAgICAgICAvLyBUaGlzIGlzIGZhaW50bHkgcmlkaWN1bG91czoKLSAgICAgICAgemUuc2V0Q3JjIChlbXB0eUNyYyk7Ci0KLSAgICAgICAgLy8gdGhpcyBpcyAwNDA3NzUgfCBNUy1ET1MgZGlyZWN0b3J5IGZsYWcgaW4gcmV2ZXJzZSBieXRlIG9yZGVyCi0gICAgICAgIHplLnNldEV4dGVybmFsQXR0cmlidXRlcygweDQxRkQwMDEwTCk7Ci0KLSAgICAgICAgek91dC5wdXROZXh0RW50cnkgKHplKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKElucHV0U3RyZWFtIGluLCBaaXBPdXRwdXRTdHJlYW0gek91dCwgU3RyaW5nIHZQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkodlBhdGgpOwotICAgICAgICB6ZS5zZXRUaW1lKGxhc3RNb2RpZmllZCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogWFhYIFppcE91dHB1dFN0cmVhbS5wdXRFbnRyeSBleHBlY3RzIHRoZSBaaXBFbnRyeSB0byBrbm93IGl0cwotICAgICAgICAgKiBzaXplIGFuZCB0aGUgQ1JDIHN1bSBiZWZvcmUgeW91IHN0YXJ0IHdyaXRpbmcgdGhlIGRhdGEgd2hlbiB1c2luZyAKLSAgICAgICAgICogU1RPUkVEIG1vZGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgZm9yY2VzIHVzIHRvIHByb2Nlc3MgdGhlIGRhdGEgdHdpY2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEkgY291bGRuJ3QgZmluZCBhbnkgZG9jdW1lbnRhdGlvbiBvbiB0aGlzLCBqdXN0IGZvdW5kIG91dCBieSB0cnkgCi0gICAgICAgICAqIGFuZCBlcnJvci4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghZG9Db21wcmVzcykgewotICAgICAgICAgICAgbG9uZyBzaXplID0gMDsKLSAgICAgICAgICAgIENSQzMyIGNhbCA9IG5ldyBDUkMzMigpOwotICAgICAgICAgICAgaWYgKCFpbi5tYXJrU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9yZSBkYXRhIGludG8gYSBieXRlW10KLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzggKiAxMDI0XTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgY2FsLnVwZGF0ZShidWZmZXIsIDAsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgYm9zLndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAtMSk7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluLm1hcmsoSW50ZWdlci5NQVhfVkFMVUUpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4ICogMTAyNF07Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGNhbC51cGRhdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gaW4ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IC0xKTsKLSAgICAgICAgICAgICAgICBpbi5yZXNldCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgemUuc2V0U2l6ZShzaXplKTsKLSAgICAgICAgICAgIHplLnNldENyYyhjYWwuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB6T3V0LnB1dE5leHRFbnRyeSh6ZSk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzggKiAxMDI0XTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICB6T3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7Ci0gICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IC0xKTsKLSAgICAgICAgYWRkZWRGaWxlcy5hZGRFbGVtZW50KHZQYXRoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKEZpbGUgZmlsZSwgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoZmlsZS5lcXVhbHMoemlwRmlsZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQSB6aXAgZmlsZSBjYW5ub3QgaW5jbHVkZSBpdHNlbGYiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZkluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHppcEZpbGUoZkluLCB6T3V0LCB2UGF0aCwgZmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBmSW4uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZSBhbGwgcGFyZW50IGRpcnMgb2YgYSBnaXZlbiBlbnRyeSBoYXZlIGJlZW4gYWRkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUGFyZW50RGlycyhGaWxlIGJhc2VEaXIsIFN0cmluZyBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFppcE91dHB1dFN0cmVhbSB6T3V0LCBTdHJpbmcgcHJlZml4KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiggIWRvRmlsZXNvbmx5ICkgewotICAgICAgICAgICAgU3RhY2sgZGlyZWN0b3JpZXMgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgICAgIGludCBzbGFzaFBvcyA9IGVudHJ5Lmxlbmd0aCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoKHNsYXNoUG9zID0gZW50cnkubGFzdEluZGV4T2YoKGludCknLycsIHNsYXNoUG9zLTEpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSBlbnRyeS5zdWJzdHJpbmcoMCwgc2xhc2hQb3MrMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZGVkRGlycy5nZXQocHJlZml4K2RpcikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMucHVzaChkaXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoIWRpcmVjdG9yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSAoU3RyaW5nKSBkaXJlY3Rvcmllcy5wb3AoKTsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGJhc2VEaXIsIGRpcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGRpcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHppcERpcihmLCB6T3V0LCBwcmVmaXgrZGlyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEl0ZXJhdGUgb3ZlciB0aGUgZ2l2ZW4gVmVjdG9yIG9mICh6aXApZmlsZXNldHMgYW5kIGFkZAotICAgICAqIGFsbCBmaWxlcyB0byB0aGUgWmlwT3V0cHV0U3RyZWFtIHVzaW5nIHRoZSBnaXZlbiBwcmVmaXguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRmlsZXMoVmVjdG9yIGZpbGVzZXRzLCBaaXBPdXRwdXRTdHJlYW0gek91dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQWRkIGVhY2ggZmlsZXNldCBpbiB0aGUgVmVjdG9yLgotICAgICAgICBmb3IgKGludCBpID0gMDsgaTxmaWxlc2V0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKLQotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIGZ1bGxwYXRoID0gIiI7Ci0gICAgICAgICAgICBpZiAoZnMgaW5zdGFuY2VvZiBaaXBGaWxlU2V0KSB7Ci0gICAgICAgICAgICAgICAgWmlwRmlsZVNldCB6ZnMgPSAoWmlwRmlsZVNldCkgZnM7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gemZzLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgIGZ1bGxwYXRoID0gemZzLmdldEZ1bGxwYXRoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwIAotICAgICAgICAgICAgICAgICYmICFwcmVmaXguZW5kc1dpdGgoIi8iKQotICAgICAgICAgICAgICAgICYmICFwcmVmaXguZW5kc1dpdGgoIlxcIikpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggKz0gIi8iOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGFkZCBlaXRoZXIgZnVsbHBhdGgncyBwYXJlbnQgZGlyZWN0b3J5LCBvciAKLSAgICAgICAgICAgIC8vIHRoZSBwcmVmaXggZGlyZWN0b3J5LCB0byB0aGUgYXJjaGl2ZS4gCi0gICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGFkZFBhcmVudERpcnMobnVsbCwgcHJlZml4LCB6T3V0LCAiIik7Ci0gICAgICAgICAgICAgICAgemlwRGlyKG51bGwsIHpPdXQsIHByZWZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZ1bGxwYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGFkZFBhcmVudERpcnMobnVsbCwgZnVsbHBhdGgsIHpPdXQsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZzIGluc3RhbmNlb2YgWmlwRmlsZVNldAotICAgICAgICAgICAgICAgICYmICgoWmlwRmlsZVNldCkgZnMpLmdldFNyYygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGRaaXBFbnRyaWVzKChaaXBGaWxlU2V0KSBmcywgZHMsIHpPdXQsIHByZWZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZmlsZXNldC4KLSAgICAgICAgICAgICAgICBhZGRGaWxlcyhkcywgek91dCwgcHJlZml4LCBmdWxscGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyBhbnkgY2xlYW4gdXAgbmVjZXNzYXJ5IHRvIGFsbG93IHRoaXMgaW5zdGFuY2UgdG8gYmUgdXNlZCBhZ2Fpbi4KLSAgICAgKgotICAgICAqIDxwPldoZW4gd2UgZ2V0IGhlcmUsIHRoZSBaaXAgZmlsZSBoYXMgYmVlbiBjbG9zZWQgYW5kIGFsbCB3ZQotICAgICAqIG5lZWQgdG8gZG8gaXMgdG8gcmVzZXQgc29tZSBnbG9iYWxzLjwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgewotICAgICAgICBhZGRlZERpcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGFkZGVkRmlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0NvbXBpbGVyQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0NvbXBpbGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmM3OWZkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Db21waWxlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWM7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSB0aGF0IGFsbCBjb21waWxlciBhZGFwdGVycyBtdXN0IGFkaGVyIHRvLiAgCi0gKgotICogPHA+QSBjb21waWxlciBhZGFwdGVyIGlzIGFuIGFkYXB0ZXIgdGhhdCBpbnRlcnByZXRzIHRoZSBqYXZhYydzCi0gKiBwYXJhbWV0ZXJzIGluIHByZXBlcmF0aW9uIHRvIGJlIHBhc3NlZCBvZmYgdG8gdGhlIGNvbXBpZXIgdGhpcwotICogYWRhcHRlciByZXByZXNlbnRzLiAgQXMgYWxsIHRoZSBuZWNlc3NhcnkgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlCi0gKiBKYXZhYyB0YXNrIGl0c2VsZiwgdGhlIG9ubHkgdGhpbmcgYWxsIGFkYXB0ZXJzIG5lZWQgaXMgdGhlIGphdmFjCi0gKiB0YXNrLCB0aGUgZXhlY3V0ZSBjb21tYW5kIGFuZCBhIHBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IgKGZvcgotICogcmVmbGVjdGlvbikuPC9wPgotICoKLSAqIEBhdXRob3IgSmF5IERpY2tvbiBHbGFudmlsbGUgPGEgaHJlZj0ibWFpbHRvOmpheWdsYW52aWxsZUBob21lLmNvbSI+amF5Z2xhbnZpbGxlQGhvbWUuY29tPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGlsZXJBZGFwdGVyIHsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbXBpbGVyIGF0dHJpYnV0ZXMsIHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIEphdmFjIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YWMoIEphdmFjIGF0dHJpYnV0ZXMgKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqCi0gICAgICogQHJldHVybiBoYXMgdGhlIGNvbXBpbGF0aW9uIGJlZW4gc3VjY2Vzc2Z1bAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0NvbXBpbGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwYWUyNS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi0vKioKLSAqIENyZWF0ZXMgdGhlIG5lY2Vzc2FyeSBjb21waWxlciBhZGFwdGVyLCBnaXZlbiBiYXNpYyBjcml0ZXJpYS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXlnbGFudmlsbGVAaG9tZS5jb20iPkogRCBHbGFudmlsbGU8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxlckFkYXB0ZXJGYWN0b3J5IHsKLQotICAgIC8qKiBUaGlzIGlzIGEgc2luZ2x0b24gLS0gY2FuJ3QgY3JlYXRlIGluc3RhbmNlcyEhICovCi0gICAgcHJpdmF0ZSBDb21waWxlckFkYXB0ZXJGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJhc2VkIG9uIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluLCB0aGlzIG1ldGhvZCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkKLSAgICAgKiBmYWN0b3J5IGRlc2lyZWQuCi0gICAgICoKLSAgICAgKiBUaGUgY3VycmVudCBtYXBwaW5nIGZvciBjb21waWxlciBuYW1lcyBhcmUgYXMgZm9sbG93czoKLSAgICAgKiA8dWw+PGxpPmppa2VzID0gamlrZXMgY29tcGlsZXIKLSAgICAgKiA8bGk+Y2xhc3NpYywgamF2YWMxLjEsIGphdmFjMS4yID0gdGhlIHN0YW5kYXJkIGNvbXBpbGVyIGZyb20gSkRLCi0gICAgICogMS4xLzEuMgotICAgICAqIDxsaT5tb2Rlcm4sIGphdmFjMS4zID0gdGhlIG5ldyBjb21waWxlciBvZiBKREsgMS4zCi0gICAgICogPGxpPmp2YywgbWljcm9zb2Z0ID0gdGhlIGNvbW1hbmQgbGluZSBjb21waWxlciBmcm9tIE1pY3Jvc29mdCdzIFNESwotICAgICAqIGZvciBKYXZhIC8gVmlzdWFsIEorKwotICAgICAqIDxsaT5ramMgPSB0aGUga29waSBjb21waWxlcjwvbGk+Ci0gICAgICogPGxpPmdjaiA9IHRoZSBnY2ogY29tcGlsZXIgZnJvbSBnY2M8L2xpPgotICAgICAqIDxsaT48aT5hIGZ1bGx5IHF1YWxsaWZpZWQgY2xhc3NuYW1lPC9pPiA9IHRoZSBuYW1lIG9mIGEgY29tcGlsZXIKLSAgICAgKiBhZGFwdGVyCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21waWxlclR5cGUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNvbXBpbGVyLCBvciB0aGUKLSAgICAgKiBmdWxsIGNsYXNzbmFtZSBvZiB0aGUgY29tcGlsZXIncyBhZGFwdGVyLgotICAgICAqIEBwYXJhbSB0YXNrIGEgdGFzayB0byBsb2cgdGhyb3VnaC4KLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxlciB0eXBlIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbnRvCi0gICAgICogYSBjb21waWxlciBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29tcGlsZXJBZGFwdGVyIGdldENvbXBpbGVyKCBTdHJpbmcgY29tcGlsZXJUeXBlLCBUYXNrIHRhc2sgKSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8qIElmIEkndmUgZG9uZSB0aGluZ3MgcmlnaHQsIHRoaXMgc2hvdWxkIGJlIHRoZSBleHRlbnQgb2YgdGhlCi0gICAgICAgICAgICAgKiBjb25kaXRpb25hbCBzdGF0ZW1lbnRzIHJlcXVpcmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqaWtlcyIpICkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmlrZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImV4dEphdmFjIikgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhY0V4dGVybmFsKCk7Ci0gICAgICAgICAgICB9ICAgICAgIAotICAgICAgICAgICAgaWYgKCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3NpYyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhYzEuMSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhYzEuMiIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhYzEyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJtb2Rlcm4iKSB8fAotICAgICAgICAgICAgICAgICAgICBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YWMxLjMiKSB8fAotICAgICAgICAgICAgICAgICAgICBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YWMxLjQiKSkgewotICAgICAgICAgICAgICAgIC8vIGRvZXMgdGhlIG1vZGVybiBjb21waWxlciBleGlzdD8KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLmphdmFjLk1haW4iKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFzay5sb2coIk1vZGVybiBjb21waWxlciBpcyBub3QgYXZhaWxhYmxlIC0gdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNsYXNzaWMgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhYzEyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YWMxMygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgianZjIikgfHwKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoIm1pY3Jvc29mdCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKdmMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImtqYyIpICkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgS2pjKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJnY2oiKSApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdjaigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJzaiIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJzeW1hbnRlYyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzc05hbWUoIGNvbXBpbGVyVHlwZSApOwotICAgICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byByZXNvbHZlIHRoZSBnaXZlbiBjbGFzc25hbWUgaW50byBhIGNvbXBpbGVyIGFkYXB0ZXIuCi0gICAgICogVGhyb3dzIGEgZml0IGlmIGl0IGNhbid0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSB0byBiZSBjcmVhdGVkLgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gVGhpcyBpcyB0aGUgZml0IHRoYXQgaXMgdGhyb3duIGlmIGNsYXNzTmFtZQotICAgICAqIGlzbid0IGFuIGluc3RhbmNlIG9mIENvbXBpbGVyQWRhcHRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDb21waWxlckFkYXB0ZXIgcmVzb2x2ZUNsYXNzTmFtZSggU3RyaW5nIGNsYXNzTmFtZSApCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZSggY2xhc3NOYW1lICk7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHJldHVybiAoQ29tcGlsZXJBZGFwdGVyKSBvOwotICAgICAgICB9IGNhdGNoICggQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCBjbGFzc05hbWUgKyAiIGNhblwndCBiZSBmb3VuZC4iLCBjbmZlICk7Ci0gICAgICAgIH0gY2F0Y2ggKCBDbGFzc0Nhc3RFeGNlcHRpb24gY2NlICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzTmFtZSArICIgaXNuXCd0IHRoZSBjbGFzc25hbWUgb2YgIgotICAgICAgICAgICAgICAgICAgICArICJhIGNvbXBpbGVyIGFkYXB0ZXIuIiwgY2NlKTsKLSAgICAgICAgfSBjYXRjaCAoIFRocm93YWJsZSB0ICkgewotICAgICAgICAgICAgLy8gZm9yIGFsbCBvdGhlciBwb3NzaWJpbGl0aWVzCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY2xhc3NOYW1lICsgIiBjYXVzZWQgYW4gaW50ZXJlc3RpbmcgIgotICAgICAgICAgICAgICAgICAgICArICJleGNlcHRpb24uIiwgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXJBZGFwdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvRGVmYXVsdENvbXBpbGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjVkMmM5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBDb21waWxlckFkYXB0ZXIgaW50ZXJmYWNlLgotICogQ3VycmVudGx5LCB0aGlzIGlzIGEgY3V0LWFuZC1wYXN0ZSBvZiB0aGUgb3JpZ2luYWwgamF2YWMgdGFzay4KLSAqCi0gKiBAYXV0aG9yIEphbWVzIERhdmlkc29uIDxhIGhyZWY9Im1haWx0bzpkdW5jYW5AeDE4MC5jb20iPmR1bmNhbkB4MTgwLmNvbTwvYT4KLSAqIEBhdXRob3IgUm9iaW4gR3JlZW4gPGEgaHJlZj0ibWFpbHRvOmdyZWVucmRAaG90bWFpbC5jb20iPmdyZWVucmRAaG90bWFpbC5jb208L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amF5Z2xhbnZpbGxlQGhvbWUuY29tIj5KIEQgR2xhbnZpbGxlPC9hPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVmYXVsdENvbXBpbGVyQWRhcHRlciBpbXBsZW1lbnRzIENvbXBpbGVyQWRhcHRlciB7Ci0KLSAgICAvKiBqZGcgLSBUT0RPIC0gYWxsIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIGN1cnJlbnRseSBwcm90ZWN0ZWQsIGJ1dCB0aGV5Ci0gICAgICogc2hvdWxkIHByb2JhYmx5IGJlIHByaXZhdGUgaW4gdGhlIG5lYXIgZnV0dXJlLgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIFBhdGggc3JjOwotICAgIHByb3RlY3RlZCBGaWxlIGRlc3REaXI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZzsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIG9wdGltaXplID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVwcmVjYXRpb24gPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXBlbmQgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXQ7Ci0gICAgcHJvdGVjdGVkIFBhdGggYm9vdGNsYXNzcGF0aDsKLSAgICBwcm90ZWN0ZWQgUGF0aCBleHRkaXJzOwotICAgIHByb3RlY3RlZCBQYXRoIGNvbXBpbGVDbGFzc3BhdGg7Ci0gICAgcHJvdGVjdGVkIFByb2plY3QgcHJvamVjdDsKLSAgICBwcm90ZWN0ZWQgTG9jYXRpb24gbG9jYXRpb247Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUFudFJ1bnRpbWU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUphdmFSdW50aW1lOwotCi0gICAgcHJvdGVjdGVkIEZpbGVbXSBjb21waWxlTGlzdDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBsU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgIHByb3RlY3RlZCBKYXZhYyBhdHRyaWJ1dGVzOwotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YWMoIEphdmFjIGF0dHJpYnV0ZXMgKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgICAgIHNyYyA9IGF0dHJpYnV0ZXMuZ2V0U3JjZGlyKCk7Ci0gICAgICAgIGRlc3REaXIgPSBhdHRyaWJ1dGVzLmdldERlc3RkaXIoKTsKLSAgICAgICAgZW5jb2RpbmcgPSBhdHRyaWJ1dGVzLmdldEVuY29kaW5nKCk7Ci0gICAgICAgIGRlYnVnID0gYXR0cmlidXRlcy5nZXREZWJ1ZygpOwotICAgICAgICBvcHRpbWl6ZSA9IGF0dHJpYnV0ZXMuZ2V0T3B0aW1pemUoKTsKLSAgICAgICAgZGVwcmVjYXRpb24gPSBhdHRyaWJ1dGVzLmdldERlcHJlY2F0aW9uKCk7Ci0gICAgICAgIGRlcGVuZCA9IGF0dHJpYnV0ZXMuZ2V0RGVwZW5kKCk7Ci0gICAgICAgIHZlcmJvc2UgPSBhdHRyaWJ1dGVzLmdldFZlcmJvc2UoKTsKLSAgICAgICAgdGFyZ2V0ID0gYXR0cmlidXRlcy5nZXRUYXJnZXQoKTsKLSAgICAgICAgYm9vdGNsYXNzcGF0aCA9IGF0dHJpYnV0ZXMuZ2V0Qm9vdGNsYXNzcGF0aCgpOwotICAgICAgICBleHRkaXJzID0gYXR0cmlidXRlcy5nZXRFeHRkaXJzKCk7Ci0gICAgICAgIGNvbXBpbGVMaXN0ID0gYXR0cmlidXRlcy5nZXRGaWxlTGlzdCgpOwotICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gYXR0cmlidXRlcy5nZXRDbGFzc3BhdGgoKTsKLSAgICAgICAgcHJvamVjdCA9IGF0dHJpYnV0ZXMuZ2V0UHJvamVjdCgpOwotICAgICAgICBsb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgaW5jbHVkZUFudFJ1bnRpbWUgPSBhdHRyaWJ1dGVzLmdldEluY2x1ZGVhbnRydW50aW1lKCk7Ci0gICAgICAgIGluY2x1ZGVKYXZhUnVudGltZSA9IGF0dHJpYnV0ZXMuZ2V0SW5jbHVkZWphdmFydW50aW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEphdmFjIGdldEphdmFjKCkgewotICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgdGhlIGNvbXBpbGF0aW9uIGNsYXNzcGF0aC4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBQYXRoIGdldENvbXBpbGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0KLSAgICAgICAgLy8gYWRkIGRlc3QgZGlyIHRvIGNsYXNzcGF0aCBzbyB0aGF0IHByZXZpb3VzbHkgY29tcGlsZWQgYW5kCi0gICAgICAgIC8vIHVudG91Y2hlZCBjbGFzc2VzIGFyZSBvbiBjbGFzc3BhdGgKLQotICAgICAgICBpZiAoZGVzdERpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGguc2V0TG9jYXRpb24oZGVzdERpcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb21iaW5lIHRoZSBidWlsZCBjbGFzc3BhdGggd2l0aCB0aGUgc3lzdGVtIGNsYXNzcGF0aCwgaW4gYW4gCi0gICAgICAgIC8vIG9yZGVyIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIGJ1aWxkLmNsYXNzcGF0aAotCi0gICAgICAgIGlmIChjb21waWxlQ2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICggaW5jbHVkZUFudFJ1bnRpbWUgKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKFBhdGguc3lzdGVtQ2xhc3NwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICggaW5jbHVkZUFudFJ1bnRpbWUgKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKGNvbXBpbGVDbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0IikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGguYWRkRXhpc3RpbmcoY29tcGlsZUNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmNsdWRlSmF2YVJ1bnRpbWUpIHsKLSAgICAgICAgICAgIC8vIFhYWCBtb3ZlIHRoaXMgc3R1ZmYgdG8gYSBzZXBhcmF0ZSBjbGFzcywgY29kZSBpcyBpZGVudGljYWwgdG8KLSAgICAgICAgICAgIC8vICAgICBjb2RlIGluIC4uL3JtaWMvRGVmYXVsdFJtaWNBZGFwdGVyCi0KLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVuZG9yIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJtaWNyb3NvZnQiKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHVsbCBpbiAqLnppcCBmcm9tIHBhY2thZ2VzIGRpcmVjdG9yeQotICAgICAgICAgICAgICAgIEZpbGVTZXQgbXNaaXBGaWxlcyA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgICAgICAgICAgbXNaaXBGaWxlcy5zZXREaXIobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yICsgIlBhY2thZ2VzIikpOwotICAgICAgICAgICAgICAgIG1zWmlwRmlsZXMuc2V0SW5jbHVkZXMoIiouWklQIik7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEZpbGVzZXQobXNaaXBGaWxlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChQcm9qZWN0LmdldEphdmFWZXJzaW9uKCkgPT0gUHJvamVjdC5KQVZBXzFfMSkgewotICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2xhc3Nlcy56aXAiKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEpESyA+IDEuMSBzZWVtcyB0byBzZXQgamF2YS5ob21lIHRvIHRoZSBKUkUgZGlyZWN0b3J5LgotICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInJ0LmphciIpKTsKLSAgICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgdGhlIG9sZCB2ZXJzaW9uIGFzIHdlbGwgYW5kIGxldCBhZGRFeGlzdGluZ1RvUGF0aAotICAgICAgICAgICAgICAgIC8vIHNvcnQgaXQgb3V0LgotICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArImpyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJydC5qYXIiKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGRlZCBmb3IgTWFjT1MgWAotICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiQ2xhc3NlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJjbGFzc2VzLmphciIpKTsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGguYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIi4uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIkNsYXNzZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAidWkuamFyIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcHJvY2Vzc2luZyBjb21tb24gdG8gY2xhc3NpYyBhbmQKLSAgICAgKiBtb2Rlcm4uICBEb2Vzbid0IGFkZCB0aGUgZmlsZXMgdG8gY29tcGlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgc2V0dXBKYXZhY0NvbW1hbmRsaW5lU3dpdGNoZXMoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gZ2V0Q29tcGlsZUNsYXNzcGF0aCgpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldE5vd2FybigpKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vd2FybiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVwcmVjYXRpb24gPT0gdHJ1ZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kZXByZWNhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlc3REaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGRlc3REaXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWNsYXNzcGF0aCIpOwotCi0gICAgICAgIC8vIEp1c3QgYWRkICJzb3VyY2VwYXRoIiB0byBjbGFzc3BhdGggKCBmb3IgSkRLMS4xICkKLSAgICAgICAgLy8gYXMgd2VsbCBhcyAiYm9vdGNsYXNzcGF0aCIgYW5kICJleHRkaXJzIgotICAgICAgICBpZiAoUHJvamVjdC5nZXRKYXZhVmVyc2lvbigpLnN0YXJ0c1dpdGgoIjEuMSIpKSB7Ci0gICAgICAgICAgICBQYXRoIGNwID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogWFhYIC0gVGhpcyBkb2Vzbid0IG1peCB2ZXJ5IHdlbGwgd2l0aCBidWlsZC5zeXN0ZW1jbGFzc3BhdGgsCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChib290Y2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjcC5hcHBlbmQoYm9vdGNsYXNzcGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXh0ZGlycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXh0ZGlyc1RvQ2xhc3NwYXRoKGNwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNwLmFwcGVuZChjbGFzc3BhdGgpOwotICAgICAgICAgICAgY3AuYXBwZW5kKHNyYyk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGNwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc291cmNlcGF0aCIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChzcmMpOwotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi10YXJnZXQiKTsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSh0YXJnZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJvb3RjbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYm9vdGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoYm9vdGNsYXNzcGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXh0ZGlycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1leHRkaXJzIik7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChleHRkaXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVuY29kaW5nIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShlbmNvZGluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWciKTsKLSAgICAgICAgfSBlbHNlIGlmIChQcm9qZWN0LmdldEphdmFWZXJzaW9uKCkgIT0gUHJvamVjdC5KQVZBXzFfMCAmJgotICAgICAgICAgICAgICAgICAgIFByb2plY3QuZ2V0SmF2YVZlcnNpb24oKSAhPSBQcm9qZWN0LkpBVkFfMV8xKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWc6bm9uZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcHRpbWl6ZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1PIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVwZW5kKSB7Ci0gICAgICAgICAgICBpZiAoUHJvamVjdC5nZXRKYXZhVmVyc2lvbigpLnN0YXJ0c1dpdGgoIjEuMSIpKSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kZXBlbmQiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoUHJvamVjdC5nZXRKYXZhVmVyc2lvbigpLnN0YXJ0c1dpdGgoIjEuMiIpKSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1YZGVwZW5kIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJkZXBlbmQgYXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1vZGVybiBjb21waWxlciIsCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdmVyYm9zZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NpbmcgY29tbW9uIHRvIGNsYXNzaWMgYW5kCi0gICAgICogbW9kZXJuIGFuZCBhZGRzIHRoZSBmaWxlcyB0byBjb21waWxlIGFzIHdlbGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIHNldHVwSmF2YWNDb21tYW5kKCkgewotICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgc2V0dXBKYXZhY0NvbW1hbmRsaW5lU3dpdGNoZXMoY21kKTsKLSAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKLSAgICAgICAgcmV0dXJuIGNtZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2dzIHRoZSBjb21waWxhdGlvbiBwYXJhbWV0ZXJzLCBhZGRzIHRoZSBmaWxlcyB0byBjb21waWxlIGFuZCBsb2dzIHRoZSAKLSAgICAgKiAmcW91dDtuaWNlU291cmNlTGlzdCZxdW90OwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBhdHRyaWJ1dGVzLmxvZygiQ29tcGlsYXRpb24gYXJnczogIiArIGNtZC50b1N0cmluZygpLAotICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIG5pY2VTb3VyY2VMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigiRmlsZSIpOwotICAgICAgICBpZiAoY29tcGlsZUxpc3QubGVuZ3RoICE9IDEpIHsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZCgicyIpOwotICAgICAgICB9Ci0gICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZCgiIHRvIGJlIGNvbXBpbGVkOiIpOwotCi0gICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChsU2VwKTsKLQotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjb21waWxlTGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGFyZyA9IGNvbXBpbGVMaXN0W2ldLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJnKTsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZCgiICAgICIgKyBhcmcgKyBsU2VwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF0dHJpYnV0ZXMubG9nKG5pY2VTb3VyY2VMaXN0LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSBjb21waWxlIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCi0gICAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgdG8gcGFzcyB0byBwcm9jZXNzIG9uIGNvbW1hbmQgbGluZQotICAgICAqIEBwYXJhbSBmaXJzdEZpbGVOYW1lIC0gaW5kZXggb2YgdGhlIGZpcnN0IHNvdXJjZSBmaWxlIGluIGFyZ3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoU3RyaW5nW10gYXJncywgaW50IGZpcnN0RmlsZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nW10gY29tbWFuZEFycmF5ID0gbnVsbDsKLSAgICAgICAgRmlsZSB0bXBGaWxlID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE1hbnkgc3lzdGVtIGhhdmUgYmVlbiByZXBvcnRlZCB0byBnZXQgaW50byB0cm91YmxlIHdpdGggCi0gICAgICAgICAgICAgKiBsb25nIGNvbW1hbmQgbGluZXMgLSBubywgbm90IG9ubHkgV2luZG93cyA7LSkuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogUE9TSVggc2VlbXMgdG8gZGVmaW5lIGEgbG93ZXIgbGltaXQgb2YgNGssIHNvIHVzZSBhIHRlbXBvcmFyeSAKLSAgICAgICAgICAgICAqIGZpbGUgaWYgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBsaW5lIGV4Y2VlZHMgdGhpcyBsaW1pdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKENvbW1hbmRsaW5lLnRvU3RyaW5nKGFyZ3MpLmxlbmd0aCgpID4gNDA5NikgewotICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wRmlsZSA9IG5ldyBGaWxlKCJqaWtlcyIrKG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKS5uZXh0TG9uZygpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKHRtcEZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0RmlsZU5hbWU7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZEFycmF5ID0gbmV3IFN0cmluZ1tmaXJzdEZpbGVOYW1lKzFdOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIGNvbW1hbmRBcnJheSwgMCwgZmlyc3RGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheVtmaXJzdEZpbGVOYW1lXSA9ICJAIiArIHRtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIiwgZSwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtvdXQuY2xvc2UoKTt9IGNhdGNoIChUaHJvd2FibGUgdCkge30KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29tbWFuZEFycmF5ID0gYXJnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKGF0dHJpYnV0ZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pKTsKLSAgICAgICAgICAgICAgICBleGUuc2V0QW50UnVuKHByb2plY3QpOwotICAgICAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KHByb2plY3QuZ2V0QmFzZURpcigpKTsKLSAgICAgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY29tbWFuZEFycmF5KTsKLSAgICAgICAgICAgICAgICBleGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBleGUuZ2V0RXhpdFZhbHVlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBydW5uaW5nICIgKyBhcmdzWzBdIAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNvbXBpbGVyIiwgZSwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHRtcEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbXVsYXRpb24gb2YgZXh0ZGlycyBmZWF0dXJlIGluIGphdmEgPj0gMS4yLgotICAgICAqIFRoaXMgbWV0aG9kIGFkZHMgYWxsIGZpbGVzIGluIHRoZSBnaXZlbgotICAgICAqIGRpcmVjdG9yaWVzIChidXQgbm90IGluIHN1Yi1kaXJlY3RvcmllcyEpIHRvIHRoZSBjbGFzc3BhdGgsCi0gICAgICogc28gdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byBzcGVjaWZ5IHRoZW0gYWxsIG9uZSBieSBvbmUuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aCAtIFBhdGggdG8gYXBwZW5kIGZpbGVzIHRvCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZGlyc1RvQ2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7Ci0gICAgICAgIGlmIChleHRkaXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBleHRQcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmV4dC5kaXJzIik7Ci0gICAgICAgICAgICBpZiAoZXh0UHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXh0ZGlycyA9IG5ldyBQYXRoKHByb2plY3QsIGV4dFByb3ApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBkaXJzID0gZXh0ZGlycy5saXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxkaXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWRpcnNbaV0uZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgZGlyc1tpXSArPSBGaWxlLnNlcGFyYXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgZGlyID0gcHJvamVjdC5yZXNvbHZlRmlsZShkaXJzW2ldKTsKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICAgICAgZnMuc2V0RGlyKGRpcik7Ci0gICAgICAgICAgICBmcy5zZXRJbmNsdWRlcygiKiIpOwotICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEZpbGVzZXQoZnMpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9HY2ouamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9HY2ouamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkNmU4NC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvR2NqLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2NqIGNvbXBpbGVyLgotICogVGhpcyBpcyBwcmltYXJpbHkgYSBjdXQtYW5kLXBhc3RlIGZyb20gdGhlIGppa2VzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnRvcmFAZGViaWFuLm9yZyI+VGFrYXNoaSBPa2Ftb3RvPC9hPgotICovCi1wdWJsaWMgY2xhc3MgR2NqIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIGNvbXBpbGUgdXNpbmcgdGhlIGdjaiBjb21waWxlci4KLSAgICAgKiAgCi0gICAgICogQGF1dGhvciB0b3JhQGRlYmlhbi5vcmcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQlDb21tYW5kbGluZSBjbWQ7Ci0gICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBnY2ogY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQljbWQgPSBzZXR1cEdDSkNvbW1hbmQoKTsKLQotICAgICAgICBpbnQgZmlyc3RGaWxlTmFtZSA9IGNtZC5zaXplKCk7Ci0gICAgICAgIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKGNtZCk7Ci0KLSAgICAgICAgcmV0dXJuIGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoY21kLmdldENvbW1hbmRsaW5lKCksIGZpcnN0RmlsZU5hbWUpID09IDA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIHNldHVwR0NKQ29tbWFuZCgpIHsKLSAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0KLSAgICAgICAgLy8gZ2NqIGRvZXNuJ3Qgc3VwcG9ydCBib290Y2xhc3NwYXRoIGRpciAoLWJvb3RjbGFzc3BhdGgpCi0gICAgICAgIC8vIHNvIHdlJ2xsIGVtdWxhdGUgaXQgZm9yIGNvbXBhdGliaWxpdHkgYW5kIGNvbnZlbmllbmNlLgotICAgICAgICBpZiAoYm9vdGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKGJvb3RjbGFzc3BhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2NqIGRvZXNuJ3Qgc3VwcG9ydCBhbiBleHRlbnNpb24gZGlyICgtZXh0ZGlyKQotICAgICAgICAvLyBzbyB3ZSdsbCBlbXVsYXRlIGl0IGZvciBjb21wYXRpYmlsaXR5IGFuZCBjb252ZW5pZW5jZS4KLSAgICAgICAgYWRkRXh0ZGlyc1RvQ2xhc3NwYXRoKGNsYXNzcGF0aCk7Ci0KLSAgICAgICAgaWYgKCAoYm9vdGNsYXNzcGF0aCA9PSBudWxsKSB8fCAoYm9vdGNsYXNzcGF0aC5zaXplKCkgPT0gMCkgKSB7Ci0gICAgICAgICAgICAvLyBubyBib290Y2xhc3NwYXRoLCB0aGVyZWZvcmUsIGdldCBvbmUgZnJvbSB0aGUgamF2YSBydW50aW1lCi0gICAgICAgICAgICBpbmNsdWRlSmF2YVJ1bnRpbWUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoZ2V0Q29tcGlsZUNsYXNzcGF0aCgpKTsKLQotICAgICAgICAvLyBHY2ogaGFzIG5vIG9wdGlvbiBmb3Igc291cmNlLXBhdGggc28gd2UKLSAgICAgICAgLy8gd2lsbCBhZGQgaXQgdG8gY2xhc3NwYXRoLgotICAgICAgICBjbGFzc3BhdGguYXBwZW5kKHNyYyk7Ci0KLSAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoImdjaiIpOwotCi0gICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZCIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShkZXN0RGlyKTsKLQkgICAgCi0JICAgIGlmKGRlc3REaXIubWtkaXJzKCkpewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgbWFrZSBvdXRwdXQgZGlyZWN0b3JpZXMuIE1heWJlIHBlcm1pc3Npb24gaXMgd3JvbmcuICIpOwotCSAgICB9OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWNsYXNzcGF0aCIpOwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGNsYXNzcGF0aCk7Ci0KLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJnY2ogZG9lc24ndCBzdXBwb3J0IC1lbmNvZGluZyBvcHRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1nMSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcHRpbWl6ZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1PIik7Ci0gICAgICAgIH0KLQotCS8qKgotCSAqICBnY2ogc2hvdWxkIGJlIHNldCBmb3IgZ2VuZXJhdGUgY2xhc3MuCi0gICAgICAgICAqLwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLUMiKTsKLQlyZXR1cm4gY21kOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhYzEyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWMxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDY2ODM5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhYzEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBqYXZhYyBjb21waWxlciBmb3IgSkRLIDEuMgotICogVGhpcyBpcyBwcmltYXJpbHkgYSBjdXQtYW5kLXBhc3RlIGZyb20gdGhlIG9yaWdpbmFsIGphdmFjIHRhc2sgYmVmb3JlIGl0Ci0gKiB3YXMgcmVmYWN0b3JlZC4KLSAqCi0gKiBAYXV0aG9yIEphbWVzIERhdmlkc29uIDxhIGhyZWY9Im1haWx0bzpkdW5jYW5AeDE4MC5jb20iPmR1bmNhbkB4MTgwLmNvbTwvYT4KLSAqIEBhdXRob3IgUm9iaW4gR3JlZW4gPGEgaHJlZj0ibWFpbHRvOmdyZWVucmRAaG90bWFpbC5jb20iPmdyZWVucmRAaG90bWFpbC5jb208L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amF5Z2xhbnZpbGxlQGhvbWUuY29tIj5KIEQgR2xhbnZpbGxlPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSmF2YWMxMiBleHRlbmRzIERlZmF1bHRDb21waWxlckFkYXB0ZXIgewotCi0gICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBjbGFzc2ljIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwSmF2YWNDb21tYW5kKCk7Ci0KLSAgICAgICAgT3V0cHV0U3RyZWFtIGxvZ3N0ciA9IG5ldyBMb2dPdXRwdXRTdHJlYW0oYXR0cmlidXRlcywgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbXBpbGVyLCByZWRpcmVjdGluZyBvdXRwdXQgdG8KLSAgICAgICAgICAgIC8vIHRoZSBwcm9qZWN0IGxvZwotICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoInN1bi50b29scy5qYXZhYy5NYWluIik7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zID0gYy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IE91dHB1dFN0cmVhbS5jbGFzcywgU3RyaW5nLmNsYXNzIH0pOwotICAgICAgICAgICAgT2JqZWN0IGNvbXBpbGVyID0gY29ucy5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyBsb2dzdHIsICJqYXZhYyIgfSk7Ci0KLSAgICAgICAgICAgIC8vIENhbGwgdGhlIGNvbXBpbGUoKSBtZXRob2QKLSAgICAgICAgICAgIE1ldGhvZCBjb21waWxlID0gYy5nZXRNZXRob2QoImNvbXBpbGUiLCBuZXcgQ2xhc3MgW10geyBTdHJpbmdbXS5jbGFzcyB9KTsKLSAgICAgICAgICAgIEJvb2xlYW4gb2sgPSAoQm9vbGVhbiljb21waWxlLmludm9rZShjb21waWxlciwgbmV3IE9iamVjdFtdIHtjbWQuZ2V0QXJndW1lbnRzKCl9KTsKLSAgICAgICAgICAgIHJldHVybiBvay5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgdXNlIGNsYXNzaWMgY29tcGlsZXIsIGFzIGl0IGlzIG5vdCBhdmFpbGFibGUiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBIGNvbW1vbiBzb2x1dGlvbiBpcyB0byBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEpBVkFfSE9NRSB0byB5b3VyIGpkayBkaXJlY3RvcnkuIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSBleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBzdGFydGluZyBjbGFzc2ljIGNvbXBpbGVyOiAiLCBleCwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsb2dzdHIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBwbGFpbiBpbXBvc3NpYmxlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhYzEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjQxYmYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGphdmFjIGNvbXBpbGVyIGZvciBKREsgMS4zCi0gKiBUaGlzIGlzIHByaW1hcmlseSBhIGN1dC1hbmQtcGFzdGUgZnJvbSB0aGUgb3JpZ2luYWwgamF2YWMgdGFzayBiZWZvcmUgaXQKLSAqIHdhcyByZWZhY3RvcmVkLgotICoKLSAqIEBhdXRob3IgSmFtZXMgRGF2aWRzb24gPGEgaHJlZj0ibWFpbHRvOmR1bmNhbkB4MTgwLmNvbSI+ZHVuY2FuQHgxODAuY29tPC9hPgotICogQGF1dGhvciBSb2JpbiBHcmVlbiA8YSBocmVmPSJtYWlsdG86Z3JlZW5yZEBob3RtYWlsLmNvbSI+Z3JlZW5yZEBob3RtYWlsLmNvbTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXlnbGFudmlsbGVAaG9tZS5jb20iPkogRCBHbGFudmlsbGU8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhYzEzIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIHJldHVybmVkIGJ5IHRoZSAiTW9kZXJuIiBqZGsxLjMgY29tcGlsZXIgdG8gaW5kaWNhdGUgc3VjY2Vzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERVJOX0NPTVBJTEVSX1NVQ0NFU1MgPSAwOwotCi0gICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBtb2Rlcm4gY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBKYXZhY0NvbW1hbmQoKTsKLQotICAgICAgICAvLyBVc2UgcmVmbGVjdGlvbiB0byBiZSBhYmxlIHRvIGJ1aWxkIG9uIGFsbCBKREtzID49IDEuMToKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGMgPSBDbGFzcy5mb3JOYW1lICgiY29tLnN1bi50b29scy5qYXZhYy5NYWluIik7Ci0gICAgICAgICAgICBPYmplY3QgY29tcGlsZXIgPSBjLm5ld0luc3RhbmNlICgpOwotICAgICAgICAgICAgTWV0aG9kIGNvbXBpbGUgPSBjLmdldE1ldGhvZCAoImNvbXBpbGUiLAotICAgICAgICAgICAgICAgIG5ldyBDbGFzcyBbXSB7KG5ldyBTdHJpbmcgW10ge30pLmdldENsYXNzICgpfSk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gKChJbnRlZ2VyKSBjb21waWxlLmludm9rZQotICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGlsZXIsIG5ldyBPYmplY3RbXSB7Y21kLmdldEFyZ3VtZW50cygpfSkpIC5pbnRWYWx1ZSAoKTsKLSAgICAgICAgICAgIHJldHVybiAocmVzdWx0ID09IE1PREVSTl9DT01QSUxFUl9TVUNDRVNTKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgZXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igc3RhcnRpbmcgbW9kZXJuIGNvbXBpbGVyIiwgZXgsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhY0V4dGVybmFsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWNFeHRlcm5hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYxZTZjLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhY0V4dGVybmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhIGNvbXBpbGUgdXNpbmcgamF2YWMgZXh0ZXJuYWxseS4KLSAqCi0gKiBAYXV0aG9yIEJyaWFuIERlaXR0ZQotICovCi1wdWJsaWMgY2xhc3MgSmF2YWNFeHRlcm5hbCBleHRlbmRzIERlZmF1bHRDb21waWxlckFkYXB0ZXIgewotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBjb21waWxlIHVzaW5nIHRoZSBKYXZhYyBleHRlcm5hbGx5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVXNpbmcgZXh0ZXJuYWwgamF2YWMgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQotICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoImphdmFjIik7Ci0gICAgICAgIHNldHVwSmF2YWNDb21tYW5kbGluZVN3aXRjaGVzKGNtZCk7Ci0gICAgICAgIGludCBmaXJzdEZpbGVOYW1lID0gY21kLnNpemUoKTsKLSAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKLQotICAgICAgICByZXR1cm4gZXhlY3V0ZUV4dGVybmFsQ29tcGlsZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSwgZmlyc3RGaWxlTmFtZSkgPT0gMDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KaWtlcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0ppa2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWIzOWEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0ppa2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBqaWtlcyBjb21waWxlci4KLSAqIFRoaXMgaXMgcHJpbWFyaWx5IGEgY3V0LWFuZC1wYXN0ZSBmcm9tIHRoZSBvcmlnaW5hbCBqYXZhYyB0YXNrIGJlZm9yZSBpdAotICogd2FzIHJlZmFjdG9yZWQuCi0gKgotICogQGF1dGhvciBKYW1lcyBEYXZpZHNvbiA8YSBocmVmPSJtYWlsdG86ZHVuY2FuQHgxODAuY29tIj5kdW5jYW5AeDE4MC5jb208L2E+Ci0gKiBAYXV0aG9yIFJvYmluIEdyZWVuIDxhIGhyZWY9Im1haWx0bzpncmVlbnJkQGhvdG1haWwuY29tIj5ncmVlbnJkQGhvdG1haWwuY29tPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpheWdsYW52aWxsZUBob21lLmNvbSI+SiBEIEdsYW52aWxsZTwvYT4KLSAqLwotcHVibGljIGNsYXNzIEppa2VzIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIGNvbXBpbGUgdXNpbmcgdGhlIEppa2VzIGNvbXBpbGVyIGZyb20gSUJNLi4KLSAgICAgKiBNb3N0bHkgb2YgdGhpcyBjb2RlIGlzIGlkZW50aWNhbCB0byBkb0NsYXNzaWNDb21waWxlKCkKLSAgICAgKiBIb3dldmVyLCBpdCBkb2VzIG5vdCBzdXBwb3J0IGFsbCBvcHRpb25zIGxpa2UKLSAgICAgKiBib290Y2xhc3NwYXRoLCBleHRkaXJzLCBkZXByZWNhdGlvbiBhbmQgc28gb24sIGJlY2F1c2UKLSAgICAgKiB0aGVyZSBpcyBubyBvcHRpb24gaW4gamlrZXMgYW5kIEkgZG9uJ3QgdW5kZXJzdGFuZAotICAgICAqIHdoYXQgdGhleSBzaG91bGQgZG8uCi0gICAgICoKLSAgICAgKiBJdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVzdGVkIHdpdGggamlrZXMgPjEuMTAKLSAgICAgKgotICAgICAqIEBhdXRob3Igc2thbnRoYWtAbXVlaGxoZWltLmRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBqaWtlcyBjb21waWxlciIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCi0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0KLSAgICAgICAgLy8gSmlrZXMgZG9lc24ndCBzdXBwb3J0IGJvb3RjbGFzc3BhdGggZGlyICgtYm9vdGNsYXNzcGF0aCkKLSAgICAgICAgLy8gc28gd2UnbGwgZW11bGF0ZSBpdCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCi0gICAgICAgIGlmIChib290Y2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoYm9vdGNsYXNzcGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBKaWtlcyBkb2Vzbid0IHN1cHBvcnQgYW4gZXh0ZW5zaW9uIGRpciAoLWV4dGRpcikKLSAgICAgICAgLy8gc28gd2UnbGwgZW11bGF0ZSBpdCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCi0gICAgICAgIGFkZEV4dGRpcnNUb0NsYXNzcGF0aChjbGFzc3BhdGgpOwotCi0gICAgICAgIGlmICggKGJvb3RjbGFzc3BhdGggPT0gbnVsbCkgfHwgKGJvb3RjbGFzc3BhdGguc2l6ZSgpID09IDApICkgewotICAgICAgICAgICAgLy8gbm8gYm9vdGNsYXNzcGF0aCwgdGhlcmVmb3JlLCBnZXQgb25lIGZyb20gdGhlIGphdmEgcnVudGltZQotICAgICAgICAgICAgaW5jbHVkZUphdmFSdW50aW1lID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgYm9vdGNsYXNzcGF0aCBzdGF0ZWQuICBCeSBkZWZhdWx0LCB0aGUKLSAgICAgICAgICAgIC8vIGluY2x1ZGVKYXZhUnVudGltZSBpcyBmYWxzZS4gIElmIHRoZSB1c2VyIGhhcyBzdGF0ZWQgYQotICAgICAgICAgICAgLy8gYm9vdGNsYXNzcGF0aCBhbmQgc2FpZCB0byBpbmNsdWRlIHRoZSBqYXZhIHJ1bnRpbWUsIGl0J3Mgb24KLSAgICAgICAgICAgIC8vIHRoZWlyIGhlYWQhCi0gICAgICAgIH0KLSAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChnZXRDb21waWxlQ2xhc3NwYXRoKCkpOwotCi0gICAgICAgIC8vIEppa2VzIGhhcyBubyBvcHRpb24gZm9yIHNvdXJjZS1wYXRoIHNvIHdlCi0gICAgICAgIC8vIHdpbGwgYWRkIGl0IHRvIGNsYXNzcGF0aC4KLSAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChzcmMpOwotCi0gICAgICAgIC8vIGlmIHRoZSB1c2VyIGhhcyBzZXQgSklLRVNQQVRIIHdlIHNob3VsZCBhZGQgdGhlIGNvbnRlbnRzIGFzIHdlbGwKLSAgICAgICAgU3RyaW5nIGppa2VzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamlrZXMuY2xhc3MucGF0aCIpOwotICAgICAgICBpZiAoamlrZXNQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQobmV3IFBhdGgocHJvamVjdCwgamlrZXNQYXRoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZSgiamlrZXMiKTsKLQotICAgICAgICBpZiAoZGVwcmVjYXRpb24gPT0gdHJ1ZSkKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZGVwcmVjYXRpb24iKTsKLQotICAgICAgICBpZiAoZGVzdERpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWQiKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoZGVzdERpcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7Ci0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoY2xhc3NwYXRoKTsKLQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1lbmNvZGluZyIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZW5jb2RpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1nIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGltaXplKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLU8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi12ZXJib3NlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlcGVuZCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kZXBlbmQiKTsKLSAgICAgICAgfSAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFhYWAotICAgICAgICAgKiBQZXJoYXBzIHdlIHNob3VsZG4ndCB1c2UgcHJvcGVydGllcyBmb3IgdGhlc2UKLSAgICAgICAgICogdGhyZWUgb3B0aW9ucyAoZW1hY3MgbW9kZSwgd2FybmluZ3MgYW5kIHBlZGFudGljKSwKLSAgICAgICAgICogYnV0IGluY2x1ZGUgaXQgaW4gdGhlIGphdmFjIGRpcmVjdGl2ZT8KLSAgICAgICAgICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEppa2VzIGhhcyB0aGUgbmljZSBmZWF0dXJlIHRvIHByaW50IGVycm9yCi0gICAgICAgICAqIG1lc3NhZ2VzIGluIGEgZm9ybSByZWFkYWJsZSBieSBlbWFjcywgc28KLSAgICAgICAgICogdGhhdCBlbWFjcyBjYW4gZGlyZWN0bHkgc2V0IHRoZSBjdXJzb3IKLSAgICAgICAgICogdG8gdGhlIHBsYWNlLCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBlbWFjc1Byb3BlcnR5ID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIuZW1hY3MiKTsKLSAgICAgICAgaWYgKGVtYWNzUHJvcGVydHkgIT0gbnVsbCAmJiBQcm9qZWN0LnRvQm9vbGVhbihlbWFjc1Byb3BlcnR5KSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIitFIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSmlrZXMgaXNzdWVzIG1vcmUgd2FybmluZ3MgdGhhdCBqYXZhYywgZm9yCi0gICAgICAgICAqIGV4YW1wbGUsIHdoZW4geW91IGhhdmUgZmlsZXMgaW4geW91ciBjbGFzc3BhdGgKLSAgICAgICAgICogdGhhdCBkb24ndCBleGlzdC4gQXMgdGhpcyBpcyBvZnRlbiB0aGUgY2FzZSwgdGhlc2UKLSAgICAgICAgICogd2FybmluZyBjYW4gYmUgcHJldHR5IGFubm95aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIHdhcm5pbmdzUHJvcGVydHkgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlci53YXJuaW5ncyIpOwotICAgICAgICBpZiAod2FybmluZ3NQcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiISEgdGhlIGJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuICEhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIiEhIFVzZSB0aGUgbm93YXJuIGF0dHJpYnV0ZSBpbnN0ZWFkLiAhISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIGlmICghUHJvamVjdC50b0Jvb2xlYW4od2FybmluZ3NQcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vd2FybiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGlmIChhdHRyaWJ1dGVzLmdldE5vd2FybigpKSB7Ci0gICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAqIEZJWE1FIGxhdGVyCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogbGV0IHRoZSBtYWdpYyBwcm9wZXJ0eSB3aW4gb3ZlciB0aGUgYXR0cmlidXRlIGZvciBiYWNrd2FyZHMgCi0gICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbm93YXJuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSmlrZXMgY2FuIGlzc3VlIHBlZGFudGljIHdhcm5pbmdzLiAKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBwZWRhbnRpY1Byb3BlcnR5ID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIucGVkYW50aWMiKTsKLSAgICAgICAgaWYgKHBlZGFudGljUHJvcGVydHkgIT0gbnVsbCAmJiBQcm9qZWN0LnRvQm9vbGVhbihwZWRhbnRpY1Byb3BlcnR5KSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIitQIik7Ci0gICAgICAgIH0KLSAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEppa2VzIHN1cHBvcnRzIHNvbWV0aGluZyBpdCBjYWxscyAiZnVsbCBkZXBlbmRlbmN5Ci0gICAgICAgICAqIGNoZWNraW5nIiwgc2VlIHRoZSBqaWtlcyBkb2N1bWVudGF0aW9uIGZvciBkaWZmZXJlbmNlcwotICAgICAgICAgKiBiZXR3ZWVuIC1kZXBlbmQgYW5kICtGLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIGZ1bGxEZXBlbmRQcm9wZXJ0eSA9IHByb2plY3QuZ2V0UHJvcGVydHkoImJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQiKTsKLSAgICAgICAgaWYgKGZ1bGxEZXBlbmRQcm9wZXJ0eSAhPSBudWxsICYmIFByb2plY3QudG9Cb29sZWFuKGZ1bGxEZXBlbmRQcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCIrRiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcnN0RmlsZU5hbWUgPSBjbWQuc2l6ZSgpOwotICAgICAgICBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShjbWQpOwotCi0gICAgICAgIHJldHVybiBleGVjdXRlRXh0ZXJuYWxDb21waWxlKGNtZC5nZXRDb21tYW5kbGluZSgpLCBmaXJzdEZpbGVOYW1lKSA9PSAwOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSnZjLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSnZjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODc4OGQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0p2Yy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUganZjIGNvbXBpbGVyIGZyb20gbWljcm9zb2Z0LgotICogVGhpcyBpcyBwcmltYXJpbHkgYSBjdXQtYW5kLXBhc3RlIGZyb20gdGhlIG9yaWdpbmFsIGphdmFjIHRhc2sgYmVmb3JlIGl0Ci0gKiB3YXMgcmVmYWN0b3JlZC4KLSAqCi0gKiBAYXV0aG9yIEphbWVzIERhdmlkc29uIDxhIGhyZWY9Im1haWx0bzpkdW5jYW5AeDE4MC5jb20iPmR1bmNhbkB4MTgwLmNvbTwvYT4KLSAqIEBhdXRob3IgUm9iaW4gR3JlZW4gPGEgaHJlZj0ibWFpbHRvOmdyZWVucmRAaG90bWFpbC5jb20iPmdyZWVucmRAaG90bWFpbC5jb208L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amF5Z2xhbnZpbGxlQGhvbWUuY29tIj5KIEQgR2xhbnZpbGxlPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSnZjIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgYXR0cmlidXRlcy5sb2coIlVzaW5nIGp2YyBjb21waWxlciIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCi0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0KLSAgICAgICAgLy8ganZjIGRvZXNuJ3Qgc3VwcG9ydCBib290Y2xhc3NwYXRoIGRpciAoLWJvb3RjbGFzc3BhdGgpCi0gICAgICAgIC8vIHNvIHdlJ2xsIGVtdWxhdGUgaXQgZm9yIGNvbXBhdGliaWxpdHkgYW5kIGNvbnZlbmllbmNlLgotICAgICAgICBpZiAoYm9vdGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKGJvb3RjbGFzc3BhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8ganZjIGRvZXNuJ3Qgc3VwcG9ydCBhbiBleHRlbnNpb24gZGlyICgtZXh0ZGlyKQotICAgICAgICAvLyBzbyB3ZSdsbCBlbXVsYXRlIGl0IGZvciBjb21wYXRpYmlsaXR5IGFuZCBjb252ZW5pZW5jZS4KLSAgICAgICAgYWRkRXh0ZGlyc1RvQ2xhc3NwYXRoKGNsYXNzcGF0aCk7Ci0KLSAgICAgICAgaWYgKCAoYm9vdGNsYXNzcGF0aCA9PSBudWxsKSB8fCAoYm9vdGNsYXNzcGF0aC5zaXplKCkgPT0gMCkgKSB7Ci0gICAgICAgICAgICAvLyBubyBib290Y2xhc3NwYXRoLCB0aGVyZWZvcmUsIGdldCBvbmUgZnJvbSB0aGUgamF2YSBydW50aW1lCi0gICAgICAgICAgICBpbmNsdWRlSmF2YVJ1bnRpbWUgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBib290Y2xhc3NwYXRoIHN0YXRlZC4gIEJ5IGRlZmF1bHQsIHRoZQotICAgICAgICAgICAgLy8gaW5jbHVkZUphdmFSdW50aW1lIGlzIGZhbHNlLiAgSWYgdGhlIHVzZXIgaGFzIHN0YXRlZCBhCi0gICAgICAgICAgICAvLyBib290Y2xhc3NwYXRoIGFuZCBzYWlkIHRvIGluY2x1ZGUgdGhlIGphdmEgcnVudGltZSwgaXQncyBvbgotICAgICAgICAgICAgLy8gdGhlaXIgaGVhZCEKLSAgICAgICAgfQotICAgICAgICBjbGFzc3BhdGguYXBwZW5kKGdldENvbXBpbGVDbGFzc3BhdGgoKSk7Ci0KLSAgICAgICAgLy8ganZjIGhhcyBubyBvcHRpb24gZm9yIHNvdXJjZS1wYXRoIHNvIHdlCi0gICAgICAgIC8vIHdpbGwgYWRkIGl0IHRvIGNsYXNzcGF0aC4KLSAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChzcmMpOwotCi0gICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZSgianZjIik7Ci0KLSAgICAgICAgaWYgKGRlc3REaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi9kIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGRlc3REaXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIENsYXNzcGF0aCBiZWZvcmUgdGhlICJpbnRlcm5hbCIgb25lLgotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiL2NwOnAiKTsKLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChjbGFzc3BhdGgpOwotCi0gICAgICAgIC8vIEVuYWJsZSBNUy1FeHRlbnNpb25zIGFuZCAuLi4KLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi94LSIpOwotICAgICAgICAvLyAuLi4gZG8gbm90IGRpc3BsYXkgYSBNZXNzYWdlIGFib3V0IHRoaXMuCi0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCIvbm9tZXNzYWdlIik7Ci0gICAgICAgIC8vIERvIG5vdCBkaXNwbGF5IExvZ28KLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi9ub2xvZ28iKTsKLQotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCIvZyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcHRpbWl6ZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi9PIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCIvdmVyYm9zZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcnN0RmlsZU5hbWUgPSBjbWQuc2l6ZSgpOwotICAgICAgICBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShjbWQpOwotCi0gICAgICAgIHJldHVybiBleGVjdXRlRXh0ZXJuYWxDb21waWxlKGNtZC5nZXRDb21tYW5kbGluZSgpLCBmaXJzdEZpbGVOYW1lKSA9PSAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9LamMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9LamMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMmZmNy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvS2pjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEphdmEgY29tcGlsZXIgZm9yIEtKQy4KLSAqIFRoaXMgaXMgcHJpbWFyaWx5IGEgY3V0LWFuZC1wYXN0ZSBmcm9tIEppa2VzLmphdmEgYW5kCi0gKiBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnRvcmFAZGViaWFuLm9yZyI+VGFrYXNoaSBPa2Ftb3RvPC9hPiArICovCi1wdWJsaWMgY2xhc3MgS2pjIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgYXR0cmlidXRlcy5sb2coIlVzaW5nIGtqYyBjb21waWxlciIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBzZXR1cEtqY0NvbW1hbmQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoImF0LmRtcy5ramMuTWFpbiIpOwotCi0gICAgICAgICAgICAvLyBDYWxsIHRoZSBjb21waWxlKCkgbWV0aG9kCi0gICAgICAgICAgICBNZXRob2QgY29tcGlsZSA9IGMuZ2V0TWV0aG9kKCJjb21waWxlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzcyBbXSB7IFN0cmluZyBbXS5jbGFzcyB9KTsKLSAgICAgICAgICAgIEJvb2xlYW4gb2sgPSAoQm9vbGVhbiljb21waWxlLmludm9rZShudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NtZC5nZXRBcmd1bWVudHMoKX0pOwotICAgICAgICAgICAgcmV0dXJuIG9rLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCB1c2Uga2pjIGNvbXBpbGVyLCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEEgY29tbW9uIHNvbHV0aW9uIGlzIHRvIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ0xBU1NQQVRIIHRvIHlvdXIga2pjIGFyY2hpdmUgKGtqYy5qYXIpLiIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgZXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igc3RhcnRpbmcga2pjIGNvbXBpbGVyOiAiLCBleCwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0dXAga2pjIGNvbW1hbmQgYXJndW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb21tYW5kbGluZSBzZXR1cEtqY0NvbW1hbmQoKSB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOwotCQotCS8vIGdlbmVyYXRlIGNsYXNzcGF0aCwgYmVjYXVzZSBramMgZG9lcyd0IHN1cHBvcnQgc291cmNlcGF0aC4KLSAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBnZXRDb21waWxlQ2xhc3NwYXRoKCk7Ci0KLSAgICAgICAgaWYgKGRlcHJlY2F0aW9uID09IHRydWUpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZGVwcmVjYXRpb24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZCIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShkZXN0RGlyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdlbmVyYXRlIHRoZSBjbHNzcGF0aCAKLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKLQotCVBhdGggY3AgPSBuZXcgUGF0aChwcm9qZWN0KTsKLQotCS8vIGtqYyBkb24ndCBoYXZlIGJvb3RjbGFzc3BhdGggb3B0aW9uLgotCWlmIChib290Y2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNwLmFwcGVuZChib290Y2xhc3NwYXRoKTsKLQl9Ci0KLQlpZiAoZXh0ZGlycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRFeHRkaXJzVG9DbGFzc3BhdGgoY3ApOwotCX0KLQotCWNwLmFwcGVuZChjbGFzc3BhdGgpOwotCWNwLmFwcGVuZChzcmMpOwotCi0JY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChjcCk7Ci0KLQkvLyBramMtMS41QSBkb2Vzbid0IHN1cHBvcnQgLWVuY29kaW5nIG9wdGlvbiBub3cuCi0gICAgICAgIC8vIGJ1dCBpdCB3aWxsIGJlIHN1cHBvcnRlZCBuZWFyIHRoZSBmZWF0dXJlLgotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1lbmNvZGluZyIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZW5jb2RpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpbWl6ZSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1PMiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdmVyYm9zZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKLSAgICAgICAgcmV0dXJuIGNtZDsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL1NqLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvU2ouamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNTFlZC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvU2ouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2ogY29tcGlsZXIuCi0gKiBVc2VzIHRoZSBkZWZhdWx0cyBmb3IgRGVmYXVsdENvbXBpbGVyQWRhcHRlcgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25AYmVhLmNvbSI+RG9uIEZlcmd1c29uPC9hPgotICovCi1wdWJsaWMgY2xhc3MgU2ogZXh0ZW5kcyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyIHsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgY29tcGlsZSB1c2luZyB0aGUgc2ogY29tcGlsZXIgZnJvbSBTeW1hbnRlYy4KLSAgICAgKiBAYXV0aG9yIGRvbkBiZWEuY29tCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBzeW1hbnRlYyBqYXZhIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBKYXZhY0NvbW1hbmQoKTsKLSAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoInNqIik7Ci0KLSAgICAgICAgaW50IGZpcnN0RmlsZU5hbWUgPSBjbWQuc2l6ZSgpIC0gY29tcGlsZUxpc3QubGVuZ3RoOwotCi0gICAgICAgIHJldHVybiBleGVjdXRlRXh0ZXJuYWxDb21waWxlKGNtZC5nZXRDb21tYW5kbGluZSgpLCBmaXJzdEZpbGVOYW1lKSA9PSAwOwotICAgIH0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbmQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwNGI4MC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi0vKioKLSAqICZsdDthbmQmZ3Q7IGNvbmRpdGlvbiBjb250YWluZXIuCi0gKgotICogPHA+SXRlcmF0ZXMgb3ZlciBhbGwgY29uZGl0aW9ucyBhbmQgcmV0dXJucyBmYWxzZSBhcyBzb29uIGFzIG9uZQotICogZXZhbHVhdGVzIHRvIGZhbHNlLjwvcD4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGU+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmQgZXh0ZW5kcyBDb25kaXRpb25CYXNlIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gZ2V0Q29uZGl0aW9ucygpOwotICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgQ29uZGl0aW9uIGMgPSAoQ29uZGl0aW9uKSBlbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoIWMuZXZhbCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbmRpdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAyOGQzLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBjb25kaXRpb25zIHRvIHVzZSBpbnNpZGUgdGhlICZsdDtjb25kaXRpb24mZ3Q7IHRhc2suCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGU+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uZGl0aW9uIHsKLSAgICAvKioKLSAgICAgKiBJcyB0aGlzIGNvbmRpdGlvbiB0cnVlPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb25CYXNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQ29uZGl0aW9uQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGJkMDdjLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb25CYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BdmFpbGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVXBUb0RhdGU7Ci0KLS8qKgotICogQmFzZWNsYXNzIGZvciB0aGUgJmx0O2NvbmRpdGlvbiZndDsgdGFzayBhcyB3ZWxsIGFzIHNldmVyYWwKLSAqIGNvbmRpdGlvbnMgLSBlbnN1cmVzIHRoYXQgdGhlIHR5cGVzIG9mIGNvbmRpdGlvbnMgaW5zaWRlIHRoZSB0YXNrCi0gKiBhbmQgdGhlICJjb250YWluZXIiIGNvbmRpdGlvbnMgYXJlIGluIHN5bmMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGU+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25kaXRpb25CYXNlIHsKLSAgICBwcml2YXRlIFZlY3RvciBjb25kaXRpb25zID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHApIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcDsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIFByb2plY3QgZ2V0UHJvamVjdCgpIHtyZXR1cm4gcHJvamVjdDt9Ci0KLSAgICAvKioKLSAgICAgKiBDb3VudCB0aGUgY29uZGl0aW9ucy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvdW50Q29uZGl0aW9ucygpIHtyZXR1cm4gY29uZGl0aW9ucy5zaXplKCk7fQotCi0gICAgLyoqCi0gICAgICogSXRlcmF0ZSB0aHJvdWdoIGFsbCBjb25kaXRpb25zLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBFbnVtZXJhdGlvbiBnZXRDb25kaXRpb25zKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbmRpdGlvbkVudW1lcmF0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuICZsdDthdmFpbGFibGUmZ3Q7IGNvbmRpdGlvbi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBdmFpbGFibGUoQXZhaWxhYmxlIGEpIHtjb25kaXRpb25zLmFkZEVsZW1lbnQoYSk7fQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuICZsdDt1cHRvZGF0ZSZndDsgY29uZGl0aW9uLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFVwdG9kYXRlKFVwVG9EYXRlIHUpIHtjb25kaXRpb25zLmFkZEVsZW1lbnQodSk7fQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuICZsdDtub3QmZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGROb3QoTm90IG4pIHtjb25kaXRpb25zLmFkZEVsZW1lbnQobik7fQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuICZsdDthbmQmZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBbmQoQW5kIGEpIHtjb25kaXRpb25zLmFkZEVsZW1lbnQoYSk7fQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuICZsdDtvciZndDsgY29uZGl0aW9uICJjb250YWluZXIiLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE9yKE9yIG8pIHtjb25kaXRpb25zLmFkZEVsZW1lbnQobyk7fQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuICZsdDtlcXVhbHMmZ3Q7IGNvbmRpdGlvbi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRFcXVhbHMoRXF1YWxzIGUpIHtjb25kaXRpb25zLmFkZEVsZW1lbnQoZSk7fQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuICZsdDtvcyZndDsgY29uZGl0aW9uLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE9zKE9zIG8pIHtjb25kaXRpb25zLmFkZEVsZW1lbnQobyk7fQotCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgdGhhdCBjb25maWd1cmVzIHRob3NlIGNvbmRpdGlvbnMgd2l0aCBhIHByb2plY3QKLSAgICAgKiBpbnN0YW5jZSB0aGF0IG5lZWQgaXQuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBDb25kaXRpb25FbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgY3VycmVudEVsZW1lbnQgPSAwOwotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLSAgICAgICAgICAgIHJldHVybiBjb3VudENvbmRpdGlvbnMoKSA+IGN1cnJlbnRFbGVtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbyA9IGNvbmRpdGlvbnMuZWxlbWVudEF0KGN1cnJlbnRFbGVtZW50KyspOwotICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhc2spIHsKLSAgICAgICAgICAgICAgICAoKFRhc2spIG8pLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIENvbmRpdGlvbkJhc2UpIHsKLSAgICAgICAgICAgICAgICAoKENvbmRpdGlvbkJhc2UpIG8pLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0VxdWFscy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0VxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGNhNmZmLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLS8qKgotICogU2ltcGxlIFN0cmluZyBjb21wYXJpc29uIGNvbmRpdGlvbi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZT5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEVxdWFscyBpbXBsZW1lbnRzIENvbmRpdGlvbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBhcmcxLCBhcmcyOwotCi0gICAgcHVibGljIHZvaWQgc2V0QXJnMShTdHJpbmcgYTEpIHthcmcxID0gYTE7fQotICAgIHB1YmxpYyB2b2lkIHNldEFyZzIoU3RyaW5nIGEyKSB7YXJnMiA9IGEyO30KLQotICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJnMSA9PSBudWxsIHx8IGFyZzIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJib3RoIGFyZzEgYW5kIGFyZzIgYXJlIHJlcXVpcmVkIGluIGVxdWFscyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcmcxLmVxdWFscyhhcmcyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vTm90LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vTm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NGQyYzguLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL05vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAmbHQ7bm90Jmd0OyBjb25kaXRpb24uCi0gKgotICogRXZhbHVhdGVzIHRvIHRydWUgaWYgdGhlIHNpbmdsZSBjb25kaXRpb24gbmVzdGVkIGludG8gaXQgaXMgZmFsc2UKLSAqIGFuZCB2aWNlIHZlcnNhLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlPlN0ZWZhbiBCb2Rld2lnPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgTm90IGV4dGVuZHMgQ29uZGl0aW9uQmFzZSBpbXBsZW1lbnRzIENvbmRpdGlvbiB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvdW50Q29uZGl0aW9ucygpID4gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBub3QgbmVzdCBtb3JlIHRoYW4gb25lIGNvbmRpdGlvbiBpbnRvIDxub3Q+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50Q29uZGl0aW9ucygpIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBuZXN0IGEgY29uZGl0aW9uIGludG8gPG5vdD4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gISgoQ29uZGl0aW9uKSBnZXRDb25kaXRpb25zKCkubmV4dEVsZW1lbnQoKSkuZXZhbCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL09yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmZDQyNC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLS8qKgotICogJmx0O29yJmd0OyBjb25kaXRpb24gY29udGFpbmVyLgotICoKLSAqIDxwPkl0ZXJhdGVzIG92ZXIgYWxsIGNvbmRpdGlvbnMgYW5kIHJldHVybnMgdHJ1ZSBhcyBzb29uIGFzIG9uZQotICogZXZhbHVhdGVzIHRvIHRydWUuPC9wPgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZT5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIE9yIGV4dGVuZHMgQ29uZGl0aW9uQmFzZSBpbXBsZW1lbnRzIENvbmRpdGlvbiB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRW51bWVyYXRpb24gZW51bSA9IGdldENvbmRpdGlvbnMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIENvbmRpdGlvbiBjID0gKENvbmRpdGlvbikgZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGMuZXZhbCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL09zLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzZTA5NC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLS8qKgotICogQ29uZGl0aW9uIHRoYXQgdGVzdHMgdGhlIE9TIHR5cGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGU+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBPcyBpbXBsZW1lbnRzIENvbmRpdGlvbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmFtaWx5OwotCi0gICAgcHVibGljIHZvaWQgc2V0RmFtaWx5KFN0cmluZyBmKSB7ZmFtaWx5ID0gZi50b0xvd2VyQ2FzZSgpO30KLQotICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgU3RyaW5nIHBhdGhTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7Ci0gICAgICAgIGlmIChmYW1pbHkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGZhbWlseS5lcXVhbHMoIndpbmRvd3MiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBvc05hbWUuaW5kZXhPZigid2luZG93cyIpID4gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoImRvcyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhTZXAuZXF1YWxzKCI7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoIm1hYyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9zTmFtZS5pbmRleE9mKCJtYWMiKSA+IC0xOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKCJ1bml4IikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGF0aFNlcC5lcXVhbHMoIjoiKQotICAgICAgICAgICAgICAgICAgICAmJiAoIW9zTmFtZS5zdGFydHNXaXRoKCJtYWMiKSB8fCBvc05hbWUuZW5kc1dpdGgoIngiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRvblwndCBrbm93IGhvdyB0byBkZXRlY3Qgb3MgZmFtaWx5IFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmFtaWx5ICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGVmYXVsdHMucHJvcGVydGllcyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDYwNTUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0jIHN0YW5kYXJkIGFudCB0YXNrcwotbWtkaXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWtkaXIKLWphdmFjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjCi1jaG1vZD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DaG1vZAotZGVsZXRlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkRlbGV0ZQotY29weT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db3B5Ci1tb3ZlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1vdmUKLWphcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXIKLXJtaWM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUm1pYwotY3ZzPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkN2cwotZ2V0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdldAotdW56aXA9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhwYW5kCi11bmphcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQKLXVud2FyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4cGFuZAotZWNobz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvCi1qYXZhZG9jPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MKLXppcD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5aaXAKLWd6aXA9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuR1ppcAotZ3VuemlwPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdVbnppcAotcmVwbGFjZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZXBsYWNlCi1qYXZhPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmEKLXRzdGFtcD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Uc3RhbXAKLXByb3BlcnR5PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByb3BlcnR5Ci10YXNrZGVmPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRhc2tkZWYKLWFudD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQKLWV4ZWM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY1Rhc2sKLXRhcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UYXIKLXVudGFyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlVudGFyCi1hdmFpbGFibGU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQXZhaWxhYmxlCi1maWx0ZXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRmlsdGVyCi1maXhjcmxmPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkZpeENSTEYKLXBhdGNoPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlBhdGNoCi1zdHlsZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUUHJvY2VzcwotdG91Y2g9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVG91Y2gKLXNpZ25qYXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU2lnbkphcgotZ2Vua2V5PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdlbmVyYXRlS2V5Ci1hbnRzdHJ1Y3R1cmU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50U3RydWN0dXJlCi1leGVjb249b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZU9uCi1hbnRjYWxsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNhbGxUYXJnZXQKLXNxbD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TUUxFeGVjCi1tYWlsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNlbmRFbWFpbAotZmFpbD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGl0Ci13YXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2FyCi11cHRvZGF0ZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VcFRvRGF0ZQotYXBwbHk9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHJhbnNmb3JtCi1yZWNvcmQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVjb3JkZXIKLWN2c3Bhc3M9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ1ZTUGFzcwotdHlwZWRlZj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UeXBlZGVmCi1zbGVlcD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TbGVlcAotcGF0aGNvbnZlcnQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUGF0aENvbnZlcnQKLWVhcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FYXIKLXBhcmFsbGVsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlBhcmFsbGVsCi1zZXF1ZW50aWFsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNlcXVlbnRpYWwKLWNvbmRpdGlvbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db25kaXRpb25UYXNrCi1kZXBlbmRzZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGVwZW5kU2V0Ci0KLSMgb3B0aW9uYWwgdGFza3MKLXNjcmlwdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5TY3JpcHQKLW5ldHJleHhjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5ldFJleHhDCi1yZW5hbWVleHQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuUmVuYW1lRXh0ZW5zaW9ucwotZWpiYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRWpiYwotZGRjcmVhdG9yPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5ERENyZWF0b3IKLXdscnVuPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5XTFJ1bgotd2xzdG9wPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5XTFN0b3AKLXZzc2dldD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NHRVQKLWVqYmphcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRWpiSmFyCi1tcGFyc2U9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubWV0YW1hdGEuTVBhcnNlCi1tbWV0cmljcz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5tZXRhbWF0YS5NTWV0cmljcwotbWF1ZGl0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm1ldGFtYXRhLk1BdWRpdAotanVuaXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUYXNrCi1jYWI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuQ2FiCi1mdHA9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LkZUUAotaWNvbnRyYWN0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLklDb250cmFjdAotamF2YWNjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFjYy5KYXZhQ0MKLWpqdHJlZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2MuSkpUcmVlCi1zdGFydGVhbT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zY20uQW50U3RhclRlYW1DaGVja091dAotd2xqc3BjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5XTEpzcGMKLWpsaW5rPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rLkpsaW5rVGFzawotbmF0aXZlMmFzY2lpPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5hdGl2ZTJBc2NpaQotcHJvcGVydHlmaWxlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlByb3BlcnR5RmlsZQotZGVwZW5kPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5EZXBlbmQKLWFudGxyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkFOVExSCi12YWpsb2FkPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmlkZS5WQUpMb2FkUHJvamVjdHMKLXZhamV4cG9ydD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pZGUuVkFKRXhwb3J0Ci12YWppbXBvcnQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlLlZBSkltcG9ydAotdGVsbmV0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5UZWxuZXRUYXNrCi1jc2M9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LkNTaGFycAotaWxhc209b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LklsYXNtCi1zdHlsZWJvb2s9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuU3R5bGVCb29rCi10ZXN0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlRlc3QKLXB2Y3M9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucHZjcy5QdmNzCi1wNGNoYW5nZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNENoYW5nZQotcDRsYWJlbD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNExhYmVsCi1wNGhhdmU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRIYXZlCi1wNHN5bmM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRTeW5jCi1wNGVkaXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRFZGl0Ci1wNHN1Ym1pdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNFN1Ym1pdAotcDRjb3VudGVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0Q291bnRlcgotamF2YWg9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuSmF2YWgKLWNjdXBkYXRlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZS5DQ1VwZGF0ZQotY2NjaGVja291dD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NDaGVja291dAotY2NjaGVja2luPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZS5DQ0NoZWNraW4KLWNjdW5jaGVja291dD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NVbkNoZWNrb3V0Ci1zb3VuZD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3VuZC5Tb3VuZFRhc2sKLWp1bml0cmVwb3J0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlhNTFJlc3VsdEFnZ3JlZ2F0b3IKLXZzc2xhYmVsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0xBQkVMCi12c3NoaXN0b3J5PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0hJU1RPUlkKLWJsZ2VuY2xpZW50PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5Cb3JsYW5kR2VuZXJhdGVDbGllbnQKLXJwbT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5ScG0KLXhtbHZhbGlkYXRlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlhNTFZhbGlkYXRlVGFzawotdnNzY2hlY2tpbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NDSEVDS0lOCi12c3NjaGVja291dD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NDSEVDS09VVAotaXBsYW5ldC1lamJjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5JUGxhbmV0RWpiY1Rhc2sKLWpkZXBlbmQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamRlcGVuZC5KRGVwZW5kVGFzawotbWltZW1haWw9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0Lk1pbWVNYWlsCi1jY21jaGVja2luPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbS5DQ01DaGVja2luCi1jY21jaGVja291dD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20uQ0NNQ2hlY2tvdXQKLWNjbWNoZWNraW50YXNrPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbS5DQ01DaGVja2luRGVmYXVsdAotY2NtcmVjb25maWd1cmU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtLkNDTVJlY29uZmlndXJlCi1jY21jcmVhdGV0YXNrPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbS5DQ01DcmVhdGVUYXNrCi1qcGNvdmVyYWdlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuQ292ZXJhZ2UKLWpwY292bWVyZ2U9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5Db3ZNZXJnZQotanBjb3ZyZXBvcnQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5Db3ZSZXBvcnQKLQotIyBkZXByZWNhdGVkIGFudCB0YXNrcyAoa2VwdCBmb3IgYmFjayBjb21wYXRpYmlsaXR5KQotamF2YWRvYzI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYwotI2NvbXBpbGVUYXNrPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvbXBpbGVUYXNrCi1jb3B5ZGlyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHlkaXIKLWNvcHlmaWxlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHlmaWxlCi1kZWx0cmVlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkRlbHRyZWUKLXJlbmFtZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZW5hbWUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BTlRMUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODFkZTE2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLS8qKgotICogQGF1dGhvciBFcmlrIE1lYWRlLCBlbWVhZGVAZ2Vla2Zhcm0ub3JnCi0gKi8KLXB1YmxpYyBjbGFzcyBBTlRMUiBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBDb21tYW5kbGluZUphdmEgY29tbWFuZGxpbmUgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7Ci0gICAgcHJpdmF0ZSBGaWxlIHRhcmdldDsKLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JrID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBGaWxlIGRpcjsKLQotICAgIHB1YmxpYyBBTlRMUigpIHsKLSAgICAgICAgY29tbWFuZGxpbmUuc2V0Vm0oImphdmEiKTsKLSAgICAgICAgY29tbWFuZGxpbmUuc2V0Q2xhc3NuYW1lKCJhbnRsci5Ub29sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KEZpbGUgdGFyZ2V0KSB7Ci0gICAgICAgIGxvZygiU2V0dGluZyB0YXJnZXQgdG86ICIgKyB0YXJnZXQudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dGRpcmVjdG9yeShGaWxlIG91dHB1dERpcmVjdG9yeSkgewotICAgICAgICBsb2coIlNldHRpbmcgb3V0cHV0IGRpcmVjdG9yeSB0bzogIiArIG91dHB1dERpcmVjdG9yeS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yayhib29sZWFuIHMpIHsKLSAgICAgICAgdGhpcy5mb3JrID0gczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkKSB7Ci0gICAgICAgIHRoaXMuZGlyID0gZDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAvL1RPRE86IHVzZSBBTlRMUiB0byBwYXJzZSB0aGUgZ3JhbW1lciBmaWxlIHRvIGRvIHRoaXMuCi0gICAgICAgIGlmICh0YXJnZXQubGFzdE1vZGlmaWVkKCkgPiBnZXRHZW5lcmF0ZWRGaWxlKCkubGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1vIik7Ci0gICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKG91dHB1dERpcmVjdG9yeS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGFyZ2V0LnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBpZiAoZm9yaykgewotICAgICAgICAgICAgICAgIGxvZygiRm9ya2luZyAiICsgY29tbWFuZGxpbmUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IHJ1bihjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBTlRMUiByZXR1cm5lZDogIitlcnIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBFeGVjdXRlLnJ1bkNvbW1hbmQodGhpcywgY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uewotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgIXRhcmdldC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIHRhcmdldDogIiArIHRhcmdldCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBubyBvdXRwdXQgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgdXNlZCB0aGUgdGFyZ2V0J3MgZGlyZWN0b3J5Ci0gICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gdGFyZ2V0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBzZXRPdXRwdXRkaXJlY3RvcnkobmV3IEZpbGUodGFyZ2V0LmdldFBhcmVudCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFvdXRwdXREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIG91dHB1dCBkaXJlY3Rvcnk6ICIgKyBvdXRwdXREaXJlY3RvcnkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmb3JrICYmIChkaXIgPT0gbnVsbCB8fCAhZGlyLmlzRGlyZWN0b3J5KCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgd29ya2luZyBkaXJlY3Rvcnk6ICIgKyBkaXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIGdldEdlbmVyYXRlZEZpbGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZ2VuZXJhdGVkRmlsZU5hbWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIodGFyZ2V0KSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXh0ZW5kc0luZGV4ID0gbGluZS5pbmRleE9mKCIgZXh0ZW5kcyAiKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJjbGFzcyAiKSAmJiAgZXh0ZW5kc0luZGV4ID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkRmlsZU5hbWUgPSBsaW5lLnN1YnN0cmluZyg2LCBleHRlbmRzSW5kZXgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGRldGVybWluZSBnZW5lcmF0ZWQgY2xhc3MiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2VuZXJhdGVkRmlsZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGdlbmVyYXRlZCBjbGFzcyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnksIGdlbmVyYXRlZEZpbGVOYW1lICsgIi5qYXZhIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcnVuKFN0cmluZ1tdIGNvbW1hbmQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywgUHJvamVjdC5NU0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKSwgbnVsbCk7Ci0gICAgICAgIGV4ZS5zZXRBbnRSdW4ocHJvamVjdCk7Ci0gICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGRpcik7Ci0gICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjb21tYW5kKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBleGUuZXhlY3V0ZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQ2FiLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9DYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhOGI5Yy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9DYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIENBQiBhcmNoaXZlLgotICoKLSAqIEBhdXRob3IgUm9nZXIgVmF1Z2huIDxhIGhyZWY9Im1haWx0bzpydmF1Z2huQHNlYWNvbmluYy5jb20iPnJ2YXVnaG5Ac2VhY29uaW5jLmNvbTwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2FiIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKLQotICAgIHByaXZhdGUgRmlsZSBjYWJGaWxlOwotICAgIHByaXZhdGUgRmlsZSBiYXNlRGlyOwotICAgIHByaXZhdGUgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgYm9vbGVhbiBkb0NvbXByZXNzID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZG9WZXJib3NlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY21kT3B0aW9uczsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGFyY2hpdmVUeXBlID0gImNhYiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbXlvczsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luZG93czsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIG15b3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLSAgICAgICAgaXNXaW5kb3dzID0gbXlvcy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndpbmRvd3MiKSA+PSAwOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHRoZSBuYW1lL2xvY2F0aW9uIG9mIHdoZXJlIHRvIAotICAgICAqIGNyZWF0ZSB0aGUgLmNhYiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhYmZpbGUoRmlsZSBjYWJGaWxlKSB7Ci0gICAgICAgIHRoaXMuY2FiRmlsZSA9IGNhYkZpbGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGxvb2sgaW4gZm9yIAotICAgICAqIHRoaW5ncyB0byBjYWIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZWRpcihGaWxlIGJhc2VEaXIpIHsKLSAgICAgICAgdGhpcy5iYXNlRGlyID0gYmFzZURpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGJvb2xlYW4gY29tcHJlc3MpIHsKLSAgICAgICAgZG9Db21wcmVzcyA9IGNvbXByZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB3ZSB3YW50IHRvIHNlZSBvciBzdXBwcmVzcyBjYWJhcmMgb3V0cHV0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIGRvVmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhZGRpdGlvbmFsIGNhYmFyYyBvcHRpb25zIHRoYXQgYXJlbid0IHN1cHBvcnRlZCBkaXJlY3RseS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKFN0cmluZyBvcHRpb25zKSB7Ci0gICAgICAgIGNtZE9wdGlvbnMgPSBvcHRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgewotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJJ20gbm90IGZvbmQgb2YgdGhpcyBwYXR0ZXJuOiAic3ViLW1ldGhvZCBleHBlY3RlZCB0byB0aHJvdwotICAgICAqIHRhc2stY2FuY2VsbGluZyBleGNlcHRpb25zIi4gIEl0IGZlZWxzIHRvbyBtdWNoIGxpa2UgcHJvZ3JhbW1pbmcKLSAgICAgKiBmb3Igc2lkZS1lZmZlY3RzIHRvIG1lLi4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJiYXNlZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWJhc2VEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmFzZWRpciBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FiRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNhYmZpbGUgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGV4ZWMgZGVsZWdhdGUuICBUaGUgZGVsZWdhdGUgdGFzayBpcyBwb3B1bGF0ZWQgc28gdGhhdAotICAgICAqIGl0IGFwcGVhcnMgaW4gdGhlIGxvZ3MgdG8gYmUgdGhlIHNhbWUgdGFzayBhcyB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRXhlY1Rhc2sgY3JlYXRlRXhlYygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRXhlY1Rhc2sgZXhlYyA9IChFeGVjVGFzaylwcm9qZWN0LmNyZWF0ZVRhc2soImV4ZWMiKTsKLSAgICAgICAgZXhlYy5zZXRPd25pbmdUYXJnZXQodGhpcy5nZXRPd25pbmdUYXJnZXQoKSk7Ci0gICAgICAgIGV4ZWMuc2V0VGFza05hbWUodGhpcy5nZXRUYXNrTmFtZSgpKTsKLSAgICAgICAgZXhlYy5zZXREZXNjcmlwdGlvbih0aGlzLmdldERlc2NyaXB0aW9uKCkpOwotCi0gICAgICAgIHJldHVybiBleGVjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgdGFyZ2V0IGlzIHVwIHRvIGRhdGUgd2l0aCByZXNwZWN0IHRvIGlucHV0IGZpbGVzLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FiIGZpbGUgaXMgbmV3ZXIgdGhhbiBpdHMgZGVwZW5kZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwVG9EYXRlKFZlY3RvciBmaWxlcykKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgPSB0cnVlOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZmlsZXMuc2l6ZSgpICYmIHVwVG9EYXRlOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlID0gZmlsZXMuZWxlbWVudEF0KGkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAobmV3IEZpbGUoYmFzZURpcixmaWxlKS5sYXN0TW9kaWZpZWQoKSA+IAotICAgICAgICAgICAgICAgIGNhYkZpbGUubGFzdE1vZGlmaWVkKCkpCi0gICAgICAgICAgICAgICAgdXBUb0RhdGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXBUb0RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBjYWJhcmMgY29tbWFuZCBsaW5lIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgY3JlYXRlQ29tbWFuZChGaWxlIGxpc3RGaWxlKQotICAgIHsKLSAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZCA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBjb21tYW5kLnNldEV4ZWN1dGFibGUoImNhYmFyYyIpOwotICAgICAgICBjb21tYW5kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1yIik7Ci0gICAgICAgIGNvbW1hbmQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXAiKTsKLQotICAgICAgICBpZiAoIWRvQ29tcHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1hbmQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW0iKTsKLSAgICAgICAgICAgIGNvbW1hbmQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgibm9uZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNtZE9wdGlvbnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY29tbWFuZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGNtZE9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb21tYW5kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIm4iKTsKLSAgICAgICAgY29tbWFuZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoY2FiRmlsZSk7Ci0gICAgICAgIGNvbW1hbmQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiQCIgKyBsaXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbW1hbmQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ZXIgPSBuZXcgUmFuZG9tKCkubmV4dEludCgpICUgMTAwMDAwOwotICAgIHByb3RlY3RlZCBGaWxlIGNyZWF0ZVRlbXBGaWxlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgpCi0gICAgewotICAgICAgICBpZiAoc3VmZml4ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1ZmZpeCA9ICIudG1wIjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICsKLSAgICAgICAgICAgIG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMjIyIpLmZvcm1hdChuZXcgSW50ZWdlcihjb3VudGVyKyspKSArCi0gICAgICAgICAgICBzdWZmaXg7Ci0KLSAgICAgICAgU3RyaW5nIHRtcGRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQotICAgICAgICAvLyBqYXZhLmlvLnRtcGRpciBpcyBub3QgcHJlc2VudCBpbiAxLjEKLSAgICAgICAgaWYgKHRtcGRpciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUodG1wZGlyLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbGlzdCBmaWxlLiAgVGhpcyB0ZW1wb3JhcnkgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgYWxsIGZpbGVzCi0gICAgICogdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNhYiwgb25lIGZpbGUgcGVyIGxpbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgY3JlYXRlTGlzdEZpbGUoVmVjdG9yIGZpbGVzKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgbGlzdEZpbGUgPSBjcmVhdGVUZW1wRmlsZSgiYW50IiwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0obGlzdEZpbGUpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbihmaWxlcy5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGxpc3RGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZCBhbGwgZmlsZXMgZm91bmQgYnkgYSBkaXJlY3Rvcnkgc2Nhbm5lciB0byBhIHZlY3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRGaWxlcyhWZWN0b3IgZmlsZXMsIERpcmVjdG9yeVNjYW5uZXIgZHMpCi0gICAgewotICAgICAgICBTdHJpbmdbXSBkc2ZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHNmaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZXMuYWRkRWxlbWVudChkc2ZpbGVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29tcGxldGUgbGlzdCBvZiBmaWxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY2FiLiAgRmlsZW5hbWVzCi0gICAgICogYXJlIGdhdGhlcmVkIGZyb20gZmlsZXNldHMgaWYgYW55IGhhdmUgYmVlbiBhZGRlZCwgb3RoZXJ3aXNlIGZyb20gdGhlCi0gICAgICogdHJhZGl0aW9uYWwgaW5jbHVkZSBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBWZWN0b3IgZ2V0RmlsZUxpc3QoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFZlY3RvciBmaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBpZiAoZmlsZXNldHMuc2l6ZSgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGdldCBmaWxlcyBmcm9tIG9sZCBtZXRob2RzIC0gaW5jbHVkZXMgYW5kIG5lc3RlZCBpbmNsdWRlCi0gICAgICAgICAgICBhcHBlbmRGaWxlcyhmaWxlcywgc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihiYXNlRGlyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBnZXQgZmlsZXMgZnJvbSBmaWxlc2V0cwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc2V0cy5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZEZpbGVzKGZpbGVzLCBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmlsZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgY2hlY2tDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgVmVjdG9yIGZpbGVzID0gZ2V0RmlsZUxpc3QoKTsKLSAgICAKLSAgICAgICAgLy8gcXVpY2sgZXhpdCBpZiB0aGUgdGFyZ2V0IGlzIHVwIHRvIGRhdGUKLSAgICAgICAgaWYgKGlzVXBUb0RhdGUoZmlsZXMpKSByZXR1cm47Ci0KLSAgICAgICAgbG9nKCJCdWlsZGluZyAiKyBhcmNoaXZlVHlwZSArIjogIisgY2FiRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgLy8gd2UgbXVzdCBiZSBvbiBXaW5kb3dzIHRvIGNvbnRpbnVlCi0gICAgICAgIGlmICghaXNXaW5kb3dzKSB7Ci0gICAgICAgICAgICBsb2coIlVzaW5nIGxpc3RjYWIvbGliY2FiaW5ldCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGZpbGVFbnVtID0gZmlsZXMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKGZpbGVFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGZpbGVFbnVtLm5leHRFbGVtZW50KCkpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiXG4iKS5hcHBlbmQoY2FiRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFByb2Nlc3MgcCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoImxpc3RjYWIiKTsKLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcC5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJQcm9ibGVtIGNyZWF0aW5nICIgKyBjYWJGaWxlICsgIiAiICsgZXguZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGxpc3RGaWxlID0gY3JlYXRlTGlzdEZpbGUoZmlsZXMpOwotICAgICAgICAgICAgICAgIEV4ZWNUYXNrIGV4ZWMgPSBjcmVhdGVFeGVjKCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBvdXRGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBkaWUgaWYgY2FiYXJjIGZhaWxzCi0gICAgICAgICAgICAgICAgZXhlYy5zZXRGYWlsb25lcnJvcih0cnVlKTsKLSAgICAgICAgICAgICAgICBleGVjLnNldERpcihiYXNlRGlyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIWRvVmVyYm9zZSkgewotICAgICAgICAgICAgICAgICAgICBvdXRGaWxlID0gY3JlYXRlVGVtcEZpbGUoImFudCIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBleGVjLnNldE91dHB1dChvdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGV4ZWMuc2V0Q29tbWFuZChjcmVhdGVDb21tYW5kKGxpc3RGaWxlKSk7Ci0gICAgICAgICAgICAgICAgZXhlYy5leGVjdXRlKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKG91dEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvdXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBsaXN0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvYmxlbSBjcmVhdGluZyAiICsgY2FiRmlsZSArICIgIiArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9JQ29udHJhY3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0lDb250cmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTFjNjJlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0lDb250cmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODI2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOwotCi0KLQotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWtkaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkRlZmF1bHRDb21waWxlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKLQotLyoqCi0gKiBJbnN0cnVtZW50cyBKYXZhIGNsYXNzZXMgd2l0aCA8YSBocmVmPSJodHRwOi8vd3d3LnJlbGlhYmxlLXN5c3RlbXMuY29tL3Rvb2xzLyI+aUNvbnRyYWN0PC9hPgotICogREJDIHByZXByb2Nlc3Nvci4KLSAqIDxici8+Ci0gKiBUaGUgdGFzayBjYW4gZ2VuZXJhdGUgYSBwcm9wZXJ0aWVzIGZpbGUgZm9yIDxhIGhyZWY9Imh0dHA6Ly9oamVtLnNvbC5uby9oZWxsZXNveS9pY29udHJvbC5odG1sIj5pQ29udHJvbDwvYT4sCi0gKiBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSB0aGF0IGxldHMgeW91IHR1cm4gb24vb2ZmIGFzc2VydGlvbnMuIGlDb250cm9sIGdlbmVyYXRlcyBhIGNvbnRyb2wgZmlsZSB0aGF0IHlvdSBjYW4gcmVmZXIgdG8KLSAqIGZyb20gdGhpcyB0YXNrIHVzaW5nIHRoZSBjb250cm9sZmlsZSBhdHRyaWJ1dGUuCi0gKiA8cC8+Ci0gKiBUaGFua3MgdG8gUmFpbmVyIFNjaG1pdHogZm9yIGVuaGFuY2VtZW50cyBhbmQgY29tbWVudHMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YXNsYWsuaGVsbGVzb3lAYmVray5ubyI+QXNsYWsgSGVsbGVz+Hk8L2E+Ci0gKgotICogPHAvPgotICogPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAqICAgPHRyPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICogICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjZGlyPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPkxvY2F0aW9uIG9mIHRoZSBqYXZhIGZpbGVzLjwvdGQ+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj5pbnN0cnVtZW50ZGlyPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGVyZSB0aGUgaW5zdHJ1bWVudGVkIHNvdXJjZSBmaWxlcyBzaG91bGQgZ28uPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPnJlcG9zaXRvcnlkaXI8L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXJlIHRoZSByZXBvc2l0b3J5IHNvdXJjZSBmaWxlcyBzaG91bGQgZ28uPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1aWxkZGlyPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGVyZSB0aGUgY29tcGlsZWQgaW5zdHJ1bWVudGVkIGNsYXNzZXMgc2hvdWxkIGdvLgotICogICAgICAgRGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIGluc3RydW1lbnRkaXIuCi0gKiAgICAgICA8L3A+Ci0gKiAgICAgICA8ZW0+Tk9URTo8L2VtPiBEb24ndCB1c2UgdGhlIHNhbWUgZGlyZWN0b3J5IGZvciBjb21waWxlZCBpbnN0cnVtZW50ZWQgY2xhc3NlcwotICogICAgICAgYW5kIHVuaW5zdHJ1bWVudGVkIGNsYXNzZXMuIEl0IHdpbGwgYnJlYWsgdGhlIGRlcGVuZGVuY3kgY2hlY2tpbmcuIChDbGFzc2VzIHdpbGwKLSAqICAgICAgIG5vdCBiZSByZWluc3RydW1lbnRlZCBpZiB5b3UgY2hhbmdlIHRoZW0pLjwvdGQ+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPnJlcG9zaXRvcnlidWlsZGRpcjwvdGQ+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hlcmUgdGhlIGNvbXBpbGVkIHJlcG9zaXRvcnkgY2xhc3NlcyBzaG91bGQgZ28uCi0gKiAgICAgICBEZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgcmVwb3NpdG9yeWRpci48L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj5wcmU8L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc3RydW1lbnQgZm9yIHByZWNvbmRpdGlvbnMuCi0gKiAgICAgICBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPiB1bmxlc3MgY29udHJvbGZpbGUgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIGl0Ci0gKiAgICAgICBkZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+cG9zdDwvdGQ+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zdHJ1bWVudCBmb3IgcG9zdGNvbmRpdGlvbnMuCi0gKiAgICAgICBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPiB1bmxlc3MgY29udHJvbGZpbGUgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIGl0Ci0gKiAgICAgICBkZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+aW52YXJpYW50PC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnN0cnVtZW50IGZvciBpbnZhcmlhbnRzLgotICogICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gdW5sZXNzIGNvbnRyb2xmaWxlIGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBpdAotICogICAgICAgZGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvdGQ+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWx0aHJvd2FibGU8L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZ1bGwgbmFtZSBvZiB0aGUgVGhyb3dhYmxlIChFeGNlcHRpb24pIHRoYXQgc2hvdWxkIGJlCi0gKiAgICAgICB0aHJvd24gd2hlbiBhbiBhc3NlcnRpb24gaXMgdmlvbGF0ZWQuIERlZmF1bHRzIHRvIDxjb2RlPmphdmEubGFuZy5FcnJvcjwvY29kZT48L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NpdHk8L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgaUNvbnRyYWN0LiBBbnkgY29tYmluYXRpb24KLSAqICAgICAgIG9mIDxjb2RlPmVycm9yKix3YXJuaW5nKixub3RlKixpbmZvKixwcm9ncmVzcyosZGVidWcqPC9jb2RlPiAoY29tbWEgc2VwYXJhdGVkKSBjYW4gYmUKLSAqICAgICAgIHVzZWQuIERlZmF1bHRzIHRvIDxjb2RlPmVycm9yKjwvY29kZT48L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj5xdWlldDwvdGQ+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgaWYgaUNvbnRyYWN0IHNob3VsZCBiZSBxdWlldC4gVHVybiBpdCBvZmYgaWYgbWFueSB5b3VyIGNsYXNzZXMgZXh0ZW5kIHVuaW5zdHJ1bWVudGVkIGNsYXNzZXMKLSAqICAgICBhbmQgeW91IGRvbid0IHdhbnQgd2FybmluZ3MgYWJvdXQgdGhpcy4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+dXBkYXRlaWNvbnRyb2w8L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgc2V0IHRvIHRydWUsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0aWVzIGZpbGUgZm9yCi0gKiAgICAgICBpQ29udHJvbCBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc2hvdWxkIGJlIHVwZGF0ZWQgKG9yIGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBleGlzdCkuCi0gKiAgICAgICBEZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+Y29udHJvbGZpbGU8L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGNvbnRyb2wgZmlsZSB0byBwYXNzIHRvIGlDb250cmFjdC4gQ29uc2lkZXIgdXNpbmcgaUNvbnRyb2wgdG8gZ2VuZXJhdGUgdGhlIGZpbGUuCi0gKiAgICAgICBEZWZhdWx0IGlzIG5vdCB0byBwYXNzIGEgZmlsZS4gPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk9ubHkgaWYgPGNvZGU+dXBkYXRlaWNvbnRyb2w9dHJ1ZTwvY29kZT48L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc2RpcjwvdGQ+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hlcmUgY29tcGlsZWQgKHVuaXN0cnVtZW50ZWQpIGNsYXNzZXMgYXJlIGxvY2F0ZWQuCi0gKiAgICAgICBUaGlzIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIHByb3Blcmx5IHVwZGF0ZSB0aGUgaWNvbnRyb2wucHJvcGVydGllcyBmaWxlLCBub3QKLSAqICAgICAgIGZvciBpbnN0cnVtZW50YXRpb24uPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk9ubHkgaWYgPGNvZGU+dXBkYXRlaWNvbnRyb2w9dHJ1ZTwvY29kZT48L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgPHRkIHZhbGlnbj0idG9wIj50YXJnZXRzPC90ZD4KLSAqICAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBieSB0aGlzIHRhc2ssIHdoaWNoIGxpc3RzIGFsbCB0aGUKLSAqICAgICAgICBjbGFzc2VzIHRoYXQgaUNvbnRyYWN0IHdpbGwgaW5zdHJ1bWVudC4gSWYgc3BlY2lmaWVkLCB0aGUgZmlsZSB3aWxsIG5vdCBiZSBkZWxldGVkIGFmdGVyIGV4ZWN1dGlvbi4KLSAqICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCBhIGZpbGUgd2lsbCBzdGlsbCBiZSBjcmVhdGVkLCBidXQgaXQgd2lsbCBiZSBkZWxldGVkIGFmdGVyIGV4ZWN1dGlvbi48L3RkPgotICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICogICA8L3RyPgotICogPC90YWJsZT4KLSAqCi0gKiA8cC8+Ci0gKiA8Yj5Ob3RlOjwvYj4gaUNvbnRyYWN0IHdpbGwgdXNlIHRoZSBqYXZhIGNvbXBpbGVyIGluZGljYXRlZCBieSB0aGUgcHJvamVjdCdzCi0gKiA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHkuIFNlZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBKYXZhYyB0YXNrIGZvcgotICogbW9yZSBpbmZvcm1hdGlvbi4KLSAqIDxwLz4KLSAqIE5lc3RlZCBpbmNsdWRlcyBhbmQgZXhjbHVkZXMgYXJlIGFsc28gc3VwcG9ydGVkLgotICoKLSAqIDxwPjxiPkV4YW1wbGU6PC9iPjwvcD4KLSAqIDxwcmU+Ci0gKiAmbHQ7aWNvbnRyYWN0Ci0gKiAgICBzcmNkaXI9IiR7YnVpbGQuc3JjfSIKLSAqICAgIGluc3RydW1lbnRkaXI9IiR7YnVpbGQuaW5zdHJ1bWVudH0iCi0gKiAgICByZXBvc2l0b3J5ZGlyPSIke2J1aWxkLnJlcG9zaXRvcnl9IgotICogICAgYnVpbGRkaXI9IiR7YnVpbGQuaW5zdHJjbGFzc2VzfSIKLSAqICAgIHVwZGF0ZWljb250cm9sPSJ0cnVlIgotICogICAgY2xhc3NkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gKiAgICBjb250cm9sZmlsZT0iY29udHJvbCIKLSAqICAgIHRhcmdldHM9InRhcmdldHMiCi0gKiAgICB2ZXJib3NpdHk9ImVycm9yKix3YXJuaW5nKiIKLSAqICAgIHF1aWV0PSJ0cnVlIgotICogPgotICogICAgJmx0O2NsYXNzcGF0aCByZWZpZD0iY29tcGlsZS1jbGFzc3BhdGgiLz4KLSAqICZsdDsvaWNvbnRyYWN0PgotICogPC9wcmU+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSUNvbnRyYWN0IGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OVFJPTF9QUk9QRVJUSUVTX0hFQURFUiA9Ci0gICAgICAgICIgWW91IG1pZ2h0IHdhbnQgdG8gc2V0IGNsYXNzUm9vdCB0byBwb2ludCB0byB5b3VyIG5vcm1hbCBjb21waWxhdGlvbiBjbGFzcyByb290IGRpcmVjdG9yeS4iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05UUk9MX1BST1BFUlRJRVNfTUVTU0FHRSA9Ci0gICAgICAgICJZb3Ugc2hvdWxkIHByb2JhYmx5IG1vZGlmeSBpY29udHJvbC5wcm9wZXJ0aWVzJyBjbGFzc1Jvb3QgdG8gd2hlcmUgY29taWxlZCAodW5pbnN0cnVtZW50ZWQpIGNsYXNzZXMgZ28uIjsKLQotICAgIC8qKiBcIG9uIHdpbmRvd3MsIC8gb24gbGludXgvdW5peCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggInBhdGguc2VwYXJhdG9yIiApOwotCi0gICAgLyoqIGNvbXBpbGVyIHRvIHVzZSBmb3IgaW5zdHJ1bWVuYXRpb24gKi8KLSAgICBwcml2YXRlIFN0cmluZyBpY0NvbXBpbGVyID0gImphdmFjIjsKLQotICAgIC8qKiB0ZW1wb3JhcnkgZmlsZSB3aXRoIGZpbGUgbmFtZXMgb2YgYWxsIGphdmEgZmlsZXMgdG8gYmUgaW5zdHJ1bWVudGVkICovCi0gICAgcHJpdmF0ZSBGaWxlIHRhcmdldHMgPSBudWxsOwotCi0gICAgLyoqIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgYW55IG9mIHRoZSBzb3VyY2EgZmlsZXMgYXJlIG5ld2VyIHRoYW4gdGhlIGluc3RydW1lbnRlZCBmaWxlcyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotCi0gICAgLyoqIHNldCB0byB0cnVlIGlmIHRoZSBpQ29udHJhY3QgamFyIGlzIG1pc3NpbmcgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaUNvbnRyYWN0TWlzc2luZyA9IGZhbHNlOwotCi0gICAgLyoqIHNvdXJjZSBmaWxlIHJvb3QgKi8KLSAgICBwcml2YXRlIEZpbGUgc3JjRGlyID0gbnVsbDsKLQotICAgIC8qKiBpbnN0cnVtZW50YXRpb24gc3JjIHJvb3QgKi8KLSAgICBwcml2YXRlIEZpbGUgaW5zdHJ1bWVudERpciA9IG51bGw7Ci0KLSAgICAvKiogaW5zdHJ1bWVudGF0aW9uIGJ1aWxkIHJvb3QgKi8KLSAgICBwcml2YXRlIEZpbGUgYnVpbGREaXIgPSBudWxsOwotCi0gICAgLyoqIHJlcG9zaXRvcnkgc3JjIHJvb3QgKi8KLSAgICBwcml2YXRlIEZpbGUgcmVwb3NpdG9yeURpciA9IG51bGw7Ci0KLSAgICAvKiogcmVwb3NpdG9yeSBidWlsZCByb290ICovCi0gICAgcHJpdmF0ZSBGaWxlIHJlcEJ1aWxkRGlyID0gbnVsbDsKLQotICAgIC8qKiBjbGFzc3BhdGggKi8KLSAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoID0gbnVsbDsKLQotICAgIC8qKiBUaGUgY2xhc3Mgb2YgdGhlIFRocm93YWJsZSB0byBiZSB0aHJvd24gb24gZmFpbGVkIGFzc2VydGlvbnMgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmYWlsVGhyb3dhYmxlID0gImphdmEubGFuZy5FcnJvciI7Ci0KLSAgICAvKiogVGhlIC12IG9wdGlvbiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZlcmJvc2l0eSA9ICJlcnJvcioiOwotCi0gICAgLyoqIFRoZSAtcSBvcHRpb24gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcXVpZXQgPSBmYWxzZTsKLQotICAgIC8qKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gdXNlIGludGVybmFsIGNvbXBpbGF0aW9uICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGludGVybmFsY29tcGlsYXRpb24gPSBmYWxzZTsKLQotICAgIC8qKiBUaGUgLW0gb3B0aW9uICovCi0gICAgcHJpdmF0ZSBGaWxlIGNvbnRyb2xGaWxlID0gbnVsbDsKLQotICAgIC8qKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zdHJ1bWVudCBmb3IgcHJlY29uZGl0aW9ucyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwcmUgPSB0cnVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBwcmVNb2RpZmllZCA9IGZhbHNlOwotCi0gICAgLyoqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnN0cnVtZW50IGZvciBwb3N0Y29uZGl0aW9ucyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwb3N0ID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcG9zdE1vZGlmaWVkID0gZmFsc2U7Ci0KLSAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc3RydW1lbnQgZm9yIGludmFyaWFudHMgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW52YXJpYW50ID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW52YXJpYW50TW9kaWZpZWQgPSBmYWxzZTsKLQotICAgIC8qKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zdHJ1bWVudCBhbGwgZmlsZXMgcmVnYXJkbGVzcyBvZiB0aW1lc3RhbXAgKi8KLSAgICAvLyBjYW4ndCBiZSBleHBsaWNpdGx5IHNldCwgaXMgc2V0IGlmIGNvbnRyb2wgZmlsZSBleGlzdHMgYW5kIGlzIG5ld2VyIHRoYW4gYW55IHNvdXJjZSBmaWxlCi0gICAgcHJpdmF0ZSBib29sZWFuIGluc3RydW1lbnRhbGwgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgbmFtZSBvZiBhIHByb3BlcnRpZXMgZmlsZSAoaW50ZW50aW9uYWxseSBmb3IgaUNvbnRyb2wpIHdoZXJlIHRoZSBjbGFzc3BhdGgKLSAgICAgKiBwcm9wZXJ0eSBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlSWNvbnRyb2wgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFJlZ3VsYXIgY29tcGlsYXRpb24gY2xhc3Mgcm9vdAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBjbGFzc0RpciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3JjRGlyIHRoZSBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3JjZGlyKCBGaWxlIHNyY0RpciApIHsKLSAgICAgICAgdGhpcy5zcmNEaXIgPSBzcmNEaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2xhc3MgZGlyZWN0b3J5ICh1bmluc3RydW1lbnRlZCBjbGFzc2VzKQotICAgICAqCi0gICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIGRpcmVjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzZGlyKCBGaWxlIGNsYXNzRGlyICkgewotICAgICAgICB0aGlzLmNsYXNzRGlyID0gY2xhc3NEaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5zdHJ1bWVudGF0aW9uIGRpcmVjdG9yeQotICAgICAqCi0gICAgICogQHBhcmFtIGluc3RydW1lbnREaXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnN0cnVtZW50ZGlyKCBGaWxlIGluc3RydW1lbnREaXIgKSB7Ci0gICAgICAgIHRoaXMuaW5zdHJ1bWVudERpciA9IGluc3RydW1lbnREaXI7Ci0gICAgICAgIGlmICggdGhpcy5idWlsZERpciA9PSBudWxsICkgewotICAgICAgICAgICAgc2V0QnVpbGRkaXIoIGluc3RydW1lbnREaXIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBmb3IgaW5zdHJ1bWVudGVkIGNsYXNzZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBidWlsZERpciB0aGUgYnVpbGQgZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGRkaXIoIEZpbGUgYnVpbGREaXIgKSB7Ci0gICAgICAgIHRoaXMuYnVpbGREaXIgPSBidWlsZERpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIHJlcG9zaXRvcnkgY2xhc3NlcwotICAgICAqCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlEaXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBvc2l0b3J5ZGlyKCBGaWxlIHJlcG9zaXRvcnlEaXIgKSB7Ci0gICAgICAgIHRoaXMucmVwb3NpdG9yeURpciA9IHJlcG9zaXRvcnlEaXI7Ci0gICAgICAgIGlmKCB0aGlzLnJlcEJ1aWxkRGlyID09IG51bGwgKSB7Ci0gICAgICAgICAgICBzZXRSZXBidWlsZGRpciggcmVwb3NpdG9yeURpciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYnVpbGQgZGlyZWN0b3J5IGZvciBpbnN0cnVtZW50ZWQgY2xhc3NlcwotICAgICAqCi0gICAgICogQHBhcmFtIGJ1aWxkRGlyIHRoZSBidWlsZCBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBidWlsZGRpciggRmlsZSByZXBCdWlsZERpciApIHsKLSAgICAgICAgdGhpcy5yZXBCdWlsZERpciA9IHJlcEJ1aWxkRGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm5zIG9uL29mZiBwcmVjb25kaXRpb24gaW5zdHJ1bWVudGF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlIHRydWUgdHVybnMgaXQgb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmUoIGJvb2xlYW4gcHJlICkgewotICAgICAgICB0aGlzLnByZSA9IHByZTsKLSAgICAgICAgcHJlTW9kaWZpZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm5zIG9uL29mZiBwb3N0Y29uZGl0aW9uIGluc3RydW1lbnRhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHBvc3QgdHJ1ZSB0dXJucyBpdCBvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvc3QoIGJvb2xlYW4gcG9zdCApIHsKLSAgICAgICAgdGhpcy5wb3N0ID0gcG9zdDsKLSAgICAgICAgcG9zdE1vZGlmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJucyBvbi9vZmYgaW52YXJpYW50IGluc3RydW1lbnRhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGludmFyaWFudCB0cnVlIHR1cm5zIGl0IG9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW52YXJpYW50KCBib29sZWFuIGludmFyaWFudCApIHsKLSAgICAgICAgdGhpcy5pbnZhcmlhbnQgPSBpbnZhcmlhbnQ7Ci0gICAgICAgIGludmFyaWFudE1vZGlmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBUaHJvd2FibGUgKEV4Y2VwdGlvbikgdG8gYmUgdGhyb3duIG9uIGFzc2VydGlvbiB2aW9sYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgZnVsbHkgcXVhbGlmaWVkIFRocm93YWJsZSBjbGFzcyBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFpbHRocm93YWJsZSggU3RyaW5nIGNsYXp6ICkgewotICAgICAgICB0aGlzLmZhaWxUaHJvd2FibGUgPSBjbGF6ejsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgaUNvbnRyYWN0LiBBbnkgY29tYmluYXRpb24gb2YKLSAgICAgKiBlcnJvciosd2FybmluZyosbm90ZSosaW5mbyoscHJvZ3Jlc3MqLGRlYnVnKiAoY29tbWEgc2VwYXJhdGVkKQotICAgICAqIGNhbiBiZSB1c2VkLiBEZWZhdWx0cyB0byBlcnJvciosd2FybmluZyoKLSAgICAgKgotICAgICAqIEBwYXJhbSB2ZXJib3NpdHkgdmVyYm9zaXR5IGxldmVsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyYm9zaXR5KCBTdHJpbmcgdmVyYm9zaXR5ICkgewotICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IHZlcmJvc2l0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyBpQ29udHJhY3QgdG8gYmUgcXVpZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcXVpZXQgdHJ1ZSBpZiBpQ29udHJhY3Qgc2hvdWxkIGJlIHF1aWV0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KCBib29sZWFuIHF1aWV0ICkgewotICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aGVyZSB0YXJnZXRzIHdpbGwgYmUgd3JpdHRlbi4KLSAgICAgKiBUaGF0IGlzIHRoZSBmaWxlIHRoYXQgdGVsbHMgaUNvbnRyYWN0IHdoYXQgZmlsZXMgdG8gcHJvY2Vzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXRzIHRoZSB0YXJnZXRzIGZpbGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldHMoIEZpbGUgdGFyZ2V0cyApIHsKLSAgICAgICAgdGhpcy50YXJnZXRzID0gdGFyZ2V0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250cm9sIGZpbGUgdG8gcGFzcyB0byBpQ29udHJhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udHJvbEZpbGUgdGhlIGNvbnRyb2wgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xmaWxlKCBGaWxlIGNvbnRyb2xGaWxlICkgewotICAgICAgICBpZiggIWNvbnRyb2xGaWxlLmV4aXN0cygpICkgewotICAgICAgICAgICAgbG9nKCAiV0FSTklORzogQ29udHJvbCBmaWxlICIgKyBjb250cm9sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZG9lc24ndCBleGlzdC4gaUNvbnRyYWN0IHdpbGwgYmUgcnVuIHdpdGhvdXQgY29udHJvbCBmaWxlLiIgKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNvbnRyb2xGaWxlID0gY29udHJvbEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIGludm9jYXRpb24gb2YgaUNvbnRyYWN0LgotICAgICAqCi0gICAgICogQHBhdGggdGhlIGNsYXNzcGF0aAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aCggUGF0aCBwYXRoICkgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5hcHBlbmQoIHBhdGggKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgoIGdldFByb2plY3QoKSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWZlcmVuY2UgcmVmZXJlbmNlZCBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoIFJlZmVyZW5jZSByZWZlcmVuY2UgKSB7Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKCByZWZlcmVuY2UgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNpZGVzIHdoZXRoZXIgb3Igbm90IHRvIHVwZGF0ZSBpQ29udHJvbCBwcm9wZXJ0aWVzIGZpbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSB1cGRhdGVJY29udHJvbCB0cnVlIGlmIGlDb250cm9sIHByb3BlcnRpZXMgZmlsZSBzaG91bGQgYmUgdXBkYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZWljb250cm9sKCBib29sZWFuIHVwZGF0ZUljb250cm9sICkgewotICAgICAgICB0aGlzLnVwZGF0ZUljb250cm9sID0gdXBkYXRlSWNvbnRyb2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHRhc2sKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGluc3RydW1lbnRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBwcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIHNjYW4oKTsKLSAgICAgICAgaWYoIGRpcnR5ICkgewotCi0gICAgICAgICAgICAvLyB0dXJuIG9mZiBhc3NlcnRpb25zIGlmIHdlJ3JlIHVzaW5nIGNvbnRyb2xmaWxlLCB1bmxlc3MgdGhleSBhcmUgbm90IGV4cGxpY2l0bHkgc2V0LgotICAgICAgICAgICAgYm9vbGVhbiB1c2VDb250cm9sRmlsZSA9IChjb250cm9sRmlsZSAhPSBudWxsKSAmJiBjb250cm9sRmlsZS5leGlzdHMoKTsKLSAgICAgICAgICAgIGlmKCB1c2VDb250cm9sRmlsZSAmJiAhcHJlTW9kaWZpZWQgKSB7Ci0gICAgICAgICAgICAgICAgcHJlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiggdXNlQ29udHJvbEZpbGUgJiYgIXBvc3RNb2RpZmllZCApIHsKLSAgICAgICAgICAgICAgICBwb3N0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiggdXNlQ29udHJvbEZpbGUgJiYgIWludmFyaWFudE1vZGlmaWVkICkgewotICAgICAgICAgICAgICAgIGludmFyaWFudCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaXNzdWUgd2FybmluZyBpZiBwcmUscG9zdCBvciBpbnZhcmlhbnQgaXMgdXNlZCB0b2dldGhlciB3aXRoIGNvbnRyb2xmaWxlCi0gICAgICAgICAgICBpZiggKCBwcmUgfHwgcG9zdCB8fCBpbnZhcmlhbnQgKSAmJiBjb250cm9sRmlsZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGxvZyggIldBUk5JTkc6IHNwZWNpZnlpbmcgcHJlLHBvc3Qgb3IgaW52YXJpYW50IHdpbGwgb3ZlcnJpZGUgY29udHJvbCBmaWxlIHNldHRpbmdzIiApOwotICAgICAgICAgICAgfQotCi0KLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBiZSBub3RpZmllZCBpZiBpQ29udHJhY3QgamFyIGlzIG1pc3NpbmcuIFRoaXMgbWFrZXMgbGlmZSBlYXNpZXIgZm9yIHRoZSB1c2VyCi0gICAgICAgICAgICAvLyB3aG8gZGlkbid0IHVuZGVyc3RhbmQgdGhhdCBpQ29udHJhY3QgaXMgYSBzZXBhcmF0ZSBsaWJyYXJ5IChkdWghKQotICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIoIG5ldyBJQ29udHJhY3RQcmVzZW5jZURldGVjdG9yKCkgKTsKLQotICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgZGlyZWN0b3JpZXMgZm9yIGlDb250cmFjdC4gaUNvbnRyYWN0IHdpbGwgbWFrZSB0aGVtIGlmIHRoZXkKLSAgICAgICAgICAgIC8vIGRvbid0IGV4aXN0LCBidXQgZm9yIHNvbWUgcmVhc29uIEkgZG9uJ3Qga25vdywgaXQgd2lsbCBjb21wbGFpbiBhYm91dCB0aGUgUkVQIGZpbGVzCi0gICAgICAgICAgICAvLyBhZnRlcndhcmRzCi0gICAgICAgICAgICBNa2RpciBta2RpciA9IChNa2RpcikgcHJvamVjdC5jcmVhdGVUYXNrKCAibWtkaXIiICk7Ci0gICAgICAgICAgICBta2Rpci5zZXREaXIoIGluc3RydW1lbnREaXIgKTsKLSAgICAgICAgICAgIG1rZGlyLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIG1rZGlyLnNldERpciggYnVpbGREaXIgKTsKLSAgICAgICAgICAgIG1rZGlyLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIG1rZGlyLnNldERpciggcmVwb3NpdG9yeURpciApOwotICAgICAgICAgICAgbWtkaXIuZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGNsYXNzcGF0aCB0aGF0IGlzIG5lZWRlZCBmb3IgcmVndWxhciBKYXZhYyBjb21waWxhdGlvbgotICAgICAgICAgICAgUGF0aCBiYXNlQ2xhc3NwYXRoID0gY3JlYXRlQ2xhc3NwYXRoKCk7Ci0KLSAgICAgICAgICAgIC8vIE1pZ2h0IG5lZWQgdG8gYWRkIHRoZSBjb3JlIGNsYXNzZXMgaWYgd2UncmUgbm90IHVzaW5nIFN1bidzIEphdmFjIChsaWtlIEppa2VzKQotICAgICAgICAgICAgU3RyaW5nIGNvbXBpbGVyID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiKTsKLSAgICAgICAgICAgIENsYXNzcGF0aEhlbHBlciBjbGFzc3BhdGhIZWxwZXIgPSBuZXcgQ2xhc3NwYXRoSGVscGVyKCBjb21waWxlciApOwotICAgICAgICAgICAgY2xhc3NwYXRoSGVscGVyLm1vZGlmeSggYmFzZUNsYXNzcGF0aCApOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNsYXNzcGF0aCByZXF1aXJlZCB0byBjb21waWxlIHRoZSBzb3VyY2VmaWxlcyBCRUZPUkUgaW5zdHJ1bWVudGF0aW9uCi0gICAgICAgICAgICBQYXRoIGJlZm9yZUluc3RydW1lbnRhdGlvbkNsYXNzcGF0aCA9ICgoUGF0aCkgYmFzZUNsYXNzcGF0aC5jbG9uZSgpKTsKLSAgICAgICAgICAgIGJlZm9yZUluc3RydW1lbnRhdGlvbkNsYXNzcGF0aC5hcHBlbmQoIG5ldyBQYXRoKCBnZXRQcm9qZWN0KCksIHNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSApICk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY2xhc3NwYXRoIHJlcXVpcmVkIHRvIGNvbXBpbGUgdGhlIHNvdXJjZWZpbGVzIEFGVEVSIGluc3RydW1lbnRhdGlvbgotICAgICAgICAgICAgUGF0aCBhZnRlckluc3RydW1lbnRhdGlvbkNsYXNzcGF0aCA9ICgoUGF0aCkgYmFzZUNsYXNzcGF0aC5jbG9uZSgpKTsKLSAgICAgICAgICAgIGFmdGVySW5zdHJ1bWVudGF0aW9uQ2xhc3NwYXRoLmFwcGVuZCggbmV3IFBhdGgoIGdldFByb2plY3QoKSwgaW5zdHJ1bWVudERpci5nZXRBYnNvbHV0ZVBhdGgoKSApICk7Ci0gICAgICAgICAgICBhZnRlckluc3RydW1lbnRhdGlvbkNsYXNzcGF0aC5hcHBlbmQoIG5ldyBQYXRoKCBnZXRQcm9qZWN0KCksIHJlcG9zaXRvcnlEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKSApOwotICAgICAgICAgICAgYWZ0ZXJJbnN0cnVtZW50YXRpb25DbGFzc3BhdGguYXBwZW5kKCBuZXcgUGF0aCggZ2V0UHJvamVjdCgpLCBzcmNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKSApOwotICAgICAgICAgICAgYWZ0ZXJJbnN0cnVtZW50YXRpb25DbGFzc3BhdGguYXBwZW5kKCBuZXcgUGF0aCggZ2V0UHJvamVjdCgpLCBidWlsZERpci5nZXRBYnNvbHV0ZVBhdGgoKSApICk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY2xhc3NwYXRoIHJlcXVpcmVkIHRvIGF1dG9tYXRpY2FsbHkgY29tcGlsZSB0aGUgcmVwb3NpdG9yeSBmaWxlcwotICAgICAgICAgICAgUGF0aCByZXBvc2l0b3J5Q2xhc3NwYXRoID0gKChQYXRoKSBiYXNlQ2xhc3NwYXRoLmNsb25lKCkpOwotICAgICAgICAgICAgcmVwb3NpdG9yeUNsYXNzcGF0aC5hcHBlbmQoIG5ldyBQYXRoKCBnZXRQcm9qZWN0KCksIGluc3RydW1lbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKSApOwotICAgICAgICAgICAgcmVwb3NpdG9yeUNsYXNzcGF0aC5hcHBlbmQoIG5ldyBQYXRoKCBnZXRQcm9qZWN0KCksIHNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSApICk7Ci0gICAgICAgICAgICByZXBvc2l0b3J5Q2xhc3NwYXRoLmFwcGVuZCggbmV3IFBhdGgoIGdldFByb2plY3QoKSwgcmVwb3NpdG9yeURpci5nZXRBYnNvbHV0ZVBhdGgoKSApICk7Ci0gICAgICAgICAgICByZXBvc2l0b3J5Q2xhc3NwYXRoLmFwcGVuZCggbmV3IFBhdGgoIGdldFByb2plY3QoKSwgYnVpbGREaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKSApOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNsYXNzcGF0aCByZXF1aXJlZCBmb3IgaUNvbnRyYWN0IGl0c2VsZgotICAgICAgICAgICAgUGF0aCBpQ29udHJhY3RDbGFzc3BhdGggPSAoKFBhdGgpIGJhc2VDbGFzc3BhdGguY2xvbmUoKSk7Ci0gICAgICAgICAgICBpQ29udHJhY3RDbGFzc3BhdGguYXBwZW5kKCBuZXcgUGF0aCggZ2V0UHJvamVjdCgpLCBTeXN0ZW0uZ2V0UHJvcGVydHkoICJqYXZhLmhvbWUiICkgKyBGaWxlLnNlcGFyYXRvciArICIuLiIgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiICsgRmlsZS5zZXBhcmF0b3IgKyAidG9vbHMuamFyIiApICk7Ci0gICAgICAgICAgICBpQ29udHJhY3RDbGFzc3BhdGguYXBwZW5kKCBuZXcgUGF0aCggZ2V0UHJvamVjdCgpLCBzcmNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKSApOwotICAgICAgICAgICAgaUNvbnRyYWN0Q2xhc3NwYXRoLmFwcGVuZCggbmV3IFBhdGgoIGdldFByb2plY3QoKSwgcmVwb3NpdG9yeURpci5nZXRBYnNvbHV0ZVBhdGgoKSApICk7Ci0gICAgICAgICAgICBpQ29udHJhY3RDbGFzc3BhdGguYXBwZW5kKCBuZXcgUGF0aCggZ2V0UHJvamVjdCgpLCBpbnN0cnVtZW50RGlyLmdldEFic29sdXRlUGF0aCgpICkgKTsKLSAgICAgICAgICAgIGlDb250cmFjdENsYXNzcGF0aC5hcHBlbmQoIG5ldyBQYXRoKCBnZXRQcm9qZWN0KCksIGJ1aWxkRGlyLmdldEFic29sdXRlUGF0aCgpICkgKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZm9ya2VkIGphdmEgcHJvY2VzcwotICAgICAgICAgICAgSmF2YSBpQ29udHJhY3QgPSAoSmF2YSkgcHJvamVjdC5jcmVhdGVUYXNrKCAiamF2YSIgKTsKLSAgICAgICAgICAgIGlDb250cmFjdC5zZXRUYXNrTmFtZSggZ2V0VGFza05hbWUoKSApOwotICAgICAgICAgICAgaUNvbnRyYWN0LnNldEZvcmsoIHRydWUgKTsKLSAgICAgICAgICAgIGlDb250cmFjdC5zZXRDbGFzc25hbWUoICJjb20ucmVsaWFibGVzeXN0ZW1zLmlDb250cmFjdC5Ub29sIiApOwotICAgICAgICAgICAgaUNvbnRyYWN0LnNldENsYXNzcGF0aCggaUNvbnRyYWN0Q2xhc3NwYXRoICk7Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBhcmd1bWVudHMgdG8gaUNvbnRyYWN0Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYXJncyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCBkaXJlY3RpdmVTdHJpbmcoKSApOwotICAgICAgICAgICAgYXJncy5hcHBlbmQoICItdiIgKS5hcHBlbmQoIHZlcmJvc2l0eSApLmFwcGVuZCggIiAiICk7Ci0gICAgICAgICAgICBhcmdzLmFwcGVuZCggIi1iIiApLmFwcGVuZCggIlwiIiApLmFwcGVuZCggaWNDb21waWxlciApLmFwcGVuZCggIiAtY2xhc3NwYXRoICIgKS5hcHBlbmQoIGJlZm9yZUluc3RydW1lbnRhdGlvbkNsYXNzcGF0aCApLmFwcGVuZCggIlwiICIgKTsKLSAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCAiLWMiICkuYXBwZW5kKCAiXCIiICkuYXBwZW5kKCBpY0NvbXBpbGVyICkuYXBwZW5kKCAiIC1jbGFzc3BhdGggIiApLmFwcGVuZCggYWZ0ZXJJbnN0cnVtZW50YXRpb25DbGFzc3BhdGggKS5hcHBlbmQoICIgLWQgIiApLmFwcGVuZCggYnVpbGREaXIgKS5hcHBlbmQoICJcIiAiICk7Ci0gICAgICAgICAgICBhcmdzLmFwcGVuZCggIi1uIiApLmFwcGVuZCggIlwiIiApLmFwcGVuZCggaWNDb21waWxlciApLmFwcGVuZCggIiAtY2xhc3NwYXRoICIgKS5hcHBlbmQoIHJlcG9zaXRvcnlDbGFzc3BhdGggKS5hcHBlbmQoICJcIiAiICk7Ci0gICAgICAgICAgICBhcmdzLmFwcGVuZCggIi1kIiApLmFwcGVuZCggZmFpbFRocm93YWJsZSApLmFwcGVuZCggIiAiICk7Ci0gICAgICAgICAgICBhcmdzLmFwcGVuZCggIi1vIiApLmFwcGVuZCggaW5zdHJ1bWVudERpciApLmFwcGVuZCggRmlsZS5zZXBhcmF0b3IgKS5hcHBlbmQoICJAcCIgKS5hcHBlbmQoIEZpbGUuc2VwYXJhdG9yICkuYXBwZW5kKCAiQGYuQGUgIiApOwotICAgICAgICAgICAgYXJncy5hcHBlbmQoICItayIgKS5hcHBlbmQoIHJlcG9zaXRvcnlEaXIgKS5hcHBlbmQoIEZpbGUuc2VwYXJhdG9yICkuYXBwZW5kKCAiQHAgIiApOwotICAgICAgICAgICAgYXJncy5hcHBlbmQoIHF1aWV0ID8gIi1xICIgOiAiIiApOwotICAgICAgICAgICAgYXJncy5hcHBlbmQoIGluc3RydW1lbnRhbGwgPyAiLWEgIiA6ICIiICk7IC8vIHJlaW5zdHJ1bWVudCBldmVyeXRoaW5nIGlmIGNvbnRyb2xGaWxlIGV4aXN0cyBhbmQgaXMgbmV3ZXIgdGhhbiBhbnkgY2xhc3MKLSAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCAiQCIgKS5hcHBlbmQoIHRhcmdldHMuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICAgICAgICAgIGlDb250cmFjdC5jcmVhdGVBcmcoKS5zZXRMaW5lKCBhcmdzLnRvU3RyaW5nKCkgKTsKLQotLy9TeXN0ZW0ub3V0LnByaW50bG4oICJKQVZBIC1jbGFzc3BhdGggIiArIGlDb250cmFjdENsYXNzcGF0aCArICIgY29tLnJlbGlhYmxlc3lzdGVtcy5pQ29udHJhY3QuVG9vbCAiICsgYXJncy50b1N0cmluZygpICk7Ci0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSBpQ29udHJvbFByb3BlcnRpZXMgaWYgaXQncyBzZXQuCi0gICAgICAgICAgICBpZiggdXBkYXRlSWNvbnRyb2wgKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBpQ29udHJvbFByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICB0cnkgeyAvLyB0byByZWFkIGV4aXN0aW5nIHByb3BlcnRpZXNmaWxlCi0gICAgICAgICAgICAgICAgICAgIGlDb250cm9sUHJvcHMubG9hZCggbmV3IEZpbGVJbnB1dFN0cmVhbSggImljb250cm9sLnByb3BlcnRpZXMiICkgKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgICAgICAgICBsb2coICJGaWxlIGljb250cm9sLnByb3BlcnRpZXMgbm90IGZvdW5kLiBUaGF0J3Mgb2suIFdyaXRpbmcgYSBkZWZhdWx0IG9uZS4iICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlDb250cm9sUHJvcHMuc2V0UHJvcGVydHkoICJzb3VyY2VSb290Iiwgc3JjRGlyLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xQcm9wcy5zZXRQcm9wZXJ0eSggImNsYXNzUm9vdCIsIGNsYXNzRGlyLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xQcm9wcy5zZXRQcm9wZXJ0eSggImNsYXNzcGF0aCIsIGFmdGVySW5zdHJ1bWVudGF0aW9uQ2xhc3NwYXRoLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICBpQ29udHJvbFByb3BzLnNldFByb3BlcnR5KCAiY29udHJvbEZpbGUiLCBjb250cm9sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIGlDb250cm9sUHJvcHMuc2V0UHJvcGVydHkoICJ0YXJnZXRzRmlsZSIsIHRhcmdldHMuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7IC8vIHRvIHJlYWQgZXhpc3RpbmcgcHJvcGVydGllc2ZpbGUKLSAgICAgICAgICAgICAgICAgICAgaUNvbnRyb2xQcm9wcy5zdG9yZSggbmV3IEZpbGVPdXRwdXRTdHJlYW0oICJpY29udHJvbC5wcm9wZXJ0aWVzIiApLCBJQ09OVFJPTF9QUk9QRVJUSUVTX0hFQURFUiApOwotICAgICAgICAgICAgICAgICAgICBsb2coICJVcGRhdGVkIGljb250cm9sLnByb3BlcnRpZXMiICk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCggSU9FeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCAiQ291bGRuJ3Qgd3JpdGUgaWNvbnRyb2wucHJvcGVydGllcy4iICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkbyBpdCEKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBpQ29udHJhY3QuZXhlY3V0ZUphdmEoKTsKLSAgICAgICAgICAgIGlmKCByZXN1bHQgIT0gMCApIHsKLSAgICAgICAgICAgICAgICBpZiggaUNvbnRyYWN0TWlzc2luZyApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCAiaUNvbnRyYWN0IGNhbid0IGJlIGZvdW5kIG9uIHlvdXIgY2xhc3NwYXRoLiBZb3VyIGNsYXNzcGF0aCBpczoiICk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyggY2xhc3NwYXRoLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCAiSWYgeW91IGRvbid0IGhhdmUgdGhlIGlDb250cmFjdCBqYXIsIGdvIGdldCBpdCBhdCBodHRwOi8vd3d3LnJlbGlhYmxlLXN5c3RlbXMuY29tL3Rvb2xzLyIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiaUNvbnRyYWN0IGluc3RydW1lbnRhdGlvbiBmYWlsZWQuIENvZGU9IiArIHJlc3VsdCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7IC8vIG5vdCBkaXJ0eQotICAgICAgICAgICAgLy9sb2coICJOb3RoaW5nIHRvIGRvLiBFdmVyeXRoaW5nIHVwIHRvIGRhdGUuIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgYXJlIHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJlY29uZGl0aW9ucygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmNEaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBsb2NhdGlvbiApOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3JjRGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJzcmNkaXIgXCIiICsgc3JjRGlyLmdldFBhdGgoKSArICJcIiBkb2VzIG5vdCBleGlzdCEiLCBsb2NhdGlvbiApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnN0cnVtZW50RGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggImluc3RydW1lbnRkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGxvY2F0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnlEaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAicmVwb3NpdG9yeWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgbG9jYXRpb24gKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlSWNvbnRyb2wgPT0gdHJ1ZSAmJiBjbGFzc0RpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJjbGFzc2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB1cGRhdGVpY29udHJvbD10cnVlISIsIGxvY2F0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIHVwZGF0ZUljb250cm9sID09IHRydWUgJiYgY29udHJvbEZpbGUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggImNvbnRyb2xmaWxlIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHVwZGF0ZWljb250cm9sPXRydWUhIiwgbG9jYXRpb24gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHdoZXRoZXIgYW55IG9mIHRoZSBzb3VyY2UgZmlsZXMgaGF2ZSBjaGFuZ2VkLiBEb25lIGJ5IGNvbXBhcmluZyBkYXRlIG9mIHNvdXJjZS9jbGFzcyBmaWxlcy4KLSAgICAgKiBUaGUgd2hvbGUgbG90IGlzICJkaXJ0eSIgaWYgYXQgbGVhc3Qgb25lIHNvdXJjZSBmaWxlIG9yIHRoZSBjb250cm9sIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgaW5zdHJ1bWVudGVkCi0gICAgICogZmlsZXMuIElmIG5vdCBkaXJ0eSwgaUNvbnRyYWN0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLgotICAgICAqIDxici8+Ci0gICAgICogQWxzbyBjcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgd2l0aCBhIGxpc3Qgb2YgdGhlIHNvdXJjZSBmaWxlcywgdGhhdCB3aWxsIGJlIGRlbGV0ZWQgdXBvbiBleGl0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzY2FuKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCi0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBudWxsOwotCi0gICAgICAgIGRzID0gZ2V0RGlyZWN0b3J5U2Nhbm5lciggc3JjRGlyICk7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gdGFyZ2V0T3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgUHJpbnRTdHJlYW0gdGFyZ2V0UHJpbnRlciA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gd3JpdGVUYXJnZXRzID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiggdGFyZ2V0cyA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHRhcmdldHMgPSBuZXcgRmlsZSggInRhcmdldHMiICk7Ci0gICAgICAgICAgICAgICAgbG9nKCAiV2FybmluZzogdGFyZ2V0cyBmaWxlIG5vdCBzcGVjaWZpZWQuIGdlbmVyYXRpbmcgZmlsZTogIiArIHRhcmdldHMuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgd3JpdGVUYXJnZXRzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiggIXRhcmdldHMuZXhpc3RzKCkgKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCAiU3BlY2lmaWVkIHRhcmdldHMgZmlsZSBkb2Vzbid0IGV4aXN0LiBnZW5lcmF0aW5nIGZpbGU6ICIgKyB0YXJnZXRzLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgIHdyaXRlVGFyZ2V0cyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiggd3JpdGVUYXJnZXRzICkgewotICAgICAgICAgICAgICAgIGxvZyggIllvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgaUNvbnRyb2wgdG8gY3JlYXRlIGEgdGFyZ2V0IGZpbGUuIiApOwotICAgICAgICAgICAgICAgIHRhcmdldE91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCB0YXJnZXRzICk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0UHJpbnRlciA9IG5ldyBQcmludFN0cmVhbSggdGFyZ2V0T3V0cHV0U3RyZWFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0RpciwgZmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lbmRzV2l0aCgiLmphdmEiKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBwcmludCB0aGUgdGFyZ2V0LCB3aGlsZSB3ZSdyZSBhdCBoZXJlLiAoT25seSBpZiBnZW5lcmF0ZXRhcmdldD10cnVlKS4KLSAgICAgICAgICAgICAgICAgICAgaWYoIHRhcmdldFByaW50ZXIgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByaW50ZXIucHJpbnRsbiggc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgY2xhc3NGaWxlID0gbmV3IEZpbGUoIGJ1aWxkRGlyLCBmaWxlc1tpXS5zdWJzdHJpbmcoIDAsIGZpbGVzW2ldLmluZGV4T2YoICIuamF2YSIgKSApICsgIi5jbGFzcyIgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IG5vdykgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBmaWxlIG1vZGlmaWVkIGluIHRoZSBmdXR1cmU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzW2ldLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghY2xhc3NGaWxlLmV4aXN0cygpIHx8IHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPiBjbGFzc0ZpbGUubGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9nKCAiRm91bmQgYSBmaWxlIG5ld2VyIHRoYW4gdGhlIGluc3RydW1lbnREaXIgY2xhc3MgZmlsZTogIiArIHNyY0ZpbGUuZ2V0UGF0aCgpICsgIiBuZXdlciB0aGFuICIgKyBjbGFzc0ZpbGUuZ2V0UGF0aCgpICsgIi4gUnVubmluZyBpQ29udHJhY3QgYWdhaW4uLi4iICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiggdGFyZ2V0UHJpbnRlciAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIHRhcmdldFByaW50ZXIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB0YXJnZXRQcmludGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goIElPRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJDb3VsZCBub3QgY3JlYXRlIHRhcmdldCBmaWxlOiIgKyBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWxzbywgY2hlY2sgY29udHJvbEZpbGUgdGltZXN0YW1wCi0gICAgICAgIGxvbmcgY29udHJvbEZpbGVUaW1lID0gLTE7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiggY29udHJvbEZpbGUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBpZiggY29udHJvbEZpbGUuZXhpc3RzKCkgJiYgYnVpbGREaXIuZXhpc3RzKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWxlVGltZSA9IGNvbnRyb2xGaWxlLmxhc3RNb2RpZmllZCgpOwotICAgICAgICAgICAgICAgICAgICBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoIGJ1aWxkRGlyICk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoIHNyY0RpciwgZmlsZXNbaV0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlc1tpXS5lbmRzV2l0aCggIi5jbGFzcyIgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY29udHJvbEZpbGVUaW1lID4gc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFkaXJ0eSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyggIkNvbnRyb2wgZmlsZSAiICsgY29udHJvbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGhhcyBiZWVuIHVwZGF0ZWQuIEluc3RydW1lbnRpbmcgYWxsIGZpbGVzLi4uIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGFsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoKCBUaHJvd2FibGUgdCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIkdvdCBhbiBpbnRlcmVzdGluZyBleGNlcHRpb246IiArIHQuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIC1tIG9wdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWVzIG9mIGNvbnRyb2xGaWxlLCBwcmUsIHBvc3QgYW5kIGludmFyaWFudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkaXJlY3RpdmVTdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYm9vbGVhbiBjb21tYSA9IGZhbHNlOwotCi0gICAgICAgIGJvb2xlYW4gdXNlQ29udHJvbEZpbGUgPSAoY29udHJvbEZpbGUgIT0gbnVsbCkgJiYgY29udHJvbEZpbGUuZXhpc3RzKCk7Ci0gICAgICAgIGlmKCB1c2VDb250cm9sRmlsZSB8fCBwcmUgfHwgcG9zdCB8fCBpbnZhcmlhbnQgKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICItbSIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiggdXNlQ29udHJvbEZpbGUgKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICJAIiApLmFwcGVuZCggY29udHJvbEZpbGUgKTsKLSAgICAgICAgICAgIGNvbW1hID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiggcHJlICkgewotICAgICAgICAgICAgaWYoIGNvbW1hICkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIiwiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICJwcmUiICk7Ci0gICAgICAgICAgICBjb21tYSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIHBvc3QgKSB7Ci0gICAgICAgICAgICBpZiggY29tbWEgKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiLCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggInBvc3QiICk7Ci0gICAgICAgICAgICBjb21tYSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIGludmFyaWFudCApIHsKLSAgICAgICAgICAgIGlmKCBjb21tYSApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIsIiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCAiaW52IiApOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZCggIiAiICk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkTGlzdGVuZXIgdGhhdCBzZXRzIHRoZSBpQ29udHJhY3RNaXNzaW5nIGZsYWcgdG8gdHJ1ZSBpZiBhCi0gICAgICogbWVzc2FnZSBhYm91dCBtaXNzaW5nIGlDb250cmFjdCBpcyBtaXNzaW5nLiBVc2VkIHRvIGluZGljYXRlCi0gICAgICogYSBtb3JlIHZlcmJvc2UgZXJyb3IgdG8gdGhlIHVzZXIsIHdpdGggYWR2aWNlIGFib3V0IGhvdyB0byBzb2x2ZQotICAgICAqIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBJQ29udHJhY3RQcmVzZW5jZURldGVjdG9yIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KLSAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYoICJqYXZhLmxhbmcuTm9DbGFzc0RlZkZvdW5kRXJyb3I6IGNvbS9yZWxpYWJsZXN5c3RlbXMvaUNvbnRyYWN0L1Rvb2wiLmVxdWFscyggZXZlbnQuZ2V0TWVzc2FnZSgpICkgKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyYWN0TWlzc2luZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KLSAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQotICAgICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KLSAgICAgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkge30KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIGlzIGEgaGVscGVyIHRvIHNldCBjb3JyZWN0IGNsYXNzcGF0aCBmb3Igb3RoZXIgY29tcGlsZXJzLCBsaWtlIEppa2VzLgotICAgICAqIEl0IHJldXNlcyB0aGUgbG9naWMgZnJvbSBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyLCB3aGljaCBpcyBwcm90ZWN0ZWQsIHNvIHdlIGhhdmUKLSAgICAgKiB0byBzdWJjbGFzcyBpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIENsYXNzcGF0aEhlbHBlciBleHRlbmRzIERlZmF1bHRDb21waWxlckFkYXB0ZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb21waWxlcjsKLSAgICAgICAgcHVibGljIENsYXNzcGF0aEhlbHBlciggU3RyaW5nIGNvbXBpbGVyICkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMuY29tcGlsZXIgPSBjb21waWxlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2UgaXQgcHVibGljCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeSggUGF0aCBwYXRoICkgewotICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHdoYXQgY29tcGlsZXIgdG8gdXNlLCBzZXQgdGhlIGluY2x1ZGVKYXZhUnVudGltZSBmbGFnCi0gICAgICAgICAgICBpZiggImppa2VzIi5lcXVhbHMoIGNvbXBpbGVyICkgKSB7Ci0gICAgICAgICAgICAgICAgaWNDb21waWxlciA9IGNvbXBpbGVyOwotICAgICAgICAgICAgICAgIGluY2x1ZGVKYXZhUnVudGltZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQoIGdldENvbXBpbGVDbGFzc3BhdGgoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtbXkgaW1wbGVtZW50YXRpb24uIE5ldmVyIGNhbGxlZAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRKYXZhYyggSmF2YWMgamF2YWMgKSB7fQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgeyByZXR1cm4gdHJ1ZTsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0phdmFoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9KYXZhaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTMyZTU4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0phdmFoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUYXNrIHRvIGdlbmVyYXRlIEpOSSBoZWFkZXIgZmlsZXMgdXNpbmcgamF2YWguIFRoaXMgdGFzayBjYW4gdGFrZSB0aGUgZm9sbG93aW5nCi0gKiBhcmd1bWVudHM6Ci0gKiA8dWw+Ci0gKiA8bGk+Y2xhc3NuYW1lIC0gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3M8L2xpPgotICogPGxpPm91dHB1dEZpbGUgLSBDb25jYXRlbmF0ZXMgdGhlIHJlc3VsdGluZyBoZWFkZXIgb3Igc291cmNlIGZpbGVzIGZvciBhbGwKLSAqICAgICB0aGUgY2xhc3NlcyBsaXN0ZWQgaW50byB0aGlzIGZpbGU8L2xpPgotICogPGxpPmRlc3RkaXIgLSBTZXRzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgamF2YWggc2F2ZXMgdGhlIGhlYWRlciBmaWxlcyBvciB0aGUKLSAqICAgICBzdHViIGZpbGVzPC9saT4KLSAqIDxsaT5jbGFzc3BhdGg8L2xpPgotICogPGxpPmJvb3RjbGFzc3BhdGg8L2xpPgotICogPGxpPmZvcmNlIC0gU3BlY2lmaWVzIHRoYXQgb3V0cHV0IGZpbGVzIHNob3VsZCBhbHdheXMgYmUgd3JpdHRlbgotICAgICAgIChKREsxLjIgb25seSk8L2xpPgotICogPGxpPm9sZCAtIFNwZWNpZmllcyB0aGF0IG9sZCBKREsxLjAtc3R5bGUgaGVhZGVyIGZpbGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQKLSAqICAgICAob3RoZXJ3aXNlIG91dHB1dCBmaWxlIGNvbnRhaW4gSk5JLXN0eWxlIG5hdGl2ZSBtZXRob2QKLSAqICAgICAgZnVuY3Rpb24gcHJvdG90eXBlcykgKEpESzEuMiBvbmx5KTwvbGk+Ci0gKiA8bGk+c3R1YnMgLSBnZW5lcmF0ZSBDIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBKYXZhIG9iamVjdCBmaWxlICh1c2VkIHdpdGggb2xkKTwvbGk+Ci0gKiA8bGk+dmVyYm9zZSAtIGNhdXNlcyBqYXZhaCB0byBwcmludCBhIG1lc3NhZ2UgdG8gc3Rkb3V0IGNvbmNlcm5pbmcgdGhlIHN0YXR1cwotICogICAgIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXM8L2xpPgotICogPGxpPmV4dGRpcnMgLSBPdmVycmlkZSBsb2NhdGlvbiBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9uczwvbGk+Ci0gKiA8L3VsPgotICogT2YgdGhlc2UgYXJndW1lbnRzLCBlaXRoZXIgPGI+b3V0cHV0RmlsZTwvYj4gb3IgPGI+ZGVzdGRpcjwvYj4gaXMgcmVxdWlyZWQsCi0gKiBidXQgbm90IGJvdGguIE1vcmUgdGhhbiBvbmUgY2xhc3NuYW1lIG1heSBiZSBzcGVjaWZpZWQsIHVzaW5nIGEgY29tbWEtc2VwYXJhdGVkCi0gKiBsaXN0IG9yIGJ5IHVzaW5nIDxjb2RlPiZsdDtjbGFzcyBuYW1lPSJ4eHgiJmd0OzwvY29kZT4gZWxlbWVudHMgd2l0aGluIHRoZSB0YXNrLgotICogPHA+Ci0gKiBXaGVuIHRoaXMgdGFzayBleGVjdXRlcywgaXQgd2lsbCBnZW5lcmF0ZSBDIGhlYWRlciBhbmQgc291cmNlIGZpbGVzIHRoYXQKLSAqIGFyZSBuZWVkZWQgdG8gaW1wbGVtZW50IG5hdGl2ZSBtZXRob2RzLgotICoKLSAqIEBhdXRob3IgUmljayBCZXRvbiA8YSBocmVmPSJtYWlsdG86cmljaGFyZC5iZXRvbkBwaHlzaWNzLm9yZyI+cmljaGFyZC5iZXRvbkBwaHlzaWNzLm9yZzwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSmF2YWggZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMX01TRyA9ICJDb21waWxlIGZhaWxlZCwgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBwcm92aWRlZC4iOwotCi0gICAgcHJpdmF0ZSBWZWN0b3IgY2xhc3NlcyA9IG5ldyBWZWN0b3IoMik7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2xzOwotICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOwotICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGggPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXRGaWxlID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZSAgID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG9sZCAgICAgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc3R1YnMgICA9IGZhbHNlOwotICAgIHByaXZhdGUgUGF0aCBib290Y2xhc3NwYXRoOwotICAgIC8vcHJpdmF0ZSBQYXRoIGV4dGRpcnM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgY2xzKSB7Ci0gICAgICAgIHRoaXMuY2xzID0gY2xzOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0FyZ3VtZW50IGNyZWF0ZUNsYXNzKCkgewotICAgICAgICBDbGFzc0FyZ3VtZW50IGdhID0gbmV3IENsYXNzQXJndW1lbnQoKTsKLSAgICAgICAgY2xhc3Nlcy5hZGRFbGVtZW50KGdhKTsKLSAgICAgICAgcmV0dXJuIGdhOwotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBDbGFzc0FyZ3VtZW50IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgICAgICBwdWJsaWMgQ2xhc3NBcmd1bWVudCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICBsb2coIkNsYXNzQXJndW1lbnQubmFtZT0iK25hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKYXZhIHNvdXJjZQotICAgICAqIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKEZpbGUgZGVzdERpcikgewotICAgICAgICB0aGlzLmRlc3REaXIgPSBkZXN0RGlyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIHNyYykgewotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IHNyYzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoc3JjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKLSAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Qm9vdGNsYXNzcGF0aChQYXRoIHNyYykgewotICAgICAgICBpZiAoYm9vdGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBib290Y2xhc3NwYXRoID0gc3JjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vdGNsYXNzcGF0aC5hcHBlbmQoc3JjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVCb290Y2xhc3NwYXRoKCkgewotICAgICAgICBpZiAoYm9vdGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBib290Y2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJvb3RjbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBDTEFTU1BBVEggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Qm9vdENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVCb290Y2xhc3NwYXRoKCkuc2V0UmVmaWQocik7Ci0gICAgfQotCi0gICAgLy8vKioKLSAgICAvLyAqIFNldHMgdGhlIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCi0gICAgLy8gKiBjb21waWxhdGlvbi4KLSAgICAvLyAqLwotICAgIC8vcHVibGljIHZvaWQgc2V0RXh0ZGlycyhQYXRoIGV4dGRpcnMpIHsKLSAgICAvLyAgICBpZiAodGhpcy5leHRkaXJzID09IG51bGwpIHsKLSAgICAvLyAgICAgICAgdGhpcy5leHRkaXJzID0gZXh0ZGlyczsKLSAgICAvLyAgICB9IGVsc2UgewotICAgIC8vICAgICAgICB0aGlzLmV4dGRpcnMuYXBwZW5kKGV4dGRpcnMpOwotICAgIC8vICAgIH0KLSAgICAvL30KLQotICAgIC8vLyoqCi0gICAgLy8gKiBNYXliZSBjcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LgotICAgIC8vICovCi0gICAgLy9wdWJsaWMgUGF0aCBjcmVhdGVFeHRkaXJzKCkgewotICAgIC8vICAgIGlmIChleHRkaXJzID09IG51bGwpIHsKLSAgICAvLyAgICAgICAgZXh0ZGlycyA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgIC8vICAgIH0KLSAgICAvLyAgICByZXR1cm4gZXh0ZGlycy5jcmVhdGVQYXRoKCk7Ci0gICAgLy99Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RmlsZShGaWxlIG91dHB1dEZpbGUpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlID0gb3V0cHV0RmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZvcmNlLXdyaXRlIGZsYWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yY2UoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICB0aGlzLmZvcmNlID0gZm9yY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvbGQgZmxhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGQoYm9vbGVhbiBvbGQpIHsKLSAgICAgICAgdGhpcy5vbGQgPSBvbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzdHVicyBmbGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0dWJzKGJvb2xlYW4gc3R1YnMpIHsKLSAgICAgICAgdGhpcy5zdHVicyA9IHN0dWJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmVyYm9zZSBmbGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgc3JjZGlyCi0KLSAgICAgICAgaWYgKChjbHMgPT0gbnVsbCkgJiYgKGNsYXNzZXMuc2l6ZSgpID09IDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNsYXNzIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGNscyAhPSBudWxsKSAmJiAoY2xhc3Nlcy5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzZXQgY2xhc3MgYXR0cmlidXRlIG9yIGNsYXNzIGVsZW1lbnQsIG5vdCBib3RoLiIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghZGVzdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0aW5hdGlvbiBkaXJlY3RvcnkgXCIiICsgZGVzdERpciArICJcIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3V0cHV0RmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0ZGlyIGFuZCBvdXRwdXRGaWxlIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IFBhdGguc3lzdGVtQ2xhc3NwYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbXBpbGVyID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiKTsKLSAgICAgICAgaWYgKGNvbXBpbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChQcm9qZWN0LmdldEphdmFWZXJzaW9uKCkgIT0gUHJvamVjdC5KQVZBXzFfMSAmJgotICAgICAgICAgICAgICAgIFByb2plY3QuZ2V0SmF2YVZlcnNpb24oKSAhPSBQcm9qZWN0LkpBVkFfMV8yKSB7Ci0gICAgICAgICAgICAgICAgY29tcGlsZXIgPSAibW9kZXJuIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29tcGlsZXIgPSAiY2xhc3NpYyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkb0NsYXNzaWNDb21waWxlKCk7Ci0gICAgfQotCi0gICAgLy8gWFhYCi0gICAgLy8gd2UgbmVlZCBhIHdheSB0byBub3QgdXNlIHRoZSBjdXJyZW50IGNsYXNzcGF0aC4KLQotICAgIC8qKgotICAgICAqIFBlZm9ybXMgYSBjb21waWxlIHVzaW5nIHRoZSBjbGFzc2ljIGNvbXBpbGVyIHRoYXQgc2hpcHBlZCB3aXRoCi0gICAgICogSkRLIDEuMSBhbmQgMS4yLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIGRvQ2xhc3NpY0NvbXBpbGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBzZXR1cEphdmFoQ29tbWFuZCgpOwotCi0gICAgICAgIC8vIFVzZSByZWZsZWN0aW9uIHRvIGJlIGFibGUgdG8gYnVpbGQgb24gYWxsIEpES3MKLSAgICAgICAgLyoKLSAgICAgICAgLy8gcHJvdmlkZSB0aGUgY29tcGlsZXIgYSBkaWZmZXJlbnQgbWVzc2FnZSBzaW5rIC0gbmFtZWx5IG91ciBvd24KLSAgICAgICAgc3VuLnRvb2xzLmphdmFjLk1haW4gY29tcGlsZXIgPQotICAgICAgICAgICAgICAgIG5ldyBzdW4udG9vbHMuamF2YWMuTWFpbihuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX1dBUk4pLCAiamF2YWMiKTsKLQotICAgICAgICBpZiAoIWNvbXBpbGVyLmNvbXBpbGUoY21kLmdldEFyZ3VtZW50cygpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb21waWxlIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBKYXZhYyB1c2VzIGxvZ3N0ciB0byBjaGFuZ2UgdGhlIG91dHB1dCBzdHJlYW0gYW5kIGNhbGxzCi0gICAgICAgICAgICAvLyB0aGUgY29uc3RydWN0b3IncyBpbnZva2UgbWV0aG9kIHRvIGNyZWF0ZSBhIGNvbXBpbGVyIGluc3RhbmNlCi0gICAgICAgICAgICAvLyBkeW5hbWljYWxseS4gSG93ZXZlciwgamF2YWggaGFzIGEgZGlmZmVyZW50IGludGVyZmFjZSBhbmQgdGhpcwotICAgICAgICAgICAgLy8gbWFrZXMgaXQgaGFyZGVyLCBzbyBoZXJlJ3MgYSBzaW1wbGUgYWx0ZXJuYXRpdmUuCi0gICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgY29tLnN1bi50b29scy5qYXZhaC5NYWluIG1haW4gPSBuZXcgY29tLnN1bi50b29scy5qYXZhaC5NYWluKCBjbWQuZ2V0QXJndW1lbnRzKCkgKTsKLSAgICAgICAgICAgIG1haW4ucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9jYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAvLyAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCB1c2UgamF2YWggYmVjYXVzZSBpdCBpcyBub3QgYXZhaWxhYmxlIisKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQSBjb21tb24gc29sdXRpb24gaXMgdG8gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSIrCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEpBVkFfSE9NRSB0byB5b3VyIGpkayBkaXJlY3RvcnkuIiwgbG9jYXRpb24pOwotICAgICAgICAvL30KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHN0YXJ0aW5nIGphdmFoOiAiLCBleCwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NpbmcgY29tbW9uIHRvIGNsYXNzaWMgYW5kCi0gICAgICogbW9kZXJuLgotICAgICAqLwotICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgc2V0dXBKYXZhaENvbW1hbmQoKSB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOwotCi0gICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZCIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShkZXN0RGlyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRwdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbyIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShvdXRwdXRGaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEpESzEuMSBpcyByYXRoZXIgc2ltcGxlciB0aGFuIEpESzEuMgotICAgICAgICBpZiAoUHJvamVjdC5nZXRKYXZhVmVyc2lvbigpLnN0YXJ0c1dpdGgoIjEuMSIpKSB7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXZlcmJvc2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvbGQpIHsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW9sZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvcmNlKSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1mb3JjZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0dWJzKSB7Ci0gICAgICAgICAgICBpZiAoIW9sZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3R1YnMgb25seSBhdmFpbGFibGUgaW4gb2xkIG1vZGUuIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zdHVicyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChib290Y2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYm9vdGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChib290Y2xhc3NwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKGNtZCk7Ci0gICAgICAgIHJldHVybiBjbWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyB0aGUgY29tcGlsYXRpb24gcGFyYW1ldGVycywgYWRkcyB0aGUgZmlsZXMgdG8gY29tcGlsZSBhbmQgbG9ncyB0aGUKLSAgICAgKiAmcW91dDtuaWNlU291cmNlTGlzdCZxdW90OwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpbnQgbiA9IDA7Ci0gICAgICAgIGxvZygiQ29tcGlsYXRpb24gYXJnczogIiArIGNtZC50b1N0cmluZygpLAotICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIG5pY2VDbGFzc0xpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmIChjbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xzLCAiLCIsIGZhbHNlKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFDbGFzcyA9IHRvay5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYUNsYXNzKTsKLSAgICAgICAgICAgICAgICBuaWNlQ2xhc3NMaXN0LmFwcGVuZCgiICAgICIgKyBhQ2xhc3MgKyBsU2VwKTsKLSAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gY2xhc3Nlcy5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgQ2xhc3NBcmd1bWVudCBhcmcgPSAoQ2xhc3NBcmd1bWVudCllbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgYUNsYXNzID0gYXJnLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFDbGFzcyk7Ci0gICAgICAgICAgICBuaWNlQ2xhc3NMaXN0LmFwcGVuZCgiICAgICIgKyBhQ2xhc3MgKyBsU2VwKTsKLSAgICAgICAgICAgIG4rKzsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCJDbGFzcyIpOwotICAgICAgICBpZiAobiA+IDEpIHsKLSAgICAgICAgICAgIHByZWZpeC5hcHBlbmQoImVzIik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZml4LmFwcGVuZCgiIHRvIGJlIGNvbXBpbGVkOiIpOwotICAgICAgICBwcmVmaXguYXBwZW5kKGxTZXApOwotCi0gICAgICAgIGxvZyhwcmVmaXgudG9TdHJpbmcoKSArIG5pY2VDbGFzc0xpc3QudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OYXRpdmUyQXNjaWkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05hdGl2ZTJBc2NpaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBhMzY0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05hdGl2ZTJBc2NpaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLio7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQ29udmVydCBmaWxlcyBmcm9tIG5hdGl2ZSBlbmNvZGluZ3MgdG8gYXNjaWkuCi0gKgotICogQGF1dGhvciBEcmV3IFN1ZGVsbCA8YXN1ZGVsbEBhY20ub3JnPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTmF0aXZlMkFzY2lpIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiByZXZlcnNlID0gZmFsc2U7ICAvLyBjb252ZXJ0IGZyb20gYXNjaWkgYmFjayB0byBuYXRpdmUKLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IG51bGw7ICAgLy8gZW5jb2RpbmcgdG8gY29udmVydCB0by9mcm9tCi0gICAgcHJpdmF0ZSBGaWxlIHNyY0RpciA9IG51bGw7ICAgICAgIC8vIFdoZXJlIHRvIGZpbmQgaW5wdXQgZmlsZXMKLSAgICBwcml2YXRlIEZpbGUgZGVzdERpciA9IG51bGw7ICAgICAgLy8gV2hlcmUgdG8gcHV0IG91dHB1dCBmaWxlcwotICAgIHByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbiA9IG51bGw7ICAvLyBFeHRlbnNpb24gb2Ygb3V0cHV0IGZpbGVzIGlmIGRpZmZlcmVudAotCi0gICAgcHJpdmF0ZSBNYXBwZXIgbWFwcGVyOwotCi0gICAgLyoqCi0gICAgICogRmxhZyB0aGUgY29udmVyc2lvbiB0byBydW4gaW4gdGhlIHJldmVyc2Ugc2Vuc2UsCi0gICAgICogdGhhdCBpcyBBc2NpaSB0byBOYXRpdmUgZW5jb2RpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJldmVyc2UgVHJ1ZSBpZiB0aGUgY29udmVyc2lvbiBpcyB0byBiZSByZXZlcnNlZCwKLSAgICAgKiAgICAgICAgICAgICAgICBvdGhlcndpc2UgZmFsc2U7Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmV2ZXJzZShib29sZWFuIHJldmVyc2UpewotICAgICAgICB0aGlzLnJldmVyc2UgPSByZXZlcnNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW5jb2RpbmcgdG8gdHJhbnNsYXRlIHRvL2Zyb20uCi0gICAgICogSWYgdW5zZXQsIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgSlZNIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIE5hdGl2ZSAKLSAgICAgKiAgICAgICAgICAgICAgICAgZW5jb2RpbmcgdG8gY29udmVydCBmcm9tIG9yIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZyl7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gZmluZCBmaWxlcyB0byBjb252ZXJ0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNyY0RpciBEaXJlY3JvcnkgdG8gZmluZCBpbnB1dCBmaWxlIGluLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIHNyY0Rpcil7Ci0gICAgICAgIHRoaXMuc3JjRGlyID0gc3JjRGlyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJjdG9yeSB0byBwbGFjZSBjb252ZXJ0ZWQgZmlsZXMgaW50by4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXN0RGlyIGRpcmVjdG9yeSB0byBwbGFjZSBvdXRwdXQgZmlsZSBpbnRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkZXN0RGlyKXsKLSAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGV4dGVuc2lvbiB3aGljaCBjb252ZXJ0ZWQgZmlsZXMgc2hvdWxkIGhhdmUuCi0gICAgICogSWYgdW5zZXQsIGZpbGVzIHdpbGwgbm90IGJlIHJlbmFtZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0IEZpbGUgZXh0ZW5zaW9uIHRvIHVzZSBmb3IgY29udmVydGVkIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4dChTdHJpbmcgZXh0KXsKLSAgICAgICAgdGhpcy5leHRlbnNpb24gPSBleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUgRmlsZU5hbWVNYXBwZXIgdG8gdXNlIChuZXN0ZWQgbWFwcGVyIGVsZW1lbnQpLgotICAgICAqLwotICAgIHB1YmxpYyBNYXBwZXIgY3JlYXRlTWFwcGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSBtYXBwZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBtYXBwZXIgPSBuZXcgTWFwcGVyKHByb2plY3QpOwotICAgICAgICByZXR1cm4gbWFwcGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIENvbW1hbmRsaW5lIGJhc2VDbWQgPSBudWxsOyAgICAgIC8vIHRoZSBjb21tb24gcG9ydGlvbiBvZiBvdXIgY21kIGxpbmUKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbnVsbDsgLy8gU2Nhbm5lciB0byBmaW5kIG91ciBpbnB1dHMKLSAgICAgICAgU3RyaW5nW10gZmlsZXM7ICAgICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBmaWxlcyB0byBwcm9jZXNzCi0KLSAgICAgICAgLy8gZGVmYXVsdCBzcmNEaXIgdG8gYmFzZWRpcgotICAgICAgICBpZiAoc3JjRGlyID09IG51bGwpewotICAgICAgICAgICAgc3JjRGlyID0gcHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVxdWlyZSBkZXN0RGlyCi0gICAgICAgIGlmIChkZXN0RGlyID09IG51bGwpewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBzcmMgYW5kIGRlc3QgZGlycyBhcmUgdGhlIHNhbWUsIHJlcXVpcmUgdGhlIGV4dGVuc2lvbgotICAgICAgICAvLyB0byBiZSBzZXQsIHNvIHdlIGRvbid0IHN0b21wIGV2ZXJ5IGZpbGUuICBPbmUgY291bGQgc3RpbGwKLSAgICAgICAgLy8gaW5jbHVkZSBhIGZpbGUgd2l0aCB0aGUgc2FtZSBleHRlbnNpb24sIGJ1dCAuLi4uCi0gICAgICAgIGlmIChzcmNEaXIuZXF1YWxzKGRlc3REaXIpICYmIGV4dGVuc2lvbiA9PSBudWxsICYmIG1hcHBlciA9PSBudWxsKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGV4dCBhdHRyaWJ1dGUgb3IgYSBtYXBwZXIgbXVzdCBiZSBzZXQgaWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNyYyBhbmQgZGVzdCBkaXJzIGFyZSB0aGUgc2FtZS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGVOYW1lTWFwcGVyIG0gPSBudWxsOwotICAgICAgICBpZiAobWFwcGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG0gPSBuZXcgSWRlbnRpdHlNYXBwZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbSA9IG5ldyBFeHRNYXBwZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG0gPSBtYXBwZXIuZ2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2Nhbm5lciA9IGdldERpcmVjdG9yeVNjYW5uZXIoc3JjRGlyKTsKLSAgICAgICAgZmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOwotICAgICAgICBmaWxlcyA9IHNmcy5yZXN0cmljdChmaWxlcywgc3JjRGlyLCBkZXN0RGlyLCBtKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXMubGVuZ3RoOwotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkNvbnZlcnRpbmcgIisgY291bnQgKyAiIGZpbGUiCi0gICAgICAgICAgICArIChjb3VudCAhPSAxID8gInMiIDogIiIpICsgIiBmcm9tICI7Ci0gICAgICAgIGxvZyhtZXNzYWdlICsgc3JjRGlyICsgIiB0byAiICsgZGVzdERpcik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspewotICAgICAgICAgICAgY29udmVydChmaWxlc1tpXSwgbS5tYXBGaWxlTmFtZShmaWxlc1tpXSlbMF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIHNpbmdsZSBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIE5hbWUgb2YgdGhlIGZpbGUgdG8gY29udmVydCAocmVsYXRpdmUgdG8gc3JjRGlyKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29udmVydChTdHJpbmcgc3JjTmFtZSwgU3RyaW5nIGRlc3ROYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOyAgLy8gQ29tbWFuZCBsaW5lIHRvIHJ1bgotICAgICAgICBGaWxlIHNyY0ZpbGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgdG8gY29udmVydAotICAgICAgICBGaWxlIGRlc3RGaWxlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0cwotCi0gICAgICAgIC8vIFNldCB1cCB0aGUgYmFzaWMgYXJncyAodGhpcyBjb3VsZCBiZSBkb25lIG9uY2UsIGJ1dAotICAgICAgICAvLyBpdCdzIGNsZWFuZXIgaGVyZSkKLSAgICAgICAgaWYgKHJldmVyc2UpewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1yZXZlcnNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCl7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVuY29kaW5nIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShlbmNvZGluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCdWlsZCB0aGUgZnVsbCBmaWxlIG5hbWVzCi0gICAgICAgIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIHNyY05hbWUpOwotICAgICAgICBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsIGRlc3ROYW1lKTsKLQotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKHNyY0ZpbGUpOwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGRlc3RGaWxlKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBhYm91dCB0byBjbG9iYmVyIHNvbWV0aGluZwotICAgICAgICBpZiAoc3JjRmlsZS5lcXVhbHMoZGVzdEZpbGUpKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZSAiICsgc3JjRmlsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd291bGQgb3ZlcndyaXRlIGl0cyBzZWxmIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyBpZiBuZWVkZWQKLSAgICAgICAgLy8gWFhYIEpESyAxLjEgZG9zZW4ndCBoYXZlIEZpbGUuZ2V0UGFyZW50RmlsZSwKLSAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSBkZXN0RmlsZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKHBhcmVudE5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICBGaWxlIHBhcmVudEZpbGUgPSBuZXcgRmlsZShwYXJlbnROYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCghIHBhcmVudEZpbGUuZXhpc3RzKCkpICYmICggISBwYXJlbnRGaWxlLm1rZGlycygpKSl7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjYW5ub3QgY3JlYXRlIHBhcmVudCBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmVudE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbG9nKCJjb252ZXJ0aW5nICIgKyBzcmNOYW1lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgc3VuLnRvb2xzLm5hdGl2ZTJhc2NpaS5NYWluIG4yYQotICAgICAgICAgICAgPSBuZXcgc3VuLnRvb2xzLm5hdGl2ZTJhc2NpaS5NYWluKCk7Ci0gICAgICAgIGlmKCEgbjJhLmNvbnZlcnQoY21kLmdldEFyZ3VtZW50cygpKSl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvbnZlcnNpb24gZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEV4dE1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBzKSB7fQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgcykge30KLQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgICAgICBpbnQgbGFzdERvdCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICBpZiAobGFzdERvdCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpICsgZXh0ZW5zaW9ufTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWUgKyBleHRlbnNpb259OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmV0UmV4eEMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05ldFJleHhDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmQ5MDkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmV0UmV4eEMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG5ldHJleHgubGFuZy5SZXh4OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuKjsKLQotLyoqCi0gKiBUYXNrIHRvIGNvbXBpbGUgTmV0UmV4eCBzb3VyY2UgZmlsZXMuIFRoaXMgdGFzayBjYW4gdGFrZSB0aGUgZm9sbG93aW5nCi0gKiBhcmd1bWVudHM6Ci0gKiA8dWw+Ci0gKiA8bGk+YmluYXJ5PC9saT4KLSAqIDxsaT5jbGFzc3BhdGg8L2xpPgotICogPGxpPmNvbW1lbnRzPC9saT4KLSAqIDxsaT5jb21waWxlPC9saT4KLSAqIDxsaT5jb25zb2xlPC9saT4KLSAqIDxsaT5jcm9zc3JlZjwvbGk+Ci0gKiA8bGk+ZGVjaW1hbDwvbGk+Ci0gKiA8bGk+ZGVzdGRpcjwvbGk+Ci0gKiA8bGk+ZGlhZzwvbGk+Ci0gKiA8bGk+ZXhwbGljaXQ8L2xpPgotICogPGxpPmZvcm1hdDwvbGk+Ci0gKiA8bGk+a2VlcDwvbGk+Ci0gKiA8bGk+bG9nbzwvbGk+Ci0gKiA8bGk+cmVwbGFjZTwvbGk+Ci0gKiA8bGk+c2F2ZWxvZzwvbGk+Ci0gKiA8bGk+c3JjZGlyPC9saT4KLSAqIDxsaT5zb3VyY2VkaXI8L2xpPgotICogPGxpPnN0cmljdGFyZ3M8L2xpPgotICogPGxpPnN0cmljdGFzc2lnbjwvbGk+Ci0gKiA8bGk+c3RyaWN0Y2FzZTwvbGk+Ci0gKiA8bGk+c3RyaWN0aW1wb3J0PC9saT4KLSAqIDxsaT5zeW1ib2xzPC9saT4KLSAqIDxsaT50aW1lPC9saT4KLSAqIDxsaT50cmFjZTwvbGk+Ci0gKiA8bGk+dXRmODwvbGk+Ci0gKiA8bGk+dmVyYm9zZTwvbGk+Ci0gKiA8L3VsPgotICogT2YgdGhlc2UgYXJndW1lbnRzLCB0aGUgPGI+c3JjZGlyPC9iPiBhcmd1bWVudCBpcyByZXF1aXJlZC4KLSAqCi0gKiA8cD5XaGVuIHRoaXMgdGFzayBleGVjdXRlcywgaXQgd2lsbCByZWN1cnNpdmVseSBzY2FuIHRoZSBzcmNkaXIKLSAqIGxvb2tpbmcgZm9yIE5ldFJleHggc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuIFRoaXMgdGFzayBtYWtlcyBpdHMKLSAqIGNvbXBpbGUgZGVjaXNpb24gYmFzZWQgb24gdGltZXN0YW1wLgotICogPHA+QmVmb3JlIGZpbGVzIGFyZSBjb21waWxlZCB0aGV5IGFuZCBhbnkgb3RoZXIgZmlsZSBpbiB0aGUKLSAqIHNyY2RpciB3aWxsIGJlIGNvcGllZCB0byB0aGUgZGVzdGRpciBhbGxvd2luZyBzdXBwb3J0IGZpbGVzIHRvIGJlCi0gKiBsb2NhdGVkIHByb3Blcmx5IGluIHRoZSBjbGFzc3BhdGguIFRoZSByZWFzb24gZm9yIGNvcHlpbmcgdGhlIHNvdXJjZSBmaWxlcwotICogYmVmb3JlIHRoZSBjb21waWxlIGlzIHRoYXQgTmV0UmV4eEMgaGFzIG9ubHkgdHdvIGRlc3RpbmF0aW9ucyBmb3IgY2xhc3NmaWxlczoKLSAqIDxvbD4KLSAqIDxsaT5UaGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCw8L2xpPgotICogPGxpPlRoZSBkaXJlY3RvcnkgdGhlIHNvdXJjZSBpcyBpbiAoc2VlIHNvdXJjZWRpciBvcHRpb24pCi0gKiA8L29sPgotICoKLSAqIEBhdXRob3IgZElvbiBHaWxsYXJkIDxhIGhyZWY9Im1haWx0bzpkaW9uQG11bHRpdGFzay5jb20uYXUiPmRpb25AbXVsdGl0YXNrLmNvbS5hdTwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTmV0UmV4eEMgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotCi0gICAgLy8gdmFyaWFibGVzIHRvIGhvbGQgYXJndW1lbnRzCi0gICAgcHJpdmF0ZSBib29sZWFuIGJpbmFyeTsKLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc3BhdGg7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNvbW1lbnRzOwotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYWN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBjb21waWxlID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gY29uc29sZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gY3Jvc3NyZWY7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlY2ltYWwgPSB0cnVlOwotICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOwotICAgIHByaXZhdGUgYm9vbGVhbiBkaWFnOwotICAgIHByaXZhdGUgYm9vbGVhbiBleHBsaWNpdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZm9ybWF0OwotICAgIHByaXZhdGUgYm9vbGVhbiBqYXZhOwotICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwOwotICAgIHByaXZhdGUgYm9vbGVhbiBsb2dvID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVwbGFjZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZWxvZzsKLSAgICBwcml2YXRlIEZpbGUgc3JjRGlyOwotICAgIHByaXZhdGUgYm9vbGVhbiBzb3VyY2VkaXIgPSB0cnVlOyAvLyA/PyBTaG91bGQgdGhpcyBiZSB0aGUgZGVmYXVsdCBmb3IgYW50PwotICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpY3RhcmdzOwotICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpY3Rhc3NpZ247Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN0cmljdGNhc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN0cmljdGltcG9ydDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc3RyaWN0cHJvcHM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN0cmljdHNpZ25hbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc3ltYm9sczsKLSAgICBwcml2YXRlIGJvb2xlYW4gdGltZTsKLSAgICBwcml2YXRlIFN0cmluZyB0cmFjZSA9ICJ0cmFjZTIiOwotICAgIHByaXZhdGUgYm9vbGVhbiB1dGY4OwotICAgIHByaXZhdGUgU3RyaW5nIHZlcmJvc2UgPSAidmVyYm9zZTMiOwotCi0gICAgLy8gb3RoZXIgaW1wbGVtZW50YXRpb24gdmFyaWFibGVzCi0gICAgcHJpdmF0ZSBWZWN0b3IgY29tcGlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgZmlsZWNvcHlMaXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgU3RyaW5nIG9sZENsYXNzcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0KLQotICAgIC8qKgotICAgICAqIFNldCB3aGV0aGVyIGxpdGVyYWxzIGFyZSB0cmVhdGVkIGFzIGJpbmFyeSwgcmF0aGVyIHRoYW4gTmV0UmV4eCB0eXBlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJpbmFyeShib29sZWFuIGJpbmFyeSkgewotICAgICAgICB0aGlzLmJpbmFyeSA9IGJpbmFyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB1c2VkIGZvciBOZXRSZXh4IGNvbXBpbGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFN0cmluZyBjbGFzc3BhdGgpIHsKLSAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgY29tbWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBnZW5lcmF0ZWQgamF2YSBzb3VyY2UuCi0gICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50cyhib29sZWFuIGNvbW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuY29tbWVudHMgPSBjb21tZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciBlcnJvciBtZXNzYWdlcyBjb21lIG91dCBpbiBjb21wYWN0IG9yIHZlcmJvc2UgZm9ybWF0LgotICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGFjdChib29sZWFuIGNvbXBhY3QpIHsKLSAgICAgICAgdGhpcy5jb21wYWN0ID0gY29tcGFjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0aGUgTmV0UmV4eCBjb21waWxlciBzaG91bGQgY29tcGlsZSB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZQotICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICogU2V0dGluZyB0aGlzIGZsYWcgdG8gZmFsc2UsIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhlIGtlZXAgZmxhZyB0byB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGUoYm9vbGVhbiBjb21waWxlKSB7Ci0gICAgICAgIHRoaXMuY29tcGlsZSA9IGNvbXBpbGU7Ci0gICAgICAgIGlmICghdGhpcy5jb21waWxlICYmICF0aGlzLmtlZXApIHRoaXMua2VlcCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgb3Igbm90IG1lc3NhZ2VzIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlICdjb25zb2xlJwotICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc29sZShib29sZWFuIGNvbnNvbGUpIHsKLSAgICAgICAgdGhpcy5jb25zb2xlID0gY29uc29sZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHZhcmlhYmxlIGNyb3NzIHJlZmVyZW5jZXMgYXJlIGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENyb3NzcmVmKGJvb2xlYW4gY3Jvc3NyZWYpIHsKLSAgICAgICAgdGhpcy5jcm9zc3JlZiA9IGNyb3NzcmVmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB3aGV0aGVyIGRlY2ltYWwgYXJpdGhtZXRpYyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIG5ldHJleHggY29kZS4KLSAgICAgKiBCaW5hcnkgYXJpdGhtZXRpYyBpcyB1c2VkIHdoZW4gdGhpcyBmbGFnIGlzIHR1cm5lZCBvZmYuCi0gICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNpbWFsKGJvb2xlYW4gZGVjaW1hbCkgewotICAgICAgICB0aGlzLmRlY2ltYWwgPSBkZWNpbWFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIE5ldFJleHggc291cmNlCi0gICAgICogZmlsZXMgc2hvdWxkIGJlIGNvcGllZCBhbmQgdGhlbiBjb21waWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0RGlyKEZpbGUgZGVzdERpck5hbWUpIHsKLSAgICAgICAgZGVzdERpciA9IGRlc3REaXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZSBpcyBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFnKGJvb2xlYW4gZGlhZykgewotICAgICAgICB0aGlzLmRpYWcgPSBkaWFnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB2YXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCBleHBsaWNpdGx5IGJlZm9yZSB1c2UuCi0gICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwbGljaXQoYm9vbGVhbiBleHBsaWNpdCkgewotICAgICAgICB0aGlzLmV4cGxpY2l0ID0gZXhwbGljaXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBmb3JtYXR0ZWQgbmljZWx5IG9yIGxlZnQgdG8gbWF0Y2ggTmV0UmV4eAotICAgICAqIGxpbmUgbnVtYmVycyBmb3IgY2FsbCBzdGFjayBkZWJ1Z2dpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXQoYm9vbGVhbiBmb3JtYXQpIHsKLSAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBwcm9kdWNlZAotICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEphdmEoYm9vbGVhbiBqYXZhKSB7Ci0gICAgICAgIHRoaXMuamF2YSA9IGphdmE7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIHNvdXJjZSBmaWxlIHNob3VsZCBiZSBrZXB0IGFmdGVyIGNvbXBpbGF0aW9uLgotICAgICAqIFRoZSBnZW5lcmF0ZWQgZmlsZXMgd2lsbCBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuamF2YS5rZWVwLCA8Yj5ub3Q8L2I+IC5qYXZhCi0gICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2VlcChib29sZWFuIGtlZXApIHsKLSAgICAgICAgdGhpcy5rZWVwID0ga2VlcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBjb21waWxlciB0ZXh0IGxvZ28gaXMgZGlzcGxheWVkIHdoZW4gY29tcGlsaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9nbyhib29sZWFuIGxvZ28pIHsKLSAgICAgICAgdGhpcy5sb2dvID0gbG9nbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgLmphdmEgZmlsZSBzaG91bGQgYmUgcmVwbGFjZWQgd2hlbiBjb21waWxpbmcKLSAgICAgKiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlKGJvb2xlYW4gcmVwbGFjZSkgewotICAgICAgICB0aGlzLnJlcGxhY2UgPSByZXBsYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGUgY29tcGlsZXIgbWVzc2FnZXMgd2lsbCBiZSB3cml0dGVuIHRvIE5ldFJleHhDLmxvZyBhcwotICAgICAqIHdlbGwgYXMgdG8gdGhlIGNvbnNvbGUKLSAgICAgKiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTYXZlbG9nKGJvb2xlYW4gc2F2ZWxvZykgewotICAgICAgICB0aGlzLnNhdmVsb2cgPSBzYXZlbG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHN0b3JlIHRoZSBjbGFzcyBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKLSAgICAgKiBhcyB0aGUgc291cmNlIGZpbGVzLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5Ci0gICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VkaXIoYm9vbGVhbiBzb3VyY2VkaXIpIHsKLSAgICAgICAgdGhpcy5zb3VyY2VkaXIgPSBzb3VyY2VkaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzb3VyY2UgZGlyIHRvIGZpbmQgdGhlIHNvdXJjZSBKYXZhIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNyY0RpcihGaWxlIHNyY0Rpck5hbWUpIHsKLSAgICAgICAgc3JjRGlyID0gc3JjRGlyTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0aGF0IG1ldGhvZCBjYWxscyBhbHdheXMgbmVlZCBwYXJlbnRoZXNlcywKLSAgICAgKiBldmVuIGlmIG5vIGFyZ3VtZW50cyBhcmUgbmVlZGVkLCBlLmcuIDxjb2RlPmFTdHJpbmdWYXIuZ2V0Qnl0ZXM8L2NvZGU+Ci0gICAgICogdnMuIDxjb2RlPmFTdHJpbmdWYXIuZ2V0Qnl0ZXMoKTwvY29kZT4KLSAgICAgKiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3RhcmdzKGJvb2xlYW4gc3RyaWN0YXJncykgewotICAgICAgICB0aGlzLnN0cmljdGFyZ3MgPSBzdHJpY3RhcmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGUgdGhhdCBhc3NpZ25tZW50cyBtdXN0IG1hdGNoIGV4YWN0bHkgb24gdHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdGFzc2lnbihib29sZWFuIHN0cmljdGFzc2lnbikgewotICAgICAgICB0aGlzLnN0cmljdGFzc2lnbiA9IHN0cmljdGFzc2lnbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTmV0UmV4eCBjb21waWxlciBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUgb3Igbm90Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaWN0Y2FzZShib29sZWFuIHN0cmljdGNhc2UpIHsKLSAgICAgICAgdGhpcy5zdHJpY3RjYXNlID0gc3RyaWN0Y2FzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgY2xhc3NlcyBuZWVkIHRvIGJlIGltcG9ydGVkIGV4cGxpY2l0bHkgdXNpbmcgYW4KLSAgICAgKiA8Y29kZT5pbXBvcnQ8L2NvZGU+IHN0YXRlbWVudC4gQnkgZGVmYXVsdCB0aGUgTmV0UmV4eCBjb21waWxlciB3aWxsIGltcG9ydAotICAgICAqIGNlcnRhaW4gcGFja2FnZXMgYXV0b21hdGljYWxseQotICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdGltcG9ydChib29sZWFuIHN0cmljdGltcG9ydCkgewotICAgICAgICB0aGlzLnN0cmljdGltcG9ydCA9IHN0cmljdGltcG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgbG9jYWwgcHJvcGVydGllcyBuZWVkIHRvIGJlIHF1YWxpZmllZCBleHBsaWNpdGx5IHVzaW5nIDxjb2RlPnRoaXM8L2NvZGU+Ci0gICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaWN0cHJvcHMoYm9vbGVhbiBzdHJpY3Rwcm9wcykgewotICAgICAgICB0aGlzLnN0cmljdHByb3BzID0gc3RyaWN0cHJvcHM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBjb21waWxlciBzaG91bGQgZm9yY2UgY2F0Y2hpbmcgb2YgZXhjZXB0aW9ucyBieSBleHBsaWNpdGx5IG5hbWVkIHR5cGVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaWN0c2lnbmFsKGJvb2xlYW4gc3RyaWN0c2lnbmFsKSB7Ci0gICAgICAgIHRoaXMuc3RyaWN0c2lnbmFsID0gc3RyaWN0c2lnbmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBkZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW50byB0aGUgY2xhc3MgZmlsZQotICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN5bWJvbHMoYm9vbGVhbiBzeW1ib2xzKSB7Ci0gICAgICAgIHRoaXMuc3ltYm9scyA9IHN5bWJvbHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNrcyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBwcmludCBjb21waWxhdGlvbiB0aW1lcyB0byB0aGUgY29uc29sZQotICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoYm9vbGVhbiB0aW1lKSB7Ci0gICAgICAgIHRoaXMudGltZSA9IHRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybnMgb24gb3Igb2ZmIHRyYWNpbmcgYW5kIGRpcmVjdHMgdGhlIHJlc3VsdGFudCB0cmFjZSBvdXRwdXQKLSAgICAgKiBWYWxpZCB2YWx1ZXMgYXJlOiAidHJhY2UiLCAidHJhY2UxIiwgInRyYWNlMiIgYW5kICJub3RyYWNlIi4KLSAgICAgKiAidHJhY2UiIGFuZCAidHJhY2UyIgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlKFN0cmluZyB0cmFjZSkgewotICAgICAgICBpZiAodHJhY2UuZXF1YWxzSWdub3JlQ2FzZSgidHJhY2UiKQotICAgICAgICAgICAgfHwgdHJhY2UuZXF1YWxzSWdub3JlQ2FzZSgidHJhY2UxIikKLSAgICAgICAgICAgIHx8IHRyYWNlLmVxdWFsc0lnbm9yZUNhc2UoInRyYWNlMiIpCi0gICAgICAgICAgICB8fCB0cmFjZS5lcXVhbHNJZ25vcmVDYXNlKCJub3RyYWNlIikpIHsKLSAgICAgICAgICAgIHRoaXMudHJhY2UgPSB0cmFjZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5rbm93biB0cmFjZSB2YWx1ZSBzcGVjaWZpZWQ6ICciICsgdHJhY2UgKyAiJyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdGhhdCB0aGUgc291cmNlIGlzIGluIFVURjgKLSAgICAgKiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVdGY4KGJvb2xlYW4gdXRmOCkgewotICAgICAgICB0aGlzLnV0ZjggPSB1dGY4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgbG90cyBvZiB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoU3RyaW5nIHZlcmJvc2UpIHsKLSAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgdGFzaywgaS5lLiBkb2VzIHRoZSBhY3R1YWwgY29tcGlsZXIgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgc3JjZGlyIGFuZCBkZXN0ZGlyCi0gICAgICAgIGlmIChzcmNEaXIgPT0gbnVsbCB8fCBkZXN0RGlyID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY0RpciBhbmQgZGVzdERpciBhdHRyaWJ1dGVzIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2NhbiBzb3VyY2UgYW5kIGRlc3QgZGlycyB0byBidWlsZCB1cCBib3RoIGNvcHkgbGlzdHMgYW5kCi0gICAgICAgIC8vIGNvbXBpbGUgbGlzdHMKLSAgICAgICAgLy8gICAgICAgIHNjYW5EaXIoc3JjRGlyLCBkZXN0RGlyKTsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoc3JjRGlyKTsKLQotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICBzY2FuRGlyKHNyY0RpciwgZGVzdERpciwgZmlsZXMpOwotCi0gICAgICAgIC8vIGNvcHkgdGhlIHNvdXJjZSBhbmQgc3VwcG9ydCBmaWxlcwotICAgICAgICBjb3B5RmlsZXNUb0Rlc3RpbmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzCi0gICAgICAgIGlmIChjb21waWxlTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgY29tcGlsZUxpc3Quc2l6ZSgpICsgIiBzb3VyY2UgZmlsZSIKLSAgICAgICAgICAgICAgICArIChjb21waWxlTGlzdC5zaXplKCkgPT0gMSA/ICIiIDogInMiKQotICAgICAgICAgICAgICAgICsgIiB0byAiICsgZGVzdERpcik7Ci0gICAgICAgICAgICBkb05ldFJleHhDb21waWxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FucyB0aGUgZGlyZWN0b3J5IGxvb2tpbmcgZm9yIHNvdXJjZSBmaWxlcyB0byBiZSBjb21waWxlZCBhbmQKLSAgICAgKiBzdXBwb3J0IGZpbGVzIHRvIGJlIGNvcGllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2NhbkRpcihGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLCBTdHJpbmdbXSBmaWxlcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIGZpbGVzW2ldKTsKLSAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBub24gc291cmNlIGZpbGUsIGNvcHkgaXQgaWYgYSBsYXRlciBkYXRlIHRoYW4gdGhlCi0gICAgICAgICAgICAvLyBkZXN0Ci0gICAgICAgICAgICAvLyBpZiBpdCdzIGEgc291cmNlIGZpbGUsIHNlZSBpZiB0aGUgZGVzdGluYXRpb24gY2xhc3MgZmlsZQotICAgICAgICAgICAgLy8gbmVlZHMgdG8gYmUgcmVjcmVhdGVkIHZpYSBjb21waWxhdGlvbgotICAgICAgICAgICAgaWYgKGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5ucngiKSkgewotICAgICAgICAgICAgICAgIEZpbGUgY2xhc3NGaWxlID0gCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRlc3REaXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKSkgKyAiLmNsYXNzIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBpbGUgfHwgc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNsYXNzRmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlY29weUxpc3QucHV0KHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZUxpc3QuYWRkRWxlbWVudChkZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGRlc3RGaWxlLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVjb3B5TGlzdC5wdXQoc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcHkgZWxpZ2libGUgZmlsZXMgZnJvbSB0aGUgc3JjRGlyIHRvIGRlc3REaXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29weUZpbGVzVG9EZXN0aW5hdGlvbigpIHsKLSAgICAgICAgaWYgKGZpbGVjb3B5TGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBsb2coIkNvcHlpbmcgIiArIGZpbGVjb3B5TGlzdC5zaXplKCkgKyAiIGZpbGUiCi0gICAgICAgICAgICAgICAgKyAoZmlsZWNvcHlMaXN0LnNpemUoKSA9PSAxID8gIiIgOiAicyIpCi0gICAgICAgICAgICAgICAgKyAiIHRvICIgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBmaWxlY29weUxpc3Qua2V5cygpOwotICAgICAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnJvbUZpbGUgPSAoU3RyaW5nKWVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG9GaWxlID0gKFN0cmluZylmaWxlY29weUxpc3QuZ2V0KGZyb21GaWxlKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmNvcHlGaWxlKGZyb21GaWxlLCB0b0ZpbGUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBjb3B5ICIgKyBmcm9tRmlsZSArICIgdG8gIiArIHRvRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGR1ZSB0byAiICsgaW9lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZWZvcm1zIGEgY29wbWlsZSB1c2luZyB0aGUgTmV0UmV4eCAxLjEueCBjb21waWxlcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkb05ldFJleHhDb21waWxlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nKCJVc2luZyBOZXRSZXh4IGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBnZXRDb21waWxlQ2xhc3NwYXRoKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBjb21waWxlT3B0aW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGZpbGVMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhbiBhcnJheSBvZiBzdHJpbmdzIGZvciBpbnB1dCB0byB0aGUgY29tcGlsZXI6IG9uZSBhcnJheQotICAgICAgICAvLyBjb21lcyBmcm9tIHRoZSBjb21waWxlIG9wdGlvbnMsIHRoZSBvdGhlciBmcm9tIHRoZSBjb21waWxlTGlzdAotICAgICAgICBTdHJpbmdbXSBjb21waWxlT3B0aW9uc0FycmF5ID0gZ2V0Q29tcGlsZU9wdGlvbnNBc0FycmF5KCk7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVMaXN0QXJyYXkgPSBuZXcgU3RyaW5nW2NvbXBpbGVMaXN0LnNpemUoKV07Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBjb21waWxlTGlzdC5lbGVtZW50cygpOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBmaWxlTGlzdEFycmF5W2pdID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY3JlYXRlIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cyBmb3IgdGhlIGNvbXBpbGVyCi0gICAgICAgIFN0cmluZyBjb21waWxlQXJnc1tdID0gbmV3IFN0cmluZ1tjb21waWxlT3B0aW9uc0FycmF5Lmxlbmd0aCArIGZpbGVMaXN0QXJyYXkubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21waWxlT3B0aW9uc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb21waWxlQXJnc1tpXSA9IGNvbXBpbGVPcHRpb25zQXJyYXlbaV07Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb21waWxlQXJnc1tpK2NvbXBpbGVPcHRpb25zQXJyYXkubGVuZ3RoXSA9IGZpbGVMaXN0QXJyYXlbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcmludCBuaWNlIG91dHB1dCBhYm91dCB3aGF0IHdlIGFyZSBkb2luZyBmb3IgdGhlIGxvZwotICAgICAgICBjb21waWxlT3B0aW9ucy5hcHBlbmQoIkNvbXBpbGF0aW9uIGFyZ3M6ICIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGVPcHRpb25zQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvbXBpbGVPcHRpb25zLmFwcGVuZChjb21waWxlT3B0aW9uc0FycmF5W2ldKTsKLSAgICAgICAgICAgIGNvbXBpbGVPcHRpb25zLmFwcGVuZCgiICIpOwotICAgICAgICB9Ci0gICAgICAgIGxvZyhjb21waWxlT3B0aW9ucy50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQotICAgICAgICBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICBTdHJpbmdCdWZmZXIgbmljZVNvdXJjZUxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWxlcyB0byBiZSBjb21waWxlZDoiICsgZW9sKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChjb21waWxlTGlzdC5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoZW9sKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZyhuaWNlU291cmNlTGlzdC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQotICAgICAgICAvLyBuZWVkIHRvIHNldCBqYXZhLmNsYXNzLnBhdGggcHJvcGVydHkgYW5kIHJlc3RvcmUgaXQgbGF0ZXIKLSAgICAgICAgLy8gc2luY2UgdGhlIE5ldFJleHggY29tcGlsZXIgaGFzIG5vIG9wdGlvbiBmb3IgdGhlIGNsYXNzcGF0aAotICAgICAgICBTdHJpbmcgY3VycmVudENsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0gICAgICAgIFByb3BlcnRpZXMgY3VycmVudFByb3BlcnRpZXMgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOwotICAgICAgICBjdXJyZW50UHJvcGVydGllcy5wdXQoImphdmEuY2xhc3MucGF0aCIsIGNsYXNzcGF0aCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7IAotICAgICAgICAgICAgaW50IHJjID0gQ09NLmlibS5uZXRyZXh4LnByb2Nlc3MuTmV0UmV4eEMuCi0gICAgICAgICAgICAgICAgbWFpbihuZXcgUmV4eChjb21waWxlQXJncyksIG5ldyBQcmludFdyaXRlcihvdXQpKTsKLQotICAgICAgICAgICAgaWYgKHJjID4gMSkgeyAvLyAxIGlzIHdhcm5pbmdzIGZyb20gcmVhbCBOZXRSZXh4QwotICAgICAgICAgICAgICAgIGxvZyhvdXQudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNvbXBpbGUgZmFpbGVkLCBtZXNzYWdlcyBzaG91bGQgaGF2ZSBiZWVuIHByb3ZpZGVkLiI7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChyYyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbG9nKG91dC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxvZyhvdXQudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIG5lZWQgdG8gcmVzZXQgamF2YS5jbGFzcy5wYXRoIHByb3BlcnR5Ci0gICAgICAgICAgICAvLyBzaW5jZSB0aGUgTmV0UmV4eCBjb21waWxlciBoYXMgbm8gb3B0aW9uIGZvciB0aGUgY2xhc3NwYXRoCi0gICAgICAgICAgICBjdXJyZW50UHJvcGVydGllcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBjdXJyZW50UHJvcGVydGllcy5wdXQoImphdmEuY2xhc3MucGF0aCIsIGN1cnJlbnRDbGFzc1BhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSBjb21waWxhdGlvbiBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tcGlsZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGNsYXNzcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAvLyBhZGQgZGVzdCBkaXIgdG8gY2xhc3NwYXRoIHNvIHRoYXQgcHJldmlvdXNseSBjb21waWxlZCBhbmQKLSAgICAgICAgLy8gdW50b3VjaGVkIGNsYXNzZXMgYXJlIG9uIGNsYXNzcGF0aAotICAgICAgICBjbGFzc3BhdGguYXBwZW5kKGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgIC8vIGFkZCBvdXIgY2xhc3NwYXRoIHRvIHRoZSBtaXgKLSAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEV4aXN0aW5nVG9DbGFzc3BhdGgoY2xhc3NwYXRoLCB0aGlzLmNsYXNzcGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgdGhlIHN5c3RlbSBjbGFzc3BhdGgKLSAgICAgICAgLy8gYWRkRXhpc3RpbmdUb0NsYXNzcGF0aChjbGFzc3BhdGgsU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7Ci0gICAgICAgIHJldHVybiBjbGFzc3BhdGgudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRDb21waWxlT3B0aW9uc0FzQXJyYXkoKSB7Ci0gICAgICAgIFZlY3RvciBvcHRpb25zID0gbmV3IFZlY3RvcigpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoYmluYXJ5ID8gIi1iaW5hcnkiIDogIi1ub2JpbmFyeSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY29tbWVudHMgPyAiLWNvbW1lbnRzIiA6ICItbm9jb21tZW50cyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY29tcGlsZSA/ICItY29tcGlsZSIgOiAiLW5vY29tcGlsZSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY29tcGFjdCA/ICItY29tcGFjdCIgOiAiLW5vY29tcGFjdCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY29uc29sZSA/ICItY29uc29sZSIgOiAiLW5vY29uc29sZSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY3Jvc3NyZWYgPyAiLWNyb3NzcmVmIiA6ICItbm9jcm9zc3JlZiIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoZGVjaW1hbCA/ICItZGVjaW1hbCIgOiAiLW5vZGVjaW1hbCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoZGlhZyA/ICItZGlhZyIgOiAiLW5vZGlhZyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoZXhwbGljaXQgPyAiLWV4cGxpY2l0IjogIi1ub2V4cGxpY2l0Iik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChmb3JtYXQgPyAiLWZvcm1hdCIgOiAiLW5vZm9ybWF0Iik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChrZWVwID8gIi1rZWVwIiA6ICItbm9rZWVwIik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChsb2dvID8gIi1sb2dvIiA6ICItbm9sb2dvIik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChyZXBsYWNlID8gIi1yZXBsYWNlIiA6ICItbm9yZXBsYWNlIik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzYXZlbG9nID8gIi1zYXZlbG9nIiA6ICItbm9zYXZlbG9nIik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzb3VyY2VkaXIgPyAiLXNvdXJjZWRpciIgOiAiLW5vc291cmNlZGlyIik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3RhcmdzID8gIi1zdHJpY3RhcmdzIiA6ICItbm9zdHJpY3RhcmdzIik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3Rhc3NpZ24gPyAiLXN0cmljdGFzc2lnbiIgOiAiLW5vc3RyaWN0YXNzaWduIik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3RjYXNlID8gIi1zdHJpY3RjYXNlIjogIi1ub3N0cmljdGNhc2UiKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KHN0cmljdGltcG9ydCA/ICItc3RyaWN0aW1wb3J0IiA6ICItbm9zdHJpY3RpbXBvcnQiKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KHN0cmljdHByb3BzID8gIi1zdHJpY3Rwcm9wcyIgOiAiLW5vc3RyaWN0cHJvcHMiKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KHN0cmljdHNpZ25hbCA/ICItc3RyaWN0c2lnbmFsIiA6ICItbm9zdHJpY3RzaWduYWwiKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KHN5bWJvbHMgPyAiLXN5bWJvbHMiIDogIi1ub3N5bWJvbHMiKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KHRpbWUgPyAiLXRpbWUiIDogIi1ub3RpbWUiKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItIiArIHRyYWNlKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KHV0ZjggPyAiLXV0ZjgiIDogIi1ub3V0ZjgiKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItIiArIHZlcmJvc2UpOwotICAgICAgICBTdHJpbmdbXSByZXN1bHRzID0gbmV3IFN0cmluZ1tvcHRpb25zLnNpemUoKV07Ci0gICAgICAgIG9wdGlvbnMuY29weUludG8ocmVzdWx0cyk7Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBUYWtlcyBhIGNsYXNzcGF0aC1saWtlIHN0cmluZywgYW5kIGFkZHMgZWFjaCBlbGVtZW50IG9mCi0gICAgICogdGhpcyBzdHJpbmcgdG8gYSBuZXcgY2xhc3NwYXRoLCBpZiB0aGUgY29tcG9uZW50cyBleGlzdC4KLSAgICAgKiBDb21wb25lbnRzIHRoYXQgZG9uJ3QgZXhpc3QsIGFyZW4ndCBhZGRlZC4KLSAgICAgKiBXZSBkbyB0aGlzLCBiZWNhdXNlIGppa2VzIGlzc3VlcyB3YXJuaW5ncyBmb3Igbm9uLWV4aXN0YW50Ci0gICAgICogZmlsZXMvZGlycyBpbiBoaXMgY2xhc3NwYXRoLCBhbmQgdGhlc2Ugd2FybmluZ3MgYXJlIHByZXR0eQotICAgICAqIGFubm95aW5nLgotICAgICAqIEBwYXJhbSB0YXJnZXQgLSB0YXJnZXQgY2xhc3NwYXRoCi0gICAgICogQHBhcmFtIHNvdXJjZSAtIHNvdXJjZSBjbGFzc3BhdGgKLSAgICAgKiB0byBnZXQgZmlsZSBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRFeGlzdGluZ1RvQ2xhc3NwYXRoKFN0cmluZ0J1ZmZlciB0YXJnZXQsU3RyaW5nIHNvdXJjZSkgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKSwgZmFsc2UpOwotICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgRmlsZSBmID0gcHJvamVjdC5yZXNvbHZlRmlsZSh0b2submV4dFRva2VuKCkpOwotCi0gICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kKGYuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkRyb3BwaW5nIGZyb20gY2xhc3NwYXRoOiAiKwotICAgICAgICAgICAgICAgICAgICBmLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHJvcGVydHlGaWxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllY2QyMS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLQotLyoqCi0gKlByb3BlcnR5RmlsZSB0YXNrIHVzZXMgamF2YS51dGlsLlByb3BlcnRpZXMgdG8gbW9kaWZ5IGludGVnZXIsIFN0cmluZyBhbmQKLSAqRGF0ZSBzZXR0aW5ncyBpbiBhIHByb3BlcnR5IGZpbGUuPHA+Ci0gKgotICoKLSAqVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGl0cyB1c2FnZToKLSAqICAgIDx1bD4mbHQ7dGFyZ2V0IG5hbWU9InNldFN0YXRlIiZndDs8YnI+Ci0gKiAgICA8dWw+Jmx0O3Byb3BlcnR5PGJyPgotICogICAgICAgIDx1bD5uYW1lPSJoZWFkZXIiPGJyPgotICogICAgICAgIHZhbHVlPSIjI0dlbmVyYXRlZCBmaWxlIC0gZG8gbm90IG1vZGlmeSEiLyZndDs8YnI+Ci0gKiAgICAgICZsdDtwcm9wZXJ0eWZpbGUgZmlsZT0iYXByb3BmaWxlLnByb3BlcnRpZXMiIGNvbW1lbnQ9IiR7aGVhZGVyfSImZ3Q7PGJyPgotICogICAgICAgICZsdDtlbnRyeSBrZXk9InByb2R1Y3QudmVyc2lvbi5tYWpvciIgdHlwZT0iaW50IiAgdmFsdWU9IjUiLyZndDs8YnI+Ci0gKiAgICAgICAgJmx0O2VudHJ5IGtleT0icHJvZHVjdC52ZXJzaW9uLm1pbm9yIiB0eXBlPSJpbnQiICB2YWx1ZT0iMCIvJmd0Ozxicj4KLSAqICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLm1ham9yIiAgIHR5cGU9ImludCIgIHZhbHVlPSIwIiAvJmd0Ozxicj4KLSAqICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLm1pbm9yIiAgIHR5cGU9ImludCIgIG9wZXJhdGlvbj0iKyIgLyZndDs8YnI+Ci0gKiAgICAgICAgJmx0O2VudHJ5IGtleT0icHJvZHVjdC5idWlsZC5kYXRlIiAgICB0eXBlPSJkYXRlIiBvcGVyYXRpb249Im5vdyIgLyZndDs8YnI+Ci0gKiAgICAgICAgJmx0O2VudHJ5IGtleT0iaW50U2V0IiB0eXBlPSJpbnQiIG9wZXJhdGlvbj0iPSIgdmFsdWU9IjY4MSIvJmd0Ozxicj4KLSAqICAgICAgICAmbHQ7ZW50cnkga2V5PSJpbnREZWMiIHR5cGU9ImludCIgb3BlcmF0aW9uPSItIi8mZ3Q7PGJyPgotICogICAgICAgICZsdDtlbnRyeSBrZXk9Ik5ldmVyRGF0ZSIgdHlwZT0iZGF0ZSIgb3BlcmF0aW9uPSJuZXZlciIvJmd0Ozxicj4KLSAqICAgICAgICAmbHQ7ZW50cnkga2V5PSJTdHJpbmdFcXVhbHMiIHR5cGU9InN0cmluZyIgdmFsdWU9InRlc3RWYWx1ZSIvJmd0Ozxicj4KLSAqICAgICAgICAmbHQ7ZW50cnkga2V5PSJOb3dEYXRlIiB0eXBlPSJkYXRlIiBvcGVyYXRpb249Im5vdyIvJmd0Ozxicj48L3VsPgotICogICAgICZsdDsvcHJvcGVydHlmaWxlJmd0Ozxicj48L3VsPgotICogICAmbHQ7L3RhcmdldCZndDs8L3VsPjxwPgotICoKLSAqVGhlICZsdDtwcm9wZXJ0eWZpbGUmZ3Q7IHRhc2sgbXVzdCBoYXZlOjxicj4KLSAqICAgIDx1bD48bGk+ZmlsZTwvbGk+PC91bD4KLSAqT3RoZXIgcGFyYW1ldGVycyBhcmU6PGJyPgotICogICAgPHVsPjxsaT5jb21tZW50LCBrZXksIG9wZXJhdGlvbiwgdHlwZSBhbmQgdmFsdWUgKHRoZSBmaW5hbCBmb3VyIGJlaW5nIGVsaW1pbmF0ZWQgc2hvcnRseSk8L2xpPjwvdWw+Ci0gKgotICpUaGUgJmx0O2VudHJ5Jmd0OyB0YXNrIG11c3QgaGF2ZTo8YnI+Ci0gKiAgICA8dWw+PGxpPmtleTwvbGk+PC91bD4KLSAqT3RoZXIgcGFyYW1ldGVycyBhcmU6PGJyPgotICogICAgPHVsPjxsaT5vcGVyYXRpb248L2xpPgotICogICAgICAgIDxsaT50eXBlPC9saT4KLSAqICAgICAgICA8bGk+dmFsdWU8L2xpPgotICogICAgICAgIDxsaT5vZmZzZXQ8L2xpPjwvdWw+Ci0gKgotICpJZiB0eXBlIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBzdHJpbmcKLSAqCi0gKlBhcmFtZXRlciB2YWx1ZXM6PGJyPgotICogICAgPHVsPjxsaT5vcGVyYXRpb246PC9saT4KLSAqICAgICAgICA8dWw+PGxpPiI9IiAoc2V0IC0tIGRlZmF1bHQpPC9saT4KLSAqICAgICAgICA8bGk+Ii0iIChkZWMpPC9saT4KLSAqICAgICAgICA8bGk+IisiIChpbmMpPC9saT4KLSAqCi0gKiAgICA8bGk+dHlwZTo8L2xpPgotICogICAgICAgIDx1bD48bGk+ImludCI8L2xpPgotICogICAgICAgIDxsaT4iZGF0ZSI8L2xpPgotICogICAgICAgIDxsaT4ic3RyaW5nIjwvbGk+PC91bD48L3VsPgotICoKLSAqICAgIDxsaT52YWx1ZTo8L2xpPgotICogICAgICA8dWw+PGxpPmhvbGRzIHRoZSBkZWZhdWx0IHZhbHVlLCBpZiB0aGUgcHJvcGVydHkKLSAqICAgICAgICAgICAgICB3YXMgbm90IGZvdW5kIGluIHByb3BlcnR5IGZpbGU8L2xpPgotICogICAgICAgICAgPGxpPiJub3ciIEluIGNhc2Ugb2YgdHlwZSAiZGF0ZSIsIHRoZQotICogICAgICAgICAgICAgIHZhbHVlICJub3ciIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICBkYXRlL3RpbWUgYW5kIHVzZWQgZXZlbiBpZiBhIHZhbGlkIGRhdGUgd2FzCi0gKiAgICAgICAgICAgICAgZm91bmQgaW4gdGhlIHByb3BlcnR5IGZpbGUuPC9saT48L3VsPgotICoKLSAqICAgIDxsaT5vZmZzZXQ6PGJyPnZhbGlkIGZvciAiLSIgb3IgIisiLCB0aGUgb2Zmc2V0IChkZWZhdWx0Ci0gKiAgICBzZXQgdG8gMSkgd2lsbCBiZSBhZGRlZCBvciBzdWJ0cmFjdGVkIGZyb20gImludCIgb3IKLSAqICAgICJkYXRlIiB0eXBlIHZhbHVlLjwvbGk+Ci0gKiAgICA8L3VsPgotICoKLSAqU3RyaW5nIHByb3BlcnR5IHR5cGVzIGNhbiBvbmx5IHVzZSB0aGUgIj0iIG9wZXJhdGlvbi4KLSAqRGF0ZSBwcm9wZXJ0eSB0eXBlcyBjYW4gb25seSB1c2UgdGhlICJuZXZlciIgb3IgIm5vdyIgb3BlcmF0aW9ucy4KLSAqSW50IHByb3BlcnR5IHR5cGVzIGNhbiBvbmx5IHVzZSB0aGUgIj0iLCAiLSIgb3IgIisiIG9wZXJhdGlvbnMuPHA+Ci0gKgotICpUaGUgbWVzc2FnZSBwcm9wZXJ0eSBpcyB1c2VkIGZvciB0aGUgcHJvcGVydHkgZmlsZSBoZWFkZXIsIHdpdGggIlxcIiBiZWluZwotICphIG5ld2xpbmUgZGVsaW1pdGVyIGNoYXJhdGVyLgotICoKLSAqIEBhdXRob3IgVGhvbWFzIENocmlzdGVuIDxhIGhyZWY9Im1haWx0bzpjaHJAYWN0aXZlLmNoIj5jaHJAYWN0aXZlLmNoPC9hPgotICogQGF1dGhvciBKZXJlbXkgTWF3c29uIDxhIGhyZWY9Im1haWx0bzpqZW1AbG9mdGluc3BhY2UuY29tLmF1PmplbUBsb2Z0aW5zcGFjZS5jb20uYXU8L2E+Ci0qLwotcHVibGljIGNsYXNzIFByb3BlcnR5RmlsZSBleHRlbmRzIFRhc2sKLXsKLQotICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICoKLSAgICAqIFN0YXRpYyB2YXJpYWJsZXMuCi0gICAgKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0KLSAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqCi0gICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMuCi0gICAgKi8KLQotICAgIC8vIFVzZSB0aGlzIHRvIHByZXBlbmQgYSBtZXNzYWdlIHRvIHRoZSBwcm9wZXJ0aWVzIGZpbGUKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgbV9jb21tZW50OwotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzICAgICAgICAgIG1fcHJvcGVydGllczsKLSAgICBwcml2YXRlIEZpbGUgICAgICAgICAgICAgICAgbV9wcm9wZXJ0eWZpbGU7Ci0KLSAgICBwcml2YXRlIFZlY3RvciBlbnRyaWVzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKgotICAgICogQ29uc3RydWN0b3JzCi0gICAgKi8KLQotICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICoKLSAgICAqIE1ldGhvZHMKLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHJlYWRGaWxlKCk7Ci0gICAgICAgIGV4ZWN1dGVPcGVyYXRpb24oKTsKLSAgICAgICAgd3JpdGVGaWxlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudHJ5IGNyZWF0ZUVudHJ5KCkKLSAgICB7Ci0gICAgICAgIEVudHJ5IGUgPSBuZXcgRW50cnkoKTsKLSAgICAgICAgZW50cmllcy5hZGRFbGVtZW50KGUpOwotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZW50cmllcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGVudHJ5LmV4ZWN1dGVPbihtX3Byb3BlcnRpZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRGaWxlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBDcmVhdGUgdGhlIFByb3BlcnR5RmlsZQotICAgICAgICBtX3Byb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fcHJvcGVydHlmaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZygiVXBkYXRpbmcgcHJvcGVydHkgZmlsZTogIittX3Byb3BlcnR5ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgbV9wcm9wZXJ0aWVzLmxvYWQobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKG1fcHJvcGVydHlmaWxlKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZygiQ3JlYXRpbmcgbmV3IHByb3BlcnR5IGZpbGU6ICIrCi0gICAgICAgICAgICAgICAgICAgIG1fcHJvcGVydHlmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1fcHJvcGVydHlmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQYXJhbWV0ZXJzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIWNoZWNrUGFyYW0obV9wcm9wZXJ0eWZpbGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgdG9rZW4gbXVzdCBub3QgYmUgbnVsbC4iLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkKLSAgICB7Ci0gICAgICAgIG1fcHJvcGVydHlmaWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBoZHIpCi0gICAgewotICAgICAgICBtX2NvbW1lbnQgPSBoZHI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRmlsZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShtX3Byb3BlcnR5ZmlsZSkpOwotCi0gICAgICAgICAgICAvLyBQcm9wZXJ0aWVzLnN0b3JlIGlzIG5vdCBhdmFpbGFibGUgaW4gSkRLIDEuMQotICAgICAgICAgICAgTWV0aG9kIG0gPQotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMuY2xhc3MuZ2V0TWV0aG9kKCJzdG9yZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzc30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgbS5pbnZva2UobV9wcm9wZXJ0aWVzLCBuZXcgT2JqZWN0W10ge2JvcywgbV9jb21tZW50fSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLSAgICAgICAgICAgIG1fcHJvcGVydGllcy5zYXZlKGJvcywgbV9jb21tZW50KTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQsIGxvY2F0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIC8vIGltcG9zc2libGUKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpYWUsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYm9zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBib3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4KSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcGFyYW1ldGVyIGhhcyBiZWVuIGRlZmluZWQuCi0gICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tQYXJhbShTdHJpbmcgcGFyYW0pCi0gICAgewotICAgICAgICByZXR1cm4gISgocGFyYW0gPT0gbnVsbCkgfHwgKHBhcmFtLmVxdWFscygibnVsbCIpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUGFyYW0oRmlsZSBwYXJhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhKHBhcmFtID09IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBuZXN0ZWQgZWxlbWVudHMgb2YKLSAgICAgKiBhIHRhc2sgcHJvcGVydHlmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50cnkKLSAgICB7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBOT1dfVkFMVUVfID0gICAgICAgICJub3ciOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfVkFMVUVfID0gICAgICAgIm5ldmVyIjsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgREVGQVVMVF9JTlRfVkFMVUUgPSAgICAgMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3JlZ29yaWFuQ2FsZW5kYXIKLSAgICAgICAgICAgIERFRkFVTFRfREFURV9WQUxVRSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBtX2tleSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICBtX3R5cGUgPSBUeXBlLlNUUklOR19UWVBFOwotICAgICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgbV9vcGVyYXRpb24gPSBPcGVyYXRpb24uRVFVQUxTX09QRVI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBtX3ZhbHVlID0iMSI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBtX2RlZmF1bHQgPSBudWxsOwotICAgICAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1fa2V5ID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1fdmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb24oT3BlcmF0aW9uIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbmV3T3BlcmF0aW9uID0gT3BlcmF0aW9uLnRvT3BlcmF0aW9uKHZhbHVlLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKG5ld09wZXJhdGlvbiA9PSBPcGVyYXRpb24uTk9XX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tX29wZXJhdGlvbiA9IE9wZXJhdGlvbi5FUVVBTFNfT1BFUjsKLSAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuTk9XX1ZBTFVFXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChuZXdPcGVyYXRpb24gPT0gT3BlcmF0aW9uLk5VTExfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1fb3BlcmF0aW9uID0gT3BlcmF0aW9uLkVRVUFMU19PUEVSOwotICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5OVUxMX1ZBTFVFXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1fb3BlcmF0aW9uID0gbmV3T3BlcmF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tX3R5cGUgPSBUeXBlLnRvVHlwZSh2YWx1ZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tX2RlZmF1bHQgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tX3BhdHRlcm4gPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPbihQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgICAgIC8vIG1fdHlwZSBtYXkgYmUgbnVsbCBiZWNhdXNlIGl0IHdhc24ndCBzZXQKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBUeXBlLklOVEVHRVJfVFlQRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJbnRlZ2VyKChTdHJpbmcpcHJvcHMuZ2V0KG1fa2V5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdHlwZSA9PSBUeXBlLkRBVEVfVFlQRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVEYXRlKChTdHJpbmcpcHJvcHMuZ2V0KG1fa2V5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdHlwZSA9PSBUeXBlLlNUUklOR19UWVBFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVN0cmluZygoU3RyaW5nKXByb3BzLmdldChtX2tleSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uIHR5cGU6ICIrbV90eXBlKyIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHRvIHN0cmluZyB0eXBlCi0gICAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgZG8gbm90aGluZwotICAgICAgICAgICAgICAgIG5wZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEluc2VydCBhcyBhIHN0cmluZyBieSBkZWZhdWx0Ci0gICAgICAgICAgICBwcm9wcy5wdXQobV9rZXksIG1fdmFsdWUpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBIYW5kbGUgb3BlcmF0aW9ucyBmb3IgdHlwZSA8Y29kZT5kYXRlPC9jb2RlPi4KLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgY3VycmVudCB2YWx1ZSByZWFkIGZyb20gdGhlIHByb3BlcnR5IGZpbGUgb3IKLSAgICAgICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIDxjb2RlPmtleTwvY29kZT4gd2FzCi0gICAgICAgICogICAgICAgICAgICAgICAgIG5vdCBjb250YWluZWQgaW4gdGhlIHByb3BlcnR5IGZpbGUuCi0gICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBleGVjdXRlRGF0ZShTdHJpbmcgb2xkVmFsdWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgbmV3VmFsdWUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLQotICAgICAgICAgICAgaWYgKG1fcGF0dGVybiA9PSBudWxsKSBtX3BhdHRlcm4gPSAieXl5eS9NTS9kZCBISDptbSI7Ci0gICAgICAgICAgICBEYXRlRm9ybWF0IGZtdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KG1fcGF0dGVybik7Ci0KLSAgICAgICAgICAgIGlmIChtX3ZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoTk9XX1ZBTFVFXy5lcXVhbHMobV92YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zZXRUaW1lKG5ldyBEYXRlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChOVUxMX1ZBTFVFXy5lcXVhbHMobV92YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2V0VGltZShmbXQucGFyc2UobV92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9idmlvdXNseSBub3QgYSBkYXRlLCB0cnkgYSBzaW1wbGUgaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBJbnRlZ2VyLnBhcnNlSW50KG1fdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2V0KENhbGVuZGFyLkRBWV9PRl9ZRUFSLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleF8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldChDYWxlbmRhci5EQVlfT0ZfWUVBUiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlCi0gICAgICAgICAgICBpZiAobV9kZWZhdWx0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBOT1dfVkFMVUVfLmVxdWFscyhtX2RlZmF1bHQudG9Mb3dlckNhc2UoKSkgJiYKLSAgICAgICAgICAgICAgICAobV9vcGVyYXRpb24gPT0gT3BlcmF0aW9uLklOQ1JFTUVOVF9PUEVSIHx8Ci0gICAgICAgICAgICAgICAgIG1fb3BlcmF0aW9uID09IE9wZXJhdGlvbi5ERUNSRU1FTlRfT1BFUikgKSB7Ci0gICAgICAgICAgICAgICAgb2xkVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlLnNldFRpbWUoZm10LnBhcnNlKG9sZFZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgIHsgLyogc3dvbGxvdyAqLyB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobV9kZWZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE5PV19WQUxVRV8uZXF1YWxzKG1fZGVmYXVsdC50b0xvd2VyQ2FzZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUuc2V0VGltZShuZXcgRGF0ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChOVUxMX1ZBTFVFXy5lcXVhbHMobV9kZWZhdWx0LnRvTG93ZXJDYXNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlLnNldFRpbWUoZm10LnBhcnNlKG1fZGVmYXVsdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSAgeyAvKiBzd29sbG93ICovIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1fb3BlcmF0aW9uID09IE9wZXJhdGlvbi5FUVVBTFNfT1BFUikgewotICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtX29wZXJhdGlvbiA9PSBPcGVyYXRpb24uSU5DUkVNRU5UX09QRVIpIHsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZS5hZGQoQ2FsZW5kYXIuU0VDT05ELCB2YWx1ZS5nZXQoQ2FsZW5kYXIuU0VDT05EKSk7Ci0gICAgICAgICAgICAgICAgbmV3VmFsdWUuYWRkKENhbGVuZGFyLk1JTlVURSwgdmFsdWUuZ2V0KENhbGVuZGFyLk1JTlVURSkpOwotICAgICAgICAgICAgICAgIG5ld1ZhbHVlLmFkZChDYWxlbmRhci5IT1VSX09GX0RBWSwgdmFsdWUuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKSk7Ci0gICAgICAgICAgICAgICAgbmV3VmFsdWUuYWRkKENhbGVuZGFyLkRBWV9PRl9ZRUFSLCB2YWx1ZS5nZXQoQ2FsZW5kYXIuREFZX09GX1lFQVIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1fb3BlcmF0aW9uID09IE9wZXJhdGlvbi5ERUNSRU1FTlRfT1BFUikgewotICAgICAgICAgICAgICAgIG5ld1ZhbHVlLmFkZChDYWxlbmRhci5TRUNPTkQsIC0xICogdmFsdWUuZ2V0KENhbGVuZGFyLlNFQ09ORCkpOwotICAgICAgICAgICAgICAgIG5ld1ZhbHVlLmFkZChDYWxlbmRhci5NSU5VVEUsIC0xICogdmFsdWUuZ2V0KENhbGVuZGFyLk1JTlVURSkpOwotICAgICAgICAgICAgICAgIG5ld1ZhbHVlLmFkZChDYWxlbmRhci5IT1VSX09GX0RBWSwgLTEgKiB2YWx1ZS5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpKTsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZS5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIC0xICogdmFsdWUuZ2V0KENhbGVuZGFyLkRBWV9PRl9ZRUFSKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBmbXQuZm9ybWF0KG5ld1ZhbHVlLmdldFRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEhhbmRsZSBvcGVyYXRpb25zIGZvciB0eXBlIDxjb2RlPmludDwvY29kZT4uCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIGN1cnJlbnQgdmFsdWUgcmVhZCBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlIG9yCi0gICAgICAgICogICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSA8Y29kZT5rZXk8L2NvZGU+IHdhcwotICAgICAgICAqICAgICAgICAgICAgICAgICBub3QgY29udGFpbmVkIGluIHRoZSBwcm9wZXJ0eSBmaWxlLgotICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUludGVnZXIoU3RyaW5nIG9sZFZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaW50IHZhbHVlID0gMDsKLSAgICAgICAgICAgIGludCBuZXdWYWx1ZSAgPSAwOwotCi0gICAgICAgICAgICBEZWNpbWFsRm9ybWF0IGZtdCA9IChtX3BhdHRlcm4gIT0gbnVsbCkgPyBuZXcgRGVjaW1hbEZvcm1hdChtX3BhdHRlcm4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRGVjaW1hbEZvcm1hdCgpOwotCi0gICAgICAgICAgICBpZiAobV92YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmbXQucGFyc2UobV92YWx1ZSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsgLyogc3dvbGxvdyAqLyB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSAgeyAvKiBzd29sbG93ICovIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBmbXQucGFyc2Uob2xkVmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7IC8qIHN3b2xsb3cgKi8gfQotICAgICAgICAgICAgICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgIHsgLyogc3dvbGxvdyAqLyB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtX2RlZmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gZm10LnBhcnNlKG1fZGVmYXVsdCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsgLyogc3dvbGxvdyAqLyB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSAgeyAvKiBzd29sbG93ICovIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1fb3BlcmF0aW9uID09IE9wZXJhdGlvbi5FUVVBTFNfT1BFUikgewotICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtX29wZXJhdGlvbiA9PSBPcGVyYXRpb24uSU5DUkVNRU5UX09QRVIpIHsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSArPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1fb3BlcmF0aW9uID09IE9wZXJhdGlvbi5ERUNSRU1FTlRfT1BFUikgewotICAgICAgICAgICAgICAgIG5ld1ZhbHVlIC09IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV92YWx1ZSA9IGZtdC5mb3JtYXQobmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSGFuZGxlIG9wZXJhdGlvbnMgZm9yIHR5cGUgPGNvZGU+c3RyaW5nPC9jb2RlPi4KLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgY3VycmVudCB2YWx1ZSByZWFkIGZyb20gdGhlIHByb3BlcnR5IGZpbGUgb3IKLSAgICAgICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIDxjb2RlPmtleTwvY29kZT4gd2FzCi0gICAgICAgICogICAgICAgICAgICAgICAgIG5vdCBjb250YWluZWQgaW4gdGhlIHByb3BlcnR5IGZpbGUuCi0gICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBleGVjdXRlU3RyaW5nKFN0cmluZyBvbGRWYWx1ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlICA9ICIiOwotCi0gICAgICAgICAgICBpZiAobV92YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBtX3ZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IG9sZFZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobV9kZWZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IG1fZGVmYXVsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1fb3BlcmF0aW9uID09IE9wZXJhdGlvbi5FUVVBTFNfT1BFUikgewotICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtX29wZXJhdGlvbiA9PSBPcGVyYXRpb24uSU5DUkVNRU5UX09QRVIpIHsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSArPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fdmFsdWUgPSBuZXdWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDaGVjayBpZiBwYXJhbWV0ZXIgY29tYmluYXRpb25zIGNhbiBiZSBzdXBwb3J0ZWQKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1BhcmFtZXRlcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBUeXBlLlNUUklOR19UWVBFICYmCi0gICAgICAgICAgICAgICAgbV9vcGVyYXRpb24gPT0gT3BlcmF0aW9uLkRFQ1JFTUVOVF9PUEVSKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCItIGlzIG5vdCBzdXBvcnRlZCBmb3Igc3RyaW5nIHByb3BlcnRpZXMgKGtleToiICsgbV9rZXkgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fdmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidmFsdWUgaXMgbWFuZGF0b3J5IChrZXk6IiArIG1fa2V5ICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX2tleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJrZXkgaXMgbWFuZGF0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV90eXBlID09IFR5cGUuU1RSSU5HX1RZUEUgJiYKLSAgICAgICAgICAgICAgICBtX3BhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicGF0dGVybiBpcyBub3Qgc3Vwb3J0ZWQgZm9yIHN0cmluZyBwcm9wZXJ0aWVzIChrZXk6IiArIG1fa2V5ICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgIisiLCAiLSIsICI9IiwgIm5vdyIgYW5kICJuZXZlciIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9wZXJhdGlvbiBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotCi0gICAgICAgICAgICAvLyBQcm9wZXJ0eSB0eXBlIG9wZXJhdGlvbnMKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVF9PUEVSID0gICAwOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDUkVNRU5UX09QRVIgPSAgIDE7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUVVBTFNfT1BFUiA9ICAgICAgMjsKLQotICAgICAgICAgICAgLy8gU3BlY2lhbCB2YWx1ZXMKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PV19WQUxVRSA9ICAgICAgICAzOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9WQUxVRSA9ICAgICAgIDQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IisiLCAiLSIsICI9IiwgTk9XX1ZBTFVFXywgTlVMTF9WQUxVRV99OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGludCB0b09wZXJhdGlvbihTdHJpbmcgb3BlcikgewotICAgICAgICAgICAgICAgIGlmICgiKyIuZXF1YWxzKG9wZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTkNSRU1FTlRfT1BFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIi0iLmVxdWFscyhvcGVyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVDUkVNRU5UX09QRVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5PV19WQUxVRV8uZXF1YWxzKG9wZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1dfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5VTExfVkFMVUVfLmVxdWFscyhvcGVyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVRVUFMU19PUEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEVudW1lcmF0ZWQgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlcyAiaW50IiwgImRhdGUiIGFuZCAic3RyaW5nIi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotCi0gICAgICAgICAgICAvLyBQcm9wZXJ0eSB0eXBlcwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUl9UWVBFID0gICAgIDA7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRFX1RZUEUgPSAgICAgICAgMTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklOR19UWVBFID0gICAgICAyOwotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJpbnQiLCAiZGF0ZSIsICJzdHJpbmcifTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgdG9UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCJpbnQiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgiZGF0ZSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBEQVRFX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBTVFJJTkdfVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JlbmFtZUV4dGVuc2lvbnMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JlbmFtZUV4dGVuc2lvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4NmFiMS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZW5hbWVFeHRlbnNpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqIAotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFRhc2sgdG8gcmVuYW1lIGZpbGVzIGJhc2VkIG9uIGV4dGVuc2lvbi4gVGhpcyB0YXNrIGhhcyB0aGUgZm9sbG93aW5nCi0gKiBwcm9wZXJ0aWVzIHdoaWNoIGNhbiBiZSBzZXQ6Ci0gKiA8dWw+Ci0gKiA8bGk+ZnJvbUV4dGVuc2lvbjogPC9saT4KLSAqIDxsaT50b0V4dGVuc2lvbjogPC9saT4KLSAqIDxsaT5zcmNEaXI6IDwvbGk+Ci0gKiA8bGk+cmVwbGFjZTogPC9saT4KLSAqIDwvdWw+Ci0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIGRJb24gR2lsbGFyZCA8YSBocmVmPSJtYWlsdG86ZGlvbkBtdWx0aXRhc2suY29tLmF1Ij5kaW9uQG11bHRpdGFzay5jb20uYXU8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUV4dGVuc2lvbnMgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZnJvbUV4dGVuc2lvbiA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHRvRXh0ZW5zaW9uID0gIiI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2UgPSBmYWxzZTsKLSAgICBwcml2YXRlIEZpbGUgc3JjRGlyOwotCi0gICAgcHJpdmF0ZSBNYXBwZXIuTWFwcGVyVHlwZSBnbG9iVHlwZTsKLQotCi0gICAgLyoqIENyZWF0ZXMgbmV3IFJlbmFtZUV4dGVuc2lvbnMgKi8KLSAgICBwdWJsaWMgUmVuYW1lRXh0ZW5zaW9ucygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgZ2xvYlR5cGUgPSBuZXcgTWFwcGVyLk1hcHBlclR5cGUoKTsKLSAgICAgICAgZ2xvYlR5cGUuc2V0VmFsdWUoImdsb2IiKTsKLSAgICB9Ci0KLSAgICAvKiogc3RvcmUgZnJvbUV4dGVuc2lvbiAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9tRXh0ZW5zaW9uKFN0cmluZyBmcm9tKSB7Ci0gICAgICAgIGZyb21FeHRlbnNpb24gPSBmcm9tOwotICAgIH0KLQotICAgIC8qKiBzdG9yZSB0b0V4dGVuc2lvbiAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0V4dGVuc2lvbihTdHJpbmcgdG8pIHsKLSAgICAgICAgdG9FeHRlbnNpb24gPSB0bzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzdG9yZSByZXBsYWNlIGF0dHJpYnV0ZSAtIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0YXJnZXQgZmlsZQotICAgICAqIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBpZiBwcmVzZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVwbGFjZShib29sZWFuIHJlcGxhY2UpIHsKLSAgICAgICAgdGhpcy5yZXBsYWNlID0gcmVwbGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgZmlsZXMgdG8gYmUgcmVuYW1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmNEaXIoRmlsZSBzcmNEaXIpIHsKLSAgICAgICAgdGhpcy5zcmNEaXIgPSBzcmNEaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHRhc2ssIGkuZS4gZG9lcyB0aGUgYWN0dWFsIGNvbXBpbGVyIGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBmaXJzdCBvZmYsIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIGZyb20gYW5kIHRvIGV4dGVuc2lvbgotICAgICAgICBpZiAoZnJvbUV4dGVuc2lvbiA9PSBudWxsIHx8IHRvRXh0ZW5zaW9uID09IG51bGwgfHwgc3JjRGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggInNyY0RpciwgZnJvbUV4dGVuc2lvbiBhbmQgdG9FeHRlbnNpb24gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIG11c3QgYmUgc2V0ISIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSByZW5hbWVleHQgdGFzayBpcyBkZXByZWNhdGVkLiAgVXNlIG1vdmUgaW5zdGVhZC4iLAotICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIGxvZygiUmVwbGFjZSB0aGlzIHdpdGg6IiwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgIGxvZygiPG1vdmUgdG9kaXI9XCIiK3NyY0RpcisiXCIgb3ZlcndyaXRlPVwiIityZXBsYWNlKyJcIj4iLCAKLSAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICBsb2coIiAgPGZpbGVzZXQgZGlyPVwiIitzcmNEaXIrIlwiIC8+IiwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgIGxvZygiICA8bWFwcGVyIHR5cGU9XCJnbG9iXCIiLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgbG9nKCIgICAgICAgICAgZnJvbT1cIioiK2Zyb21FeHRlbnNpb24rIlwiIiwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgIGxvZygiICAgICAgICAgIHRvPVwiKiIrdG9FeHRlbnNpb24rIlwiIC8+IiwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgIGxvZygiPC9tb3ZlPiIsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICBsb2coInVzaW5nIHRoZSBzYW1lIHBhdHRlcm5zIG9uIDxmaWxlc2V0PiBhcyB5b3VcJ3ZlIHVzZWQgaGVyZSIsIAotICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7Ci0KLSAgICAgICAgTW92ZSBtb3ZlID0gKE1vdmUpcHJvamVjdC5jcmVhdGVUYXNrKCJtb3ZlIik7Ci0gICAgICAgIG1vdmUuc2V0T3duaW5nVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIG1vdmUuc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgIG1vdmUuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIG1vdmUuc2V0VG9kaXIoc3JjRGlyKTsKLSAgICAgICAgbW92ZS5zZXRPdmVyd3JpdGUocmVwbGFjZSk7Ci0KLSAgICAgICAgZmlsZXNldC5zZXREaXIoc3JjRGlyKTsKLSAgICAgICAgbW92ZS5hZGRGaWxlc2V0KGZpbGVzZXQpOwotCi0gICAgICAgIE1hcHBlciBtZSA9IG1vdmUuY3JlYXRlTWFwcGVyKCk7Ci0gICAgICAgIG1lLnNldFR5cGUoZ2xvYlR5cGUpOwotICAgICAgICBtZS5zZXRGcm9tKCIqIitmcm9tRXh0ZW5zaW9uKTsKLSAgICAgICAgbWUuc2V0VG8oIioiK3RvRXh0ZW5zaW9uKTsKLQotICAgICAgICBtb3ZlLmV4ZWN1dGUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JwbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUnBtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYmVmYWYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUnBtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotCi0vKioKLSAqCi0gKiAgQGF1dGhvciBsdWNhc0Bjb2xsYWIubmV0Ci0gKi8KLXB1YmxpYyBjbGFzcyBScG0gZXh0ZW5kcyBUYXNrIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiB0aGUgc3BlYyBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3BlY0ZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgcnBtIHRvcCBkaXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgdG9wRGlyOwotCi0gICAgLyoqCi0gICAgICogdGhlIHJwbSBjb21tYW5kIHRvIHVzZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbW1hbmQgPSAiLWJiIjsKLQotICAgIC8qKgotICAgICAqIGNsZWFuIEJVSUxEIGRpcmVjdG9yeQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhbkJ1aWxkRGlyID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiByZW1vdmUgc3BlYyBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZVNwZWMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIHJlbW92ZSBzb3VyY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZVNvdXJjZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogdGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dDsKLQotICAgIC8qKgotICAgICAqIHRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBjb21tYW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGVycm9yOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBDb21tYW5kbGluZSB0b0V4ZWN1dGUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLQotICAgICAgICB0b0V4ZWN1dGUuc2V0RXhlY3V0YWJsZSgicnBtIik7Ci0gICAgICAgIGlmICh0b3BEaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tZGVmaW5lIik7Ci0gICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiX3RvcGRpciIgKyB0b3BEaXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0TGluZShjb21tYW5kKTsKLQotICAgICAgICBpZiAoY2xlYW5CdWlsZERpcikgewotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tY2xlYW4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVtb3ZlU3BlYykgewotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tcm1zcGVjIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlbW92ZVNvdXJjZSkgewotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tcm1zb3VyY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJTUEVDUy8iICsgc3BlY0ZpbGUpOwotCi0gICAgICAgIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHN0cmVhbWhhbmRsZXIgPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0c3RyZWFtID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIGVycm9yc3RyZWFtID0gbnVsbDsKLSAgICAgICAgaWYgKGVycm9yID09IG51bGwgJiYgb3V0cHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0cmVhbWhhbmRsZXIgPSBuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLCBQcm9qZWN0Lk1TR19JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0c3RyZWFtID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXQpKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSxsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0c3RyZWFtID0gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBlcnJvcnN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZXJyb3IpKSk7Ci0gICAgICAgICAgICAgICAgfSAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGVycm9yc3RyZWFtID0gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmVhbWhhbmRsZXIgPSBuZXcgUHVtcFN0cmVhbUhhbmRsZXIob3V0cHV0c3RyZWFtLCBlcnJvcnN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKHN0cmVhbWhhbmRsZXIsIG51bGwpOwotCi0gICAgICAgIGV4ZS5zZXRBbnRSdW4ocHJvamVjdCk7Ci0gICAgICAgIGlmICh0b3BEaXIgPT0gbnVsbCkgdG9wRGlyID0gcHJvamVjdC5nZXRCYXNlRGlyKCk7Ci0gICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KHRvcERpcik7Ci0KLSAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKHRvRXhlY3V0ZS5nZXRDb21tYW5kbGluZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZS5leGVjdXRlKCk7Ci0gICAgICAgICAgICBsb2coIkJ1aWxkaW5nIHRoZSBSUE0gYmFzZWQgb24gdGhlICIgKyBzcGVjRmlsZSArICIgZmlsZSIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgbG9jYXRpb24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0c3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VG9wRGlyKEZpbGUgdGQpIHsKLSAgICAgICAgdGhpcy50b3BEaXIgPSB0ZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kKFN0cmluZyBjKSB7Ci0gICAgICAgIHRoaXMuY29tbWFuZCA9IGM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3BlY0ZpbGUoU3RyaW5nIHNmKSB7Ci0gICAgICAgIGlmICggKHNmID09IG51bGwpIHx8IChzZi50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmeSBhIHNwZWMgZmlsZSIsbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc3BlY0ZpbGUgPSBzZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhbkJ1aWxkRGlyKGJvb2xlYW4gY2JkKSB7Ci0gICAgICAgIGNsZWFuQnVpbGREaXIgPSBjYmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlU3BlYyhib29sZWFuIHJzKSB7Ci0gICAgICAgIHJlbW92ZVNwZWMgPSByczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVTb3VyY2UoYm9vbGVhbiBycykgewotICAgICAgICByZW1vdmVTb3VyY2UgPSByczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoRmlsZSBvdXRwdXQpIHsKLSAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3IoRmlsZSBlcnJvcikgewotICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NyaXB0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY3JpcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlNmIxNC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY3JpcHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IGNvbS5pYm0uYnNmLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogRXhlY3V0ZSBhIHNjcmlwdAotICoKLSAqIEBhdXRob3IgU2FtIFJ1YnkgPGEgaHJlZj0ibWFpbHRvOnJ1YnlzQHVzLmlibS5jb20iPnJ1YnlzQHVzLmlibS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTY3JpcHQgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZTsKLSAgICBwcml2YXRlIFN0cmluZyBzY3JpcHQgPSAiIjsKLSAgICBwcml2YXRlIEhhc2h0YWJsZSBiZWFucyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSBsaXN0IG9mIG5hbWVkIG9iamVjdHMgdG8gdGhlIGxpc3QgdG8gYmUgZXhwb3J0ZWQgdG8gdGhlIHNjcmlwdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRCZWFucyhIYXNodGFibGUgZGljdGlvbmFyeSkgewotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGU9ZGljdGlvbmFyeS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBrZXkubGVuZ3RoKCk+MCAmJgotICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoa2V5LmNoYXJBdCgwKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGk9MTsgaXNWYWxpZCAmJiBpPGtleS5sZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoa2V5LmNoYXJBdChpKSk7Ci0KLSAgICAgICAgICAgIGlmIChpc1ZhbGlkKSBiZWFucy5wdXQoa2V5LCBkaWN0aW9uYXJ5LmdldChrZXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSB3b3JrLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGRCZWFucyhwcm9qZWN0LmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICBhZGRCZWFucyhwcm9qZWN0LmdldFVzZXJQcm9wZXJ0aWVzKCkpOwotICAgICAgICAgICAgYWRkQmVhbnMocHJvamVjdC5nZXRUYXJnZXRzKCkpOwotICAgICAgICAgICAgYWRkQmVhbnMocHJvamVjdC5nZXRSZWZlcmVuY2VzKCkpOwotCi0gICAgICAgICAgICBCU0ZNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQlNGTWFuYWdlciAoKTsKLQotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gYmVhbnMua2V5cygpIDsgZS5oYXNNb3JlRWxlbWVudHMoKSA7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGJlYW5zLmdldChrZXkpOwotICAgICAgICAgICAgICAgIG1hbmFnZXIuZGVjbGFyZUJlYW4oa2V5LCB2YWx1ZSwgdmFsdWUuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHNjcmlwdAotICAgICAgICAgICAgbWFuYWdlci5leGVjKGxhbmd1YWdlLCAiPEFOVD4iLCAwLCAwLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChCU0ZFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gYmU7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdGUgPSBiZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICh0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgICh0ZSBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgdGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdCA9IHRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGxhbmd1YWdlIChyZXF1aXJlZCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgc2NyaXB0IHZhcmlhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgc2NyaXB0IGZyb20gYW4gZXh0ZXJuYWwgZmlsZSAKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBzY3JpcHQgdmFyaWFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgIiArIGZpbGVOYW1lICsgIiBub3QgZm91bmQuIik7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gKGludClmaWxlLmxlbmd0aCgpOwotICAgICAgICBieXRlIGRhdGFbXSA9IG5ldyBieXRlW2NvdW50XTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgIGluU3RyZWFtLnJlYWQoZGF0YSk7Ci0gICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNjcmlwdCArPSBuZXcgU3RyaW5nKGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIHNjcmlwdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBzY3JpcHQgdmFyaWFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICB0aGlzLnNjcmlwdCArPSB0ZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1N0eWxlQm9vay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU3R5bGVCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxM2YwM2YuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU3R5bGVCb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7IAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOyAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7IAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7IAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7IAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmE7IAotCi0vKiogCi0gKiBCYXNpYyB0YXNrIGZvciBhcGFjaGUgc3R5bGVib29rLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4gCi0gKi8gCi1wdWJsaWMgY2xhc3MgU3R5bGVCb29rIAotICAgIGV4dGVuZHMgSmF2YSAKLXsgCi0gICAgcHJvdGVjdGVkIEZpbGUgICAgICAgICAgICAgICAgICAgbV90YXJnZXREaXJlY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIEZpbGUgICAgICAgICAgICAgICAgICAgbV9za2luRGlyZWN0b3J5OwotICAgIHByb3RlY3RlZCBGaWxlICAgICAgICAgICAgICAgICAgIG1fYm9vazsKLQotICAgIHB1YmxpYyBTdHlsZUJvb2soKSB7Ci0gICAgICAgIHNldENsYXNzbmFtZSggIm9yZy5hcGFjaGUuc3R5bGVib29rLlN0eWxlQm9vayIgKTsKLSAgICAgICAgc2V0Rm9yayggdHJ1ZSApOwotICAgICAgICBzZXRGYWlsb25lcnJvciggdHJ1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJvb2soIGZpbmFsIEZpbGUgYm9vayApIHsKLSAgICAgICAgbV9ib29rID0gYm9vazsKLSAgICB9IAotIAotICAgIHB1YmxpYyB2b2lkIHNldFNraW5EaXJlY3RvcnkoIGZpbmFsIEZpbGUgc2tpbkRpcmVjdG9yeSApIHsKLSAgICAgICAgbV9za2luRGlyZWN0b3J5ID0gc2tpbkRpcmVjdG9yeTsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RGlyZWN0b3J5KCBmaW5hbCBGaWxlIHRhcmdldERpcmVjdG9yeSApIHsKLSAgICAgICAgbV90YXJnZXREaXJlY3RvcnkgPSB0YXJnZXREaXJlY3Rvcnk7Ci0gICAgfSAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgIAotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gIHsgCi0KLSAgICAgICAgaWYoIG51bGwgPT0gbV90YXJnZXREaXJlY3RvcnkgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJUYXJnZXREaXJlY3RvcnkgYXR0cmlidXRlIG5vdCBzZXQuIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG51bGwgPT0gbV9za2luRGlyZWN0b3J5ICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiU2tpbkRpcmVjdG9yeSBhdHRyaWJ1dGUgbm90IHNldC4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbnVsbCA9PSBtX2Jvb2sgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJib29rIGF0dHJpYnV0ZSBub3Qgc2V0LiIgKTsKLSAgICAgICAgfSAKLQotICAgICAgICBjcmVhdGVBcmcoKS5zZXRWYWx1ZSggInRhcmdldERpcmVjdG9yeT0iICsgbV90YXJnZXREaXJlY3RvcnkgKTsKLSAgICAgICAgY3JlYXRlQXJnKCkuc2V0VmFsdWUoIG1fYm9vay50b1N0cmluZygpICk7Ci0gICAgICAgIGNyZWF0ZUFyZygpLnNldFZhbHVlKCBtX3NraW5EaXJlY3RvcnkudG9TdHJpbmcoKSApOwotCi0gICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB9IAotfSAKLSAKLSAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1Rlc3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2OGE5ZS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7Ci0gCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247IAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmE7IAotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7IAotIAotLyoqIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkb25hbGRwQGFwYWNoZS5vcmciPlBldGVyIERvbmFsZDwvYT4gCi0gKi8gCi1wdWJsaWMgY2xhc3MgVGVzdCAKLSAgICBleHRlbmRzIEphdmEgewotIAotICAgIHByb3RlY3RlZCBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdGVzdHMgICAgICAgICAgICA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgVGVzdGxldEVudHJ5IHsKLQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIG1fdGVzdG5hbWUgPSAiIjsKLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KCBmaW5hbCBTdHJpbmcgdGVzdG5hbWUgKSB7Ci0gICAgICAgICAgICBtX3Rlc3RuYW1lICs9IHRlc3RuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtX3Rlc3RuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3QoKSB7Ci0gICAgICAgIHNldENsYXNzbmFtZSggIm9yZy5hcGFjaGUudGVzdGxldC5lbmdpbmUuVGV4dFRlc3RFbmdpbmUiICk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RsZXRFbnRyeSBjcmVhdGVUZXN0bGV0KCkgewotICAgICAgICBmaW5hbCBUZXN0bGV0RW50cnkgZW50cnkgPSBuZXcgVGVzdGxldEVudHJ5KCk7Ci0gICAgICAgIG1fdGVzdHMuYWRkRWxlbWVudCggZW50cnkgKTsKLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLSAKLSAgICBwdWJsaWMgdm9pZCBzZXRTaG93U3VjY2VzcyggZmluYWwgYm9vbGVhbiBzaG93U3VjY2VzcyApIHsKLSAgICAgICAgY3JlYXRlQXJnKCkuc2V0VmFsdWUoICItcz0iICsgc2hvd1N1Y2Nlc3MgKTsKLSAgICB9IAotIAotICAgIHB1YmxpYyB2b2lkIHNldFNob3dCYW5uZXIoIGZpbmFsIFN0cmluZyBzaG93QmFubmVyICkgeyAKLSAgICAgICAgY3JlYXRlQXJnKCkuc2V0VmFsdWUoICItYj0iICsgc2hvd0Jhbm5lciApOwotICAgIH0gCi0gCi0gICAgcHVibGljIHZvaWQgc2V0U2hvd1RyYWNlKCBmaW5hbCBib29sZWFuIHNob3dUcmFjZSApIHsKLSAgICAgICAgIGNyZWF0ZUFyZygpLnNldFZhbHVlKCAiLXQ9IiArIHNob3dUcmFjZSApOwotICAgIH0gCi0gCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yY2VTaG93VHJhY2UoIGZpbmFsIGJvb2xlYW4gZm9yY2VTaG93VHJhY2UgKSB7IAotICAgICAgICBjcmVhdGVBcmcoKS5zZXRWYWx1ZSggIi1mPSIgKyBmb3JjZVNob3dUcmFjZSApOwotICAgIH0gCi0gCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIAotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gIHsgCi0KLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBtX3Rlc3RzLnNpemUoKTsKLQotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHNpemU7IGkgKysgKSB7Ci0gICAgICAgICAgICBjcmVhdGVBcmcoKS5zZXRWYWx1ZSggbV90ZXN0cy5lbGVtZW50QXQoIGkgKS50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgfSAKLX0gCi0gCi0gCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1ZDhkNS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUTGlhaXNvbjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLQotLyoqCi0gKiBDb25jcmV0ZSBsaWFpc29uIGZvciBYU0xUIHByb2Nlc3NvciBpbXBsZW1lbnRpbmcgVHJhWC4gKGllIEpBWFAgMS4xKQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJ1YnlzQHVzLmlibS5jb20iPlNhbSBSdWJ5PC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZGltc0B5YWhvby5jb20iPkRhdmFudW0gU3Jpbml2YXM8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAYXBhY2hlLm9yZyI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUcmFYTGlhaXNvbiBpbXBsZW1lbnRzIFhTTFRMaWFpc29uIHsKLQotICAgIC8qKiBUaGUgdHJheCBUcmFuc2Zvcm1lckZhY3RvcnkgKi8KLSAgICBwcml2YXRlIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IG51bGw7Ci0KLSAgICAvKiogc3R5bGVzaGVldCBzdHJlYW0sIGNsb3NlIGl0IGFzYXAgKi8KLSAgICBwcml2YXRlIEZpbGVJbnB1dFN0cmVhbSB4c2xTdHJlYW0gPSBudWxsOwotCi0gICAgLyoqIFN0eWxlc2hlZXQgdGVtcGxhdGUgKi8KLSAgICBwcml2YXRlIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSBudWxsOwotCi0gICAgLyoqIHRyYW5zZm9ybWVyICovCi0gICAgcHJpdmF0ZSBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgVHJhWExpYWlzb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICB9Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0gSU1QT1JUQU5UCi0gICAgLy8gMSkgRG9uJ3QgdXNlIHRoZSBTdHJlYW1Tb3VyY2UoRmlsZSkgY3Rvci4gSXQgd29uJ3Qgd29yayB3aXRoCi0gICAgLy8geGFsYW4gcHJpb3IgdG8gMi4yIGJlY2F1c2Ugb2Ygc3lzdGVtaWQgYnVncy4KLQotICAgIC8vIDIpIFVzZSBhIHN0cmVhbSBzbyB0aGF0IHlvdSBjYW4gY2xvc2UgaXQgeW91cnNlbGYgcXVpY2tseQotICAgIC8vIGFuZCBhdm9pZCBrZWVwaW5nIHRoZSBoYW5kbGUgdW50aWwgdGhlIG9iamVjdCBpcyBnYXJiYWdlZC4KLSAgICAvLyAoYWx3YXlzIGtlZXAgY29udHJvbCksIG90aGVyd2lzZSB5b3Ugd29uJ3QgYmUgYWJsZSB0byBkZWxldGUKLSAgICAvLyB0aGUgZmlsZSBxdWlja2x5IG9uIHdpbmRvd3MuCi0KLSAgICAvLyAzKSBBbHdheXMgc2V0IHRoZSBzeXN0ZW1pZCB0byB0aGUgc291cmNlIGZvciBpbXBvcnRzLCBpbmNsdWRlcy4uLgotICAgIC8vIGluIHhzbCBhbmQgeG1sLi4uCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZXNoZWV0KEZpbGUgc3R5bGVzaGVldCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHhzbFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3R5bGVzaGVldCk7Ci0gICAgICAgIFN0cmVhbVNvdXJjZSBzcmMgPSBuZXcgU3RyZWFtU291cmNlKHhzbFN0cmVhbSk7Ci0gICAgICAgIHNyYy5zZXRTeXN0ZW1JZChnZXRTeXN0ZW1JZChzdHlsZXNoZWV0KSk7Ci0gICAgICAgIHRlbXBsYXRlcyA9IHRmYWN0b3J5Lm5ld1RlbXBsYXRlcyhzcmMpOwotICAgICAgICB0cmFuc2Zvcm1lciA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShGaWxlIGluZmlsZSwgRmlsZSBvdXRmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5maWxlKTsKLSAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dGZpbGUpOwotICAgICAgICAgICAgU3RyZWFtU291cmNlIHNyYyA9IG5ldyBTdHJlYW1Tb3VyY2UoZmlzKTsKLSAgICAgICAgICAgIHNyYy5zZXRTeXN0ZW1JZChnZXRTeXN0ZW1JZChpbmZpbGUpKTsKLSAgICAgICAgICAgIFN0cmVhbVJlc3VsdCByZXMgPSBuZXcgU3RyZWFtUmVzdWx0KGZvcyk7Ci0gICAgICAgICAgICAvLyBub3Qgc3VyZSB3aGF0IGNvdWxkIGJlIHRoZSBuZWVkIG9mIHRoaXMuLi4KLSAgICAgICAgICAgIHJlcy5zZXRTeXN0ZW1JZChnZXRTeXN0ZW1JZChvdXRmaWxlKSk7Ci0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzcmMsIHJlcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xvc2UgYWxsIGhhbmRsZXMsIG90aGVyd2lzZSB0aGUgZ2FyYmFnZQotICAgICAgICAgICAgLy8gY29sbGVjdG9yIHdpbGwgY2xvc2UgdGhlbS4uLndoZW5ldmVyIHBvc3NpYmxlIGFuZAotICAgICAgICAgICAgLy8gV2luZG93cyBtYXkgY29tcGxhaW4gYWJvdXQgbm90IGJlaW5nIGFibGUgdG8gZGVsZXRlIGZpbGVzLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoeHNsU3RyZWFtICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICB4c2xTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKXt9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpe30KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCl7fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHN5c3RlbWlkIGlzIG1hZGUgb2YgJy8nIGFuZCBub3QgJ1wnIG90aGVyd2lzZQotICAgIC8vIGNyaW1zb24gd2lsbCBjb21wbGFpbiB0aGF0IGl0IGNhbm5vdCByZXNvbHZlIHJlbGF0aXZlIGVudGl0aWVzCi0gICAgLy8gYmVjYXVzZSBpdCBncmFicyB0aGUgYmFzZSB1cmkgdmlhIGxhc3RJbmRleE9mKCcvJykgd2l0aG91dAotICAgIC8vIG1ha2luZyBzdXJlIGl0IGlzIHJlYWxseSBhIC8nZWQgcGF0aAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3lzdGVtSWQoRmlsZSBmaWxlKXsKLSAgICAgIFN0cmluZyBwYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJ1xcJywnLycpOwotICAgICAgcmV0dXJuIEZJTEVfUFJPVE9DT0xfUFJFRklYICsgcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKXsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci19IC8vLS0gVHJhWExpYWlzb24KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hNTFZhbGlkYXRlVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWE1MVmFsaWRhdGVUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzUwMzQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWE1MVmFsaWRhdGVUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguUGFyc2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJBZGFwdGVyOwotCi0vKiogCi0gKiBUaGUgPGNvZGU+WE1MVmFsaWRhdGVUYXNrPC9jb2RlPiBjaGVja3MgdGhhdCBhbiBYTUwgZG9jdW1lbnQgaXMgdmFsaWQsCi0gKiB3aXRoIGEgU0FYIHZhbGlkYXRpbmcgcGFyc2VyLgotICogQGF1dGhvciBSYXBoYWVsIFBpZXJxdWluIDxhIGhyZWY9Im1haWx0bzpyYXBoYWVsLnBpZXJxdWluQGFnaXNwaGVyZS5jb20iPnJhcGhhZWwucGllcnF1aW5AYWdpc3BoZXJlLmNvbTwvYT4KLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRlVGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGFyc2VyIGNsYXNzbmFtZSB1c2VkIGJ5IHRoZSB0YXNrIHRvIHByb2Nlc3MKLSAgICAgKiB2YWxpZGF0aW9uLgotICAgICAqLwotICAgIC8vIFRoZSBjcmltc29uIGltcGxlbWVudGF0aW9uIGlzIHNoaXBwZWQgd2l0aCBhbnQuCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9YTUxfUkVBREVSX0NMQVNTTkFNRT0gIm9yZy5hcGFjaGUuY3JpbXNvbi5wYXJzZXIuWE1MUmVhZGVySW1wbCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBJTklUX0ZBSUxFRF9NU0cgPSAiQ291bGQnbnQgc3RhcnQgeG1sIHZhbGlkYXRpb246ICI7Ci0KLSAgICAvLyBhbnQgdGFzayBwcm9wZXJ0aWVzCi0gICAgLy8gZGVmYXVsdHMKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvciA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gd2FybiA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbGVuaWVudCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgIHJlYWRlckNsYXNzTmFtZSA9IERFRkFVTFRfWE1MX1JFQURFUl9DTEFTU05BTUU7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEZpbGUgZmlsZSA9IG51bGw7IC8vIGZpbGUgdG8gYmUgdmFsaWRhdGVkCi0gICAgcHJvdGVjdGVkIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsgLy8gc2V0cyBvZiBmaWxlIHRvIGJlIHZhbGlkYXRlZAotICAgIHByb3RlY3RlZCBQYXRoIGNsYXNzcGF0aDsKLQotCi0gICAgLyoqCi0gICAgICogdGhlIHBhcnNlciBpcyB2aWV3ZWQgYXMgYSBTQVgyIFhNTFJlYWRlci4gSWYgYSBTQVgxIHBhcnNlciBpcyBzcGVjaWZpZWQsCi0gICAgICogaXQncyB3cmFwcGVkIGluIGFuIGFkYXB0ZXIgdGhhdCBtYWtlIGl0IGJlaGF2ZSBhcyBhIFhNTFJlYWRlci4KLSAgICAgKiBhIG1vcmUgJ3N0YW5kYXJkJyB3YXkgb2YgZG9pbmcgdGhpcyB3b3VsZCBiZSB0byB1c2UgdGhlIEpBWFAxLjEgU0FYUGFyc2VyCi0gICAgICogaW50ZXJmYWNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxSZWFkZXIgeG1sUmVhZGVyID0gbnVsbDsgLy8gWE1MUmVhZGVyIHVzZWQgdG8gdmFsaWRhdGlvbiBwcm9jZXNzCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvckVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIKLSAgICAgICAgPSBuZXcgVmFsaWRhdG9yRXJyb3JIYW5kbGVyKCk7IC8vIHRvIHJlcG9ydCBzYXggcGFyc2luZyBlcnJvcnMKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGZlYXR1cmVzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IGhvdyBwYXJzZXIgZXJyb3IgYXJlIHRvIGJlIGhhbmRsZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IChkZWZhdWx0KSwgdGhyb3cgYSBidWlsZEV4Y2VwdGlvbiBpZiB0aGUgcGFyc2VyIHlpZWxkcyBhbiBlcnJvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWwpIHsKLSAgICAgICAgCi0gICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IGhvdyBwYXJzZXIgZXJyb3IgYXJlIHRvIGJlIGhhbmRsZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgc2V0IHRvIDxjb2RlPnRydWU8L3RydWU+IChkZWZhdWx0KSwgbG9nIGEgd2FybiBtZXNzYWdlIGZvciBlYWNoIFNBWCB3YXJuIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdhcm4oYm9vbGVhbiBib29sKSB7Ci0gICAgICAgIAotICAgICAgICB3YXJuID0gYm9vbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIHBhcnNlciBzaG91bGQgYmUgdmFsaWRhdGluZy4gRGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIHRoZSB2YWxpZGF0aW9uIHdpbGwgZmFpbCBvbmx5IGlmIHRoZSBwYXJzZWQgZG9jdW1lbnQgaXMgbm90IHdlbGwgZm9ybWVkIFhNTC4KLSAgICAgKiA8cD4KLSAgICAgKiB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3Mgd2l0aCB7QGxpbmsgI3NldENsYXNzTmFtZShTdHJpbmcpfSBpcyBub3QgYSBTQVgyCi0gICAgICogWE1MUmVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExlbmllbnQoYm9vbGVhbiBib29sKSB7Ci0KLSAgICAgICAgbGVuaWVudCA9IGJvb2w7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIFNBWCBwYXJzZXIgdG8gYmUgdXNlZC4gKG9wdGlvbmFsKQotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgc2hvdWxkIGJlIGFuIGltcGxlbWVudGF0aW9uIG9mIFNBWDIgPGNvZGU+b3JnLnhtbC5zYXguWE1MUmVhZGVyPC9jb2RlPgotICAgICAqIG9yIFNBWDIgPGNvZGU+b3JnLnhtbC5zYXguUGFyc2VyPC9jb2RlPi4KLSAgICAgKiA8cD4gaWYgY2xhc3NOYW1lIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPm9yZy54bWwuc2F4LlBhcnNlcjwvY29kZT4sIHtAbGluayAjc2V0TGVuaWVudChib29sZWFuKX0sCi0gICAgICogd2lsbCBiZSBpZ25vcmVkLgotICAgICAqIDxwPiBpZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCB7QGxpbmsgI0RFRkFVTFRfWE1MX1JFQURFUl9DTEFTU05BTUV9IHdpbGwgYmUgdXNlZC4KLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LlBhcnNlcjsKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICAKLSAgICAgICAgcmVhZGVyQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB0aGUgY2xhc3NwYXRoIHRvIGJlIHNlYXJjaGVkIHRvIGxvYWQgdGhlIHBhcnNlciAob3B0aW9uYWwpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlICNzZXRDbGFzc1BhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSAjc2V0Q2xhc3NQYXRoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNwZWNpZmlmeSB0aGUgZmlsZSB0byBiZSBjaGVja2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzcGVjaWZpZnkgYSBzZXQgb2YgZmlsZSB0byBiZSBjaGVja2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgewotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW50IGZpbGVQcm9jZXNzZWQgPSAwOwotICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIChmaWxlc2V0cy5zaXplKCk9PTApICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UgLSBhIGZpbGUgb3IgYSBmaWxlc2V0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdFZhbGlkYXRvcigpOwotCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuY2FuUmVhZCgpICYmIGZpbGUuaXNGaWxlKCkpICB7Ci0gICAgICAgICAgICAgICAgZG9WYWxpZGF0ZShmaWxlKTsKLSAgICAgICAgICAgICAgICBmaWxlUHJvY2Vzc2VkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPSAiRmlsZSAiICsgZmlsZSArICIgY2Fubm90IGJlIHJlYWQiOwotICAgICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm9yTXNnKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGxvZyhlcnJvck1zZywgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxmaWxlc2V0cy5zaXplKCk7IGkrKykgewotCi0gICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGZpbGVzLmxlbmd0aCA7IGorKykgIHsKLSAgICAgICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShmcy5nZXREaXIocHJvamVjdCksIGZpbGVzW2pdKTsKLSAgICAgICAgICAgICAgICBkb1ZhbGlkYXRlKHNyY0ZpbGUpOwotICAgICAgICAgICAgICAgIGZpbGVQcm9jZXNzZWQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2coZmlsZVByb2Nlc3NlZCArICIgZmlsZShzKSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZC4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0IHRoZSBwYXJzZXIgOgotICAgICAqIGxvYWQgdGhlIHBhcnNlciBjbGFzcywgYW5kIHNldCBmZWF0dXJlcyBpZiBuZWNlc3NhcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRvcigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gbG9hZCB0aGUgcGFyc2VyIGNsYXNzCi0gICAgICAgICAgICAvLyB3aXRoIEpBWFAsIHdlIHdvdWxkIHVzZSBhIFNBWFBhcnNlciBmYWN0b3J5Ci0gICAgICAgICAgICBDbGFzcyByZWFkZXJDbGFzcz0gbnVsbDsKLSAgICAgICAgICAgIC8vQ2xhc3MgcmVhZGVySW1wbCA9IG51bGw7Ci0gICAgICAgICAgICAvL0NsYXNzIHBhcnNlckltcGwgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IEFudENsYXNzTG9hZGVyKHByb2plY3QsIGNsYXNzcGF0aCk7Ci0vLyAgICAgICAgICAgICAgICBsb2FkZXIuYWRkU3lzdGVtUGFja2FnZVJvb3QoIm9yZy54bWwiKTsgLy8gbmVlZGVkIHRvIGF2b2lkIGNvbmZsaWN0Ci0gICAgICAgICAgICAgICAgcmVhZGVyQ2xhc3MgPSBsb2FkZXIubG9hZENsYXNzKHJlYWRlckNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIuaW5pdGlhbGl6ZUNsYXNzKHJlYWRlckNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSAKLSAgICAgICAgICAgICAgICByZWFkZXJDbGFzcyA9IENsYXNzLmZvck5hbWUocmVhZGVyQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdGhlbiBjaGVjayBpdCBpbXBsZW1lbnRzIFhNTFJlYWRlcgotICAgICAgICAgICAgaWYgKFhNTFJlYWRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJlYWRlckNsYXNzKSkgewotCi0gICAgICAgICAgICAgICAgeG1sUmVhZGVyID0gKFhNTFJlYWRlcikgcmVhZGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBsb2coIlVzaW5nIFNBWDIgcmVhZGVyICIgKyByZWFkZXJDbGFzc05hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzZWUgaWYgaXQgaXMgYSBTQVgxIFBhcnNlcgotICAgICAgICAgICAgICAgIGlmIChQYXJzZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyZWFkZXJDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyc2VyIHBhcnNlciA9IChQYXJzZXIpIHJlYWRlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFJlYWRlciA9IG5ldyBQYXJzZXJBZGFwdGVyKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiVXNpbmcgU0FYMSBwYXJzZXIgIiArIHJlYWRlckNsYXNzTmFtZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihJTklUX0ZBSUxFRF9NU0cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVhZGVyQ2xhc3NOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1wbGVtZW50cyBub3IgU0FYMSBQYXJzZXIgbm9yIFNBWDIgWE1MUmVhZGVyLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oSU5JVF9GQUlMRURfTVNHICsgcmVhZGVyQ2xhc3NOYW1lLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oSU5JVF9GQUlMRURfTVNHICsgcmVhZGVyQ2xhc3NOYW1lLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oSU5JVF9GQUlMRURfTVNHICsgcmVhZGVyQ2xhc3NOYW1lLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHhtbFJlYWRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghICh4bWxSZWFkZXIgaW5zdGFuY2VvZiBQYXJzZXJBZGFwdGVyKSkgewotICAgICAgICAgICAgLy8gdHVybiB2YWxpZGF0aW9uIG9uCi0gICAgICAgICAgICBpZiAoISBsZW5pZW50KSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBvayA9IHNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIix0cnVlLHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghIG9rKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihJTklUX0ZBSUxFRF9NU0cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVhZGVyQ2xhc3NOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBwcm92aWRlIHZhbGlkYXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZXQgb3RoZXIgZmVhdHVyZXMKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBmZWF0dXJlcy5rZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZShlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZlYXR1cmVJZCA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBzZXRGZWF0dXJlKGZlYXR1cmVJZCwgKChCb29sZWFuKSBmZWF0dXJlcy5nZXQoZmVhdHVyZUlkKSkuYm9vbGVhblZhbHVlKCksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBzZXQgYSBmZWF0dXJlIG9uIHRoZSBwYXJzZXIuCi0gICAgICogVE9ETzogZmluZCBhIHdheSB0byBzZXQgYW55IGZlYXR1cmUgZnJvbSBidWlsZC54bWwKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgYm9vbGVhbiB2YWx1ZSwgYm9vbGVhbiB3YXJuKSB7Ci0KLSAgICAgICAgYm9vbGVhbiAgdG9SZXR1cm4gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHhtbFJlYWRlci5zZXRGZWF0dXJlKGZlYXR1cmUsdmFsdWUpOwotICAgICAgICAgICAgdG9SZXR1cm4gPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmICh3YXJuKQotICAgICAgICAgICAgICAgIGxvZygiQ291bGQnbnQgc2V0IGZlYXR1cmUgJyIKLSAgICAgICAgICAgICAgICAgICAgKyBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgICsgIicgYmVjYXVzZSB0aGUgcGFyc2VyIGRvZXNuJ3QgcmVjb2duaXplIGl0IiwgCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9IGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gIGUpIHsKLSAgICAgICAgICAgIGlmICh3YXJuKQotICAgICAgICAgICAgICAgIGxvZygiQ291bGQnbnQgc2V0IGZlYXR1cmUgJyIKLSAgICAgICAgICAgICAgICAgICAgKyBmZWF0dXJlIAotICAgICAgICAgICAgICAgICAgICArICInIGJlY2F1c2UgdGhlIHBhcnNlciBkb2Vzbid0IHN1cHBvcnQgaXQiLAotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9SZXR1cm47Ci0gICAgfQotICAgIC8qCi0gICAgICogcGFyc2UgdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9WYWxpZGF0ZShGaWxlIGFmaWxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2coIlZhbGlkYXRpbmcgIiArIGFmaWxlLmdldE5hbWUoKSArICIuLi4gIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBlcnJvckhhbmRsZXIuaW5pdChhZmlsZSk7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZVJlYWRlcihhZmlsZSkpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJmaWxlOiIgKyBhZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IHVyaS5pbmRleE9mKCcjJyk7IGluZGV4ICE9IC0xOwotICAgICAgICAgICAgICAgICBpbmRleCA9IHVyaS5pbmRleE9mKCcjJykpIHsKLSAgICAgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4KSArICIlMjMiICsgdXJpLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlzLnNldFN5c3RlbUlkKHVyaSk7Ci0gICAgICAgICAgICB4bWxSZWFkZXIucGFyc2UoaXMpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkJ250IHZhbGlkYXRlIGRvY3VtZW50ICIgKyBhZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkJ250IHZhbGlkYXRlIGRvY3VtZW50ICIgKyBhZmlsZSwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZXJyb3JIYW5kbGVyLmdldEZhaWx1cmUoKSkgewotICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihhZmlsZSArICIgaXMgbm90IGEgdmFsaWQgWE1MIGRvY3VtZW50LiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvZyhhZmlsZSArICIgaXMgbm90IGEgdmFsaWQgWE1MIGRvY3VtZW50IixQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFZhbGlkYXRvckVycm9ySGFuZGxlciByb2xlIDogCi0gICAgICogPHVsPgotICAgICAqIDxsaT4gbG9nIFNBWCBwYXJzZSBleGNlcHRpb25zLAotICAgICAqIDxsaT4gcmVtZW1iZXIgaWYgYW4gZXJyb3Igb2NjdXJlZAotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGNsYXNzIFZhbGlkYXRvckVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgbGFzdEVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGZhaWxlZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgaW5pdChGaWxlIGZpbGUpIHsKLSAgICAgICAgICAgIGN1cnJlbnRGaWxlID0gZmlsZTsKLSAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBkaWQgYW4gZXJyb3IgaGFwcGVuIGR1cmluZyBsYXN0IHBhcnNpbmcgPwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsdXJlKCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZmFpbGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQotICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGRvTG9nKGV4Y2VwdGlvbixQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0KLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgICBkb0xvZyhleGNlcHRpb24sUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIC8vIGRlcGVuZGluZyBvbiBpbXBsZW1lbnRhdGlvbiwgWE1MUmVhZGVyIGNhbiB5aWVsZCBoaXBzIG9mIHdhcm5pbmcsIAotICAgICAgICAgICAgLy8gb25seSBvdXRwdXQgdGhlbiBpZiB1c2VyIGV4cGxpY2l0ZWx5IGFza2VkIGZvciBpdAotICAgICAgICAgICAgaWYgKHdhcm4pCi0gICAgICAgICAgICAgICAgZG9Mb2coZXhjZXB0aW9uLFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZG9Mb2coU0FYUGFyc2VFeGNlcHRpb24gZSwgaW50IGxvZ0xldmVsKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxvZyhnZXRNZXNzYWdlKGUpLCBsb2dMZXZlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBzeXNJRCA9IGUuZ2V0U3lzdGVtSWQoKTsKLSAgICAgICAgICAgIGlmIChzeXNJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUgPSBlLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbCA9IGUuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKHN5c0lEKS5nZXRGaWxlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmUgPT0gLTEgPyAiIiA6ICgiOiIgKyBsaW5lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbCA9PSAtMSA/ICIiIDogKCI6IiArIGNvbCkpKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZnVlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWGFsYW5MaWFpc29uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YYWxhbkxpYWlzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkOTQ0My4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YYWxhbkxpYWlzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWFNMVExpYWlzb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFByb2Nlc3NvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFJlc3VsdFRhcmdldDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb25jcmV0ZSBsaWFpc29uIGZvciBYYWxhbiAxLnggQVBJLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJ1YnlzQHVzLmlibS5jb20iPlNhbSBSdWJ5PC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGFwYWNoZS5vcmciPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgWGFsYW5MaWFpc29uIGltcGxlbWVudHMgWFNMVExpYWlzb24gewotCi0gICAgcHJvdGVjdGVkIFhTTFRQcm9jZXNzb3IgcHJvY2Vzc29yOwotICAgIHByb3RlY3RlZCBGaWxlIHN0eWxlc2hlZXQ7Ci0KLSAgICBwdWJsaWMgWGFsYW5MaWFpc29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBwcm9jZXNzb3IgPSBYU0xUUHJvY2Vzc29yRmFjdG9yeS5nZXRQcm9jZXNzb3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZXNoZWV0KEZpbGUgc3R5bGVzaGVldCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc3R5bGVzaGVldCA9IHN0eWxlc2hlZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKEZpbGUgaW5maWxlLCBGaWxlIG91dGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0geHNsU3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHhzbFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3R5bGVzaGVldCk7Ci0gICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGluZmlsZSk7Ci0gICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRmaWxlKTsKLSAgICAgICAgICAgIC8vIHN5c3RlbWlkIHN1Y2ggYXMgZmlsZTovLy8gKyBnZXRBYnNvbHV0ZVBhdGgoKSBhcmUgY29uc2lkZXJlZAotICAgICAgICAgICAgLy8gaW52YWxpZCBoZXJlLi4uCi0gICAgICAgICAgICBYU0xUSW5wdXRTb3VyY2UgeHNsU2hlZXQgPSBuZXcgWFNMVElucHV0U291cmNlKHhzbFN0cmVhbSk7Ci0gICAgICAgICAgICB4c2xTaGVldC5zZXRTeXN0ZW1JZChzdHlsZXNoZWV0LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIFhTTFRJbnB1dFNvdXJjZSBzcmMgPSBuZXcgWFNMVElucHV0U291cmNlKGZpcyk7Ci0gICAgICAgICAgICBzcmMuc2V0U3lzdGVtSWQoaW5maWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIFhTTFRSZXN1bHRUYXJnZXQgcmVzID0gbmV3IFhTTFRSZXN1bHRUYXJnZXQoZm9zKTsKLSAgICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKHNyYywgeHNsU2hlZXQsIHJlcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xvc2UgYWxsIGhhbmRsZXMsIG90aGVyd2lzZSB0aGUgZ2FyYmFnZQotICAgICAgICAgICAgLy8gY29sbGVjdG9yIHdpbGwgY2xvc2UgdGhlbS4uLndoZW5ldmVyIHBvc3NpYmxlIGFuZAotICAgICAgICAgICAgLy8gV2luZG93cyBtYXkgY29tcGxhaW4gYWJvdXQgbm90IGJlaW5nIGFibGUgdG8gZGVsZXRlIGZpbGVzLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoeHNsU3RyZWFtICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICB4c2xTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKXt9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpe30KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCl7fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW0oU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSl7Ci0gICAgICAgIHByb2Nlc3Nvci5zZXRTdHlsZXNoZWV0UGFyYW0obmFtZSwgdmFsdWUpOwotICAgIH0KLX0gLy8tLSBYYWxhbkxpYWlzb24KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hzbHBMaWFpc29uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Yc2xwTGlhaXNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTc2ODE5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hzbHBMaWFpc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUTGlhaXNvbjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGNvbS5rdmlzY28ueHNsLio7Ci0KLS8qKgotICogQ29uY3JldGUgbGlhaXNvbiBmb3IgWFNMUAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJ1YnlzQHVzLmlibS5jb20iPlNhbSBSdWJ5PC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGFwYWNoZS5vcmciPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgWHNscExpYWlzb24gaW1wbGVtZW50cyBYU0xUTGlhaXNvbiB7Ci0KLSAgICBwcm90ZWN0ZWQgWFNMUHJvY2Vzc29yIHByb2Nlc3NvcjsKLSAgICBwcm90ZWN0ZWQgWFNMU3R5bGVzaGVldCB4c2xTaGVldDsKLQotICAgIHB1YmxpYyBYc2xwTGlhaXNvbigpIHsKLSAgICAgIHByb2Nlc3NvciA9IG5ldyBYU0xQcm9jZXNzb3IoKTsKLSAgICAgIC8vIHVoID8hIEknbSBmb3JjZWQgdG8gZG8gdGhhdCBvdGhlcndpc2UgYSBzZXRQcm9wZXJ0eSBjcmFzaGVzIHdpdGggTlBFICEKLSAgICAgIC8vIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhlIHByb3BlcnR5IG1hcCBpcyBzdGF0aWMgdGhvdWdoLi4uCi0gICAgICAvLyBob3cgY2FuIHdlIGRvIG11bHRpdGhyZWFkaW5nIHcvIG11bHRpcGxlIGlkZW50aWNhbCBwYXJhbWV0ZXJzID8KLSAgICAgIHByb2Nlc3Nvci5nZXRQcm9wZXJ0eSgiZHVtbXktdG8taW5pdC1wcm9wZXJ0aWVzLW1hcCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlc2hlZXQoRmlsZSBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBYU0xSZWFkZXIgeHNsUmVhZGVyID0gbmV3IFhTTFJlYWRlcigpOwotICAgICAgLy8gYSBmaWxlOi8vLyArIGdldEFic29sdXRlUGF0aCgpIGRvZXMgbm90IHdvcmsgaGVyZQotICAgICAgLy8gaXQgaXMgcmVhbGx5IHRoZSBwYXRobmFtZQotICAgICAgeHNsU2hlZXQgPSB4c2xSZWFkZXIucmVhZCggZmlsZU5hbWUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oRmlsZSBpbmZpbGUsIEZpbGUgb3V0ZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0ZmlsZSk7Ci0gICAgICAgIC8vIFhTTFAgZG9lcyBub3Qgc3VwcG9ydCBlbmNvZGluZy4uLndlJ3JlIGluIGhvdCB3YXRlci4KLSAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCJVVEY4Iik7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGluZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgeHNsU2hlZXQsIG91dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW0oU3RyaW5nIG5hbWUsIFN0cmluZyBleHByZXNzaW9uKXsKLSAgICAgIHByb2Nlc3Nvci5zZXRQcm9wZXJ0eShuYW1lLCBleHByZXNzaW9uKTsKLSAgICB9Ci0KLX0gLy8tLSBYU0xQTGlhaXNvbgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzM2ZhYS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBDbGFzcyBjb21tb24gdG8gYWxsIGNoZWNrIGNvbW1hbmRzIChjaGVja291dCwgY2hlY2tpbixjaGVja2luIGRlZmF1bHQgdGFzayk7Ci0gKiBAYXV0aG9yIEJlbm9pdCBNb3Vzc2F1ZCBiZW5vaXQubW91c3NhdWRAY3JpbHRlbGVjb20uY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBDQ01DaGVjayBleHRlbmRzIENvbnRpbnV1cyB7Ci0KLSAgICBwcml2YXRlIEZpbGUgICBfZmlsZSAgICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2NvbW1lbnQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIF90YXNrICAgID0gbnVsbDsKLQotICAgIHB1YmxpYyBDQ01DaGVjaygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGZpbGUuCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBfZmlsZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBmaWxlLgotICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgIHYpIHsKLSAgICAgICAgdGhpcy5fZmlsZSA9IHY7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgY29tbWVudC4KLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotICAgICAgICByZXR1cm4gX2NvbW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgY29tbWVudC4KLSAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgIHYpIHsKLSAgICAgICAgdGhpcy5fY29tbWVudCA9IHY7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0YXNrLgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhc2soKSB7Ci0gICAgICAgIHJldHVybiBfdGFzazsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0YXNrLgotICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrKFN0cmluZyAgdikgewotICAgICAgICB0aGlzLl90YXNrID0gdjsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCi0gICAgICogPHA+Ci0gICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2NtIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCi0gICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgaXMKLSAgICAgICAgLy8gY2NtIGNvIC90IC4uIGZpbGVzCi0gICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MLkVYRSBoZWxwCi0gICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2NtQ29tbWFuZCgpKTsKLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDY21BY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBjaGVja09wdGlvbnMoY29tbWFuZExpbmUpOwotCi0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IDAgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrT3B0aW9ucyhDb21tYW5kbGluZSBjbWQpIHsgICAgICAgIAotICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBnZXRUYXNrKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19UQVNLKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFRhc2soKSk7ICAgICAgICAgICAgCi0gICAgICAgIH0gLy8gZW5kIG9mIGlmICgpICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGlmICggZ2V0RmlsZSgpICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShfZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7ICAgICAgIAotICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIC1jb21tZW50IGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiL2NvbW1lbnQiOwotICAgIAotICAgIC8qKgotICAgICAqICAtdGFzayBmbGFnIC0tIGFzc29jaWF0ZSBjaGVjY2tvdXQgdGFzayB3aXRoIHRhc2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1RBU0sgPSAiL3Rhc2siOyAgIAotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tpbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5YzRkZC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY207Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotLyoqCi0gKiBUYXNrIHRvIHBlcmZvcm0gQ2hlY2tpbiBjb21tYW5kIHRvIENvbnRpbnV1cwotICogQGF1dGhvciBCZW5vaXQgTW91c3NhdWQgYmVub2l0Lm1vdXNzYXVkQGNyaWx0ZWxlY29tLmNvbQotICovCi1wdWJsaWMgY2xhc3MgQ0NNQ2hlY2tpbiBleHRlbmRzIENDTUNoZWNrIHsKLSAgICAKLSAgICBwdWJsaWMgQ0NNQ2hlY2tpbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0Q2NtQWN0aW9uKENPTU1BTkRfQ0hFQ0tJTik7Ci0gICAgICAgIHNldENvbW1lbnQoIkNoZWNraW4gIisgbmV3IERhdGUoKSk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DaGVja2luRGVmYXVsdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW5EZWZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYjliOTkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW5EZWZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbTsKLQotLyoqCi0gKiBUYXNrIHRvIHBlcmZvcm0gQ2hlY2tpbiBEZWZhdWx0IHRhc2sgY29tbWFuZCB0byBDb250aW51dXMKLSAqIEBhdXRob3IgQmVub2l0IE1vdXNzYXVkIGJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb20KLSAqLwotcHVibGljIGNsYXNzIENDTUNoZWNraW5EZWZhdWx0IGV4dGVuZHMgQ0NNQ2hlY2sgewotICAgIAotICAgIHB1YmxpYyBDQ01DaGVja2luRGVmYXVsdCgpewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRDY21BY3Rpb24oQ09NTUFORF9DSEVDS0lOKTsKLSAgICAgICAgc2V0VGFzayhERUZBVUxUX1RBU0spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFTSyA9ICJkZWZhdWx0IjsgICAKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNrb3V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzNTQ2NS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtOwotCi0vKioKLSAqIFRhc2sgdG8gcGVyZm9ybSBDaGVja291dCBjb21tYW5kIHRvIENvbnRpbnV1cwotICogQGF1dGhvciBCZW5vaXQgTW91c3NhdWQgYmVub2l0Lm1vdXNzYXVkQGNyaWx0ZWxlY29tLmNvbQotICovCi1wdWJsaWMgY2xhc3MgQ0NNQ2hlY2tvdXQgZXh0ZW5kcyBDQ01DaGVjayB7Ci0gICAgCi0gICAgcHVibGljIENDTUNoZWNrb3V0KCl7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHNldENjbUFjdGlvbihDT01NQU5EX0NIRUNLT1VUKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DcmVhdGVUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ3JlYXRlVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDllZjRiLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DcmVhdGVUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY207Ci0KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci0KLS8qKgotICogVGFzayBhbGxvd3MgdG8gY3JlYXRlIG5ldyBjY20gdGFzayBhbmQgc2V0IGl0IGFzIHRoZSBkZWZhdWx0Ci0gKiBAYXV0aG9yIEJlbm9pdCBNb3Vzc2F1ZCBiZW5vaXQubW91c3NhdWRAY3JpbHRlbGVjb20uY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBDQ01DcmVhdGVUYXNrIGV4dGVuZHMgQ29udGludXVzIGltcGxlbWVudHMgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQgICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGxhdGZvcm0gID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlciAgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHJlbGVhc2UgICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3ViU3lzdGVtID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB0YXNrICAgICAgPSBudWxsOwotCi0gICAgcHVibGljIENDTUNyZWF0ZVRhc2soKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHNldENjbUFjdGlvbihDT01NQU5EX0NSRUFURV9UQVNLKTsKLSAgICB9Ci0KLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCi0gICAgICogPHA+Ci0gICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2NtIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCi0gICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgCi0gICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0NNLkVYRSBoZWxwCi0gICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2NtQ29tbWFuZCgpKTsKLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDY21BY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBjaGVja09wdGlvbnMoY29tbWFuZExpbmUpOwotICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lLHRoaXMpOwotICAgICAgICBpZiAoIHJlc3VsdCAhPSAwICkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vY3JlYXRlIHRhc2sgb2ssIHNldCB0aGlzIHRhc2sgYXMgdGhlIGRlZmF1bHQgb25lCi0gICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lMiA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBjb21tYW5kTGluZTIuc2V0RXhlY3V0YWJsZShnZXRDY21Db21tYW5kKCkpOwotICAgICAgICBjb21tYW5kTGluZTIuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX0RFRkFVTFRfVEFTSyk7Ci0gICAgICAgIGNvbW1hbmRMaW5lMi5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFRhc2soKSk7Ci0KLSAgICAgICAgbG9nKGNvbW1hbmRMaW5lLnRvU3RyaW5nKCksUHJvamVjdC5NU0dfREVCVUcpOwotCi0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZTIpOwotICAgICAgICBpZiAoIHJlc3VsdCAhPSAwICkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7ICAgICAgICAKLSAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlQpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIlwiIitnZXRDb21tZW50KCkrIlwiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGdldFBsYXRmb3JtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19QTEFURk9STSk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRQbGF0Zm9ybSgpKTsgICAgICAgICAgICAKLSAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkgICAgICAgIAotCi0gICAgICAgIGlmICggZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1JFU09MVkVSKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFJlc29sdmVyKCkpOyAgICAgICAgICAgIAotICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKQotICAgICAgICAKLSAgICAgICAgaWYgKCBnZXRTdWJTeXN0ZW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1NVQlNZU1RFTSk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiXCIiK2dldFN1YlN5c3RlbSgpKyJcIiIpOyAgICAgICAgICAgIAotICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAoIGdldFJlbGVhc2UoKSAhPSBudWxsICkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRUxFQVNFKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFJlbGVhc2UoKSk7ICAgICAgICAgICAgCi0gICAgICAgIH0gLy8gZW5kIG9mIGlmICgpICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBjb21tZW50LgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgY29tbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBjb21tZW50OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGNvbW1lbnQuCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nICB2KSB7Ci0gICAgICAgIHRoaXMuY29tbWVudCA9IHY7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgcGxhdGZvcm0uCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBsYXRmb3JtKCkgewotICAgICAgICByZXR1cm4gcGxhdGZvcm07Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgcGxhdGZvcm0uCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF0Zm9ybShTdHJpbmcgIHYpIHsKLSAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IHY7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgcmVzb2x2ZXIuCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiByZXNvbHZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVyKCkgewotICAgICAgICByZXR1cm4gcmVzb2x2ZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgcmVzb2x2ZXIuCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byByZXNvbHZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlcihTdHJpbmcgIHYpIHsKLSAgICAgICAgdGhpcy5yZXNvbHZlciA9IHY7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiByZWxlYXNlLgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgcmVsZWFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGVhc2UoKSB7Ci0gICAgICAgIHJldHVybiByZWxlYXNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHJlbGVhc2UuCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byByZWxlYXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbGVhc2UoU3RyaW5nICB2KSB7Ci0gICAgICAgIHRoaXMucmVsZWFzZSA9IHY7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHN1YlN5c3RlbS4KLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHN1YlN5c3RlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1YlN5c3RlbSgpIHsKLSAgICAgICAgcmV0dXJuIHN1YlN5c3RlbTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBzdWJTeXN0ZW0uCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBzdWJTeXN0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3ViU3lzdGVtKFN0cmluZyAgdikgewotICAgICAgICB0aGlzLnN1YlN5c3RlbSA9IHY7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGFzay4KLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyAgZ2V0VGFzaygpICAgIHsKLSAgICAgICAgcmV0dXJuIHRhc2s7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGFzay4KLSAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFzayhTdHJpbmcgICB2KSAgICB7Ci0gICAgICAgIHRoaXMudGFzayA9IHY7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIC9jb21tZW50IC0tIGNvbW1lbnRzIGFzc29jaWF0ZWQgdG8gdGhlIHRhc2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiL3N5bm9wc2lzIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgL3BsYXRmb3JtIGZsYWcgLS0gdGFyZ2V0IHBsYXRmb3JtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19QTEFURk9STSA9ICIvcGxhdCI7ICAgCi0KLSAgICAvKioKLSAgICAgKiAvcmVzb2x2ZXIgZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVTT0xWRVIgPSAiL3Jlc29sdmVyIjsgICAKLQotICAgIC8qKgotICAgICAqIC9yZWxlYXNlIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFTEVBU0UgPSAiL3JlbGVhc2UiOyAgIAotCi0gICAgLyoqCi0gICAgICogL3JlbGVhc2UgZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfU1VCU1lTVEVNID0gIi9zdWJzeXN0ZW0iOyAgIAotCi0gICAgLyoqCi0gICAgICogIC10YXNrIGZsYWcgLS0gYXNzb2NpYXRlIGNoZWNja291dCB0YXNrIHdpdGggdGFzawotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVEFTSyA9ICIvdGFzayI7ICAgCi0KLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyIGludGVyZmFjZQotICAgIAotICAgIC8qKgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIDxkZXNjcmlwdGlvbj4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCl7ICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbTEgPGRlc2NyaXB0aW9uPgotICAgICAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiA8ZGVzY3JpcHRpb24+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0lucHV0U3RyZWFtKE91dHB1dFN0cmVhbSBwYXJhbTEpIHRocm93cyBJT0V4Y2VwdGlvbiAgICB7ICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtMSA8ZGVzY3JpcHRpb24+Ci0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIDxkZXNjcmlwdGlvbj4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzRXJyb3JTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiAgICB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKLSAgICAgICAgU3RyaW5nIHMgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgaWYgKCBzICE9IG51bGwpIAotICAgICAgICB7Ci0gICAgICAgICAgICBsb2coImVyciAiK3MsUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVhZCB0aGUgb3V0cHV0IHN0cmVhbSB0byByZXRyaWV2ZSB0aGUgbmV3IHRhc2sgbnVtYmVyLgotICAgICAqIEBwYXJhbSBpcyBJbnB1dFN0cmVhbQotICAgICAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzT3V0cHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gICAgewotCi0gICAgICAgIFN0cmluZyBidWZmZXIgPSAiIjsKLSAgICAgICAgdHJ5ICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwotICAgICAgICAgICAgYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAoIGJ1ZmZlciAhPSBudWxsKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2coImJ1ZmZlcjoiICtidWZmZXIsUHJvamVjdC5NU0dfREVCVUcpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFza3N0cmluZyAgPSBidWZmZXIuc3Vic3RyaW5nKGJ1ZmZlci5pbmRleE9mKCcgJykpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB0YXNrc3RyaW5nID0gdGFza3N0cmluZy5zdWJzdHJpbmcoMCx0YXNrc3RyaW5nLmxhc3RJbmRleE9mKCcgJykpLnRyaW0oKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc2V0VGFzayh0YXNrc3RyaW5nKTsKLSAgICAgICAgICAgICAgICBsb2coInRhc2sgaXMgIitnZXRUYXNrKCksUHJvamVjdC5NU0dfREVCVUcpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIAotICAgICAgICB7Ci0gICAgICAgICAgICBsb2coImVycm9yIHByb2Nlc3Npb24gc3RyZWFtICwgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiIsUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIG5wZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihucGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9IC8vIGVuZCBvZiBjYXRjaCAgICAgICAgCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZygiZXJyb3IgcHJvY2Vzc2lvbiBzdHJlYW0gIitlLmdldE1lc3NhZ2UoKSxQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSAvLyBlbmQgb2YgdHJ5LWNhdGNoCi0gICAgICAgIAotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNUmVjb25maWd1cmUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01SZWNvbmZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg2NzA0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01SZWNvbmZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci0KLS8qKgotICogVGFzayBhbGxvd3MgdG8gcmVjb25maWd1cmUgYSBwcm9qZWN0LCByZWN1cmNpdmVseSBvciBub3QgCi0gKiBAYXV0aG9yIEJlbm9pdCBNb3Vzc2F1ZCBiZW5vaXQubW91c3NhdWRAY3JpbHRlbGVjb20uY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBDQ01SZWNvbmZpZ3VyZSBleHRlbmRzIENvbnRpbnV1cyB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0ICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJlY3Vyc2UgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi0gICAgcHVibGljIENDTVJlY29uZmlndXJlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRDY21BY3Rpb24oQ09NTUFORF9SRUNPTkZJR1VSRSk7Ci0gICAgfQotCi0gICAgICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqIDxwPgotICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGNjbSBhbmQgdGhlbiBjYWxscyBFeGVjJ3MgcnVuIG1ldGhvZAotICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0IAotICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIENDTS5FWEUgaGVscAotICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldENjbUNvbW1hbmQoKSk7Ci0gICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q2NtQWN0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgY2hlY2tPcHRpb25zKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IDAgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrT3B0aW9ucyhDb21tYW5kbGluZSBjbWQpICAgICB7ICAgICAgICAKLQotICAgICAgICBpZiAoIGlzUmVjdXJzZSgpID09IHRydWUpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUkVDVVJTRSk7Ci0gICAgICAgIH0gLy8gZW5kIG9mIGlmICgpICAgICAgICAKLQotICAgICAgICBpZiAoIGlzVmVyYm9zZSgpID09IHRydWUpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSQk9TRSk7Ci0gICAgICAgIH0gLy8gZW5kIG9mIGlmICgpICAgICAgICAKLQotICAgICAgICBpZiAoZ2V0Q2NtUHJvamVjdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUFJPSkVDVCk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDY21Qcm9qZWN0KCkpOwotICAgICAgICB9Ci0KLSAgICB9ICAgICAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHByb2plY3QuCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2NtUHJvamVjdCgpICB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHByb2plY3QuCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENjbVByb2plY3QoU3RyaW5nICB2KSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHY7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgcmVjdXJzZS4KLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHJlY3Vyc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWN1cnNlKCkgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlY3Vyc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgcmVjdXJzZS4KLSAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHJlY3Vyc2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVjdXJzZShib29sZWFuICB2KSAgICAgewotICAgICAgICB0aGlzLnJlY3Vyc2UgPSB2OwotICAgIH0KLQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdmVyYm9zZS4KLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHZlcmJvc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgCi0gICAgewotICAgICAgICByZXR1cm4gdmVyYm9zZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiB2ZXJib3NlLgotICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gdmVyYm9zZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gIHYpIAotICAgIHsKLSAgICAgICAgdGhpcy52ZXJib3NlID0gdjsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogL3JlY3Vyc2UgLS0gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRUNVUlNFID0gIi9yZWN1cnNlIjsKLQotICAgIC8qKgotICAgICAqIC9yZWN1cnNlIC0tIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVkVSQk9TRSA9ICIvdmVyYm9zZSI7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgL3Byb2plY3QgZmxhZyAtLSB0YXJnZXQgcHJvamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUFJPSkVDVCA9ICIvcHJvamVjdCI7ICAgCi0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NvbnRpbnV1cy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NvbnRpbnV1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzM3NDliLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9Db250aW51dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dTdHJlYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEEgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgdGFza3MgZm9yIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBDb250aW51dXMgNS4xCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBleHRlbmRzIHRoZSAgdGFzayBhcyBpdCBvcGVyYXRlcyBieSBleGVjdXRpbmcgdGhlIGNjbS5leGUgcHJvZ3JhbQotICogc3VwcGxpZWQgd2l0aCBDb250aW51dXMvU3luZXJneS4gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIHRoZSBjY20gZXhlY3V0YWJsZSB0byBiZQotICogaW4gdGhlIHBhdGgsIAotICogeW91IGNhbiBvdmVycmlkZSB0aGlzIGJlIHNwZWNpZnlpbmcgdGhlIGNjbWRpciBhdHRyaWJ1dGUuCi0gKiA8L3A+Ci0gKgotICogQGF1dGhvciBCZW5vaXQgTW91c3NhdWQgYmVub2l0Lm1vdXNzYXVkQGNyaWx0ZWxlY29tLmNvbQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGludXVzIGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfY2NtRGlyICAgID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2NjbUFjdGlvbiA9ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgY2NtQWN0aW9uLgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgY2NtQWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2NtQWN0aW9uKCkgewotICAgICAgICByZXR1cm4gX2NjbUFjdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBjY21BY3Rpb24uCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBjY21BY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2NtQWN0aW9uKFN0cmluZyAgdikgewotICAgICAgICB0aGlzLl9jY21BY3Rpb24gPSB2OwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZAotICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjY20gZXhlY3V0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENjbURpcihTdHJpbmcgZGlyKSB7Ci0gICAgICAgIF9jY21EaXIgPSBwcm9qZWN0LnRyYW5zbGF0ZVBhdGgoZGlyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGNvbW1hbmQgc3RyaW5nIHRvIGV4ZWN1dGUgY2NtCi0gICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyBwYXRoIHRvIHRoZSBleGVjdXRhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRDY21Db21tYW5kKCkgewotICAgICAgICBTdHJpbmcgdG9SZXR1cm4gPSBfY2NtRGlyOwotICAgICAgICBpZiAoICF0b1JldHVybi5lcXVhbHMoIiIpICYmICF0b1JldHVybi5lbmRzV2l0aCgiLyIpICkgewotICAgICAgICAgICAgdG9SZXR1cm4gKz0gIi8iOwotICAgICAgICB9Ci0KLSAgICAgICAgdG9SZXR1cm4gKz0gQ0NNX0VYRTsKLQotICAgICAgICByZXR1cm4gdG9SZXR1cm47Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgaW50IHJ1bihDb21tYW5kbGluZSBjbWQsIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgdHJ5IHsgICAgICAgICAgICAKLSAgICAgICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUoaGFuZGxlcik7Ci0gICAgICAgICAgICBleGUuc2V0QW50UnVuKGdldFByb2plY3QoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSk7Ci0gICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICAgICAgcmV0dXJuIGV4ZS5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgcnVuKENvbW1hbmRsaW5lIGNtZCkgeyAgICAgICAgCi0gICAgICAgIHJldHVybiBydW4oY21kLG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX1ZFUkJPU0UsIFByb2plY3QuTVNHX1dBUk4pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIHRoaW5nIHRvIGV4ZWN1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0NNX0VYRSA9ICJjY20iOwotCi0gICAgLyoqCi0gICAgICogVGhlICdDcmVhdGVUYXNrJyBjb21tYW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9DUkVBVEVfVEFTSyA9ICJjcmVhdGVfdGFzayI7Ci0gICAgLyoqCi0gICAgICogVGhlICdDaGVja291dCcgY29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfQ0hFQ0tPVVQgPSAiY28iOwotICAgIC8qKgotICAgICAqIFRoZSAnQ2hlY2tpbicgY29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfQ0hFQ0tJTiA9ICJjaSI7Ci0gICAgLyoqCi0gICAgICogVGhlICdSZWNvbmZpZ3VyZScgY29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfUkVDT05GSUdVUkUgPSAicmVjb25maWd1cmUiOwotCi0gICAgLyoqCi0gICAgICogVGhlICdSZWNvbmZpZ3VyZScgY29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfREVGQVVMVF9UQVNLID0gImRlZmF1bHRfdGFzayI7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tpbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRlOWZhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0NoZWNraW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUYXNrIHRvIHBlcmZvcm0gQ2hlY2tpbiBjb21tYW5kIHRvIENsZWFyQ2FzZS4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXRlZDoKLSAqIDx0YWJsZSBib3JkZXI9IjEiPgotICogICA8dHI+Ci0gKiAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gKiAgICAgPHRoPlZhbHVlczwvdGg+Ci0gKiAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+dmlld3BhdGg8L3RkPgotICogICAgICA8dGQ+UGF0aCB0byB0aGUgQ2xlYXJDYXNlIHZpZXcgZmlsZSBvciBkaXJlY3RvcnkgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb248L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8dHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICogICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+Ci0gKiAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8dHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPm5vd2FybjwvdGQ+Ci0gKiAgICAgIDx0ZD5TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5wcmVzZXJ2ZXRpbWU8L3RkPgotICogICAgICA8dGQ+UHJlc2VydmUgdGhlIG1vZGlmaWNhdGlvbiB0aW1lPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5rZWVwY29weTwvdGQ+Ci0gKiAgICAgIDx0ZD5LZWVwcyBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbjwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDx0cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+aWRlbnRpY2FsPC90ZD4KLSAqICAgICAgPHRkPkFsbG93cyB0aGUgZmlsZSB0byBiZSBjaGVja2VkIGluIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbDwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDx0cj4KLSAqIDwvdGFibGU+Ci0gKgotICogQGF1dGhvciBDdXJ0aXMgV2hpdGUKLSAqLwotcHVibGljIGNsYXNzIENDQ2hlY2tpbiBleHRlbmRzIENsZWFyQ2FzZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9Db21tZW50ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX0NmaWxlID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9Od2FybiA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtX1B0aW1lID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1fS2VlcCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtX0lkZW50aWNhbCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KLSAgICAgKiA8cD4KLSAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBjbGVhcnRvb2wgYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKLSAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgICAgIC8vIERlZmF1bHQgdGhlIHZpZXdwYXRoIHRvIGJhc2VkaXIgaWYgaXQgaXMgbm90IHNwZWNpZmllZAotICAgICAgICBpZiAoZ2V0Vmlld1BhdGgoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRWaWV3UGF0aChhUHJvai5nZXRCYXNlRGlyKCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdC4gdGhlIGZvcm1hdCBpcwotICAgICAgICAvLyBjbGVhcnRvb2wgY2hlY2tpbiBbb3B0aW9ucy4uLl0gW3ZpZXdwYXRoIC4uLl0KLSAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDTEVBUlRPT0wuRVhFIGhlbHAKLSAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDbGVhclRvb2xDb21tYW5kKCkpOwotICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfQ0hFQ0tJTik7Ci0KLSAgICAgICAgY2hlY2tPcHRpb25zKGNvbW1hbmRMaW5lKTsKLQotICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOwotICAgICAgICBpZiAoIHJlc3VsdCAhPSAwICkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gLWMKLSAgICAgICAgICAgIGdldENvbW1lbnRDb21tYW5kKGNtZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gLWNmaWxlCi0gICAgICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXROb1dhcm4oKSkgewotICAgICAgICAgICAgLy8gLW53YXJuCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PV0FSTik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0UHJlc2VydmVUaW1lKCkpIHsKLSAgICAgICAgICAgIC8vIC1wdGltZQotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19QUkVTRVJWRVRJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldEtlZXBDb3B5KCkpIHsKLSAgICAgICAgICAgIC8vIC1rZWVwCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0tFRVBDT1BZKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRJZGVudGljYWwoKSkgewotICAgICAgICAgICAgLy8gLWlkZW50aWNhbAotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19JREVOVElDQUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmlld3BhdGgKLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Vmlld1BhdGgoKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXQgY29tbWVudCBzdHJpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50IHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLSAgICAgICAgbV9Db21tZW50ID0gY29tbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgY29tbWVudCBzdHJpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBtX0NvbW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGNvbW1lbnQgZmlsZQotICAgICAqCi0gICAgICogQHBhcmFtIGNmaWxlIHRoZSBwYXRoIHRvIHRoZSBjb21tZW50IGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50RmlsZShTdHJpbmcgY2ZpbGUpIHsKLSAgICAgICAgbV9DZmlsZSA9IGNmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBjb21tZW50IGZpbGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBtX0NmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbm93YXJuIGZsYWcKLSAgICAgKgotICAgICAqIEBwYXJhbSBud2FybiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vV2Fybihib29sZWFuIG53YXJuKSB7Ci0gICAgICAgIG1fTndhcm4gPSBud2FybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbm93YXJuIGZsYWcgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2Ygbndhcm4gZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldE5vV2FybigpIHsKLSAgICAgICAgcmV0dXJuIG1fTndhcm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHByZXNlcnZldGltZSBmbGFnCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHRpbWUgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZVRpbWUoYm9vbGVhbiBwdGltZSkgewotICAgICAgICBtX1B0aW1lID0gcHRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHByZXNlcnZldGltZSBmbGFnIHN0YXR1cwotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIHByZXNlcnZldGltZSBmbGFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UHJlc2VydmVUaW1lKCkgewotICAgICAgICByZXR1cm4gbV9QdGltZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGtlZXBjb3B5IGZsYWcKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZWVwIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2VlcENvcHkoYm9vbGVhbiBrZWVwKSB7Ci0gICAgICAgIG1fS2VlcCA9IGtlZXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGtlZXBjb3B5IGZsYWcgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2Yga2VlcGNvcHkgZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEtlZXBDb3B5KCkgewotICAgICAgICByZXR1cm4gbV9LZWVwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaWRlbnRpY2FsIGZsYWcKLSAgICAgKgotICAgICAqIEBwYXJhbSBpZGVudGljYWwgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZGVudGljYWwoYm9vbGVhbiBpZGVudGljYWwpIHsKLSAgICAgICAgbV9JZGVudGljYWwgPSBpZGVudGljYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGlkZW50aWNhbCBmbGFnIHN0YXR1cwotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIGlkZW50aWNhbCBmbGFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SWRlbnRpY2FsKCkgewotICAgICAgICByZXR1cm4gbV9JZGVudGljYWw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlICdjb21tZW50JyBjb21tYW5kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSAnY29tbWVudCcgY29tbWFuZCBpZiB0aGUgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBDb21tYW5kTGluZSBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3Igd2l0aG91dCB0aGUgY29tbWVudCBmbGFnIGFuZCBzdHJpbmcgYXBwZW5kZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCi0gICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQotICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQotICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAnY29tbWVudGZpbGUnIGNvbW1hbmQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlICdjb21tZW50ZmlsZScgY29tbWFuZCBpZiB0aGUgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBDb21tYW5kTGluZSBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3Igd2l0aG91dCB0aGUgY29tbWVudGZpbGUgZmxhZyBhbmQgZmlsZSBhcHBlbmRlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZXRDb21tZW50RmlsZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcwotICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKLSAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKLSAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlRGSUxFKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnRGaWxlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7Ci0gICAgICAgIC8qKgotICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOwotICAgICAgICAvKioKLSAgICAgKiAtbmMgZmxhZyAtLSBubyBjb21tZW50IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9DT01NRU5UID0gIi1uYyI7Ci0gICAgICAgIC8qKgotICAgICAqIC1ud2FybiBmbGFnIC0tIHN1cHByZXNzZXMgd2FybmluZyBtZXNzYWdlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9XQVJOID0gIi1ud2FybiI7Ci0gICAgICAgIC8qKgotICAgICAqIC1wdGltZSBmbGFnIC0tIHByZXNlcnZlcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BSRVNFUlZFVElNRSA9ICItcHRpbWUiOwotICAgICAgICAvKioKLSAgICAgKiAta2VlcCBmbGFnIC0tIGtlZXBzIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19LRUVQQ09QWSA9ICIta2VlcCI7Ci0gICAgICAgIC8qKgotICAgICAqIC1pZGVudGljYWwgZmxhZyAtLSBhbGxvd3MgdGhlIGZpbGUgdG8gYmUgY2hlY2tlZCBpbiBldmVuIGlmIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgb3JpZ2luYWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0lERU5USUNBTCA9ICItaWRlbnRpY2FsIjsKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NDaGVja291dC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiZTk2Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NDaGVja291dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFRhc2sgdG8gcGVyZm9ybSBDaGVja291dCBjb21tYW5kIHRvIENsZWFyQ2FzZS4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXR0ZWQ6Ci0gKiA8dGFibGUgYm9yZGVyPSIxIj4KLSAqICAgPHRyPgotICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICogICAgIDx0aD5WYWx1ZXM8L3RoPgotICogICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPnZpZXdwYXRoPC90ZD4KLSAqICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5yZXNlcnZlZDwvdGQ+Ci0gKiAgICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBjaGVjayBvdXQgdGhlIGZpbGUgYXMgcmVzZXJ2ZWQgb3Igbm90PC90ZD4KLSAqICAgICAgPHRkPlllczwvdGQ+Ci0gKiAgIDx0cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+b3V0PC90ZD4KLSAqICAgICAgPHRkPkNyZWF0ZXMgYSB3cml0YWJsZSBmaWxlIHVuZGVyIGEgZGlmZmVyZW50IGZpbGVuYW1lPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5ub2RhdGE8L3RkPgotICogICAgICA8dGQ+Q2hlY2tzIG91dCB0aGUgZmlsZSBidXQgZG9lcyBub3QgY3JlYXRlIGFuIGVkaXRhYmxlIGZpbGUgY29udGFpbmluZyBpdHMgZGF0YTwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDx0cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+YnJhbmNoPC90ZD4KLSAqICAgICAgPHRkPlNwZWNpZnkgYSBicmFuY2ggdG8gY2hlY2sgb3V0IHRoZSBmaWxlIHRvPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KLSAqICAgICAgPHRkPkFsbG93cyBjaGVja291dCBvZiBhIHZlcnNpb24gb3RoZXIgdGhhbiBtYWluIGxhdGVzdDwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDx0cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+bm93YXJuPC90ZD4KLSAqICAgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8dHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICogICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+Ci0gKiAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8dHI+Ci0gKiA8L3RhYmxlPgotICoKLSAqIEBhdXRob3IgQ3VydGlzIFdoaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDQ0NoZWNrb3V0IGV4dGVuZHMgQ2xlYXJDYXNlIHsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9SZXNlcnZlZCA9IHRydWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9PdXQgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBtX05kYXRhID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9CcmFuY2ggPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBtX1ZlcnNpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9Od2FybiA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIG1fQ29tbWVudCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9DZmlsZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KLSAgICAgKiA8cD4KLSAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBjbGVhcnRvb2wgYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKLSAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgICAgIC8vIERlZmF1bHQgdGhlIHZpZXdwYXRoIHRvIGJhc2VkaXIgaWYgaXQgaXMgbm90IHNwZWNpZmllZAotICAgICAgICBpZiAoZ2V0Vmlld1BhdGgoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRWaWV3UGF0aChhUHJvai5nZXRCYXNlRGlyKCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0IGlzCi0gICAgICAgIC8vIGNsZWFydG9vbCBjaGVja291dCBbb3B0aW9ucy4uLl0gW3ZpZXdwYXRoIC4uLl0KLSAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDTEVBUlRPT0wuRVhFIGhlbHAKLSAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDbGVhclRvb2xDb21tYW5kKCkpOwotICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfQ0hFQ0tPVVQpOwotCi0gICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7Ci0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tPcHRpb25zKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICAvLyBDbGVhckNhc2UgaXRlbXMKLSAgICAgICAgaWYgKGdldFJlc2VydmVkKCkpIHsKLSAgICAgICAgICAgIC8vIC1yZXNlcnZlZAotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRVNFUlZFRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyAtdW5yZXNlcnZlZAotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19VTlJFU0VSVkVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRPdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyAtb3V0Ci0gICAgICAgICAgICBnZXRPdXRDb21tYW5kKGNtZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Tm9EYXRhKCkpIHsKLSAgICAgICAgICAgICAgICAvLyAtbmRhdGEKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PREFUQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRCcmFuY2goKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyAtYnJhbmNoCi0gICAgICAgICAgICBnZXRCcmFuY2hDb21tYW5kKGNtZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gLXZlcnNpb24KLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1ZFUlNJT04pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0Tm9XYXJuKCkpIHsKLSAgICAgICAgICAgIC8vIC1ud2FybgotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT1dBUk4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyAtYwotICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyAtY2ZpbGUKLSAgICAgICAgICAgICAgICBnZXRDb21tZW50RmlsZUNvbW1hbmQoY21kKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT0NPTU1FTlQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmlld3BhdGgKLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Vmlld1BhdGgoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHJlc2VydmVkIGZsYWcgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzZXJ2ZWQgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNlcnZlZChib29sZWFuIHJlc2VydmVkKSB7Ci0gICAgICAgIG1fUmVzZXJ2ZWQgPSByZXNlcnZlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgcmVzZXJ2ZWQgZmxhZyBzdGF0dXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiByZXNlcnZlZCBmbGFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVzZXJ2ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtX1Jlc2VydmVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBvdXQgZmlsZQotICAgICAqCi0gICAgICogQHBhcmFtIG91dGYgdGhlIHBhdGggdG8gdGhlIG91dCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0KFN0cmluZyBvdXRmKSB7Ci0gICAgICAgIG1fT3V0ID0gb3V0ZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgb3V0IGZpbGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIG91dCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPdXQoKSB7Ci0gICAgICAgIHJldHVybiBtX091dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG5vZGF0YSBmbGFnCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmRhdGEgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb0RhdGEoYm9vbGVhbiBuZGF0YSkgewotICAgICAgICBtX05kYXRhID0gbmRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG5vZGF0YSBmbGFnIHN0YXR1cwotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIG5kYXRhIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXROb0RhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtX05kYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBicmFuY2ggbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGJyYW5jaCB0aGUgbmFtZSBvZiB0aGUgYnJhbmNoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QnJhbmNoKFN0cmluZyBicmFuY2gpIHsKLSAgICAgICAgbV9CcmFuY2ggPSBicmFuY2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGJyYW5jaCBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBicmFuY2gKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJyYW5jaCgpIHsKLSAgICAgICAgcmV0dXJuIG1fQnJhbmNoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmVyc2lvbiBmbGFnCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oYm9vbGVhbiB2ZXJzaW9uKSB7Ci0gICAgICAgIG1fVmVyc2lvbiA9IHZlcnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHZlcnNpb24gZmxhZyBzdGF0dXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiB2ZXJzaW9uIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbV9WZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbm93YXJuIGZsYWcKLSAgICAgKgotICAgICAqIEBwYXJhbSBud2FybiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vV2Fybihib29sZWFuIG53YXJuKSB7Ci0gICAgICAgIG1fTndhcm4gPSBud2FybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbm93YXJuIGZsYWcgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2Ygbndhcm4gZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldE5vV2FybigpIHsKLSAgICAgICAgcmV0dXJuIG1fTndhcm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGNvbW1lbnQgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tbWVudCB0aGUgY29tbWVudCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7Ci0gICAgICAgIG1fQ29tbWVudCA9IGNvbW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGNvbW1lbnQgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBjb21tZW50Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotICAgICAgICByZXR1cm4gbV9Db21tZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBjb21tZW50IGZpbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjZmlsZSB0aGUgcGF0aCB0byB0aGUgY29tbWVudCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbWVudEZpbGUoU3RyaW5nIGNmaWxlKSB7Ci0gICAgICAgIG1fQ2ZpbGUgPSBjZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgY29tbWVudCBmaWxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBjb21tZW50IGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRGaWxlKCkgewotICAgICAgICByZXR1cm4gbV9DZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlICdvdXQnIGNvbW1hbmQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlICdvdXQnIGNvbW1hbmQgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgc3BlY2lmaWVkLCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gQ29tbWFuZExpbmUgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yIHdpdGhvdXQgdGhlIG91dCBmbGFnIGFuZCBwYXRoIGFwcGVuZGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldE91dENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmIChnZXRPdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKLSAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCi0gICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCi0gICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19PVVQpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0T3V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAnYnJhbmNoJyBjb21tYW5kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSAnYnJhbmNoJyBjb21tYW5kIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZwotICAgICAqCi0gICAgICogQHBhcmFtIENvbW1hbmRMaW5lIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvciB3aXRob3V0IHRoZSBicmFuY2ggZmxhZyBhbmQgbmFtZSBhcHBlbmRlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZXRCcmFuY2hDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpZiAoZ2V0QnJhbmNoKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCi0gICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQotICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQotICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQlJBTkNIKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldEJyYW5jaCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgJ2NvbW1lbnQnIGNvbW1hbmQgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgc3BlY2lmaWVkLCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gQ29tbWFuZExpbmUgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yIHdpdGhvdXQgdGhlIGNvbW1lbnQgZmxhZyBhbmQgc3RyaW5nIGFwcGVuZGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldENvbW1lbnRDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcwotICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKLSAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKLSAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlQpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgJ2NmaWxlJyBjb21tYW5kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSAnY2ZpbGUnIGNvbW1hbmQgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgc3BlY2lmaWVkLCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gQ29tbWFuZExpbmUgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yIHdpdGhvdXQgdGhlIGNmaWxlIGZsYWcgYW5kIGZpbGUgYXBwZW5kZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudEZpbGVDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKLSAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCi0gICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCi0gICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19DT01NRU5URklMRSk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50RmlsZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICAgICAvKioKLSAgICAgKiAgLXJlc2VydmVkIGZsYWcgLS0gY2hlY2sgb3V0IHRoZSBmaWxlIGFzIHJlc2VydmVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRVNFUlZFRCA9ICItcmVzZXJ2ZWQiOwotICAgICAgICAvKioKLSAgICAgKiAgLXJlc2VydmVkIGZsYWcgLS0gY2hlY2sgb3V0IHRoZSBmaWxlIGFzIHVucmVzZXJ2ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1VOUkVTRVJWRUQgPSAiLXVucmVzZXJ2ZWQiOwotICAgICAgICAvKioKLSAgICAgKiAtb3V0IGZsYWcgLS0gY3JlYXRlIGEgd3JpdGFibGUgZmlsZSB1bmRlciBhIGRpZmZlcmVudCBmaWxlbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfT1VUID0gIi1vdXQiOwotICAgICAgICAvKioKLSAgICAgKiAtbmRhdGEgZmxhZyAtLSBjaGVja3Mgb3V0IHRoZSBmaWxlIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYW4gZWRpdGFibGUgZmlsZSBjb250YWluaW5nIGl0cyBkYXRhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0RBVEEgPSAiLW5kYXRhIjsKLSAgICAgICAgLyoqCi0gICAgICogLWJyYW5jaCBmbGFnIC0tIGNoZWNrcyBvdXQgdGhlIGZpbGUgb24gYSBzcGVjaWZpZWQgYnJhbmNoCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19CUkFOQ0ggPSAiLWJyYW5jaCI7Ci0gICAgICAgIC8qKgotICAgICAqIC12ZXJzaW9uIGZsYWcgLS0gYWxsb3dzIGNoZWNrb3V0IG9mIGEgdmVyc2lvbiB0aGF0IGlzIG5vdCBtYWluIGxhdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVkVSU0lPTiA9ICItdmVyc2lvbiI7Ci0gICAgICAgIC8qKgotICAgICAqIC1ud2FybiBmbGFnIC0tIHN1cHByZXNzZXMgd2FybmluZyBtZXNzYWdlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9XQVJOID0gIi1ud2FybiI7Ci0gICAgICAgIC8qKgotICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOwotICAgICAgICAvKioKLSAgICAgKiAtY2ZpbGUgZmxhZyAtLSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVEZJTEUgPSAiLWNmaWxlIjsKLSAgICAgICAgLyoqCi0gICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOwotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VuQ2hlY2tvdXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VuQ2hlY2tvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZjEzYy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVbkNoZWNrb3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGFzayB0byBwZXJmb3JtIFVuQ2hlY2tvdXQgY29tbWFuZCB0byBDbGVhckNhc2UuCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0dGVkOgotICogPHRhYmxlIGJvcmRlcj0iMSI+Ci0gKiAgIDx0cj4KLSAqICAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAqICAgICA8dGg+VmFsdWVzPC90aD4KLSAqICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD52aWV3cGF0aDwvdGQ+Ci0gKiAgICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDx0cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+a2VlcGNvcHk8L3RkPgotICogICAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8ga2VlcCBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbiBvciBub3Q8L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8dHI+Ci0gKiA8L3RhYmxlPgotICoKLSAqIEBhdXRob3IgQ3VydGlzIFdoaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDQ1VuQ2hlY2tvdXQgZXh0ZW5kcyBDbGVhckNhc2UgewotICAgIHByaXZhdGUgYm9vbGVhbiBtX0tlZXAgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqIDxwPgotICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGNsZWFydG9vbCBhbmQgdGhlbiBjYWxscyBFeGVjJ3MgcnVuIG1ldGhvZAotICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCi0gICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldFZpZXdQYXRoKGFQcm9qLmdldEJhc2VEaXIoKS5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgaXMKLSAgICAgICAgLy8gY2xlYXJ0b29sIHVuY2hlY2tvdXQgW29wdGlvbnMuLi5dIFt2aWV3cGF0aCAuLi5dCi0gICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MLkVYRSBoZWxwCi0gICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2xlYXJUb29sQ29tbWFuZCgpKTsKLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX1VOQ0hFQ0tPVVQpOwotCi0gICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7Ci0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tPcHRpb25zKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICAvLyBDbGVhckNhc2UgaXRlbXMKLSAgICAgICAgaWYgKGdldEtlZXBDb3B5KCkpIHsKLSAgICAgICAgICAgIC8vIC1rZWVwCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0tFRVBDT1BZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIC1ybQotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19STSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB2aWV3cGF0aAotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWaWV3UGF0aCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQga2VlcGNvcHkgZmxhZyBzdGF0dXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZWVwIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2VlcENvcHkoYm9vbGVhbiBrZWVwKSB7Ci0gICAgICAgIG1fS2VlcCA9IGtlZXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGtlZXBjb3B5IGZsYWcgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2Yga2VlcCBmbGFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0S2VlcENvcHkoKSB7Ci0gICAgICAgIHJldHVybiBtX0tlZXA7Ci0gICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICogIC1rZWVwIGZsYWcgLS0ga2VlcCBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCAua2VlcCBleHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0tFRVBDT1BZID0gIi1rZWVwIjsKLSAgICAgICAgLyoqCi0gICAgICogIC1ybSBmbGFnIC0tIHJlbW92ZSB0aGUgY29weSBvZiB0aGUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUk0gPSAiLXJtIjsKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVcGRhdGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VwZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGVmN2ZlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VwZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5TeXN0ZW07Ci0KLS8qKgotICogVGFzayB0byBwZXJmb3JtIGFuIFVwZGF0ZSBjb21tYW5kIHRvIENsZWFyQ2FzZS4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXR0ZWQ6Ci0gKiA8dGFibGUgYm9yZGVyPSIxIj4KLSAqICAgPHRyPgotICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICogICAgIDx0aD5WYWx1ZXM8L3RoPgotICogICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPnZpZXdwYXRoPC90ZD4KLSAqICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5ncmFwaGljYWw8L3RkPgotICogICAgICA8dGQ+RGlzcGxheXMgYSBncmFwaGljYWwgZGlhbG9nIGR1cmluZyB0aGUgdXBkYXRlPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5sb2c8L3RkPgotICogICAgICA8dGQ+U3BlY2lmaWVzIGEgbG9nIGZpbGUgZm9yIENsZWFyQ2FzZSB0byB3cml0ZSB0bzwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDx0cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+b3ZlcndyaXRlPC90ZD4KLSAqICAgICAgPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcyBvciBub3Q8L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8dHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPnJlbmFtZTwvdGQ+Ci0gKiAgICAgIDx0ZD5TcGVjaWZpZXMgdGhhdCBoaWphY2tlZCBmaWxlcyBzaG91bGQgYmUgcmVuYW1lZCB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5jdXJyZW50dGltZTwvdGQ+Ci0gKiAgICAgIDx0ZD5TcGVjaWZpZXMgdGhhdCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQgYmUgd3JpdHRlbiBhcyB0aGUgY3VycmVudCB0aW1lLiBFaXRoZXIgY3VycmVudHRpbWUgb3IgcHJlc2VydmV0aW1lIGNhbiBiZSBzcGVjaWZpZWQuPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPHRyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5wcmVzZXJ2ZXRpbWU8L3RkPgotICogICAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIHByZXNlcnZlZCBmcm9tIHRoZSBWT0IgdGltZS4gRWl0aGVyIGN1cnJlbnR0aW1lIG9yIHByZXNlcnZldGltZSBjYW4gYmUgc3BlY2lmaWVkLjwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDx0cj4KLSAqIDwvdGFibGU+Ci0gKgotICogQGF1dGhvciBDdXJ0aXMgV2hpdGUKLSAqLwotcHVibGljIGNsYXNzIENDVXBkYXRlIGV4dGVuZHMgQ2xlYXJDYXNlIHsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9HcmFwaGljYWwgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9PdmVyd3JpdGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9SZW5hbWUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9DdGltZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtX1B0aW1lID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9Mb2cgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCi0gICAgICogPHA+Ci0gICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2xlYXJ0b29sIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCi0gICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgICAgICAvLyBEZWZhdWx0IHRoZSB2aWV3cGF0aCB0byBiYXNlZGlyIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgaWYgKGdldFZpZXdQYXRoKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0Vmlld1BhdGgoYVByb2ouZ2V0QmFzZURpcigpLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcwotICAgICAgICAvLyBjbGVhcnRvb2wgdXBkYXRlIFtvcHRpb25zLi4uXSBbdmlld3BhdGggLi4uXQotICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIENMRUFSVE9PTC5FWEUgaGVscAotICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldENsZWFyVG9vbENvbW1hbmQoKSk7Ci0gICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ09NTUFORF9VUERBVEUpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucwotICAgICAgICBjaGVja09wdGlvbnMoY29tbWFuZExpbmUpOwotCi0gICAgICAgIC8vIEZvciBkZWJ1Z2dpbmcKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbW1hbmRMaW5lLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IDAgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIC8vIENsZWFyQ2FzZSBpdGVtcwotICAgICAgICBpZiAoZ2V0R3JhcGhpY2FsKCkpIHsKLSAgICAgICAgICAgIC8vIC1ncmFwaGljYWwKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfR1JBUEhJQ0FMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRPdmVyd3JpdGUoKSkgewotICAgICAgICAgICAgICAgIC8vIC1vdmVyd3JpdGUKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX09WRVJXUklURSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChnZXRSZW5hbWUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyAtcmVuYW1lCi0gICAgICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUkVOQU1FKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyAtbm92ZXJ3cml0ZQotICAgICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PVkVSV1JJVEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRUaW1lKCkpIHsKLSAgICAgICAgICAgICAgICAvLyAtY3RpbWUKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NVUlJFTlRUSU1FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFByZXNlcnZlVGltZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIC1wdGltZQotICAgICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BSRVNFUlZFVElNRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyAtbG9nIGxvZ25hbWUKLSAgICAgICAgICAgIGdldExvZ0NvbW1hbmQoY21kKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHZpZXdwYXRoCi0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZpZXdQYXRoKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBncmFwaGljYWwgZmxhZyBzdGF0dXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBncmFwaGljYWwgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHcmFwaGljYWwoYm9vbGVhbiBncmFwaGljYWwpIHsKLSAgICAgICAgbV9HcmFwaGljYWwgPSBncmFwaGljYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGdyYXBoaWNhbCBmbGFnIHN0YXR1cwotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIGdyYXBoaWNhbCBmbGFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0R3JhcGhpY2FsKCkgewotICAgICAgICByZXR1cm4gbV9HcmFwaGljYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcyBzdGF0dXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBvdyB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZShib29sZWFuIG93KSB7Ci0gICAgICAgIG1fT3ZlcndyaXRlID0gb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcyBzdGF0dXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBvdmVyd3JpdGUgZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldE92ZXJ3cml0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1fT3ZlcndyaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCByZW5hbWUgaGlqYWNrZWQgZmlsZXMgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVuIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVuYW1lKGJvb2xlYW4gcmVuKSB7Ci0gICAgICAgIG1fUmVuYW1lID0gcmVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCByZW5hbWUgaGlqYWNrZWQgZmlsZXMgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgcmVuYW1lIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtX1JlbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgbW9kaWZpZWQgdGltZSBiYXNlZCBvbiBjdXJyZW50IHRpbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjdCB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRUaW1lKGJvb2xlYW4gY3QpIHsKLSAgICAgICAgbV9DdGltZSA9IGN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBjdXJyZW50IHRpbWUgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgY3VycmVudCB0aW1lIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDdXJyZW50VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1fQ3RpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJlc2VydmUgbW9kaWZpZWQgdGltZSBmcm9tIHRoZSBWT0IgdGltZQotICAgICAqCi0gICAgICogQHBhcmFtIHB0IHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlc2VydmVUaW1lKGJvb2xlYW4gcHQpIHsKLSAgICAgICAgbV9QdGltZSA9IHB0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBwcmVzZXJ2ZSB0aW1lIHN0YXR1cwotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIHByZXNlcnZlIHRpbWUgZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFByZXNlcnZlVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1fUHRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGxvZyBmaWxlIHdoZXJlIGNsZWFydG9vbCBjYW4gcmVjb3JkIHRoZSBzdGF0dXMgb2YgdGhlIGNvbW1hbmQKLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2cgdGhlIHBhdGggdG8gdGhlIGxvZyBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9nKFN0cmluZyBsb2cpIHsKLSAgICAgICAgbV9Mb2cgPSBsb2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGxvZyBmaWxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBsb2cgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nKCkgewotICAgICAgICByZXR1cm4gbV9Mb2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAnbG9nJyBjb21tYW5kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSAnbG9nJyBjb21tYW5kIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZwotICAgICAqCi0gICAgICogQHBhcmFtIENvbW1hbmRMaW5lIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvciB3aXRob3V0IHRoZSBsb2cgZmxhZyBhbmQgcGF0aCBhcHBlbmRlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZXRMb2dDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpZiAoZ2V0TG9nKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCi0gICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQotICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQotICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTE9HKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldExvZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICAgICAvKioKLSAgICAgKiAgLWdyYXBoaWNhbCBmbGFnIC0tIGRpc3BsYXkgZ3JhcGhpY2FsIGRpYWxvZyBkdXJpbmcgdXBkYXRlIG9wZXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfR1JBUEhJQ0FMID0gIi1ncmFwaGljYWwiOwotICAgICAgICAvKioKLSAgICAgKiAtbG9nIGZsYWcgLS0gZmlsZSB0byBsb2cgc3RhdHVzIHRvCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19MT0cgPSAiLWxvZyI7Ci0gICAgICAgIC8qKgotICAgICAqIC1vdmVyd3JpdGUgZmxhZyAtLSBvdmVyd3JpdGUgaGlqYWNrZWQgZmlsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX09WRVJXUklURSA9ICItb3ZlcndyaXRlIjsKLSAgICAgICAgLyoqCi0gICAgICogLW5vdmVyd3JpdGUgZmxhZyAtLSBkbyBub3Qgb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT1ZFUldSSVRFID0gIi1ub3ZlcndyaXRlIjsKLSAgICAgICAgLyoqCi0gICAgICogLXJlbmFtZSBmbGFnIC0tIHJlbmFtZSBoaWphY2tlZCBmaWxlcyB3aXRoIC5rZWVwIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVOQU1FID0gIi1yZW5hbWUiOwotICAgICAgICAvKioKLSAgICAgKiAtY3RpbWUgZmxhZyAtLSBtb2RpZmllZCB0aW1lIGlzIHdyaXR0ZW4gYXMgdGhlIGN1cnJlbnQgdGltZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ1VSUkVOVFRJTUUgPSAiLWN0aW1lIjsKLSAgICAgICAgLyoqCi0gICAgICogLXB0aW1lIGZsYWcgLS0gbW9kaWZpZWQgdGltZSBpcyB3cml0dGVuIGFzIHRoZSBWT0IgdGltZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUFJFU0VSVkVUSU1FID0gIi1wdGltZSI7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NsZWFyQ2FzZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NsZWFyQ2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDEyNDEyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DbGVhckNhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dTdHJlYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEEgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgdGFza3MgZm9yIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBDbGVhckNhc2UuCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBleHRlbmRzIHRoZSAnZXhlYycgdGFzayBhcyBpdCBvcGVyYXRlcyBieSBleGVjdXRpbmcgdGhlIGNsZWFydG9vbCBwcm9ncmFtCi0gKiBzdXBwbGllZCB3aXRoIENsZWFyQ2FzZS4gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZSB0byBiZQotICogaW4gdGhlIHBhdGgsICogeW91IGNhbiBvdmVycmlkZSB0aGlzIGJlIHNwZWNpZnlpbmcgdGhlIGNsZWFydG9vbGRpciBhdHRyaWJ1dGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc2V0IGFuZCBnZXQgbWV0aG9kcyBmb3IgdGhlICd2aWV3cGF0aCcgYXR0cmlidXRlLiBJdAotICogYWxzbyBjb250YWlucyBjb25zdGFudHMgZm9yIHRoZSBmbGFncyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gY2xlYXJ0b29sLgotICogPC9wPgotICoKLSAqIEBhdXRob3IgQ3VydGlzIFdoaXRlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGVhckNhc2UgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcml2YXRlIFN0cmluZyBtX0NsZWFyVG9vbERpciA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIG1fdmlld1BhdGggPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlIGlzIGxvY2F0ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENsZWFyVG9vbERpcihTdHJpbmcgZGlyKSB7Ci0gICAgICAgIG1fQ2xlYXJUb29sRGlyID0gcHJvamVjdC50cmFuc2xhdGVQYXRoKGRpcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlIGNsZWFydG9vbAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyBwYXRoIHRvIHRoZSBleGVjdXRhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRDbGVhclRvb2xDb21tYW5kKCkgewotICAgICAgICBTdHJpbmcgdG9SZXR1cm4gPSBtX0NsZWFyVG9vbERpcjsKLSAgICAgICAgaWYgKCAhdG9SZXR1cm4uZXF1YWxzKCIiKSAmJiAhdG9SZXR1cm4uZW5kc1dpdGgoIi8iKSApIHsKLSAgICAgICAgICAgIHRvUmV0dXJuICs9ICIvIjsKLSAgICAgICAgfQotCi0gICAgICAgIHRvUmV0dXJuICs9IENMRUFSVE9PTF9FWEU7Ci0KLSAgICAgICAgcmV0dXJuIHRvUmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aCB0byB0aGUgaXRlbSBpbiBhIGNsZWFyY2FzZSB2aWV3IHRvIG9wZXJhdGUgb24KLSAgICAgKgotICAgICAqIEBwYXJhbSB2aWV3UGF0aCBQYXRoIHRvIHRoZSB2aWV3IGRpcmVjdG9yeSBvciBmaWxlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Vmlld1BhdGgoU3RyaW5nIHZpZXdQYXRoKSB7Ci0gICAgICAgIG1fdmlld1BhdGggPSB2aWV3UGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBhdGggdG8gdGhlIGl0ZW0gaW4gYSBjbGVhcmNhc2UgdmlldwotICAgICAqCi0gICAgICogQHJldHVybiBtX3ZpZXdQYXRoCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWaWV3UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1fdmlld1BhdGg7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgaW50IHJ1bihDb21tYW5kbGluZSBjbWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX1dBUk4pKTsKLSAgICAgICAgICAgIGV4ZS5zZXRBbnRSdW4oYVByb2opOwotICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoYVByb2ouZ2V0QmFzZURpcigpKTsKLSAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZXhlLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIHRoZSB0aGluZyB0byBleGVjdXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSVE9PTF9FWEUgPSAiY2xlYXJ0b29sIjsKLQotICAgIC8qKgotICAgICAqIFRoZSAnVXBkYXRlJyBjb21tYW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9VUERBVEUgPSAidXBkYXRlIjsKLSAgICAvKioKLSAgICAgKiBUaGUgJ0NoZWNrb3V0JyBjb21tYW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9DSEVDS09VVCA9ICJjaGVja291dCI7Ci0gICAgLyoqCi0gICAgICogVGhlICdDaGVja2luJyBjb21tYW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9DSEVDS0lOID0gImNoZWNraW4iOwotICAgIC8qKgotICAgICAqIFRoZSAnVW5kb0NoZWNrb3V0JyBjb21tYW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9VTkNIRUNLT1VUID0gInVuY2hlY2tvdXQiOwotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5ZGEzNC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuKjsKLQotLyoqCi0gKiBBIENsYXNzRmlsZSBvYmplY3Qgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgSmF2YSBjbGFzcy4KLSAqIAotICogVGhlIGNsYXNzIG1heSBiZSByZWFkIGZyb20gYSBEYXRhSW5wdXRTdHJlYW0uYW5kIHdyaXR0ZW4KLSAqIHRvIGEgRGF0YU91dHB1dFN0cmVhbS4gVGhlc2UgYXJlIHVzdWFsbHkgc3RyZWFtcyBmcm9tIGEgSmF2YQotICogY2xhc3MgZmlsZSBvciBhIGNsYXNzIGZpbGUgY29tcG9uZW50IG9mIGEgSmFyIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgQ29ub3IgTWFjTmVpbGwKLSAqLwotcHVibGljIGNsYXNzIENsYXNzRmlsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgTWFnaWMgVmFsdWUgdGhhdCBtYXJrcyB0aGUgc3RhcnQgb2YgYSBKYXZhIGNsYXNzIGZpbGUKLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgQ0xBU1NfTUFHSUMgPSAweENBRkVCQUJFOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzJyBjb25zdGFudCBwb29sLgotICAgICAqLwotICAgIHByaXZhdGUgQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbDsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzIG5hbWUgZm9yIHRoaXMgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgY2xhc3MgZnJvbSBhIGRhdGEgc3RyZWFtLgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIGFuIElucHV0U3RyZWFtIGFzIGlucHV0IGFuZAotICAgICAqIHBhcnNlcyB0aGUgY2xhc3MgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqIDxwPgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gYW4gSW5wdXRTdHJlYW0gZnJvbSB3aGljaCB0aGUgY2xhc3Mgd2lsbCBiZSByZWFkCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyBmcm9tIHRoZSBnaXZlbiBzdHJlYW0uCi0gICAgICogQHRocm93cyBDbGFzc0Zvcm1hdEVycm9yIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgcGFyc2VkIGNvcnJlY3RseQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzRm9ybWF0RXJyb3IgewotICAgICAgICBEYXRhSW5wdXRTdHJlYW0gY2xhc3NTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHN0cmVhbSk7Ci0KLQotICAgICAgICBpZiAoY2xhc3NTdHJlYW0ucmVhZEludCgpICE9IENMQVNTX01BR0lDKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFcnJvcigiTm8gTWFnaWMgQ29kZSBGb3VuZCAtIHByb2JhYmx5IG5vdCBhIEphdmEgY2xhc3MgZmlsZS4iKTsKLSAgICAgICAgfSAKLQotICAgICAgICAvLyByaWdodCB3ZSBoYXZlIGEgZ29vZCBsb29raW5nIGNsYXNzIGZpbGUuCi0gICAgICAgIGludCBtaW5vclZlcnNpb24gPSBjbGFzc1N0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwotICAgICAgICBpbnQgbWFqb3JWZXJzaW9uID0gY2xhc3NTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKLQotICAgICAgICAvLyByZWFkIHRoZSBjb25zdGFudCBwb29sIGluIGFuZCByZXNvbHZlIGl0Ci0gICAgICAgIGNvbnN0YW50UG9vbCA9IG5ldyBDb25zdGFudFBvb2woKTsKLQotICAgICAgICBjb25zdGFudFBvb2wucmVhZChjbGFzc1N0cmVhbSk7Ci0gICAgICAgIGNvbnN0YW50UG9vbC5yZXNvbHZlKCk7Ci0KLSAgICAgICAgaW50IGFjY2Vzc0ZsYWdzID0gY2xhc3NTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKLSAgICAgICAgaW50IHRoaXNDbGFzc0luZGV4ID0gY2xhc3NTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKLSAgICAgICAgaW50IHN1cGVyQ2xhc3NJbmRleCA9IGNsYXNzU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICgoQ2xhc3NDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeSh0aGlzQ2xhc3NJbmRleCkpLmdldENsYXNzTmFtZSgpOwotICAgIH0gCi0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2xhc3NlcyB3aGljaCB0aGlzIGNsYXNzIHJlZmVyZW5jZXMuCi0gICAgICovCi0gICAgcHVibGljIFZlY3RvciBnZXRDbGFzc1JlZnMoKSB7Ci0KLSAgICAgICAgVmVjdG9yIGNsYXNzUmVmcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0YW50UG9vbC5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgQ29uc3RhbnRQb29sRW50cnkgZW50cnkgPSBjb25zdGFudFBvb2wuZ2V0RW50cnkoaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsICYmIGVudHJ5LmdldFRhZygpID09IENvbnN0YW50UG9vbEVudHJ5LkNPTlNUQU5UX0NsYXNzKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NDUEluZm8gY2xhc3NFbnRyeSA9IChDbGFzc0NQSW5mbykgZW50cnk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWNsYXNzRW50cnkuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NSZWZzLmFkZEVsZW1lbnQoQ2xhc3NGaWxlVXRpbHMuY29udmVydFNsYXNoTmFtZShjbGFzc0VudHJ5LmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gCi0KLSAgICAgICAgcmV0dXJuIGNsYXNzUmVmczsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGFzcycgZnVsbHkgcXVhbGlmaWVkIG5hbWUgaW4gZG90IGZvcm1hdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIGluIGRvdCBmb3JtYXQgKGVnLiBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIENsYXNzRmlsZVV0aWxzLmNvbnZlcnRTbGFzaE5hbWUoY2xhc3NOYW1lKTsKLSAgICB9IAotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlSXRlcmF0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmFlMjA1Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NGaWxlSXRlcmF0b3IgewotCi0gICAgcHVibGljIENsYXNzRmlsZSBnZXROZXh0Q2xhc3NGaWxlKCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDU3OTk5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZmlsZSByb3V0aW5lcy4KLSAqIAotICogVGhpcyBjbGFzcyBwb3JvdmlkZXMgYSBudW1iZXIgb2Ygc3RhdGljIHV0aWxpdHkgbWV0aG9kcyB0byBjb252ZXJ0IGJldHdlZW4gdGhlCi0gKiBmb3JtYXRzIHVzZWQgaW4gdGhlIEphdmEgY2xhc3MgZmlsZSBmb3JtYXQgYW5kIHRob3NlIGNvbW1vbmx5IHVzZWQgaW4gSmF2YQotICogcHJvZ3JhbW1pbmcuCi0gKiAKLSAqIEBhdXRob3IgQ29ub3IgTWFjTmVpbGwKLSAqLwotcHVibGljIGNsYXNzIENsYXNzRmlsZVV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIGZyb20gY2xhc3MgZmlsZSBzbGFzaCBub3RhdGlvbiB0byBqYXZhIHNvdXJjZQotICAgICAqIGZpbGUgZG90IG5vdGF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzbGFzaE5hbWUgdGhlIGNsYXNzIG5hbWUgaW4gc2xhc2ggbm90YXRpb24gKGVnLiBqYXZhL2xhbmcvT2JqZWN0KQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIG5hbWUgaW4gZG90IG5vdGF0aW9uIChlZy4gamF2YS5sYW5nLk9iamVjdCkuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgY29udmVydFNsYXNoTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCdcXCcsICcuJykucmVwbGFjZSggJy8nLCAnLicgKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIGNsYXNzIG5hbWUgZnJvbSBqYXZhIHNvdXJjZSBmaWxlIGRvdCBub3RhdGlvbiB0byBjbGFzcyBmaWxlIHNsYXNoIG5vdGF0aW9uLi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZG90TmFtZSB0aGUgY2xhc3MgbmFtZSBpbiBkb3Qgbm90YXRpb24gKGVnLiBqYXZhLmxhbmcuT2JqZWN0KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIGluIHNsYXNoIG5vdGF0aW9uIChlZy4gamF2YS9sYW5nL09iamVjdCkuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgY29udmVydERvdE5hbWUoU3RyaW5nIGRvdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGRvdE5hbWUucmVwbGFjZSggJy4nLCAnLycpOwotICAgIH0gCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2NTg5ZS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvRGVwZW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC4qOwotCi0vKioKLSAqIEdlbmVyYXRlIGEgZGVwZW5kZW5jeSBmaWxlIGZvciBhIGdpdmVuIHNldCBvZiBjbGFzc2VzIAotICoKLSAqIEBhdXRob3IgQ29ub3IgTWFjTmVpbGwKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZCBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0gICAgLyoqCi0gICAgICogQSBjbGFzcyAoc3RydWN0KSB1c2VyIHRvIG1hbmFnZSBpbmZvcm1hdGlvbiBhYm91dCBhIGNsYXNzCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgY2xhc3MgQ2xhc3NGaWxlSW5mbyB7Ci0gICAgICAgIC8qKiBUaGUgZmlsZSB3aGVyZSB0aGUgY2xhc3MgZmlsZSBpcyBzdG9yZWQgaW4gdGhlIGZpbGUgc3lzdGVtICovCi0gICAgICAgIHB1YmxpYyBGaWxlIGFic29sdXRlRmlsZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgcmVsYXRpdmUgdG8gaXRzIGJhc2UgZGlyZWN0b3J5IC0gdGhlIHJvb3QKLSAgICAgICAgICAgIG9mIHRoZSBwYWNrYWdlIG5hbWVzcGFjZSAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIHJlbGF0aXZlTmFtZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoaXMgY2xhc3MgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBjbGFzc05hbWU7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXRoIHdoZXJlIHNvdXJjZSBmaWxlcyBleGlzdAotICAgICAqLyAgICAKLSAgICBwcml2YXRlIFBhdGggc3JjUGF0aDsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXRoIHdoZXJlIGNvbXBpbGVkIGNsYXNzIGZpbGVzIGV4aXN0LgotICAgICAqLwotICAgIHByaXZhdGUgUGF0aCBkZXN0UGF0aDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBkZXBlbmRlbmN5IGNhY2hlLgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBjYWNoZTsKLQotICAgIC8qKgotICAgICAqIEEgbWFwIHdoaWNoIGdpdmVzIGZvciBldmVyeSBjbGFzcyBhIGxpc3Qgb2YgdGUgY2xhc3Mgd2hpY2ggaXQgYWZmZWN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSBhZmZlY3RlZENsYXNzTWFwOwotCi0gICAgLyoqCi0gICAgICogQSBtYXAgd2hpY2ggZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGNsYXNzRmlsZUluZm9NYXA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBtYXAgd2hpY2ggZ2l2ZXMgdGhlIGxpc3Qgb2YgamFycyBhbmQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc3BhdGggdGhhdAotICAgICAqIGEgY2xhc3MgZGVwZW5kcyB1cG9uIAotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGNsYXNzcGF0aERlcGVuZGVuY2llczsKLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IG9mIGNsYXNzZXMgd2hpY2ggYXJlIG91dCBvZiBkYXRlLgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIG91dE9mRGF0ZUNsYXNzZXM7Ci0gICAgIAotICAgIC8qKgotICAgICAqIGluZGljYXRlcyB0aGF0IHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgc2hvdWxkIGJlIGV4dGVuZGVkCi0gICAgICogYmV5b25kIGRpcmVjdCBkZXBlbmRlbmNpZXMgdG8gaW5jbHVkZSBhbGwgY2xhc3Nlcy4gU28gaWYgQSBkaXJlY3RseQotICAgICAqIGFmZmVjdHMgQiBhYmQgQiBkaXJlY3RseSBhZmZlY3RzIEMsIHRoZW4gQSBpbmRpcmVjdGx5IGFmZmVjdHMgQy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2xvc3VyZSA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIEZsYWcgd2hpY2ggY29udHJvbHMgd2hldGhlciB0aGUgcmV2ZXJzZWQgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBkdW1wZWQKLSAgICAgKiB0byB0aGUgbG9nCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGR1bXAgPSBmYWxzZTsKLQotICAgIC8qKiBUaGUgY2xhc3NwYXRoIHRvIGxvb2sgZm9yIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzICovCi0gICAgcHJpdmF0ZSBQYXRoIGRlcGVuZENsYXNzcGF0aDsKLQotICAgIC8qKgotICAgICAqIGNvbnN0YW50cyB1c2VkIHdpdGggdGhlIGNhY2hlIGZpbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FDSEVfRklMRV9OQU1FID0gImRlcGVuZGVuY2llcy50eHQiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU05BTUVfUFJFUEVORCA9ICJ8fDoiOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBkZXBlbmRlbmN5IGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgewotICAgICAgICBpZiAoZGVwZW5kQ2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlcGVuZENsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlcGVuZENsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBHZXRzIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBkZXBlbmRlbmN5IGNoZWNrLiAqLwotICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGRlcGVuZENsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGRlcGVuZENsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXBlbmRDbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVwZW5kQ2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGRlcGVuZGVuY2llcyBmcm9tIGNhY2hlIGZpbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSByZWFkQ2FjaGVkRGVwZW5kZW5jaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uewotICAgICAgICBIYXNodGFibGUgZGVwZW5kZW5jeU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlIGRlcEZpbGUgPSBuZXcgRmlsZShjYWNoZSwgQ0FDSEVfRklMRV9OQU1FKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChkZXBGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZGVwRmlsZSkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFZlY3RvciBkZXBlbmRlbmN5TGlzdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpbnQgcHJlcGVuZExlbmd0aCA9IENMQVNTTkFNRV9QUkVQRU5ELmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKENMQVNTTkFNRV9QUkVQRU5EKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGxpbmUuc3Vic3RyaW5nKHByZXBlbmRMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lNYXAucHV0KGNsYXNzTmFtZSwgZGVwZW5kZW5jeUxpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUxpc3QuYWRkRWxlbWVudChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGVwZW5kZW5jeU1hcDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGRlcGVuZGVuY2llcyB0byBjYWNoZSBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQ2FjaGVkRGVwZW5kZW5jaWVzKEhhc2h0YWJsZSBkZXBlbmRlbmN5TWFwKSB0aHJvd3MgSU9FeGNlcHRpb257Ci0gICAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNhY2hlLm1rZGlycygpOyAKLSAgICAgICAgICAgICAgICBGaWxlIGRlcEZpbGUgPSBuZXcgRmlsZShjYWNoZSwgQ0FDSEVfRklMRV9OQU1FKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihkZXBGaWxlKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBkZXBzID0gZGVwZW5kZW5jeU1hcC5rZXlzKCk7IGRlcHMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWRlcHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oQ0xBU1NOQU1FX1BSRVBFTkQgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yIGRlcGVuZGVuY3lMaXN0ID0gKFZlY3RvcilkZXBlbmRlbmN5TWFwLmdldChjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGRlcGVuZGVuY3lMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBzaXplOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oZGVwZW5kZW5jeUxpc3QuZWxlbWVudEF0KHgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChwdyAhPSBudWxsKSB7IAotICAgICAgICAgICAgICAgICAgICBwdy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBjbGFzc2VzLiAKLSAgICAgKgotICAgICAqIENsYXNzIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSBleGFtaW5pbmcgdGhlIGNsYXNzIHJlZmVyZW5jZXMgaW4gYSBjbGFzcyBmaWxlCi0gICAgICogdG8gb3RoZXIgY2xhc3NlcyAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGV0ZXJtaW5lRGVwZW5kZW5jaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYWZmZWN0ZWRDbGFzc01hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgY2xhc3NGaWxlSW5mb01hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgYm9vbGVhbiBjYWNoZURpcnR5ID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBIYXNodGFibGUgZGVwZW5kZW5jeU1hcCA9IG51bGw7Ci0gICAgICAgIEZpbGUgZGVwQ2FjaGVGaWxlID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBkZXBDYWNoZUZpbGVFeGlzdHMgPSB0cnVlOwotICAgICAgICBsb25nIGRlcENhY2hlRmlsZUxhc3RNb2RpZmllZCA9IExvbmcuTUFYX1ZBTFVFOwotICAgICAgICAKLSAgICAgICAgLy8gcmVhZCB0aGUgZGVwZW5kZW5jeSBjYWNoZSBmcm9tIHRoZSBkaXNrCi0gICAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXBlbmRlbmN5TWFwID0gcmVhZENhY2hlZERlcGVuZGVuY2llcygpOwotICAgICAgICAgICAgZGVwQ2FjaGVGaWxlID0gbmV3IEZpbGUoY2FjaGUsIENBQ0hFX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICBkZXBDYWNoZUZpbGVFeGlzdHMgPSBkZXBDYWNoZUZpbGUuZXhpc3RzKCk7Ci0gICAgICAgICAgICBkZXBDYWNoZUZpbGVMYXN0TW9kaWZpZWQgPSBkZXBDYWNoZUZpbGUubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZ2V0Q2xhc3NGaWxlcyhkZXN0UGF0aCkuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGluZm8gPSAoQ2xhc3NGaWxlSW5mbyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBsb2coIkFkZGluZyBjbGFzcyBpbmZvIGZvciAiICsgaW5mby5jbGFzc05hbWUsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIGNsYXNzRmlsZUluZm9NYXAucHV0KGluZm8uY2xhc3NOYW1lLCBpbmZvKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVmVjdG9yIGRlcGVuZGVuY3lMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmVhZCB0aGUgZGVwZW5kZW5jeSBpbmZvIGZyb20gdGhlIG1hcCBpZiBpdCBpcyBub3Qgb3V0IG9mIGRhdGUKLSAgICAgICAgICAgICAgICBpZiAoZGVwQ2FjaGVGaWxlRXhpc3RzICYmIGRlcENhY2hlRmlsZUxhc3RNb2RpZmllZCA+IGluZm8uYWJzb2x1dGVGaWxlLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRlcEZpbGUgZXhpc3RzIGFuZCBpcyBuZXdlciB0aGFuIHRoZSBjbGFzcyBmaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZ2V0IGRlcGVuZGVuY3kgbGlzdCBmcm9tIHRoZSBtYXAuCi0gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0ID0gKFZlY3RvcilkZXBlbmRlbmN5TWFwLmdldChpbmZvLmNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGVwZW5kZW5jeUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIG5vdCBjYWNoZWQgLSBzbyBuZWVkIHRvIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY2xhc3MgZmlsZQotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbkZpbGVTdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluRmlsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5mby5hYnNvbHV0ZUZpbGUpOwotICAgICAgICAgICAgICAgICAgICBDbGFzc0ZpbGUgY2xhc3NGaWxlID0gbmV3IENsYXNzRmlsZSgpOwotICAgICAgICAgICAgICAgICAgICBjbGFzc0ZpbGUucmVhZChpbkZpbGVTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUxpc3QgPSBjbGFzc0ZpbGUuZ2V0Q2xhc3NSZWZzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZURpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lNYXAucHV0KGluZm8uY2xhc3NOYW1lLCBkZXBlbmRlbmN5TGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5GaWxlU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluRmlsZVN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGlzIGNsYXNzIGRlcGVuZHMgb24gZWFjaCBjbGFzcyBpbiB0aGUgZGVwZW5kZW5jeSBsaXN0LiBGb3IgZWFjaAotICAgICAgICAgICAgLy8gb25lIG9mIHRob3NlLCBhZGQgdGhpcyBjbGFzcyBpbnRvIHRoZWlyIGFmZmVjdGVkIGNsYXNzZXMgbGlzdCAKLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZGVwRW51bSA9IGRlcGVuZGVuY3lMaXN0LmVsZW1lbnRzKCk7IGRlcEVudW0uaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkZXBlbmRlbnRDbGFzcyA9IChTdHJpbmcpZGVwRW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBhZmZlY3RlZENsYXNzZXMgPSAoSGFzaHRhYmxlKWFmZmVjdGVkQ2xhc3NNYXAuZ2V0KGRlcGVuZGVudENsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoYWZmZWN0ZWRDbGFzc2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWZmZWN0ZWRDbGFzc2VzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZENsYXNzTWFwLnB1dChkZXBlbmRlbnRDbGFzcywgYWZmZWN0ZWRDbGFzc2VzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYWZmZWN0ZWRDbGFzc2VzLnB1dChpbmZvLmNsYXNzTmFtZSwgaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNsYXNzcGF0aERlcGVuZGVuY2llcyA9IG51bGw7Ci0gICAgICAgIGlmIChkZXBlbmRDbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbm93IGRldGVybWluZSB3aGljaCBqYXJzIGVhY2ggY2xhc3MgZGVwZW5kcyB1cG9uCi0gICAgICAgICAgICBjbGFzc3BhdGhEZXBlbmRlbmNpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgQW50Q2xhc3NMb2FkZXIoZ2V0UHJvamVjdCgpLCBkZXBlbmRDbGFzc3BhdGgpOwotICAgICAgICAgICAgSGFzaHRhYmxlIGNsYXNzcGF0aEZpbGVDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgIE9iamVjdCBudWxsRmlsZU1hcmtlciA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGRlcGVuZGVuY3lNYXAua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBWZWN0b3IgZGVwZW5kZW5jeUxpc3QgPSAoVmVjdG9yKWRlcGVuZGVuY3lNYXAuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgSGFzaHRhYmxlIGRlcGVuZGVuY2llcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGhEZXBlbmRlbmNpZXMucHV0KGNsYXNzTmFtZSwgZGVwZW5kZW5jaWVzKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUyID0gZGVwZW5kZW5jeUxpc3QuZWxlbWVudHMoKTsgZTIuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXBlbmRlbmN5ID0oU3RyaW5nKWUyLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBjbGFzc3BhdGhGaWxlT2JqZWN0ID0gY2xhc3NwYXRoRmlsZUNhY2hlLmdldChkZXBlbmRlbmN5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEZpbGVPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoRmlsZU9iamVjdCA9IG51bGxGaWxlTWFya2VyOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kuc3RhcnRzV2l0aCgiamF2YS4iKSAmJiAhZGVwZW5kZW5jeS5zdGFydHNXaXRoKCJqYXZheC4iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBjbGFzc1VSTCA9IGxvYWRlci5nZXRSZXNvdXJjZShkZXBlbmRlbmN5LnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc1VSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc1VSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiamFyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXJGaWxlUGF0aCA9IGNsYXNzVVJMLmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXJGaWxlUGF0aC5zdGFydHNXaXRoKCJmaWxlOiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsYXNzTWFya2VyID0gamFyRmlsZVBhdGguaW5kZXhPZignIScpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphckZpbGVQYXRoID0gamFyRmlsZVBhdGguc3Vic3RyaW5nKDUsIGNsYXNzTWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aEZpbGVPYmplY3QgPSBuZXcgRmlsZShqYXJGaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2xhc3NVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzRmlsZVBhdGggPSBjbGFzc1VSTC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhGaWxlT2JqZWN0ID0gbmV3IEZpbGUoY2xhc3NGaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDbGFzcyAiICsgY2xhc3NOYW1lICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlcGVuZHMgb24gIiArIGNsYXNzcGF0aEZpbGVPYmplY3QgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZHVlIHRvICIgKyBkZXBlbmRlbmN5LCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoRmlsZUNhY2hlLnB1dChkZXBlbmRlbmN5LCBjbGFzc3BhdGhGaWxlT2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NwYXRoRmlsZU9iamVjdCAhPSBudWxsICYmIGNsYXNzcGF0aEZpbGVPYmplY3QgIT0gbnVsbEZpbGVNYXJrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRoaXMgamFyIHRvIHRoZSBsaXN0IGZvciB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBqYXJGaWxlID0gKEZpbGUpY2xhc3NwYXRoRmlsZU9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXQoamFyRmlsZSwgamFyRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHdyaXRlIHRoZSBkZXBlbmRlbmN5IGNhY2hlIHRvIHRoZSBkaXNrCi0gICAgICAgIGlmIChjYWNoZSAhPSBudWxsICYmIGNhY2hlRGlydHkpIHsKLSAgICAgICAgICAgIHdyaXRlQ2FjaGVkRGVwZW5kZW5jaWVzKGRlcGVuZGVuY3lNYXApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGRlbGV0ZUFsbEFmZmVjdGVkRmlsZXMoKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IG91dE9mRGF0ZUNsYXNzZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGNvdW50ICs9IGRlbGV0ZUFmZmVjdGVkRmlsZXMoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIENsYXNzRmlsZUluZm8gY2xhc3NJbmZvID0gKENsYXNzRmlsZUluZm8pY2xhc3NGaWxlSW5mb01hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChjbGFzc0luZm8gIT0gbnVsbCAmJiBjbGFzc0luZm8uYWJzb2x1dGVGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NJbmZvLmFic29sdXRlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3VudDsgICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZGVsZXRlQWZmZWN0ZWRGaWxlcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgSGFzaHRhYmxlIGFmZmVjdGVkQ2xhc3NlcyA9IChIYXNodGFibGUpYWZmZWN0ZWRDbGFzc01hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKGFmZmVjdGVkQ2xhc3NlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBhZmZlY3RlZENsYXNzZXMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWZmZWN0ZWRDbGFzc05hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGFmZmVjdGVkQ2xhc3NJbmZvID0gKENsYXNzRmlsZUluZm8pYWZmZWN0ZWRDbGFzc2VzLmdldChhZmZlY3RlZENsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFmZmVjdGVkQ2xhc3NJbmZvLmFic29sdXRlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGZpbGUgIiArIGFmZmVjdGVkQ2xhc3NJbmZvLmFic29sdXRlRmlsZS5nZXRQYXRoKCkgKyAiIHNpbmNlICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArICIgb3V0IG9mIGRhdGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgYWZmZWN0ZWRDbGFzc0luZm8uYWJzb2x1dGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc3VyZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gZGVsZXRlQWZmZWN0ZWRGaWxlcyhhZmZlY3RlZENsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGNsb3N1cmUgd2UgbWF5IGRlbGV0ZSBhbiBpbm5lciBjbGFzcyBidXQgbm90IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9wIGxldmVsIGNsYXNzIHdoaWNoIHdvdWxkIG5vdCB0cmlnZ2VyIGEgcmVjb21waWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZmZWN0ZWRDbGFzc05hbWUuaW5kZXhPZigiJCIpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIG1haW4gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9wTGV2ZWxDbGFzc05hbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYWZmZWN0ZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGFmZmVjdGVkQ2xhc3NOYW1lLmluZGV4T2YoIiQiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJUb3AgbGV2ZWwgY2xhc3MgPSAiICsgdG9wTGV2ZWxDbGFzc05hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRmlsZUluZm8gdG9wTGV2ZWxDbGFzc0luZm8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKENsYXNzRmlsZUluZm8pY2xhc3NGaWxlSW5mb01hcC5nZXQodG9wTGV2ZWxDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BMZXZlbENsYXNzSW5mbyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExldmVsQ2xhc3NJbmZvLmFic29sdXRlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGZpbGUgIiArIHRvcExldmVsQ2xhc3NJbmZvLmFic29sdXRlRmlsZS5nZXRQYXRoKCkgKyAiIHNpbmNlICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmUgb2YgaXRzIGlubmVyIGNsYXNzZXMgd2FzIHJlbW92ZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGV2ZWxDbGFzc0luZm8uYWJzb2x1dGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc3VyZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gZGVsZXRlQWZmZWN0ZWRGaWxlcyh0b3BMZXZlbENsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvZXMgdGhlIHdvcmsuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIFRocm93biBpbiB1bnJlY292cmFibGUgZXJyb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgW10gc3JjUGF0aExpc3QgPSBzcmNQYXRoLmxpc3QoKTsKLSAgICAgICAgICAgIGlmIChzcmNQYXRoTGlzdC5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkZXN0UGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGVzdFBhdGggPSBzcmNQYXRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2FjaGUgIT0gbnVsbCAmJiBjYWNoZS5leGlzdHMoKSAmJiAhY2FjaGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGNhY2hlLCBpZiBzcGVjaWZpZWQsIG11c3QgcG9pbnQgdG8gYSBkaXJlY3RvcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwgJiYgIWNhY2hlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGUubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRldGVybWluZURlcGVuZGVuY2llcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZHVtcCkgeyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGxvZygiUmV2ZXJzZSBEZXBlbmRlbmN5IER1bXAgZm9yICIgKyBhZmZlY3RlZENsYXNzTWFwLnNpemUoKSArIAotICAgICAgICAgICAgICAgICAgICAiIGNsYXNzZXM6IiwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGFmZmVjdGVkQ2xhc3NNYXAua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBsb2coIiBDbGFzcyAiICsgY2xhc3NOYW1lICsgIiBhZmZlY3RzOiIsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGFmZmVjdGVkQ2xhc3NlcyA9IChIYXNodGFibGUpYWZmZWN0ZWRDbGFzc01hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlMiA9IGFmZmVjdGVkQ2xhc3Nlcy5rZXlzKCk7IGUyLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZmZlY3RlZENsYXNzID0gKFN0cmluZyllMi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBpbmZvID0gKENsYXNzRmlsZUluZm8pYWZmZWN0ZWRDbGFzc2VzLmdldChhZmZlY3RlZENsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiICAgICIgKyBhZmZlY3RlZENsYXNzICsgIiBpbiAiICsgaW5mby5hYnNvbHV0ZUZpbGUuZ2V0UGF0aCgpLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aERlcGVuZGVuY2llcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiQ2xhc3NwYXRoIGZpbGUgZGVwZW5kZW5jaWVzIChGb3J3YXJkKToiLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGNsYXNzcGF0aERlcGVuZGVuY2llcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7IAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCIgQ2xhc3MgIiArIGNsYXNzTmFtZSArICIgZGVwZW5kcyBvbjoiLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgZGVwZW5kZW5jaWVzID0gKEhhc2h0YWJsZSljbGFzc3BhdGhEZXBlbmRlbmNpZXMuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUyID0gZGVwZW5kZW5jaWVzLmVsZW1lbnRzKCk7IGUyLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgY2xhc3NwYXRoRmlsZSA9IChGaWxlKWUyLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCIgICAgIiArIGNsYXNzcGF0aEZpbGUuZ2V0UGF0aCgpLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHdlIG5vdyBuZWVkIHRvIHNjYW4gZm9yIG91dCBvZiBkYXRlIGZpbGVzLiBXaGVuIHdlIGhhdmUgdGhlIGxpc3QKLSAgICAgICAgICAgIC8vIHdlIGdvIHRocm91Z2ggYW5kIGRlbGV0ZSBhbGwgY2xhc3MgZmlsZXMgd2hpY2ggYXJlIGFmZmVjdGVkIGJ5IHRoZXNlIGZpbGVzLgotICAgICAgICAgICAgb3V0T2ZEYXRlQ2xhc3NlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHNyY1BhdGhMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBzcmNEaXIgPSAoRmlsZSlwcm9qZWN0LnJlc29sdmVGaWxlKHNyY1BhdGhMaXN0W2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjRGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSB0aGlzLmdldERpcmVjdG9yeVNjYW5uZXIoc3JjRGlyKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW5EaXIoc3JjRGlyLCBmaWxlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgY2hlY2sgY2xhc3NwYXRoIGZpbGUgZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoRGVwZW5kZW5jaWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBjbGFzc3BhdGhEZXBlbmRlbmNpZXMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeyAKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW91dE9mRGF0ZUNsYXNzZXMuY29udGFpbnNLZXkoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBpbmZvID0gKENsYXNzRmlsZUluZm8pY2xhc3NGaWxlSW5mb01hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBkZXBlbmRlbmNpZXMgPSAoSGFzaHRhYmxlKWNsYXNzcGF0aERlcGVuZGVuY2llcy5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZTIgPSBkZXBlbmRlbmNpZXMuZWxlbWVudHMoKTsgZTIuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBjbGFzc3BhdGhGaWxlID0gKEZpbGUpZTIubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NwYXRoRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGluZm8uYWJzb2x1dGVGaWxlLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ2xhc3MgIiArIGNsYXNzTmFtZSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBvdXQgb2YgZGF0ZSB3aXRoIHJlc3BlY3QgdG8gIiArIGNsYXNzcGF0aEZpbGUsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2ZEYXRlQ2xhc3Nlcy5wdXQoY2xhc3NOYW1lLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHdlIG5vdyBoYXZlIGEgY29tcGxldGUgbGlzdCBvZiBjbGFzc2VzIHdoaWNoIGFyZSBvdXQgb2YgZGF0ZQotICAgICAgICAgICAgLy8gV2Ugc2NhbiB0aHJvdWdoIHRoZSBhZmZlY3RlZCBjbGFzc2VzLCBkZWxldGluZyBhbnkgYWZmZWN0ZWQgY2xhc3Nlcy4KLSAgICAgICAgICAgIGludCBjb3VudCA9IGRlbGV0ZUFsbEFmZmVjdGVkRmlsZXMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9uZyBkdXJhdGlvbiA9IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSAvIDEwMDA7Ci0gICAgICAgICAgICBsb2coIkRlbGV0ZWQgIiArIGNvdW50ICsgIiBvdXQgb2YgZGF0ZSBmaWxlcyBpbiAiICsgZHVyYXRpb24gKyAiIHNlY29uZHMiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNjYW5zIHRoZSBkaXJlY3RvcnkgbG9va2luZyBmb3Igc291cmNlIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gdGhlaXIgY2xhc3MgZmlsZXMuCi0gICAgICogVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIHRoZSBjbGFzcyB2YXJpYWJsZSBjb21waWxlTGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNjYW5EaXIoRmlsZSBzcmNEaXIsIFN0cmluZyBmaWxlc1tdKSB7Ci0KLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIGZpbGVzW2ldKTsKLSAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lbmRzV2l0aCgiLmphdmEiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IHNyY0ZpbGUuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaWxlUGF0aC5zdWJzdHJpbmcoc3JjRGlyLmdldFBhdGgoKS5sZW5ndGgoKSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5sZW5ndGgoKSAtICIuamF2YSIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IENsYXNzRmlsZVV0aWxzLmNvbnZlcnRTbGFzaE5hbWUoY2xhc3NOYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGluZm8gPSAoQ2xhc3NGaWxlSW5mbyljbGFzc0ZpbGVJbmZvTWFwLmdldChjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgd2FzIG5vIGNsYXNzIGZpbGUuIGFkZCB0aGlzIGNsYXNzIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIG91dE9mRGF0ZUNsYXNzZXMucHV0KGNsYXNzTmFtZSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNGaWxlLmxhc3RNb2RpZmllZCgpID4gaW5mby5hYnNvbHV0ZUZpbGUubGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mRGF0ZUNsYXNzZXMucHV0KGNsYXNzTmFtZSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqIAotICAgICAqIEdldCB0aGUgbGlzdCBvZiBjbGFzcyBmaWxlcyB3ZSBhcmUgZ29pbmcgdG8gYW5hbHlzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc0xvY2F0aW9ucyBhIHBhdGggc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIHRoZSBkaXJlY3RvcmllcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBjbGFzc2VzIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAcmV0dXJuIGEgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNsYXNzZXMgdG8gYW5hbHlzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciBnZXRDbGFzc0ZpbGVzKFBhdGggY2xhc3NMb2NhdGlvbnMpIHsKLSAgICAgICAgLy8gYnJlYWsgdGhlIGNsYXNzTG9jYXRpb25zIGludG8gaXRzIGNvbXBvbmVudHMuICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gY2xhc3NMb2NhdGlvbnNMaXN0ID0gY2xhc3NMb2NhdGlvbnMubGlzdCgpOyAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVmVjdG9yIGNsYXNzRmlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTG9jYXRpb25zTGlzdC5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShjbGFzc0xvY2F0aW9uc0xpc3RbaV0pOwotICAgICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgYWRkQ2xhc3NGaWxlcyhjbGFzc0ZpbGVMaXN0LCBkaXIsIGRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjbGFzc0ZpbGVMaXN0OwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBBZGQgdGhlIGxpc3Qgb2YgY2xhc3MgZmlsZXMgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IHRvIHRoZSAKLSAgICAgKiBjbGFzcyBmaWxlIHZlY3RvciwgaW5jbHVkaW5nIGFueSBzdWJkaXJlY3Rvcmllcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc0xvY2F0aW9ucyBhIHBhdGggc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIHRoZSBkaXJlY3RvcmllcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBjbGFzc2VzIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAcmV0dXJuIGEgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNsYXNzZXMgdG8gYW5hbHlzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkQ2xhc3NGaWxlcyhWZWN0b3IgY2xhc3NGaWxlTGlzdCwgRmlsZSBkaXIsIEZpbGUgcm9vdCkgewotICAgICAgICBTdHJpbmdbXSBmaWxlc0luRGlyID0gZGlyLmxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChmaWxlc0luRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBmaWxlc0luRGlyLmxlbmd0aDsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZXNJbkRpcltpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc0ZpbGVzKGNsYXNzRmlsZUxpc3QsIGZpbGUsIHJvb3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBpbmZvID0gbmV3IENsYXNzRmlsZUluZm8oKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5hYnNvbHV0ZUZpbGUgPSBmaWxlOwotICAgICAgICAgICAgICAgICAgICBpbmZvLnJlbGF0aXZlTmFtZSA9IGZpbGUuZ2V0UGF0aCgpLnN1YnN0cmluZyhyb290LmdldFBhdGgoKS5sZW5ndGgoKSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGF0aCgpLmxlbmd0aCgpIC0gNik7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8uY2xhc3NOYW1lID0gQ2xhc3NGaWxlVXRpbHMuY29udmVydFNsYXNoTmFtZShpbmZvLnJlbGF0aXZlTmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NGaWxlTGlzdC5hZGRFbGVtZW50KGluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gCi0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgc291cmNlIGRpcnMgdG8gZmluZCB0aGUgc291cmNlIEphdmEgZmlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3JjZGlyKFBhdGggc3JjUGF0aCkgewotICAgICAgICB0aGlzLnNyY1BhdGggPSBzcmNQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBjb21waWxlZCBqYXZhIGZpbGVzIGV4aXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3REaXIoUGF0aCBkZXN0UGF0aCkgewotICAgICAgICB0aGlzLmRlc3RQYXRoID0gZGVzdFBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENhY2hlKEZpbGUgY2FjaGUpIHsKLSAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKGJvb2xlYW4gY2xvc3VyZSkgewotICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgcmV2ZXJzZSBkZXBlbmRlbmN5IGxpc3Qgc2hvdWxkIGJlIGR1bXBlZCB0byBkZWJ1ZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldER1bXAoYm9vbGVhbiBkdW1wKSB7Ci0gICAgICAgIHRoaXMuZHVtcCA9IGR1bXA7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvRGlyZWN0b3J5SXRlcmF0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EaXJlY3RvcnlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ4MjQ5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EaXJlY3RvcnlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBBbiBpdGVyYXRvciB3aGljaCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBjb250ZW50cyBvZiBhIGphdmEgZGlyZWN0b3J5LgotICogCi0gKiBUaGUgaXRlcmF0b3Igc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZGlyZWN0b3J5IGF0IHRoZSByb290IG9mIHRoZQotICogSmF2YSBuYW1lc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgQ29ub3IgTWFjTmVpbGwKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeUl0ZXJhdG9yIGltcGxlbWVudHMgQ2xhc3NGaWxlSXRlcmF0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIHN0YWNrIG9mIGN1cnJlbnQgaXRlcmF0b3JzIHN1cHBvcnRpbmcgdGhlIGRlcHRoIGZpcnN0Ci0gICAgICogdHJhdmVyc2FsIG9mIHRoZSBkaXJlY3RvcnkgdHJlZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0YWNrIGVudW1TdGFjazsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBpdGVyYXRvci4gQXMgZGlyZWN0b3JpZXMgZW5jb3VudGVyIGxvd2VyIGxldmVsCi0gICAgICogZGlyZWN0b3JpZXMsIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIHB1c2hlZCBvbnRvIHRoZSBpdGVyYXRvcgotICAgICAqIHN0YWNrIGFuZCBhIG5ldyBpdGVyYXRvciBvdmVyIHRoZSBzdWIgZGlyZWN0b3J5IGJlY29tZXMgdGhlIGN1cnJlbnQKLSAgICAgKiBkaXJlY3RvcnkuIFRoaXMgaW1wbGVtZW50cyBhIGRlcHRoIGZpcnN0IHRyYXZlcnNhbCBvZiB0aGUgZGlyZWN0b3J5IG5hbWVzcGFjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVudW1lcmF0aW9uIGN1cnJlbnRFbnVtOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxlbmd0aCBvZiB0aGUgcm9vdCBkaXJlY3RvcnkuIFRoaXMgaXMgdXNlZCB0byByZW1vdmUgdGhlIHJvb3QgZGlyZWN0b3J5Ci0gICAgICogZnJvbSBmdWxsIHBhdGhzLgotICAgICAqLwotICAgIGludCByb290TGVuZ3RoOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRpcmVjdG9yeSBpdGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBUaGUgZGlyZWN0b3J5IGl0ZXJhdG9yIGlzIGNyZWF0ZWQgdG8gc2NhbiB0aGUgcm9vdCBkaXJlY3RvcnkuIElmIHRoZQotICAgICAqIGNoYW5nZUludG8gZmxhZyBpcyBnaXZlbiwgdGhlbiB0aGUgZW50cmllcyByZXR1cm5lZCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMKLSAgICAgKiBkaXJlY3RvcnkgYW5kIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJvb3REaXJlY3RvcnkgdGhlIHJvb3QgaWYgdGhlIGRpcmVjdG9yeSBuYW1lc3BhY2Ugd2hpY2ggaXMgdG8gYmUgaXRlcmF0ZWQgb3ZlcgotICAgICAqIEBwYXJhbSBjaGFuZ2VJbnRvIGlmIHRydWUgdGhlbiB0aGUgcmV0dXJuZWQgZW50cmllcyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSByb290RGlyZWN0b3J5Ci0gICAgICogYW5kIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBEaXJlY3RvcnlJdGVyYXRvcihGaWxlIHJvb3REaXJlY3RvcnksIGJvb2xlYW4gY2hhbmdlSW50bykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICBlbnVtU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotICAgICAgICBpZiAocm9vdERpcmVjdG9yeS5pc0Fic29sdXRlKCkgfHwgY2hhbmdlSW50bykgewotICAgICAgICAgICAgcm9vdExlbmd0aCA9IHJvb3REaXJlY3RvcnkuZ2V0UGF0aCgpLmxlbmd0aCgpICsgMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJvb3RMZW5ndGggPSAwOwotICAgICAgICB9IAotCi0gICAgICAgIFZlY3RvciBmaWxlc0luUm9vdCA9IGdldERpcmVjdG9yeUVudHJpZXMocm9vdERpcmVjdG9yeSk7Ci0KLSAgICAgICAgY3VycmVudEVudW0gPSBmaWxlc0luUm9vdC5lbGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHZlY3RvciBjb3ZlcmluZyBhbGwgdGhlIGVudHJpZXMgKGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBpbiBhIGRpcmVjdG9yeSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgZGlyZWN0b3J5IHRvIGJlIHNjYW5uZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHZlY3RvciBjb250YWluaW5nIEZpbGUgb2JqZWN0cyBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgVmVjdG9yIGdldERpcmVjdG9yeUVudHJpZXMoRmlsZSBkaXJlY3RvcnkpIHsKLSAgICAgICAgVmVjdG9yIGZpbGVzID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgIC8vIEZpbGVbXSBmaWxlc0luRGlyID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotICAgICAgICBTdHJpbmdbXSBmaWxlc0luRGlyID0gZGlyZWN0b3J5Lmxpc3QoKTsKLQotICAgICAgICBpZiAoZmlsZXNJbkRpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gZmlsZXNJbkRpci5sZW5ndGg7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBmaWxlcy5hZGRFbGVtZW50KG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZXNJbkRpcltpXSkpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSAKLQotICAgICAgICByZXR1cm4gZmlsZXM7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFRlbXBsYXRlIG1ldGhvZCB0byBhbGxvdyBzdWJjbGFzc2VzIHRvIHN1cHBseSBlbGVtZW50cyBmb3IgdGhlIGl0ZXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBUaGUgZGlyZWN0b3J5IGl0ZXJhdG9yIG1haW50YWlucyBhIHN0YWNrIG9mIGl0ZXJhdG9ycyBjb3ZlcmluZyBlYWNoIGxldmVsCi0gICAgICogaW4gdGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkuIFRoZSBjdXJyZW50IGl0ZXJhdG9yIGNvdmVycyB0aGUgY3VycmVudCBkaXJlY3RvcnkKLSAgICAgKiBiZWluZyBzY2FubmVkLiBJZiB0aGUgbmV4dCBlbnRyeSBpbiB0aGF0IGRpcmVjdG9yeSBpcyBhIHN1YmRpcmVjdG9yeSwgdGhlIGN1cnJlbnQKLSAgICAgKiBpdGVyYXRvciBpcyBwdXNoZWQgb250byB0aGUgc3RhY2sgYW5kIGEgbmV3IGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZQotICAgICAqIHN1YmRpcmVjdG9yeS4gSWYgdGhlIGVudHJ5IGlzIGEgZmlsZSwgaXQgaXMgcmV0dXJuZWQgYXMgdGhlIG5leHQgZWxlbWVudCBhbmQgdGhlCi0gICAgICogaXRlcmF0b3IgcmVtYWlucyB2YWxpZC4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksCi0gICAgICogdGhlIHRvcG1vc3QgaXRlcmF0b3Igb24gdGhlIHN0YXRjayBpcyBwb3BwZWQgb2ZmIHRvIGJlY29tZSB0aGUgY3VycmVudCBpdGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IENsYXNzRmlsZSBpbiB0aGUgaXRlcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc0ZpbGUgZ2V0TmV4dENsYXNzRmlsZSgpIHsKLSAgICAgICAgQ2xhc3NGaWxlIG5leHRFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKG5leHRFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBlbGVtZW50ID0gKEZpbGUpIGN1cnJlbnRFbnVtLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNEaXJlY3RvcnkoKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXNoIHRoZSBjdXJyZW50IGl0ZXJhdG9yIG9udG8gdGhlIHN0YWNrIGFuZCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhpcyBkaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnVtU3RhY2sucHVzaChjdXJyZW50RW51bSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBmaWxlcyA9IGdldERpcmVjdG9yeUVudHJpZXMoZWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbnVtID0gZmlsZXMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIGZpbGUuIGNyZWF0ZSBhIHN0cmVhbSBmb3IgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbkZpbGVTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBkYXRhIGlucHV0IHN0cmVhbSBmcm9tIHRoZSBqYXIgaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlIGphdmFDbGFzcyA9IG5ldyBDbGFzc0ZpbGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFDbGFzcy5yZWFkKGluRmlsZVN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudCA9IGphdmFDbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpdGVyYXRvciBpcyBleGhhdXN0ZWQuIENhbiB3ZSBwb3Agb25lIG9mZiB0aGUgc3RhY2sKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1TdGFjay5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbnVtID0gKEVudW1lcmF0aW9uKSBlbnVtU3RhY2sucG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG5leHRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgfSAKLQotICAgICAgICByZXR1cm4gbmV4dEVsZW1lbnQ7Ci0gICAgfSAKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvSmFyRmlsZUl0ZXJhdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvSmFyRmlsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Y2VhMmYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0phckZpbGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZDsKLQotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogQSBjbGFzcyBmaWxlIGl0ZXJhdG9yIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggdGhlIGNvbnRlbnRzIG9mIGEgSmF2YSBqYXIgZmlsZS4KLSAqIAotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgY2xhc3MgSmFyRmlsZUl0ZXJhdG9yIGltcGxlbWVudHMgQ2xhc3NGaWxlSXRlcmF0b3IgewotICAgIHByaXZhdGUgWmlwSW5wdXRTdHJlYW0gamFyU3RyZWFtOwotCi0gICAgcHVibGljIEphckZpbGVJdGVyYXRvcihJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgamFyU3RyZWFtID0gbmV3IFppcElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gZ2V0RW50cnlCeXRlcyhJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDIwNDgpOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbjsKLQotICAgICAgICB3aGlsZSAoKG4gPSBzdHJlYW0ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSAhPSAtMSkgewotICAgICAgICAgICAgYmFvcy53cml0ZShidWZmZXIsIDAsIG4pOwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgfSAKLQotICAgIHB1YmxpYyBDbGFzc0ZpbGUgZ2V0TmV4dENsYXNzRmlsZSgpIHsKLSAgICAgICAgWmlwRW50cnkgICAgICAgICBqYXJFbnRyeTsKLSAgICAgICAgQ2xhc3NGaWxlIG5leHRFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgamFyRW50cnkgPSBqYXJTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0KLQotICAgICAgICAgICAgd2hpbGUgKG5leHRFbGVtZW50ID09IG51bGwgJiYgamFyRW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWUgPSBqYXJFbnRyeS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWphckVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnlOYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBkYXRhIGlucHV0IHN0cmVhbSBmcm9tIHRoZSBqYXIgaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0ZpbGUgamF2YUNsYXNzID0gbmV3IENsYXNzRmlsZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3MucmVhZChqYXJTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudCA9IGphdmFDbGFzczsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGphckVudHJ5ID0gamFyU3RyZWFtLmdldE5leHRFbnRyeSgpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IAotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGV4dCArPSAiOiAiICsgbWVzc2FnZTsKLSAgICAgICAgICAgIH0gCi0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgSkFSIGZpbGU6ICIgKyB0ZXh0KTsKLSAgICAgICAgfSAKLQotICAgICAgICByZXR1cm4gbmV4dEVsZW1lbnQ7Ci0gICAgfSAKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NsYXNzQ1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NsYXNzQ1BJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTdmNWEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9DbGFzc0NQSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIGNvbnN0YW50IHBvb2wgZW50cnkgd2hpY2ggc3RvcmVzIGNsYXNzIGluZm9ybWF0aW9uLgotICogCi0gKiBAYXV0aG9yIENvbm9yIE1hY05laWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0NQSW5mbyBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKLQotICAgIC8qKgotICAgICAqIFRoZSBjbGFzcycgbmFtZS4gVGhpcyB3aWxsIGJlIG9ubHkgdmFsaWQgaWYgdGhlIGVudHJ5IGhhcyBiZWVuIHJlc29sdmVkCi0gICAgICogYWdhaW5zdCB0aGUgY29uc3RhbnQgcG9vbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCB3aGVyZSB0aGlzIGNsYXNzJyBuYW1lIGlzIHN0b3JlZC4gSWYgdGhlIGNsYXNzCi0gICAgICogbmFtZSBpcyBjaGFuZ2VkLCB0aGlzIGVudHJ5IGlzIGludmFsaWQgdW50aWwgdGhpcyBlbnRyeSBpcyBjb25uZWN0ZWQgdG8gYSBjb25zdGFudAotICAgICAqIHBvb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgICAgaW5kZXg7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBTZXRzIHRoZSB0YWcgdmFsdWUgZm9yIHRoaXMgZW50cnkgdG8gdHlwZSBDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc0NQSW5mbygpIHsKLSAgICAgICAgc3VwZXIoQ09OU1RBTlRfQ2xhc3MsIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGVudHJ5IGZyb20gYSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBzdHJlYW0gY29udGFpbmluZyB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGluZGV4ID0gY3BTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKLSAgICAgICAgY2xhc3NOYW1lID0gInVucmVzb2x2ZWQiOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSBhIHN0cmluZyByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoaXMgZW50cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkNsYXNzIENvbnN0YW50IFBvb2wgRW50cnkgZm9yICIgKyBjbGFzc05hbWUgKyAiWyIgKyBpbmRleCArICJdIjsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZSB0aGlzIGNsYXNzIGluZm8gYWdhaW5zdCB0aGUgZ2l2ZW4gY29uc3RhbnQgcG9vbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uc3RhbnRQb29sIHRoZSBjb25zdGFudCBwb29sIHdpdGggd2hpY2ggdG8gcmVzb2x2ZSB0aGUgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZShDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGluZGV4KSkuZ2V0VmFsdWUoKTsKLQotICAgICAgICBzdXBlci5yZXNvbHZlKGNvbnN0YW50UG9vbCk7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGlzIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzJyBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0gCi0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudENQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudENQSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDU4YzQwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ29uc3RhbnRDUEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEEgQ29uc3RhbnQgUG9vbCBlbnRyeSB3aGljaCByZXByZXNlbnRzIGEgY29uc3RhbnQgdmFsdWUuCi0gKiAKLSAqIAotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ29uc3RhbnRDUEluZm8gZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZW50cnkncyB1bnR5cGVkIHZhbHVlLgotICAgICAqIAotICAgICAqIEVhY2ggc3ViY2xhc3MgaW50ZXJwcmV0cyB0aGUgY29uc3RhbnQgdmFsdWUgYmFzZWQgb24gdGhlIHN1YmNsYXNzJ3MgdHlwZS4KLSAgICAgKiBUaGUgdmFsdWUgaGVyZSBtdXN0IGJlIGNvbXBhdGlibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXNlIHRoZSBjb25zdGFudCBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnVmFsdWUgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgdHlwZSB0byBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBlbnRyaWVzIHRoZSBudW1iZXIgb2YgY29uc3RhbnQgcG9vbCBlbnRyeSBzbG90cyBvY2N1cGllZCBieSB0aGlzIGVudHJ5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb25zdGFudENQSW5mbyhpbnQgdGFnVmFsdWUsIGludCBlbnRyaWVzKSB7Ci0gICAgICAgIHN1cGVyKHRhZ1ZhbHVlLCBlbnRyaWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgKHVudHlwZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb25zdGFudCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB1bnR5cGVkIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHZhbHVlID0gbmV3VmFsdWU7Ci0gICAgfSAKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50UG9vbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudFBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkOGU0YS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIGNvbnN0YW50IHBvb2wgb2YgYSBKYXZhIGNsYXNzLgotICogCi0gKiBUaGUgY29uc3RhbnQgcG9vbCBpcyBhIGNvbGxlY3Rpb24gb2YgY29uc3RhbnRzIHVzZWQgaW4gYSBKYXZhIGNsYXNzIGZpbGUuIEl0IHN0b3JlcwotICogc3RyaW5ncywgY29uc3RhbnQgdmFsdWVzLCBjbGFzcyBuYW1lcywgbWV0aG9kIG5hbWVzLCBmaWVsZCBuYW1lcyBldGMuCi0gKiAKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3Ztc3BlYy8iPlRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uPC9hPgotICogCi0gKiBAYXV0aG9yIENvbm9yIE1hY05laWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdGFudFBvb2wgewotCi0gICAgLyoqCi0gICAgICogVGhlIGVudHJpZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgZW50cmllczsKLQotICAgIC8qKgotICAgICAqIEEgSGFzaHRhYmxlIG9mIFVURjggZW50cmllcyAtIHVzZWQgdG8gZ2V0IGNvbnN0YW50IHBvb2wgaW5kZXhlcyBvZiB0aGUgVVRGOCB2YWx1ZXMgcXVpY2tseQotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIHV0ZjhJbmRleGVzOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGlzZSB0aGUgY29uc3RhbnQgcG9vbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RhbnRQb29sKCkgewotICAgICAgICBlbnRyaWVzID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgIC8vIFRoZSB6ZXJvIGluZGV4IGlzIG5ldmVyIHByZXNlbnQgaW4gdGhlIGNvbnN0YW50IHBvb2wgaXRzZWxmIHNvCi0gICAgICAgIC8vIHdlIGFkZCBhIG51bGwgZW50cnkgZm9yIGl0Ci0gICAgICAgIGVudHJpZXMuYWRkRWxlbWVudChudWxsKTsKLQotICAgICAgICB1dGY4SW5kZXhlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjb25zdGFudCBwb29sIGZyb20gYSBjbGFzcyBpbnB1dCBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNsYXNzU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gb2YgYSBjbGFzcyBmaWxlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGNvbnN0YW50IHBvb2wKLSAgICAgKiBmcm9tIHRoZSBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjbGFzc1N0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IG51bUVudHJpZXMgPSBjbGFzc1N0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtRW50cmllczsgKSB7Ci0gICAgICAgICAgICBDb25zdGFudFBvb2xFbnRyeSBuZXh0RW50cnkgPSBDb25zdGFudFBvb2xFbnRyeS5yZWFkRW50cnkoY2xhc3NTdHJlYW0pOwotCi0gICAgICAgICAgICBpICs9IG5leHRFbnRyeS5nZXROdW1FbnRyaWVzKCk7Ci0KLSAgICAgICAgICAgIGFkZEVudHJ5KG5leHRFbnRyeSk7Ci0gICAgICAgIH0gCi0gICAgfSAKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgY29uc3RhbnQgcG9vbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBlbnRyaWVzLnNpemUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGVudHJ5IHRvIHRoZSBjb25zdGFudCBwb29sLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSB0aGUgbmV3IGVudHJ5IHRvIGJlIGFkZGVkIHRvIHRoZSBjb25zdGFudCBwb29sLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wgYXQgd2hpY2ggdGhlIGVudHJ5IGlzIHN0b3JlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGFkZEVudHJ5KENvbnN0YW50UG9vbEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIGludCBpbmRleCA9IGVudHJpZXMuc2l6ZSgpOwotCi0gICAgICAgIGVudHJpZXMuYWRkRWxlbWVudChlbnRyeSk7Ci0KLSAgICAgICAgaW50IG51bVNsb3RzID0gZW50cnkuZ2V0TnVtRW50cmllcygpOwotCi0gICAgICAgIC8vIGFkZCBudWxsIGVudHJpZXMgZm9yIGFueSBhZGRpdGlvbmFsIHNsb3RzIHJlcXVpcmVkLgotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVNsb3RzIC0gMTsgKytqKSB7Ci0gICAgICAgICAgICBlbnRyaWVzLmFkZEVsZW1lbnQobnVsbCk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgVXRmOENQSW5mbykgewotICAgICAgICAgICAgVXRmOENQSW5mbyB1dGY4SW5mbyA9IChVdGY4Q1BJbmZvKSBlbnRyeTsKLQotICAgICAgICAgICAgdXRmOEluZGV4ZXMucHV0KHV0ZjhJbmZvLmdldFZhbHVlKCksIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIHRoZSBlbnRyaWVzIGluIHRoZSBjb25zdGFudCBwb29sLgotICAgICAqIAotICAgICAqIFJlc29sdXRpb24gb2YgdGhlIGNvbnN0YW50IHBvb2wgaW52b2x2ZXMgdHJhbnNmb3JtaW5nIGluZGV4ZXMgdG8KLSAgICAgKiBvdGhlciBjb25zdGFudCBwb29sIGVudHJpZXMgaW50byB0aGUgYWN0dWFsIGRhdGEgZm9yIHRoYXQgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZSgpIHsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBpID0gZW50cmllcy5lbGVtZW50cygpOyBpLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgIENvbnN0YW50UG9vbEVudHJ5IHBvb2xJbmZvID0gKENvbnN0YW50UG9vbEVudHJ5KSBpLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChwb29sSW5mbyAhPSBudWxsICYmIXBvb2xJbmZvLmlzUmVzb2x2ZWQoKSkgewotICAgICAgICAgICAgICAgIHBvb2xJbmZvLnJlc29sdmUodGhpcyk7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IAotICAgIH0gCi0KLQotICAgIC8qKgotICAgICAqIEdldCBhbiBjb25zdGFudCBwb29sIGVudHJ5IGF0IGEgcGFydGljdWxhciBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSBhdCB0aGF0IGluZGV4LgotICAgICAqLwotICAgIHB1YmxpYyBDb25zdGFudFBvb2xFbnRyeSBnZXRFbnRyeShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIChDb25zdGFudFBvb2xFbnRyeSkgZW50cmllcy5lbGVtZW50QXQoaW5kZXgpOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGV4IG9mIGEgZ2l2ZW4gVVRGOCBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBVVEY4IGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBnaXZlbiBzdHJpbmcgb2NjdXJzIGluIHRoZQotICAgICAqIGNvbnN0YW50IHBvb2wgb3IgLTEgaWYgdGhlIHZhbHVlIGRvZXMgbm90IG9jY3VyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VVRGOEVudHJ5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpbnQgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgIEludGVnZXIgaW5kZXhJbnRlZ2VyID0gKEludGVnZXIpIHV0ZjhJbmRleGVzLmdldCh2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKGluZGV4SW50ZWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGluZGV4SW50ZWdlci5pbnRWYWx1ZSgpOwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbmRleCBvZiBhIGdpdmVuIENPTlNUQU5UX0NsYXNzIGVudHJ5IGluIHRoZSBjb25zdGFudCBwb29sLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGZvciB3aGljaCB0aGUgY2xhc3MgZW50cnkgaW5kZXggaXMgcmVxdWlyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGdpdmVuIGNsYXNzIGVudHJ5IG9jY3VycyBpbiB0aGUKLSAgICAgKiBjb25zdGFudCBwb29sIG9yIC0xIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBvY2N1ci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENsYXNzRW50cnkoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpbnQgaW5kZXggPSAtMTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpICYmIGluZGV4ID09IC0xOyArK2kpIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZW50cmllcy5lbGVtZW50QXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NDUEluZm8pIHsKLSAgICAgICAgICAgICAgICBDbGFzc0NQSW5mbyBjbGFzc2luZm8gPSAoQ2xhc3NDUEluZm8pIGVsZW1lbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NpbmZvLmdldENsYXNzTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfSAKLSAgICAgICAgfSAKLQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kZXggb2YgYSBnaXZlbiBjb25zdGFudCB2YWx1ZSBlbnRyeSBpbiB0aGUgY29uc3RhbnQgcG9vbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uc3RhbnRWYWx1ZSB0aGUgY29uc3RhbnQgdmFsdWUgZm9yIHdoaWNoIHRoZSBpbmRleCBpcyByZXF1aXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZ2l2ZW4gdmFsdWUgZW50cnkgb2NjdXJzIGluIHRoZQotICAgICAqIGNvbnN0YW50IHBvb2wgb3IgLTEgaWYgdGhlIHZhbHVlIGRvZXMgbm90IG9jY3VyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29uc3RhbnRFbnRyeShPYmplY3QgY29uc3RhbnRWYWx1ZSkgewotICAgICAgICBpbnQgaW5kZXggPSAtMTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpICYmIGluZGV4ID09IC0xOyArK2kpIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZW50cmllcy5lbGVtZW50QXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29uc3RhbnRDUEluZm8pIHsKLSAgICAgICAgICAgICAgICBDb25zdGFudENQSW5mbyBjb25zdGFudEVudHJ5ID0gKENvbnN0YW50Q1BJbmZvKSBlbGVtZW50OwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnN0YW50RW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMoY29uc3RhbnRWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IAotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbmRleCBvZiBhIGdpdmVuIENPTlNUQU5UX01ldGhvZFJlZiBlbnRyeSBpbiB0aGUgY29uc3RhbnQgcG9vbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0aG9kQ2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBjb250YWlucyB0aGUgbWV0aG9kCi0gICAgICogYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICogQHBhcmFtIG1ldGhvZFR5cGUgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGUgbWV0aG8gZGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGdpdmVuIG1ldGhvZCByZWYgZW50cnkgb2NjdXJzIGluIHRoZQotICAgICAqIGNvbnN0YW50IHBvb2wgb3IgLTEgaWYgdGhlIHZhbHVlIGRvZXMgbm90IG9jY3VyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWV0aG9kUmVmRW50cnkoU3RyaW5nIG1ldGhvZENsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBtZXRob2RUeXBlKSB7Ci0gICAgICAgIGludCBpbmRleCA9IC0xOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCkgJiYgaW5kZXggPT0gLTE7ICsraSkgewotICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBlbnRyaWVzLmVsZW1lbnRBdChpKTsKLQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RSZWZDUEluZm8pIHsKLSAgICAgICAgICAgICAgICBNZXRob2RSZWZDUEluZm8gbWV0aG9kUmVmRW50cnkgPSAoTWV0aG9kUmVmQ1BJbmZvKSBlbGVtZW50OwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZFJlZkVudHJ5LmdldE1ldGhvZENsYXNzTmFtZSgpLmVxdWFscyhtZXRob2RDbGFzc05hbWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWV0aG9kUmVmRW50cnkuZ2V0TWV0aG9kTmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSAmJiBtZXRob2RSZWZFbnRyeS5nZXRNZXRob2RUeXBlKCkuZXF1YWxzKG1ldGhvZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfSAKLSAgICAgICAgfSAKLQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kZXggb2YgYSBnaXZlbiBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RSZWYgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wuCi0gICAgICogCi0gICAgICogQHBhcmFtIGludGVyZmFjZU1ldGhvZENsYXNzTmFtZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXRob2QKLSAgICAgKiBiZWluZyByZWZlcmVuY2VkLgotICAgICAqIEBwYXJhbSBpbnRlcmZhY2VNZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTWV0aG9kVHlwZSB0aGUgdHlwZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXRobyBkYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZ2l2ZW4gbWV0aG9kIHJlZiBlbnRyeSBvY2N1cnMgaW4gdGhlCi0gICAgICogY29uc3RhbnQgcG9vbCBvciAtMSBpZiB0aGUgdmFsdWUgZG9lcyBub3Qgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnRlcmZhY2VNZXRob2RSZWZFbnRyeShTdHJpbmcgaW50ZXJmYWNlTWV0aG9kQ2xhc3NOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTWV0aG9kTmFtZSwgU3RyaW5nIGludGVyZmFjZU1ldGhvZFR5cGUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKSAmJiBpbmRleCA9PSAtMTsgKytpKSB7Ci0gICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGVudHJpZXMuZWxlbWVudEF0KGkpOwotCi0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVyZmFjZU1ldGhvZFJlZkNQSW5mbykgewotICAgICAgICAgICAgICAgIEludGVyZmFjZU1ldGhvZFJlZkNQSW5mbyBpbnRlcmZhY2VNZXRob2RSZWZFbnRyeSA9IChJbnRlcmZhY2VNZXRob2RSZWZDUEluZm8pIGVsZW1lbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlTWV0aG9kUmVmRW50cnkuZ2V0SW50ZXJmYWNlTWV0aG9kQ2xhc3NOYW1lKCkuZXF1YWxzKGludGVyZmFjZU1ldGhvZENsYXNzTmFtZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnRlcmZhY2VNZXRob2RSZWZFbnRyeS5nZXRJbnRlcmZhY2VNZXRob2ROYW1lKCkuZXF1YWxzKGludGVyZmFjZU1ldGhvZE5hbWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50ZXJmYWNlTWV0aG9kUmVmRW50cnkuZ2V0SW50ZXJmYWNlTWV0aG9kVHlwZSgpLmVxdWFscyhpbnRlcmZhY2VNZXRob2RUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gCi0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGV4IG9mIGEgZ2l2ZW4gQ09OU1RBTlRfRmllbGRSZWYgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpZWxkQ2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBjb250YWlucyB0aGUgZmllbGQKLSAgICAgKiBiZWluZyByZWZlcmVuY2VkLgotICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICogQHBhcmFtIGZpZWxkVHlwZSB0aGUgdHlwZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCBiZWluZyByZWZlcmVuY2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBnaXZlbiBmaWVsZCByZWYgZW50cnkgb2NjdXJzIGluIHRoZQotICAgICAqIGNvbnN0YW50IHBvb2wgb3IgLTEgaWYgdGhlIHZhbHVlIGRvZXMgbm90IG9jY3VyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmllbGRSZWZFbnRyeShTdHJpbmcgZmllbGRDbGFzc05hbWUsIFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyBmaWVsZFR5cGUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKSAmJiBpbmRleCA9PSAtMTsgKytpKSB7Ci0gICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGVudHJpZXMuZWxlbWVudEF0KGkpOwotCi0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpZWxkUmVmQ1BJbmZvKSB7Ci0gICAgICAgICAgICAgICAgRmllbGRSZWZDUEluZm8gZmllbGRSZWZFbnRyeSA9IChGaWVsZFJlZkNQSW5mbykgZWxlbWVudDsKLQotICAgICAgICAgICAgICAgIGlmIChmaWVsZFJlZkVudHJ5LmdldEZpZWxkQ2xhc3NOYW1lKCkuZXF1YWxzKGZpZWxkQ2xhc3NOYW1lKSAmJiBmaWVsZFJlZkVudHJ5LmdldEZpZWxkTmFtZSgpLmVxdWFscyhmaWVsZE5hbWUpIAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmllbGRSZWZFbnRyeS5nZXRGaWVsZFR5cGUoKS5lcXVhbHMoZmllbGRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gCi0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGV4IG9mIGEgZ2l2ZW4gQ09OU1RBTlRfTmFtZUFuZFR5cGUgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBnaXZlbiBOYW1lQW5kVHlwZSBlbnRyeSBvY2N1cnMgaW4gdGhlCi0gICAgICogY29uc3RhbnQgcG9vbCBvciAtMSBpZiB0aGUgdmFsdWUgZG9lcyBub3Qgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROYW1lQW5kVHlwZUVudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgewotICAgICAgICBpbnQgaW5kZXggPSAtMTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpICYmIGluZGV4ID09IC0xOyArK2kpIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZW50cmllcy5lbGVtZW50QXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTmFtZUFuZFR5cGVDUEluZm8pIHsKLSAgICAgICAgICAgICAgICBOYW1lQW5kVHlwZUNQSW5mbyBuYW1lQW5kVHlwZUVudHJ5ID0gKE5hbWVBbmRUeXBlQ1BJbmZvKSBlbGVtZW50OwotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVBbmRUeXBlRW50cnkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSAmJiBuYW1lQW5kVHlwZUVudHJ5LmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IAotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogRHVtcCB0aGUgY29uc3RhbnQgcG9vbCB0byBhIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMgYXMgc3RyaW5ncwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlxuIik7Ci0gICAgICAgIGludCAgICAgICAgICBzaXplID0gZW50cmllcy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiWyIgKyBpICsgIl0gPSAiICsgZ2V0RW50cnkoaSkgKyAiXG4iKTsKLSAgICAgICAgfSAKLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9IAotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ29uc3RhbnRQb29sRW50cnkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ29uc3RhbnRQb29sRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3ZDFmYi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50UG9vbEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBbiBlbnRyeSBpbiB0aGUgY29uc3RhbnQgcG9vbC4KLSAqIAotICogVGhpcyBjbGFzcyBjb250YWlucyBhIHJlcHJlc2VuYXRpb24gb2YgdGhlIGNvbnN0YW50IHBvb2wgZW50cmllcy4gSXQgaXMKLSAqIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgZGlmZmVyZW50IGZvcm1zIG9mIGNvbnN0YW50IHBvb2wgZW50cnkuCi0gKiAKLSAqIEBhdXRob3IgQ29ub3IgTWFjTmVpbGwKLSAqIEBzZWUgQ29uc3RhbnRQb29sCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25zdGFudFBvb2xFbnRyeSB7Ci0KLSAgICAvKioKLSAgICAgKiBUYWcgdmFsdWUgZm9yIFVURjggZW50cmllcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCBDT05TVEFOVF9VdGY4ID0gMTsKLQotICAgIC8qKgotICAgICAqIFRhZyB2YWx1ZSBmb3IgSW50ZWdlciBlbnRyaWVzLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IENPTlNUQU5UX0ludGVnZXIgPSAzOwotCi0gICAgLyoqCi0gICAgICogVGFnIHZhbHVlIGZvciBGbG9hdCBlbnRyaWVzLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IENPTlNUQU5UX0Zsb2F0ID0gNDsKLQotICAgIC8qKgotICAgICAqIFRhZyB2YWx1ZSBmb3IgTG9uZyBlbnRyaWVzLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IENPTlNUQU5UX0xvbmcgPSA1OwotCi0gICAgLyoqCi0gICAgICogVGFnIHZhbHVlIGZvciBEb3VibGUgZW50cmllcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCBDT05TVEFOVF9Eb3VibGUgPSA2OwotCi0gICAgLyoqCi0gICAgICogVGFnIHZhbHVlIGZvciBDbGFzcyBlbnRyaWVzLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IENPTlNUQU5UX0NsYXNzID0gNzsKLQotICAgIC8qKgotICAgICAqIFRhZyB2YWx1ZSBmb3IgU3RyaW5nIGVudHJpZXMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ09OU1RBTlRfU3RyaW5nID0gODsKLQotICAgIC8qKgotICAgICAqIFRhZyB2YWx1ZSBmb3IgRmllbGQgUmVmZXJlbmNlIGVudHJpZXMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ09OU1RBTlRfRmllbGRSZWYgPSA5OwotCi0gICAgLyoqCi0gICAgICogVGFnIHZhbHVlIGZvciBNZXRob2QgUmVmZXJlbmNlIGVudHJpZXMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ09OU1RBTlRfTWV0aG9kUmVmID0gMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUYWcgdmFsdWUgZm9yIEludGVyZmFjZSBNZXRob2QgUmVmZXJlbmNlIGVudHJpZXMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kUmVmID0gMTE7Ci0KLSAgICAvKioKLSAgICAgKiBUYWcgdmFsdWUgZm9yIE5hbWUgYW5kIFR5cGUgZW50cmllcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCBDT05TVEFOVF9OYW1lQW5kVHlwZSA9IDEyOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBlbnRyeSdzIHRhZyB3aGljaCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICB0YWc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBjb25zdGFudCBwb29sLCBvY2N1cGllZCBieSB0aGlzIGVudHJ5LgotICAgICAqLwotICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgIG51bUVudHJpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBBIGZsYWcgd2hpY2ggaW5kaWNpYXRlcyBpZiB0aGlzIGVudHJ5IGhhcyBiZWVuIHJlc29sdmVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICByZXNvbHZlZDsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxzZSB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnVmFsdWUgdGhlIHRhZyB2YWx1ZSB3aGljaCBpZGVudGlmaWVzIHdoaWNoIHR5cGUgb2YgY29uc3RhbnQgcG9vbCBlbnRyeSB0aGlzIGlzLgotICAgICAqIEBwYXJhbSBlbnRyaWVzIHRoZSBudW1iZXIgb2YgY29uc3RhbnQgcG9vbCBlbnRyeSBzbG90cyB0aGlzIGVudHJ5IG9jY3VwaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBDb25zdGFudFBvb2xFbnRyeShpbnQgdGFnVmFsdWUsIGludCBlbnRyaWVzKSB7Ci0gICAgICAgIHRhZyA9IHRhZ1ZhbHVlOwotICAgICAgICBudW1FbnRyaWVzID0gZW50cmllczsKLSAgICAgICAgcmVzb2x2ZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgc3RyZWFtLgotICAgICAqIAotICAgICAqIFRoaXMgaXMgYSBmYWN0b3J5IG1ldGhvZCB3aGljaCByZWFkcyBhIGNvbnN0YW50IHBvb2wgZW50cnkKLSAgICAgKiBmb3JtIGEgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzdWJjbGFzcyBmb3IgdGhlCi0gICAgICogZW50cnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSBpcyB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBDb25zdGFudFBvb2xFbnRyeSBzdWJjbGFzcyByZXByZXNlbnRpbmcgdGhlCi0gICAgICogY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2NlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIENvbnN0YW50UG9vbEVudHJ5IHJlYWRFbnRyeShEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIENvbnN0YW50UG9vbEVudHJ5IGNwSW5mbyA9IG51bGw7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgIGNwVGFnID0gY3BTdHJlYW0ucmVhZFVuc2lnbmVkQnl0ZSgpOwotCi0gICAgICAgIHN3aXRjaCAoY3BUYWcpIHsKLQotICAgICAgICBjYXNlIENPTlNUQU5UX1V0Zjg6Ci0gICAgICAgICAgICBjcEluZm8gPSBuZXcgVXRmOENQSW5mbygpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTlNUQU5UX0ludGVnZXI6Ci0gICAgICAgICAgICBjcEluZm8gPSBuZXcgSW50ZWdlckNQSW5mbygpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTlNUQU5UX0Zsb2F0OgotICAgICAgICAgICAgY3BJbmZvID0gbmV3IEZsb2F0Q1BJbmZvKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ09OU1RBTlRfTG9uZzoKLSAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBMb25nQ1BJbmZvKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ09OU1RBTlRfRG91YmxlOgotICAgICAgICAgICAgY3BJbmZvID0gbmV3IERvdWJsZUNQSW5mbygpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTlNUQU5UX0NsYXNzOgotICAgICAgICAgICAgY3BJbmZvID0gbmV3IENsYXNzQ1BJbmZvKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ09OU1RBTlRfU3RyaW5nOgotICAgICAgICAgICAgY3BJbmZvID0gbmV3IFN0cmluZ0NQSW5mbygpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTlNUQU5UX0ZpZWxkUmVmOgotICAgICAgICAgICAgY3BJbmZvID0gbmV3IEZpZWxkUmVmQ1BJbmZvKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ09OU1RBTlRfTWV0aG9kUmVmOgotICAgICAgICAgICAgY3BJbmZvID0gbmV3IE1ldGhvZFJlZkNQSW5mbygpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZFJlZjoKLSAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBJbnRlcmZhY2VNZXRob2RSZWZDUEluZm8oKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDT05TVEFOVF9OYW1lQW5kVHlwZToKLSAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBOYW1lQW5kVHlwZUNQSW5mbygpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzRm9ybWF0RXJyb3IoIkludmFsaWQgQ29uc3RhbnQgUG9vbCBlbnRyeSBUeXBlICIgKyBjcFRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBjcEluZm8ucmVhZChjcFN0cmVhbSk7Ci0KLSAgICAgICAgcmV0dXJuIGNwSW5mbzsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBlbnRyeSBoYXMgYmVlbiByZXNvbHZlZC4KLSAgICAgKiAKLSAgICAgKiBJbiBnZW5lcmFsIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBjYW4gcmVmZXJlbmNlIGFub3RoZXIgY29uc3RhbnQKLSAgICAgKiBwb29sIGVudHJ5IGJ5IGl0cyBpbmRleCB2YWx1ZS4gUmVzb2x1dGlvbiBpbnZvbHZlcyByZXBsYWNpbmcgdGhpcwotICAgICAqIGluZGV4IHZhbHVlIHdpdGggdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgYXQgdGhhdCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBlbnRyeSBoYXMgYmVlbiByZXNvbHZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFJlc29sdmUgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5IHdpdGggcmVzcGVjdCB0byBpdHMgZGVwZW5kZW50cyBpbgotICAgICAqIHRoZSBjb25zdGFudCBwb29sLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgb2Ygd2hpY2ggdGhpcyBlbnRyeSBpcyBhIG1lbWJlcgotICAgICAqIGFuZCBhZ2FpbnN0IHdoaWNoIHRoaXMgZW50cnkgaXMgdG8gYmUgcmVzb2x2ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZShDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7Ci0gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3BTdHJlYW0gdGhlIERhdGFJbnB1dFN0cmVhbSB3aGljaCBjb250YWlucyB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBFbnRyeSdzIHR5cGUgdGFnLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIFRhZyB2YWx1ZSBvZiB0aGlzIGVudHJ5Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiB0YWc7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIENvbnN0YW50IFBvb2wgRW50cnkgc2xvdHMgd2l0aGluIHRoZSBjb25zdGFudCBwb29sIG9jY3VwaWVkIGJ5IHRoaXMgZW50cnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNsb3RzIHVzZWQuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXROdW1FbnRyaWVzKCkgewotICAgICAgICByZXR1cm4gbnVtRW50cmllczsKLSAgICB9IAotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRG91YmxlQ1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0RvdWJsZUNQSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWNmNTE2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRG91YmxlQ1BJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogVGhlIGNvbnN0YW50IHBvb2wgZW50cnkgc3ViY2xhc3MgdXNlZCB0byByZXByZXNlbnQgZG91YmxlIGNvbnN0YW50IHZhbHVlcy4KLSAqIAotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgY2xhc3MgRG91YmxlQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRDUEluZm8gewotICAgIHB1YmxpYyBEb3VibGVDUEluZm8oKSB7Ci0gICAgICAgIHN1cGVyKENPTlNUQU5UX0RvdWJsZSwgMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3BTdHJlYW0gdGhlIERhdGFJbnB1dFN0cmVhbSB3aGljaCBjb250YWlucyB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUobmV3IERvdWJsZShjcFN0cmVhbS5yZWFkRG91YmxlKCkpKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJEb3VibGUgQ29uc3RhbnQgUG9vbCBFbnRyeTogIiArIGdldFZhbHVlKCk7Ci0gICAgfSAKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ZpZWxkUmVmQ1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ZpZWxkUmVmQ1BJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OTE0MDcuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9GaWVsZFJlZkNQSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQSBGaWVsZFJlZiBDUCBJbmZvCi0gKiAKLSAqIEBhdXRob3IgQ29ub3IgTWFjTmVpbGwKLSAqLwotcHVibGljIGNsYXNzIEZpZWxkUmVmQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewotICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkQ2xhc3NOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBmaWVsZFR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgICAgY2xhc3NJbmRleDsKLSAgICBwcml2YXRlIGludCAgICBuYW1lQW5kVHlwZUluZGV4OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkUmVmQ1BJbmZvKCkgewotICAgICAgICBzdXBlcihDT05TVEFOVF9GaWVsZFJlZiwgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3BTdHJlYW0gdGhlIERhdGFJbnB1dFN0cmVhbSB3aGljaCBjb250YWlucyB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgIG5hbWVBbmRUeXBlSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeSB3aXRoIHJlc3BlY3QgdG8gaXRzIGRlcGVuZGVudHMgaW4KLSAgICAgKiB0aGUgY29uc3RhbnQgcG9vbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uc3RhbnRQb29sIHRoZSBjb25zdGFudCBwb29sIG9mIHdoaWNoIHRoaXMgZW50cnkgaXMgYSBtZW1iZXIKLSAgICAgKiBhbmQgYWdhaW5zdCB3aGljaCB0aGlzIGVudHJ5IGlzIHRvIGJlIHJlc29sdmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgewotICAgICAgICBDbGFzc0NQSW5mbyBmaWVsZENsYXNzID0gKENsYXNzQ1BJbmZvKSBjb25zdGFudFBvb2wuZ2V0RW50cnkoY2xhc3NJbmRleCk7Ci0KLSAgICAgICAgZmllbGRDbGFzcy5yZXNvbHZlKGNvbnN0YW50UG9vbCk7Ci0KLSAgICAgICAgZmllbGRDbGFzc05hbWUgPSBmaWVsZENsYXNzLmdldENsYXNzTmFtZSgpOwotCi0gICAgICAgIE5hbWVBbmRUeXBlQ1BJbmZvIG50ID0gKE5hbWVBbmRUeXBlQ1BJbmZvKSBjb25zdGFudFBvb2wuZ2V0RW50cnkobmFtZUFuZFR5cGVJbmRleCk7Ci0KLSAgICAgICAgbnQucmVzb2x2ZShjb25zdGFudFBvb2wpOwotCi0gICAgICAgIGZpZWxkTmFtZSA9IG50LmdldE5hbWUoKTsKLSAgICAgICAgZmllbGRUeXBlID0gbnQuZ2V0VHlwZSgpOwotCi0gICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIGlmIChpc1Jlc29sdmVkKCkpIHsKLSAgICAgICAgICAgIHZhbHVlID0gIkZpZWxkIDogQ2xhc3MgPSAiICsgZmllbGRDbGFzc05hbWUgKyAiLCBuYW1lID0gIiArIGZpZWxkTmFtZSArICIsIHR5cGUgPSAiICsgZmllbGRUeXBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsdWUgPSAiRmllbGQgOiBDbGFzcyBpbmRleCA9ICIgKyBjbGFzc0luZGV4ICsgIiwgbmFtZSBhbmQgdHlwZSBpbmRleCA9ICIgKyBuYW1lQW5kVHlwZUluZGV4OwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IAotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWVsZENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkQ2xhc3NOYW1lOwotICAgIH0gCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkTmFtZTsKLSAgICB9IAotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWVsZFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZFR5cGU7Ci0gICAgfSAKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0Zsb2F0Q1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0Zsb2F0Q1BJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWVlNTguLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9GbG9hdENQSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBBIEZsb2F0IENQIEluZm8KLSAqIAotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgY2xhc3MgRmxvYXRDUEluZm8gZXh0ZW5kcyBDb25zdGFudENQSW5mbyB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRmxvYXRDUEluZm8oKSB7Ci0gICAgICAgIHN1cGVyKENPTlNUQU5UX0Zsb2F0LCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgY2xhc3Mgc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjcFN0cmVhbSB0aGUgRGF0YUlucHV0U3RyZWFtIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdGFudCBwb29sIGVudHJ5IHRvIGJlIHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShuZXcgRmxvYXQoY3BTdHJlYW0ucmVhZEZsb2F0KCkpKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJGbG9hdCBDb25zdGFudCBQb29sIEVudHJ5OiAiICsgZ2V0VmFsdWUoKTsKLSAgICB9IAotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvSW50ZWdlckNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9JbnRlZ2VyQ1BJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjFlNDkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9JbnRlZ2VyQ1BJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEFuIEludGVnZXIgQ1AgSW5mbwotICogCi0gKiBAYXV0aG9yIENvbm9yIE1hY05laWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlZ2VyQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRDUEluZm8gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEludGVnZXJDUEluZm8oKSB7Ci0gICAgICAgIHN1cGVyKENPTlNUQU5UX0ludGVnZXIsIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlYWQgYSBjb25zdGFudCBwb29sIGVudHJ5IGZyb20gYSBjbGFzcyBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKG5ldyBJbnRlZ2VyKGNwU3RyZWFtLnJlYWRJbnQoKSkpOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBQcmludCBhIHJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkludGVnZXIgQ29uc3RhbnQgUG9vbCBFbnRyeTogIiArIGdldFZhbHVlKCk7Ci0gICAgfSAKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVyZmFjZU1ldGhvZFJlZkNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9JbnRlcmZhY2VNZXRob2RSZWZDUEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkNzU1Yy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVyZmFjZU1ldGhvZFJlZkNQSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQSBJbnRlcmZhY2VNZXRob2RSZWYgQ1AgSW5mbwotICogCi0gKiAKLSAqIEBhdXRob3IgQ29ub3IgTWFjTmVpbGwKLSAqLwotcHVibGljIGNsYXNzIEludGVyZmFjZU1ldGhvZFJlZkNQSW5mbyBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKLSAgICBwcml2YXRlIFN0cmluZyBpbnRlcmZhY2VNZXRob2RDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJmYWNlTWV0aG9kTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBpbnRlcmZhY2VNZXRob2RUeXBlOwotICAgIHByaXZhdGUgaW50ICAgIGNsYXNzSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgICAgbmFtZUFuZFR5cGVJbmRleDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBJbnRlcmZhY2VNZXRob2RSZWZDUEluZm8oKSB7Ci0gICAgICAgIHN1cGVyKENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZFJlZiwgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3BTdHJlYW0gdGhlIERhdGFJbnB1dFN0cmVhbSB3aGljaCBjb250YWlucyB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgIG5hbWVBbmRUeXBlSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeSB3aXRoIHJlc3BlY3QgdG8gaXRzIGRlcGVuZGVudHMgaW4KLSAgICAgKiB0aGUgY29uc3RhbnQgcG9vbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uc3RhbnRQb29sIHRoZSBjb25zdGFudCBwb29sIG9mIHdoaWNoIHRoaXMgZW50cnkgaXMgYSBtZW1iZXIKLSAgICAgKiBhbmQgYWdhaW5zdCB3aGljaCB0aGlzIGVudHJ5IGlzIHRvIGJlIHJlc29sdmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgewotICAgICAgICBDbGFzc0NQSW5mbyBpbnRlcmZhY2VNZXRob2RDbGFzcyA9IChDbGFzc0NQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGNsYXNzSW5kZXgpOwotCi0gICAgICAgIGludGVyZmFjZU1ldGhvZENsYXNzLnJlc29sdmUoY29uc3RhbnRQb29sKTsKLQotICAgICAgICBpbnRlcmZhY2VNZXRob2RDbGFzc05hbWUgPSBpbnRlcmZhY2VNZXRob2RDbGFzcy5nZXRDbGFzc05hbWUoKTsKLQotICAgICAgICBOYW1lQW5kVHlwZUNQSW5mbyBudCA9IChOYW1lQW5kVHlwZUNQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KG5hbWVBbmRUeXBlSW5kZXgpOwotCi0gICAgICAgIG50LnJlc29sdmUoY29uc3RhbnRQb29sKTsKLQotICAgICAgICBpbnRlcmZhY2VNZXRob2ROYW1lID0gbnQuZ2V0TmFtZSgpOwotICAgICAgICBpbnRlcmZhY2VNZXRob2RUeXBlID0gbnQuZ2V0VHlwZSgpOwotCi0gICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIGlmIChpc1Jlc29sdmVkKCkpIHsKLSAgICAgICAgICAgIHZhbHVlID0gIkludGVyZmFjZU1ldGhvZCA6IENsYXNzID0gIiArIGludGVyZmFjZU1ldGhvZENsYXNzTmFtZSArICIsIG5hbWUgPSAiICsgaW50ZXJmYWNlTWV0aG9kTmFtZSArICIsIHR5cGUgPSAiIAotICAgICAgICAgICAgICAgICAgICArIGludGVyZmFjZU1ldGhvZFR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJJbnRlcmZhY2VNZXRob2QgOiBDbGFzcyBpbmRleCA9ICIgKyBjbGFzc0luZGV4ICsgIiwgbmFtZSBhbmQgdHlwZSBpbmRleCA9ICIgKyBuYW1lQW5kVHlwZUluZGV4OwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IAotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VNZXRob2RDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VNZXRob2RDbGFzc05hbWU7Ci0gICAgfSAKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTWV0aG9kTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZU1ldGhvZE5hbWU7Ci0gICAgfSAKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTWV0aG9kVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZU1ldGhvZFR5cGU7Ci0gICAgfSAKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0xvbmdDUEluZm8uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTG9uZ0NQSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTVhZWFiLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTG9uZ0NQSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBBIExvbmcgQ1AgSW5mbwotICogCi0gKiBAYXV0aG9yIENvbm9yIE1hY05laWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBMb25nQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRDUEluZm8gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIExvbmdDUEluZm8oKSB7Ci0gICAgICAgIHN1cGVyKENPTlNUQU5UX0xvbmcsIDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlYWQgYSBjb25zdGFudCBwb29sIGVudHJ5IGZyb20gYSBjbGFzcyBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKG5ldyBMb25nKGNwU3RyZWFtLnJlYWRMb25nKCkpKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJMb25nIENvbnN0YW50IFBvb2wgRW50cnk6ICIgKyBnZXRWYWx1ZSgpOwotICAgIH0gCi0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9NZXRob2RSZWZDUEluZm8uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTWV0aG9kUmVmQ1BJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOGUzODEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9NZXRob2RSZWZDUEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEEgTWV0aG9kUmVmIENQIEluZm8KLSAqIAotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmVmQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewotICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZENsYXNzTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZFR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgICAgY2xhc3NJbmRleDsKLSAgICBwcml2YXRlIGludCAgICBuYW1lQW5kVHlwZUluZGV4OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZFJlZkNQSW5mbygpIHsKLSAgICAgICAgc3VwZXIoQ09OU1RBTlRfTWV0aG9kUmVmLCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgY2xhc3Mgc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjcFN0cmVhbSB0aGUgRGF0YUlucHV0U3RyZWFtIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdGFudCBwb29sIGVudHJ5IHRvIGJlIHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjbGFzc0luZGV4ID0gY3BTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKLSAgICAgICAgbmFtZUFuZFR5cGVJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFByaW50IGEgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLQotICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJNZXRob2QgOiBDbGFzcyA9ICIgKyBtZXRob2RDbGFzc05hbWUgKyAiLCBuYW1lID0gIiArIG1ldGhvZE5hbWUgKyAiLCB0eXBlID0gIiArIG1ldGhvZFR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJNZXRob2QgOiBDbGFzcyBpbmRleCA9ICIgKyBjbGFzc0luZGV4ICsgIiwgbmFtZSBhbmQgdHlwZSBpbmRleCA9ICIgKyBuYW1lQW5kVHlwZUluZGV4OwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZSB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkgd2l0aCByZXNwZWN0IHRvIGl0cyBkZXBlbmRlbnRzIGluCi0gICAgICogdGhlIGNvbnN0YW50IHBvb2wuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnN0YW50UG9vbCB0aGUgY29uc3RhbnQgcG9vbCBvZiB3aGljaCB0aGlzIGVudHJ5IGlzIGEgbWVtYmVyCi0gICAgICogYW5kIGFnYWluc3Qgd2hpY2ggdGhpcyBlbnRyeSBpcyB0byBiZSByZXNvbHZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKENvbnN0YW50UG9vbCBjb25zdGFudFBvb2wpIHsKLSAgICAgICAgQ2xhc3NDUEluZm8gbWV0aG9kQ2xhc3MgPSAoQ2xhc3NDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShjbGFzc0luZGV4KTsKLQotICAgICAgICBtZXRob2RDbGFzcy5yZXNvbHZlKGNvbnN0YW50UG9vbCk7Ci0KLSAgICAgICAgbWV0aG9kQ2xhc3NOYW1lID0gbWV0aG9kQ2xhc3MuZ2V0Q2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgTmFtZUFuZFR5cGVDUEluZm8gbnQgPSAoTmFtZUFuZFR5cGVDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShuYW1lQW5kVHlwZUluZGV4KTsKLQotICAgICAgICBudC5yZXNvbHZlKGNvbnN0YW50UG9vbCk7Ci0KLSAgICAgICAgbWV0aG9kTmFtZSA9IG50LmdldE5hbWUoKTsKLSAgICAgICAgbWV0aG9kVHlwZSA9IG50LmdldFR5cGUoKTsKLQotICAgICAgICBzdXBlci5yZXNvbHZlKGNvbnN0YW50UG9vbCk7Ci0gICAgfSAKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gbWV0aG9kQ2xhc3NOYW1lOwotICAgIH0gCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2ROYW1lOwotICAgIH0gCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RUeXBlOwotICAgIH0gCi0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9OYW1lQW5kVHlwZUNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9OYW1lQW5kVHlwZUNQSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjhiOGM2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTmFtZUFuZFR5cGVDUEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEEgTmFtZUFuZFR5cGUgQ1AgSW5mbwotICogCi0gKiBAYXV0aG9yIENvbm9yIE1hY05laWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lQW5kVHlwZUNQSW5mbyBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBOYW1lQW5kVHlwZUNQSW5mbygpIHsKLSAgICAgICAgc3VwZXIoQ09OU1RBTlRfTmFtZUFuZFR5cGUsIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlYWQgYSBjb25zdGFudCBwb29sIGVudHJ5IGZyb20gYSBjbGFzcyBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG5hbWVJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgIGRlc2NyaXB0b3JJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFByaW50IGEgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLQotICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJOYW1lID0gIiArIG5hbWUgKyAiLCB0eXBlID0gIiArIHR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJOYW1lIGluZGV4ID0gIiArIG5hbWVJbmRleCArICIsIGRlc2NyaXB0b3IgaW5kZXggPSAiICsgZGVzY3JpcHRvckluZGV4OwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZSB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkgd2l0aCByZXNwZWN0IHRvIGl0cyBkZXBlbmRlbnRzIGluCi0gICAgICogdGhlIGNvbnN0YW50IHBvb2wuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnN0YW50UG9vbCB0aGUgY29uc3RhbnQgcG9vbCBvZiB3aGljaCB0aGlzIGVudHJ5IGlzIGEgbWVtYmVyCi0gICAgICogYW5kIGFnYWluc3Qgd2hpY2ggdGhpcyBlbnRyeSBpcyB0byBiZSByZXNvbHZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKENvbnN0YW50UG9vbCBjb25zdGFudFBvb2wpIHsKLSAgICAgICAgbmFtZSA9ICgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KG5hbWVJbmRleCkpLmdldFZhbHVlKCk7Ci0gICAgICAgIHR5cGUgPSAoKFV0ZjhDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShkZXNjcmlwdG9ySW5kZXgpKS5nZXRWYWx1ZSgpOwotCi0gICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKLSAgICB9IAotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9IAotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9IAotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotICAgIHByaXZhdGUgaW50ICAgIG5hbWVJbmRleDsKLSAgICBwcml2YXRlIGludCAgICBkZXNjcmlwdG9ySW5kZXg7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvU3RyaW5nQ1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1N0cmluZ0NQSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIwMWNiLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvU3RyaW5nQ1BJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIFN0cmluZyBDb25zdGFudCBQb29sIEVudHJ5LgotICogCi0gKiBUaGUgU3RyaW5nIGluZm8gY29udGFpbnMgYW4gaW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCB3aGVyZQotICogYSBVVEY4IHN0cmluZyBpcyBzdG9yZWQuCi0gKiAKLSAqIEBhdXRob3IgQ29ub3IgTWFjTmVpbGwKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0NQSW5mbyBleHRlbmRzIENvbnN0YW50Q1BJbmZvIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdDUEluZm8oKSB7Ci0gICAgICAgIHN1cGVyKENPTlNUQU5UX1N0cmluZywgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3BTdHJlYW0gdGhlIERhdGFJbnB1dFN0cmVhbSB3aGljaCBjb250YWlucyB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwotCi0gICAgICAgIHNldFZhbHVlKCJ1bnJlc29sdmVkIik7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFByaW50IGEgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiU3RyaW5nIENvbnN0YW50IFBvb2wgRW50cnkgZm9yICIgKyBnZXRWYWx1ZSgpICsgIlsiICsgaW5kZXggKyAiXSI7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFJlc29sdmUgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5IHdpdGggcmVzcGVjdCB0byBpdHMgZGVwZW5kZW50cyBpbgotICAgICAqIHRoZSBjb25zdGFudCBwb29sLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgb2Ygd2hpY2ggdGhpcyBlbnRyeSBpcyBhIG1lbWJlcgotICAgICAqIGFuZCBhZ2FpbnN0IHdoaWNoIHRoaXMgZW50cnkgaXMgdG8gYmUgcmVzb2x2ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZShDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7Ci0gICAgICAgIHNldFZhbHVlKCgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGluZGV4KSkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKLSAgICB9IAotCi0gICAgcHJpdmF0ZSBpbnQgaW5kZXg7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvVXRmOENQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9VdGY4Q1BJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjRjNDQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9VdGY4Q1BJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIFVURjggQ29uc3RhbnQgUG9vbCBFbnRyeS4KLSAqIAotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgY2xhc3MgVXRmOENQSW5mbyBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBVdGY4Q1BJbmZvKCkgewotICAgICAgICBzdXBlcihDT05TVEFOVF9VdGY4LCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgY2xhc3Mgc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjcFN0cmVhbSB0aGUgRGF0YUlucHV0U3RyZWFtIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdGFudCBwb29sIGVudHJ5IHRvIGJlIHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB2YWx1ZSA9IGNwU3RyZWFtLnJlYWRVVEYoKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJVVEY4IFZhbHVlID0gIiArIHZhbHVlOwotICAgIH0gCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfSAKLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvQ1NoYXJwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvQ1NoYXJwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjUxNTAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0NTaGFycC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODY0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLS8qIGJ1aWxkIG5vdGVzCi0KLSAgICAtVGhlIHJlZmVyZW5jZSBDRCB0byBsaXN0ZW4gdG8gd2hpbGUgZWRpdGluZyB0aGlzIGZpbGUgaXMgCi0gICAgICAgIG5hcDogVW5kZXJ3b3JsZCAgLSBFdmVyeXRoaW5nLCBFdmVyeXRoaW5nCi0gICAgLXZhcmlhYmxlIG5hbWluZyBwb2xpY3kgZnJvbSBGb3dsZXIncyByZWZhY3RvcmluZyBib29rLgotICAgIC10ZXN0ZWQgYWdhaW5zdCB0aGUgUERDIHByZS1iZXRhIG9mIGNzYy5leGU7IGZ1dHVyZSB2ZXJzaW9ucyB3aWxsIAotICAgICBpbmV2aXRhYmx5IGNoYW5nZSB0aGluZ3MKLSovCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBwbGFjZSBpbiB0aGUgb3B0aW9uYWwgYW50IHRhc2tzIHBhY2thZ2UKLS8vIGJ1dCBpbiBpdHMgb3duIGRvdG5ldCBncm91cAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQ7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBpbXBvcnRzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vKioKLVRoaXMgdGFzayBjb21waWxlcyBDU2hhcnAgc291cmNlIGludG8gZXhlY3V0YWJsZXMgb3IgbW9kdWxlcy4KLVRoZSB0YXNrIHdpbGwgb25seSB3b3JrIG9uIHdpbjJLIHVudGlsIG90aGVyIHBsYXRmb3JtcyBzdXBwb3J0IGNzYy5leGUgb3IgCi1hbiBlcXVpdmFsZW50LiBDU0MuZXhlIG11c3QgYmUgb24gdGhlIGV4ZWN1dGUgcGF0aCB0b28uCi0KLTxwPgotQWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOiAmbHQ7Y3NjLyZndDsgc2hvdWxkIHN1ZmZpY2UgdG8gcHJvZHVjZSBhIGRlYnVnCi1idWlsZCBvZiBhbGwgKi5jcyBmaWxlcy4gUmVmZXJlbmNlcyB0byBleHRlcm5hbCBmaWxlcyBkbyByZXF1aXJlIGV4cGxpY2l0IAotZW51bWVyYXRpb24sIHNvIGFyZSBvbmUgb2YgdGhlIGZpcnN0IGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIgYWRkaW5nLiAKLQotPHA+Ci0KLVRoZSB0YXNrIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2ssIHNvIGF0dHJpYnV0ZXMgbGlrZSA8Yj5pbmNsdWRlcz0iKi5jcyI8L2I+IGFuZCAKLTxiPmV4Y2x1ZGVzPSJicm9rZW4uY3MiPC9iPiBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBmaWxlcyBwdWxsZWQgaW4uIEJ5IGRlZmF1bHQsIAotYWxsICouY3MgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCBmb2xkZXIgZG93biBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvbW1hbmQuIAotV2hlbiB0aGlzIGhhcHBlbnMgdGhlIG91dHB1dCBmaWxlIC1pZiBub3Qgc3BlY2lmaWVkLQotaXMgdGFrZW4gYXMgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIGxpc3QsIHdoaWNoIG1heSBiZSBzb21ld2hhdCBoYXJkIHRvIGNvbnRyb2wuCi1TcGVjaWZ5aW5nIHRoZSBvdXRwdXQgZmlsZSB3aXRoIDxiPidvdXRmaWxlJzwvYj4gc2VlbXMgcHJ1ZGVudC4gCi0KLTxwPgotCi0KLTxwPgotVE9ETwotPG9sPgotICAgIDxsaT5pcyBpbmNyZW1lbnRhbCBidWlsZCBzdGlsbCBicm9rZW4gaW4gYmV0YS0xPwotICAgIDxsaT5pcyBXaW4zMkljb24gYnJva2VuPwotICAgIDxsaT5hbGwgdGhlIG1pc3Npbmcgb3B0aW9ucwotPC9vbD4KLTxwPgotSGlzdG9yeQotICAgIDxUYWJsZT4KLSAgICA8dHI+PHRkPjAuMzwvdGQ+Ci0gICAgICAgIDx0ZD4gQmV0YSAxIGVkaXRpb24gPC90ZD4KLSAgICAgICAgPHRkPiBUbyBhdm9pZCBoYXZpbmcgdG8gcmVtZW1iZXIgd2hpY2ggYXNzZW1ibGllcyB0byBpbmNsdWRlLCAKLSAgICAgICAgdGhlIHRhc2sgYXV0b21hdGljYWxseSByZWZlcnMgdG8gdGhlIG1haW4gZG90bmV0IGxpYnJhcmllcyBpbiBCZXRhMS4KLSAgICAgICAgCi0gICAgPC90cj4gICAgPHRyPjx0ZD4wLjI8L3RkPgotICAgICAgICA8dGQ+IFNsaWdodGx5IGRpZmZlcmVudDwvdGQ+Ci0gICAgICAgIDx0ZD4gU3BsaXQgY29tbWFuZCBleGVjdXRpb24gdG8gYSBzZXBhcmF0ZSBjbGFzczsgCi0gICAgPC90cj4KLSAgICA8dHI+PHRkPjAuMTwvdGQ+Ci0gICAgICAgIDx0ZD4gIkkgY2FuJ3QgYmVsaWV2ZSBpdCdzIHNvIHJ1ZGltZW50YXJ5IjwvdGQ+Ci0gICAgICAgIDx0ZD4gIEZpcnN0IHBhc3M7IG1pbmltYWwgYnVpbGRzIG9ubHkgc3VwcG9ydDsgCi0gICAgPC90cj4KLQotICAgIDwvdGFibGU+Ci1AdmVyc2lvbiAwLjMKLUBhdXRob3IgU3RldmUgTG91Z2hyYW4gc3RldmVfbEBpc2VyYW4uY29tCi0KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ1NoYXJwIAotICAgIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrIHsKLQotICAgIC8qKiBjb25zdHJ1Y3RvciBpbml0cyBldmVyeXRoaW5nIGFuZCBzZXQgdXAgdGhlIHNlYXJjaCBwYXR0ZXJuCi0gICAgKi8KLSAgICAKLSAgICBwdWJsaWMgQ1NoYXJwICgpIHsKLSAgICAgICAgQ2xlYXIoKTsKLSAgICAgICAgc2V0SW5jbHVkZXMoY3NjX2ZpbGVfcGF0dGVybik7Ci0gICAgfQotICAgIAotICAgIC8qKiBuYW1lIG9mIHRoZSBleGVjdXRhYmxlLiB0aGUgLmV4ZSBzdWZmaXggaXMgZGVsaWJlcmF0ZWx5IG5vdCBpbmNsdWRlZCAKLSAgICAgKiBpbiBhbnRpY2lwYXRpb24gb2YgdGhlIHVuaXggdmVyc2lvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGNzY19leGVfbmFtZT0iY3NjIjsKLSAgICAKLSAgICAvKiogd2hhdCBpcyB0aGUgZmlsZSBleHRlbnNpb24gd2Ugc2VhcmNoIG9uPwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGNzY19maWxlX2V4dD0iY3MiOwotICAgIAotICAgIC8qKiBkZXJpdmUgdGhlIHNlYXJjaCBwYXR0ZXJuIGZyb20gdGhlIGV4dGVuc2lvbiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBjc2NfZmlsZV9wYXR0ZXJuPSIqKi8qLiIrY3NjX2ZpbGVfZXh0OwotICAgIAotICAgIC8qKiBsaXN0IG9mIHJlZmVyZW5jZSBjbGFzc2VzLiAocHJldHR5IG11Y2ggYSBjbGFzc3BhdGggZXF1aXZhbGVudCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgIFN0cmluZyBfcmVmZXJlbmNlczsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgU2V0IHRoZSByZWZlcmVuY2UgbGlzdCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSAgcyAgVGhlIG5ldyBSZWZlcmVuY2VzIHZhbHVlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZXMoU3RyaW5nIHMpIHsKLSAgICAgICAgX3JlZmVyZW5jZXM9czsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIGdldCB0aGUgcmVmZXJlbmNlIHN0cmluZyBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQgCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgIFRoZSBSZWZlcmVuY2VzIFBhcmFtZXRlciB0byBDU0MgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWZlcmVuY2VzUGFyYW1ldGVyKCkgewotICAgICAgICAvL2JhaWwgb24gbm8gcmVmZXJlbmNlcwotICAgICAgICBpZiAobm90RW1wdHkoX3JlZmVyZW5jZXMpKSAKLSAgICAgICAgICAgIHJldHVybiAiL3JlZmVyZW5jZToiK19yZWZlcmVuY2VzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgLyoqCi0gICAgIHVzaW5nIHRoZSBwYXRoIGFwcHJvYWNoIGRpZG50IHdvcmsgYXMgaXQgY291bGQgbm90IGhhbmRsZSB0aGUgaW1wbGljaXQKLSAgICAgZXhlY3V0aW9uIHBhdGguIFBlcmhhcHMgdGhhdCBjb3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgcnVudGltZSBhbmQgdGhlbgotICAgICB0aGUgcGF0aCBhcHByb2FjaCB3b3VsZCBiZSB2aWFibGUKLSAgICAqLwotICAgIHByb3RlY3RlZCAgUGF0aCBfcmVmZXJlbmNlRmlsZXM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogYWRkIGFub3RoZXIgcGF0aCB0byB0aGUgcmVmZXJlbmNlIGZpbGUgcGF0aCBsaXN0Ci0gICAgICogQHBhcmFtIHBhdGggYW5vdGhlciBwYXRoIHRvIGFwcGVuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZUZpbGVzKFBhdGggcGF0aCkgewotICAgICAgICAvL2RlbWFuZCBjcmVhdGUgcGF0aGxpc3QKLSAgICAgICAgaWYoX3JlZmVyZW5jZUZpbGVzPT1udWxsKQotICAgICAgICAgICAgICAgIF9yZWZlcmVuY2VGaWxlcz1uZXcgUGF0aCh0aGlzLnByb2plY3QpOwotICAgICAgICBfcmVmZXJlbmNlRmlsZXMuYXBwZW5kKHBhdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgdHVybiB0aGUgcGF0aCBsaXN0IGludG8gYSBsaXN0IG9mIGZpbGVzIGFuZCBhIC9yZWZlcmVuY2VzIGFyZ3VtZW50Ci0gICAgIEByZXR1cm4gbnVsbCBvciBhIHN0cmluZyBvZiByZWZlcmVuY2VzLgotICAgICovIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlRmlsZXNQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIC8vYmFpbCBvbiBubyByZWZlcmVuY2VzCi0gICAgICAgIGlmIChfcmVmZXJlbmNlcz09bnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAvL2l0ZXJhdGUgdGhyb3VnaCB0aGUgcmVmIGxpc3QgJiBnZW5lcmF0ZSBhbiBlbnRyeSBmb3IgZWFjaAotICAgICAgICAvL29yIGp1c3QgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHRoZSB0b1N0cmluZyBvcGVyYXRvciBkb2VzIHRoaXMsIGJ1dAotICAgICAgICAvL25vdGluZyB0aGF0IHRoZSBzZXBhcmF0b3IgaXMgJzsnIG9uIHdpbmRvd3MsICc6JyBvbiB1bml4Ci0gICAgICAgIFN0cmluZyByZWZwYXRoPV9yZWZlcmVuY2VzLnRvU3RyaW5nKCk7Ci0gICAgCi0gICAgICAgIC8vYmFpbCBvbiBubyByZWZlcmVuY2VzIGxpc3RlZAotICAgICAgICBpZiAocmVmcGF0aC5sZW5ndGgoKT09MCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nQnVmZmVyIHM9bmV3IFN0cmluZ0J1ZmZlcigiL3JlZmVyZW5jZToiKTsKLSAgICAgICAgcy5hcHBlbmQocmVmcGF0aCk7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHMpOwotICAgIH0gICAKLSAgICAKLSAgICAvKiogCi0gICAgICogRml4IEMjIHJlZmVyZW5jZSBpbmNsdXNpb24uIAotICAgICAqIEMjIGlzIHJlYWxseSBkdW1iIGluIGhvdyBpdCBoYW5kbGVzIGluY2x1c2lvbi4gWW91IGhhdmUgdG8gbGlzdAotICAgICAqIGV2ZXJ5ICdhc3NlbWJseScgLXJlYWQgRExMIHRoYXQgaXMgaW1wb3J0ZWQuIFNvIGFscmVhZHkgeW91IGFyZQotICAgICAqIG1ha2luZyBhIHBsYXRmb3JtIGFzc3VtcHRpb24gLXNoYXJlZCBsaWJyYXJpZXMgaGF2ZSBhIC5kbGw7IisgZXh0ZW5zaW9uCi0gICAgICogYW5kIHRoZSBwb29yIGRldmVsb3BlciBoYXMgdG8ga25vdyBldmVyeSBsaWJyYXJ5IHdoaWNoIGlzIGluY2x1ZGVkCi0gICAgICogd2h5IHRoZSBjb21waWxlciBjYW50IGZpbmQgY2xhc3NlcyBvbiB0aGUgcGF0aCBvciBpbiBhIGRpcmVjdG9yeSwKLSAgICAgKiBpcyBhIG15c3RlcnkuCi0gICAgICoKLSAgICAgKiBUbyByZWR1Y2UgdGhlIG5lZWQgdG8gYmUgZXhwbGljaXQsIGhlcmUgaXMgYSBsb25nIGxpc3Qgb2YgCi0gICAgICogdGhlIGNvcmUgbGlicmFyaWVzIHVzZWQgaW4gQmV0YS0xIG9mIC5ORVQKLSAgICAgKiBvbW1pdHRpbmcgdGhlIGJsYXRhbnRseSBub24gcG9ydGFibGUgKE1TLndpbjMyLmludGVyb3ApCi0gICAgICogYW5kIHRoZSAuZGVzaWduZXIgbGlicmFyaWVzLiAocmlwcGluZyBvdXQgQ29tIHdhcyB0ZW1wdGluZykKLSAgICAgKiBDYXNpbmcgaXMgY2hvc2VuIHRvIG1hdGNoIHRoYXQgb2YgdGhlIGZpbGUgc3lzdGVtIDxpPmV4YWN0bHk8L2k+Ci0gICAgICogc28gbWF5IHdvcmsgb24gYSB1bml4IGJveCB0b28uIAotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRUZFUkVOQ0VfTElTVD0KLSAgICAgICAgICAgICJBY2Nlc3NpYmlsaXR5LmRsbDsiKwotICAgICAgICAgICAgImNzY29tcG1nZC5kbGw7IisKLSAgICAgICAgICAgICJDdXN0b21NYXJzaGFsZXJzLmRsbDsiKwotICAgICAgICAgICAgIklFRXhlY1JlbW90ZS5kbGw7IisKLSAgICAgICAgICAgICJJRUhvc3QuZGxsOyIrCi0gICAgICAgICAgICAiSUlFSG9zdC5kbGw7IisKLSAgICAgICAgICAgICJJU3ltV3JhcHBlci5kbGw7IisKLSAgICAgICAgICAgICJNaWNyb3NvZnQuSlNjcmlwdC5kbGw7IisKLSAgICAgICAgICAgICJNaWNyb3NvZnQuVmlzdWFsQmFzaWMuZGxsOyIrCi0gICAgICAgICAgICAiTWljcm9zb2Z0LlZpc3VhbEMuZGxsOyIrCi0gICAgICAgICAgICAiTWljcm9zb2Z0LlZzYS5kbGw7IisKLSAgICAgICAgICAgICJNc2NvcmNmZy5kbGw7IisKLSAgICAgICAgICAgICJSZWdDb2RlLmRsbDsiKwotICAgICAgICAgICAgIlN5c3RlbS5Db25maWd1cmF0aW9uLkluc3RhbGwuZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLkRhdGEuZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLkRlc2lnbi5kbGw7IisKLSAgICAgICAgICAgICJTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLkVudGVycHJpc2VTZXJ2aWNlcy5kbGw7IisKLSAgICAgICAgICAgICJTeXN0ZW0uZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLkRyYXdpbmcuRGVzaWduLmRsbDsiKwotICAgICAgICAgICAgIlN5c3RlbS5EcmF3aW5nLmRsbDsiKwotICAgICAgICAgICAgIlN5c3RlbS5NYW5hZ2VtZW50LmRsbDsiKwotICAgICAgICAgICAgIlN5c3RlbS5NZXNzYWdpbmcuZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLlJ1bnRpbWUuUmVtb3RpbmcuZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlNvYXAuZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLlNlY3VyaXR5LmRsbDsiKwotICAgICAgICAgICAgIlN5c3RlbS5TZXJ2aWNlUHJvY2Vzcy5kbGw7IisKLSAgICAgICAgICAgICJTeXN0ZW0uV2ViLmRsbDsiKwotICAgICAgICAgICAgIlN5c3RlbS5XZWIuUmVndWxhckV4cHJlc3Npb25zLmRsbDsiKwotICAgICAgICAgICAgIlN5c3RlbS5XZWIuU2VydmljZXMuZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLldpbmRvd3MuRm9ybXMuZGxsOyIrCi0gICAgICAgICAgICAiU3lzdGVtLlhNTC5kbGw7IjsKLQotCi0gICAgICAgICAKLSAgICAvKiogCi0gICAgICogZ2V0IGRlZmF1bHQgcmVmZXJlbmNlIGxpc3QKLSAgICAgKiBAcmV0dXJuIG51bGwgb3IgYSBzdHJpbmcgb2YgcmVmZXJlbmNlcy4KLSAgICAqLyAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIGlmKF9pbmNsdWRlRGVmYXVsdFJlZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzPW5ldyBTdHJpbmdCdWZmZXIoIi9yZWZlcmVuY2U6Iik7Ci0gICAgICAgICAgICBzLmFwcGVuZChERUZBVUxUX1JFRkVSRU5DRV9MSVNUKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAgICAgICAgIAotICAgIH0KLSAgICAgCi0gICAgIC8qKiBmbGFnIHRvIGVuYWJsZSBhdXRvbWF0aWMgcmVmZXJlbmNlIGluY2x1c2lvbgotICAgICAgKgotICAgICAqLwotICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzOwotCi0gICAgLyoqIHNldCB0aGUgYXV0b21hdGljIHJlZmVyZW5jZSBpbmNsdXNpb24gZmxhZyBvbiBvciBvZmYKLSAgICAgKiAgdGhpcyBmbGFnIGNvbnRyb2xzIHRoZSBzdHJpbmcgb2YgcmVmZXJlbmNlcyBhbmQgdGhlIAotICAgICAqICAvbm9zdGRsaWIgb3B0aW9uIGluIENTQwotICAgIEBwYXJhbSBmIG9uL29mZiBmbGFnCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRGVmYXVsdFJlZmVyZW5jZXMoYm9vbGVhbiBmKSB7Ci0gICAgICAgIF9pbmNsdWRlRGVmYXVsdFJlZmVyZW5jZXM9ZjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIHF1ZXJ5IHRoZSBvcHRpbWlzZSBmbGFnCi0gICAgQHJldHVybiB0cnVlIGlmIG9wdGltaXNlIGlzIHR1cm5lZCBvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVEZWZhdWx0UmVmZXJlbmNlcygpIHsKLSAgICAgICAgcmV0dXJuIF9pbmNsdWRlRGVmYXVsdFJlZmVyZW5jZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBnZXQgdGhlIGluY2x1ZGUgZGVmYXVsdCByZWZlcmVuY2VzIGZsYWcgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgUGFyYW1ldGVyIHRvIENTQyAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEluY2x1ZGVEZWZhdWx0UmVmZXJlbmNlc1BhcmFtZXRlcigpIHsKLSAgICAgICAgcmV0dXJuICIvbm9zdGRsaWIiKyhfaW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzPyItIjoiKyIpOwotICAgIH0gICAgCi0gICAgCi0gICAgLyoqIG9wdGltaXNlIGZsYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfb3B0aW1pemU7Ci0gICAgCi0gICAgLyoqIHNldCB0aGUgb3B0aW1pc2UgZmxhZyBvbiBvciBvZmYKLSAgICBAcGFyYW0gZiBvbi9vZmYgZmxhZwotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW1pemUoYm9vbGVhbiBmKSB7Ci0gICAgICAgIF9vcHRpbWl6ZT1mOwotICAgIH0KLSAgICAKLSAgICAvKiogcXVlcnkgdGhlIG9wdGltaXNlIGZsYWcKLSAgICBAcmV0dXJuIHRydWUgaWYgb3B0aW1pc2UgaXMgdHVybmVkIG9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pemUoKSB7Ci0gICAgICAgIHJldHVybiBfb3B0aW1pemU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBnZXQgdGhlIG9wdGltaXNlIGZsYWcgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgT3B0aW1pemUgUGFyYW1ldGVyIHRvIENTQyAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGltaXplUGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gIi9vcHRpbWl6ZSIrKF9vcHRpbWl6ZT8iKyI6Ii0iKTsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiBpbmNyZW1lbnRhbCBidWlsZCBmbGFnICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2luY3JlbWVudGFsOwotICAgIAotICAgIC8qKiBzZXQgdGhlIGluY3JlbWVudGFsIGNvbXBpbGF0aW9uIGZsYWcgb24gb3Igb2ZmCi0gICAgICogQHBhcmFtIGYgb24vb2ZmIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNyZW1lbnRhbChib29sZWFuIGYpewotICAgICAgICBfaW5jcmVtZW50YWw9ZjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIHF1ZXJ5IHRoZSBpbmNyZW1lbnRhbGZsYWcKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIGluY3JlbWVudGFsIGNvbXBpbGF0aW9uIGlzIHR1cm5lZCBvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEluY3JlbWVudGFsKCkgewotICAgICAgICByZXR1cm4gX2luY3JlbWVudGFsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgZ2V0IHRoZSBpbmNyZW1lbnRhbCBidWlsZCBhcmd1bWVudAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgSW5jcmVtZW50YWwgUGFyYW1ldGVyIHRvIENTQyAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEluY3JlbWVudGFsUGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gIi9pbmNyZW1lbnRhbCIrKF9pbmNyZW1lbnRhbD8iKyI6Ii0iKTsKLSAgICB9ICAgCi0gICAgCi0gICAgLyoqIGRlYnVnIGZsYWcuIENvbnRyb2xzIGdlbmVyYXRpb24gb2YgZGVidWcgaW5mb3JtYXRpb24uIAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIF9kZWJ1ZzsKLSAgICAKLSAgICAvKiogc2V0IHRoZSBkZWJ1ZyBmbGFnIG9uIG9yIG9mZgotICAgICAqIEBwYXJhbSBmIG9uL29mZiBmbGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBmKSB7Ci0gICAgICAgIF9kZWJ1Zz1mOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoqIHF1ZXJ5IHRoZSBkZWJ1ZyBmbGFnCi0gICAgICogQHJldHVybiB0cnVlIGlmIGRlYnVnIGlzIHR1cm5lZCBvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlYnVnKCkgewotICAgICAgICByZXR1cm4gX2RlYnVnOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgZ2V0IHRoZSBkZWJ1ZyBzd2l0Y2ggYXJndW1lbnQgIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgRGVidWcgUGFyYW1ldGVyIHRvIENTQyAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlYnVnUGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gIi9kZWJ1ZyIrKF9kZWJ1Zz8iKyI6Ii0iKTsKLSAgICB9ICAgCi0gICAgCi0gICAgLyoqIG91dHB1dCBYTUwgZG9jdW1lbnRhdGlvbiBmbGFnCi0gICAgKi8gIAotICAgIHByb3RlY3RlZCBGaWxlIF9kb2NGaWxlOwotICAgICAgICAKLSAgICAvKiogZmlsZSBmb3IgZ2VuZXJhdGVkIFhNTCBkb2N1bWVudGF0aW9uCi0gICAgICogQHBhcmFtIGYgb3V0cHV0IGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb2NGaWxlKEZpbGUgZikgewotICAgICAgICBfZG9jRmlsZSA9IGY7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgLyoqIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkCi0gICAgICogQHJldHVybiAgICBUaGUgRG9jRmlsZSBQYXJhbWV0ZXIgdG8gQ1NDIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RG9jRmlsZVBhcmFtZXRlcigpIHsKLSAgICAgICAgaWYgKF9kb2NGaWxlIT1udWxsKQotICAgICAgICAgICAgcmV0dXJuICIvZG9jOiIrX2RvY0ZpbGUudG9TdHJpbmcoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogd2FybmluZyBsZXZlbDogMC00LCB3aXRoIDQgYmVpbmcgbW9zdCB2ZXJib3NlCi0gICAgKi8KLSAgICBwcml2YXRlIGludCBfd2FybkxldmVsOwotICAgIAotICAgIC8qKiBzZXQgd2FybiBsZXZlbCAobm8gcmFuZ2UgY2hlY2tpbmcpCi0gICAgICogQHBhcmFtIHdhcm5MZXZlbCB3YXJuIGxldmVsIC1zZWUgLm5ldCBkb2NzIGZvciB2YWxpZCByYW5nZSAocHJvYmFibHkgMC00KQotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2FybkxldmVsKGludCB3YXJuTGV2ZWwpCi0gICAgICAgIHt0aGlzLl93YXJuTGV2ZWw9d2FybkxldmVsO30KLSAgICAKLSAgICAvKiogcXVlcnkgd2FybiBsZXZlbAotICAgICAqIEByZXR1cm4gY3VycmVudCB2YWx1ZQotICAgICovCi0gICAgcHVibGljIGludCBnZXRXYXJuTGV2ZWwoKQotICAgICAgICB7cmV0dXJuIF93YXJuTGV2ZWw7fQotICAgIAotICAgIC8qKgotICAgICAqICBnZXQgdGhlIHdhcm4gbGV2ZWwgc3dpdGNoIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgV2FybkxldmVsIFBhcmFtZXRlciB0byBDU0MgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXYXJuTGV2ZWxQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIHJldHVybiAiL3dhcm46Iitfd2FybkxldmVsOwotICAgIH0gICAKLSAgICAKLSAgICAvKiogZW5hYmxlIHVuc2FmZSBjb2RlIGZsYWcuIENsZWFybHkgc2V0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfdW5zYWZlOwotICAgIAotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBVbnNhZmUgYXR0cmlidXRlIAotICAgICAqCi0gICAgICogQHBhcmFtICB1bnNhZmUgIFRoZSBuZXcgVW5zYWZlIHZhbHVlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVuc2FmZShib29sZWFuIHVuc2FmZSkKLSAgICAgICAge3RoaXMuX3Vuc2FmZT11bnNhZmU7fQotICAgIAotICAgIC8qKgotICAgICAqICBxdWVyeSB0aGUgVW5zYWZlIGF0dHJpYnV0ZSAKLSAgICAgKgotICAgICAqIEByZXR1cm4gICAgVGhlIFVuc2FmZSB2YWx1ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRVbnNhZmUoKQotICAgICAgICB7cmV0dXJuIHRoaXMuX3Vuc2FmZTt9Ci0gICAgCi0gICAgLyoqIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkCi0gICAgICogQHJldHVybiAgICBUaGUgVW5zYWZlIFBhcmFtZXRlciB0byBDU0MgCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVuc2FmZVBhcmFtZXRlcigpewotICAgICAgICByZXR1cm4gX3Vuc2FmZT8iL3Vuc2FmZSI6bnVsbDsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiBtYWluIGNsYXNzIChvciBudWxsIGZvciBhdXRvbWF0aWMgY2hvaWNlKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgX21haW5DbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgTWFpbkNsYXNzIGF0dHJpYnV0ZQotICAgICAqCi0gICAgICogQHBhcmFtICBtYWluQ2xhc3MgIFRoZSBuZXcgTWFpbkNsYXNzIHZhbHVlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhTdHJpbmcgbWFpbkNsYXNzKQotICAgICAgICB7dGhpcy5fbWFpbkNsYXNzPW1haW5DbGFzczt9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIE1haW5DbGFzcyBhdHRyaWJ1dGUgCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgIFRoZSBNYWluQ2xhc3MgdmFsdWUgCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNYWluQ2xhc3MoKQotICAgICAgICB7cmV0dXJuIHRoaXMuX21haW5DbGFzczt9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIGdldCB0aGUgL21haW4gYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgTWFpbkNsYXNzIFBhcmFtZXRlciB0byBDU0MgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluQ2xhc3NQYXJhbWV0ZXIoKXsKLSAgICAgICAgaWYgKF9tYWluQ2xhc3MhPW51bGwgJiYgX21haW5DbGFzcy5sZW5ndGgoKSE9MCkKLSAgICAgICAgICAgIHJldHVybiAiL21haW46IitfbWFpbkNsYXNzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9IAotICAgIAotICAgIC8qKiBhbnkgZXh0cmEgY29tbWFuZCBvcHRpb25zPwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgX2V4dHJhT3B0aW9uczsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgRXh0cmFPcHRpb25zIGF0dHJpYnV0ZQotICAgICAqCi0gICAgICogQHBhcmFtICBleHRyYU9wdGlvbnMgIFRoZSBuZXcgRXh0cmFPcHRpb25zIHZhbHVlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhT3B0aW9ucyhTdHJpbmcgZXh0cmFPcHRpb25zKQotICAgICAgICB7dGhpcy5fZXh0cmFPcHRpb25zPWV4dHJhT3B0aW9uczt9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIEV4dHJhT3B0aW9ucyBhdHRyaWJ1dGUgCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgIFRoZSBFeHRyYU9wdGlvbnMgdmFsdWUgCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRyYU9wdGlvbnMoKQotICAgICAgICB7cmV0dXJuIHRoaXMuX2V4dHJhT3B0aW9uczt9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIGdldCBhbnkgZXh0cmEgb3B0aW9ucyBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQgCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgIFRoZSBFeHRyYU9wdGlvbnMgUGFyYW1ldGVyIHRvIENTQyAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dHJhT3B0aW9uc1BhcmFtZXRlcigpIHsKLSAgICAgICAgaWYgKF9leHRyYU9wdGlvbnMhPW51bGwgJiYgX2V4dHJhT3B0aW9ucy5sZW5ndGgoKSE9MCkKLSAgICAgICAgICAgIHJldHVybiBfZXh0cmFPcHRpb25zOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9IAotICAgIAotICAgIC8qKiBzb3VyY2UgZGlyZWN0b3J5IHVwb24gd2hpY2ggdGhlIHNlYXJjaCBwYXR0ZXJuIGlzIGFwcGxpZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgX3NyY0RpcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgZmlsZXMgdG8gYmUgY29tcGlsZWQKLSAgICAgKiBAcGFyYW0gIHNyY0Rpck5hbWUgIFRoZSBuZXcgU3JjRGlyIHZhbHVlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNyY0RpcihGaWxlIHNyY0Rpck5hbWUpewotICAgICAgICBfc3JjRGlyID0gc3JjRGlyTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAobnVsbCBtZWFucyB1c2UgdGhlIHNvdXJjZSBkaXJlY3RvcnkpCi0gICAgKiBOQjogdGhpcyBpcyBjdXJyZW50bHkgbm90IHVzZWQgCi0gICAgKi8KLSAgICBwcml2YXRlIEZpbGUgX2Rlc3REaXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXIgdG8gZmluZCB0aGUgZmlsZXMgdG8gYmUgY29tcGlsZWQKLSAgICAgKiBAcGFyYW0gIGRpck5hbWUgIFRoZSBuZXcgRGVzdERpciB2YWx1ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0RGlyKEZpbGUgZGlyTmFtZSkgewotICAgICAgICBfZGVzdERpciA9IGRpck5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKiB0eXBlIG9mIHRhcmdldC4gU2hvdWxkIGJlIG9uZSBvZiBleGV8bGlicmFyeXxtb2R1bGV8d2luZXhlfChudWxsKQotICAgIGRlZmF1bHQgaXMgZXhlOyB0aGUgYWN0dWFsIHZhbHVlIChpZiBub3QgbnVsbCkgaXMgZmVkIHRvIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgPGJyPlNlZSAvdGFyZ2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBfdGFyZ2V0VHlwZTsKLSAgICAKLSAgICAvKiogZGVmaW5lIHRoZSB0YXJnZXQKLSAgICAgKiBAcGFyYW0gIHRhcmdldFR5cGUgICAgICAgICAgVGhlIG5ldyBUYXJnZXRUeXBlIHZhbHVlIAotICAgICAqIEBleGNlcHRpb24gIEJ1aWxkRXhjZXB0aW9uICBpZiB0YXJnZXQgaXMgbm90IG9uZSBvZiBleGV8bGlicmFyeXxtb2R1bGV8d2luZXhlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldFR5cGUoU3RyaW5nIHRhcmdldFR5cGUpCi0gICAgICAgIHRocm93cyAgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0YXJnZXRUeXBlPXRhcmdldFR5cGUudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYodGFyZ2V0VHlwZS5lcXVhbHMoImV4ZSIpIHx8IHRhcmdldFR5cGUuZXF1YWxzKCJsaWJyYXJ5IikgfHwKLSAgICAgICAgICAgIHRhcmdldFR5cGUuZXF1YWxzKCJtb2R1bGUiKSB8fHRhcmdldFR5cGUuZXF1YWxzKCJ3aW5leGUiKSApIHsKLSAgICAgICAgICAgIF90YXJnZXRUeXBlPXRhcmdldFR5cGU7IAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRhcmdldFR5cGUgIiArdGFyZ2V0VHlwZSsiIGlzIG5vdCBhIHZhbGlkIHR5cGUiKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIFRhcmdldFR5cGUgYXR0cmlidXRlICAKLSAgICAgKgotICAgICAqIEByZXR1cm4gICAgVGhlIFRhcmdldFR5cGUgdmFsdWUgCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUeXBlKCkgeyAKLSAgICAgICAgICAgIHJldHVybiBfdGFyZ2V0VHlwZTsKLSAgICB9ICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgVGFyZ2V0VHlwZSBQYXJhbWV0ZXIgdG8gQ1NDIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0VHlwZVBhcmFtZXRlcigpIHsKLSAgICAgICAgaWYgKG5vdEVtcHR5KF90YXJnZXRUeXBlKSkgCi0gICAgICAgICAgICByZXR1cm4gIi90YXJnZXQ6IitfdGFyZ2V0VHlwZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSAgIAotICAgIAotICAgIC8qKiBpY29uIGZvciBpbmNvcnBvcmF0aW9uIGludG8gYXBwcwotICAgICAqLyAgICAgCi0gICAgcHJvdGVjdGVkIEZpbGUgX3dpbjMyaWNvbjsgIAotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgd2luMzIgaWNvbiAKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgcGF0aCB0byB0aGUgZmlsZS4gQ2FuIGJlIHJlbGF0aXZlLCBhYnNvbHV0ZSwgd2hhdGV2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2luMzJJY29uKEZpbGUgZmlsZU5hbWUpIHsKLSAgICAgICAgX3dpbjMyaWNvbiA9IGZpbGVOYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgZ2V0IHRoZSBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQgCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgIFRoZSBXaW4zMkljb24gUGFyYW1ldGVyIHRvIENTQyAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFdpbjMySWNvblBhcmFtZXRlcigpIHsKLSAgICAgICAgaWYgKF93aW4zMmljb24hPW51bGwpCi0gICAgICAgICAgICByZXR1cm4gIi93aW4zMmljb246Iitfd2luMzJpY29uLnRvU3RyaW5nKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAvKiogaWNvbiBmb3IgaW5jb3Jwb3JhdGlvbiBpbnRvIGFwcHMKLSAgICAgKi8gICAgIAotICAgIHByb3RlY3RlZCBGaWxlIF93aW4zMnJlczsgIAotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgd2luMzIgaWNvbiAKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgcGF0aCB0byB0aGUgZmlsZS4gQ2FuIGJlIHJlbGF0aXZlLCBhYnNvbHV0ZSwgd2hhdGV2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2luMzJSZXMoRmlsZSBmaWxlTmFtZSkgewotICAgICAgICBfd2luMzJyZXMgPSBmaWxlTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgV2luMzJJY29uIFBhcmFtZXRlciB0byBDU0MgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXaW4zMlJlc1BhcmFtZXRlcigpIHsKLSAgICAgICAgaWYgKF93aW4zMnJlcyE9bnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiL3dpbjMycmVzOiIrX3dpbjMycmVzLnRvU3RyaW5nKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAgCi0gICAgCi0gICAgLyoqIAotICAgICAqIHV0ZiBvdXQgZmxhZwotICAgICAqLwotICAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfdXRmOG91dHB1dD1mYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBlbmFibGUgZ2VuZXJhdGlvbiBvZiB1dGY4IG91dHB1dCBmcm9tIHRoZSBjb21waWxlci4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXRmOE91dHB1dChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgX3V0ZjhvdXRwdXQ9ZW5hYmxlZDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVdGY4T3V0cHVQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBfdXRmOG91dHB1dD8iL3V0ZjhvdXRwdXQiOm51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIF9ub2NvbmZpZz1mYWxzZTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXROb0NvbmZpZyhib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgX25vY29uZmlnPWVuYWJsZWQ7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9Db25maWdQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBfbm9jb25maWc/Ii9ub2NvbmZpZyI6bnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLy8gL2Z1bGxwYXRocwotICAgIHByb3RlY3RlZCBib29sZWFuIF9mdWxscGF0aHM9ZmFsc2U7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbFBhdGhzKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBfZnVsbHBhdGhzPWVuYWJsZWQ7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbFBhdGhzUGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gX2Z1bGxwYXRocz8iL2Z1bGxwYXRocyI6bnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqIGRlZmluZXMgbGlzdAotICAgICogc29tZXRoaW5nIGxpa2UgJ1JFTEVBU0U7V0lOMzI7Tk9fU0FOSVRZX0NIRUNLUzs7U09NRVRISU5HX0VMU0UnCi0gICAgKi8KLSAgICBTdHJpbmcgX2RlZmluaXRpb25zOwotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVmaW5pdGlvbnMKLSAgICAgKiBAcGFyYW0gbGlzdCBvZiBkZWZpbml0aW9ucyBzcGxpdCBieSA7IG9yICwgb3IgZXZlbiA6Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbnMoU3RyaW5nIHBhcmFtcykgewotICAgICAgICBfZGVmaW5pdGlvbnM9cGFyYW1zOwotICAgIH0KLSAgICAgIAotICAgIC8qKgotICAgICogIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkIAotICAgICoKLSAgICAqIEByZXR1cm4gICAgVGhlIERlZmluaXRpb25zIFBhcmFtZXRlciB0byBDU0MgCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluaXRpb25zUGFyYW1ldGVyKCkgewotICAgICAgICBpZiAobm90RW1wdHkoX2RlZmluaXRpb25zKSkKLSAgICAgICAgICAgIHJldHVybiAiL2RlZmluZToiICsgX2RlZmluaXRpb25zOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqIGxpc3Qgb2YgZXh0cmEgbW9kdWxlcyB0byByZWZlciB0byAKLSAgICAgKgotICAgICovICAgIAotICAgIFN0cmluZyBfYWRkaXRpb25hbE1vZHVsZXM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZWZpbml0aW9ucwotICAgICAqIEBwYXJhbSBsaXN0IG9mIGRlZmluaXRpb25zIHNwbGl0IGJ5IDsgb3IgLCBvciBldmVuIDoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsTW9kdWxlcyhTdHJpbmcgcGFyYW1zKSB7Ci0gICAgICAgIF9hZGRpdGlvbmFsTW9kdWxlcz1wYXJhbXM7Ci0gICAgfQotICAgIAotICAgIC8qKiBnZXQgdGhlIGFyZ3VtZW50IG9yIG51bGwgZm9yIG5vIGFyZ3VtZW50IG5lZWRlZAotICAgICogQHJldHVybiAgICBUaGUgQWRkaXRpb25hbE1vZHVsZXMgUGFyYW1ldGVyIHRvIENTQyAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFkZGl0aW9uYWxNb2R1bGVzUGFyYW1ldGVyKCkgewotICAgICAgICBpZiAobm90RW1wdHkoX2FkZGl0aW9uYWxNb2R1bGVzKSkgCi0gICAgICAgICAgICByZXR1cm4gIi9hZGRtb2R1bGU6IiArIF9hZGRpdGlvbmFsTW9kdWxlczsKLSAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKiogb3V0cHV0IGZpbGUuIElmIG5vdCBzdXBwbGllZCB0aGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUKLSAgICAgKiAgc291cmNlIGZpbGUKLSAgICAgKi8gICAgCi0gICAgcHJvdGVjdGVkIEZpbGUgX291dHB1dEZpbGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZWZpbml0aW9ucwotICAgICAqIEBwYXJhbSBsaXN0IG9mIGRlZmluaXRpb25zIHNwbGl0IGJ5IDsgb3IgLCBvciBldmVuIDoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlKEZpbGUgcGFyYW1zKSB7Ci0gICAgICAgIF9vdXRwdXRGaWxlID0gcGFyYW1zOwotICAgIH0KLSAgICAKLSAgICAvKiogZ2V0IHRoZSBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKLSAgICAqIEByZXR1cm4gICAgVGhlIE91dHB1dEZpbGUgUGFyYW1ldGVyIHRvIENTQyAKLSAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3V0cHV0RmlsZVBhcmFtZXRlcigpIHsKLSAgICAgICAgaWYgKF9vdXRwdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IF9vdXRwdXRGaWxlOwotICAgICAgICAgICAgcmV0dXJuICIvb3V0OiIrZi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKiogZmxhZyB0byBjb250cm9sIGFjdGlvbiBvbiBleGVjdXRpb24gdHJvdWJsZQotICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2ZhaWxPbkVycm9yOwotICAgIAotICAgIC8qKnNldCBmYWlsIG9uIGVycm9yIGZsYWcKLSAgICAqIEBwYXJhbSAgYiAgVGhlIG5ldyBGYWlsT25FcnJvciB2YWx1ZSAKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gYil7Ci0gICAgICAgIF9mYWlsT25FcnJvcj1iOwotICAgIH0KLSAgICAKLSAgICAvKiogcXVlcnkgZmFpbCBvbiBlcnJvciBmbGFnCi0gICAgICogQHJldHVybiAgICBUaGUgRmFpbEZhaWxPbkVycm9yIHZhbHVlIAotICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RmFpbEZhaWxPbkVycm9yKCkgewotICAgICAgICAgICAgcmV0dXJuIF9mYWlsT25FcnJvcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIHJlc2V0IGFsbCBjb250ZW50cy4gCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBDbGVhcigpIHsKLSAgICAgICAgX3RhcmdldFR5cGU9bnVsbDsKLSAgICAgICAgX3dpbjMyaWNvbj1udWxsOwotICAgICAgICBfc3JjRGlyPW51bGw7Ci0gICAgICAgIF9kZXN0RGlyPW51bGw7Ci0gICAgICAgIF9tYWluQ2xhc3M9bnVsbDsKLSAgICAgICAgX3Vuc2FmZT1mYWxzZTsKLSAgICAgICAgX3dhcm5MZXZlbD0zOwotICAgICAgICBfZG9jRmlsZSA9IG51bGw7Ci0gICAgICAgIF9pbmNyZW1lbnRhbD1mYWxzZTsKLSAgICAgICAgX29wdGltaXplPWZhbHNlOwotICAgICAgICBfZGVidWc9dHJ1ZTsKLSAgICAgICAgX3JlZmVyZW5jZXM9bnVsbDsKLSAgICAgICAgX2ZhaWxPbkVycm9yPXRydWU7Ci0gICAgICAgIF9kZWZpbml0aW9ucz1udWxsOwotICAgICAgICBfYWRkaXRpb25hbE1vZHVsZXM9bnVsbDsKLSAgICAgICAgX2luY2x1ZGVEZWZhdWx0UmVmZXJlbmNlcz10cnVlOwotICAgICAgICBfZXh0cmFPcHRpb25zPW51bGw7Ci0gICAgICAgIF9mdWxscGF0aHM9dHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIHRlc3QgZm9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgc29tZXRoaW5nIHVzZWZ1bCAKLSAgICAgKgotICAgICAqIEBwYXJhbSAgcyAgc3RyaW5nIGluIAotICAgICAqIEByZXR1cm4gICAgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbm90RW1wdHkoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpICE9IDA7Ci0gICAgfQotICAgIAotICAgIC8qKiBkbyB0aGUgd29yayBieSBidWlsZGluZyB0aGUgY29tbWFuZCBsaW5lIGFuZCB0aGVuIGNhbGxpbmcgaXQKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKF9zcmNEaXIgPT0gbnVsbCkKLSAgICAgICAgICAgIF9zcmNEaXI9cHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpOwotICAgIAotICAgICAgICBOZXRDb21tYW5kIGNvbW1hbmQ9bmV3IE5ldENvbW1hbmQodGhpcywiQ1NDIixjc2NfZXhlX25hbWUpOwotICAgICAgICBjb21tYW5kLnNldEZhaWxPbkVycm9yKGdldEZhaWxGYWlsT25FcnJvcigpKTsKLSAgICAgICAgLy9ERUJVRyBoZWxwZXIKLSAgICAgICAgY29tbWFuZC5zZXRUcmFjZUNvbW1hbmRMaW5lKHRydWUpOwotICAgICAgICAvL2ZpbGwgaW4gYXJncwotICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvbm9sb2dvIik7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0QWRkaXRpb25hbE1vZHVsZXNQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0RGVmaW5pdGlvbnNQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0RGVidWdQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0RG9jRmlsZVBhcmFtZXRlcigpKTsKLSAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRJbmNyZW1lbnRhbFBhcmFtZXRlcigpKTsKLSAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRNYWluQ2xhc3NQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0T3B0aW1pemVQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0UmVmZXJlbmNlc1BhcmFtZXRlcigpKTsKLSAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRUYXJnZXRUeXBlUGFyYW1ldGVyKCkpOwotICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldFVuc2FmZVBhcmFtZXRlcigpKTsKLSAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRXYXJuTGV2ZWxQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0V2luMzJJY29uUGFyYW1ldGVyKCkpOwotICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldE91dHB1dEZpbGVQYXJhbWV0ZXIoKSk7ICAgCi0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0SW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzUGFyYW1ldGVyKCkpOwotICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldERlZmF1bHRSZWZlcmVuY2VQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0V2luMzJSZXNQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0VXRmOE91dHB1UGFyYW1ldGVyKCkpOwotICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldE5vQ29uZmlnUGFyYW1ldGVyKCkpOwotICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldEZ1bGxQYXRoc1BhcmFtZXRlcigpKTsKLSAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRFeHRyYU9wdGlvbnNQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIAotICAgICAgICAvL2dldCBkZXBlbmRlbmNpZXMgbGlzdC4gCi0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9IHN1cGVyLmdldERpcmVjdG9yeVNjYW5uZXIoX3NyY0Rpcik7Ci0gICAgICAgIFN0cmluZ1tdIGRlcGVuZGVuY2llcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICBsb2coImNvbXBpbGluZyAiK2RlcGVuZGVuY2llcy5sZW5ndGgrIiBmaWxlIisoKGRlcGVuZGVuY2llcy5sZW5ndGg9PTEpPyIiOiJzIikpOwotICAgICAgICBTdHJpbmcgYmFzZURpcj1zY2FubmVyLmdldEJhc2VkaXIoKS50b1N0cmluZygpOwotICAgICAgICAvL2FkZCB0byB0aGUgY29tbWFuZAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEZpbGU9ZGVwZW5kZW5jaWVzW2ldOwotICAgICAgICAgICAgdGFyZ2V0RmlsZT1iYXNlRGlyK0ZpbGUuc2VwYXJhdG9yK3RhcmdldEZpbGU7Ci0gICAgICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KHRhcmdldEZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL25vdyBydW4gdGhlIGNvbW1hbmQgb2YgZXhlICsgc2V0dGluZ3MgKyBmaWxlcwotICAgICAgICBjb21tYW5kLnJ1bkNvbW1hbmQoKTsKLSAgICB9IC8vIGVuZCBleGVjdXRlCi0gICAgCi19IC8vZW5kIGNsYXNzCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvSWxhc20uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9JbGFzbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjEyYTQ1Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9JbGFzbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLS8qIGJ1aWxkIG5vdGVzCi0KLSAgIC1UaGUgcmVmZXJlbmNlIENEIHRvIGxpc3RlbiB0byB3aGlsZSBlZGl0aW5nIHRoaXMgZmlsZSBpcyAKLSAgICAgICBuYXA6IFVuZGVyd29ybGQgIC0gRXZlcnl0aGluZywgRXZlcnl0aGluZwotICAgLXZhcmlhYmxlIG5hbWluZyBwb2xpY3kgZnJvbSBGb3dsZXIncyByZWZhY3RvcmluZyBib29rLgotICAgLXRlc3RlZCBhZ2FpbnN0IHRoZSBQREMgcHJlLWJldGEgb2YgY3NjLmV4ZTsgZnV0dXJlIHZlcnNpb25zIHdpbGwgCi0gICAgaW5ldml0YWJseSBjaGFuZ2UgdGhpbmdzCi0qLwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gcGxhY2UgaW4gdGhlIG9wdGlvbmFsIGFudCB0YXNrcyBwYWNrYWdlCi0vLyBidXQgaW4gaXRzIG93biBkb3RuZXQgZ3JvdXAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gaW1wb3J0cwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLQotLyoqCi1UYXNrIHRvIGFzc2VtYmxlIC5uZXQgJ0ludGVybWVkaWF0ZSBMYW5ndWFnZScgZmlsZXMuCi1UaGUgdGFzayB3aWxsIG9ubHkgd29yayBvbiB3aW4ySyB1bnRpbCBvdGhlciBwbGF0Zm9ybXMgc3VwcG9ydCBjc2MuZXhlIG9yIAotYW4gZXF1aXZhbGVudC4gaWxhc20uZXhlIG11c3QgYmUgb24gdGhlIGV4ZWN1dGUgcGF0aCB0b28uCi08cD4KLQotPHA+Ci1BbGwgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWw6ICZsdDtpbC8mZ3Q7IHNob3VsZCBzdWZmaWNlIHRvIHByb2R1Y2UgYSBkZWJ1ZwotYnVpbGQgb2YgYWxsICouaWwgZmlsZXMuCi1UaGUgb3B0aW9uIHNldCBpcyByb3VnaGx5IGNvbXBhdGlibGUgd2l0aCB0aGUgQ1NoYXJwIGNsYXNzOwotZXZlbiB0aG91Z2ggdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBvbmx5IHZhZ3VlbHkKLWVxdWl2YWxlbnQuIFtUaGUgbG93IGxldmVsIGNvbW1hbmRzIHRha2UgdGhpbmdzIGxpa2UgL09VVD1maWxlLAotY3NjIHdhbnRzIC9vdXQ6ZmlsZSAuLi4gL3ZlcmJvc2UgaXMgdXNlZCBzb21lIHBsYWNlczsgL3F1aWV0IGhlcmUgaW4KLWlsZGFzbS4uLiBldGMuXSBJdCB3b3VsZCBiZSBuaWNlIGlmIHNvbWVvbmUgbWFkZSBhbGwgdGhlIGNvbW1hbmQgbGluZQotdG9vbHMgY29uc2lzdGVudCAoYW5kIG5vdCBhcyBicml0dGxlIGFzIHRoZSBqYXZhIGNtZGxpbmUgdG9vbHMpIAotCi0KLTxwPgotCi1UaGUgdGFzayBpcyBhIGRpcmVjdG9yeSBiYXNlZCB0YXNrLCBzbyBhdHRyaWJ1dGVzIGxpa2UgPGI+aW5jbHVkZXM9IiouaWwiPC9iPiBhbmQgCi08Yj5leGNsdWRlcz0iYnJva2VuLmlsIjwvYj4gY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgZmlsZXMgcHVsbGVkIGluLiAKLUVhY2ggZmlsZSBpcyBidWlsdCBvbiBpdHMgb3duLCBwcm9kdWNpbmcgYW4gYXBwcm9wcmlhdGVseSBuYW1lZCBvdXRwdXQgZmlsZSB1bmxlc3MKLW1hbnVhbGx5IHNwZWNpZmllZCB3aXRoIDxiPm91dGZpbGU8L2I+Ci0KLQotQGF1dGhvciBTdGV2ZSBMb3VnaHJhbiBzdGV2ZV9sQGlzZXJhbi5jb20KLUB2ZXJzaW9uIDAuMgotICovCi0KLQotcHVibGljIGNsYXNzIElsYXNtCi0gICAgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2sgewotCi0gICAgLyoqIGNvbnN0cnVjdG9yIGluaXRzIGV2ZXJ5dGhpbmcgYW5kIHNldCB1cCB0aGUgc2VhcmNoIHBhdHRlcm4KLSAgICAqLwotICAgIHB1YmxpYyBJbGFzbSAoKSB7Ci0gICAgICAgIENsZWFyKCk7Ci0gICAgICAgIHNldEluY2x1ZGVzKGZpbGVfcGF0dGVybik7Ci0gICAgfQotCi0gICAgLyoqIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuIHRoZSAuZXhlIHN1ZmZpeCBpcyBkZWxpYmVyYXRlbHkgbm90IGluY2x1ZGVkIAotICAgICAqIGluIGFudGljaXBhdGlvbiBvZiB0aGUgdW5peCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhlX25hbWU9ImlsYXNtIjsKLSAgICAKLSAgICAvKiogd2hhdCBpcyB0aGUgZmlsZSBleHRlbnNpb24gd2Ugc2VhcmNoIG9uPwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGZpbGVfZXh0PSJpbCI7Ci0gICAgCi0gICAgLyoqIGFuZCBub3cgZGVyaXZlIHRoZSBzZWFyY2ggcGF0dGVybiBmcm9tIHRoZSBleHRlbnNpb24gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlsZV9wYXR0ZXJuPSIqKi8qLiIrZmlsZV9leHQ7Ci0gICAgCi0gICAgLyoqIHRpdGxlIG9mIHRhc2sgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGV4ZV90aXRsZT0iaWxhc20iOwotICAgIAotICAgIC8qKiByZXNldCBhbGwgY29udGVudHMuIAotICAgICovCi0gICAgcHVibGljIHZvaWQgQ2xlYXIoKSB7Ci0gICAgICAgIF90YXJnZXRUeXBlPW51bGw7Ci0gICAgICAgIF9zcmNEaXI9bnVsbDsKLSAgICAgICAgX2xpc3RpbmcgPSBmYWxzZTsKLSAgICAgICAgX3ZlcmJvc2U9ZmFsc2U7Ci0gICAgICAgIF9kZWJ1Zz10cnVlOwotICAgICAgICBfb3V0cHV0RmlsZT1udWxsOwotICAgICAgICBfZmFpbE9uRXJyb3I9dHJ1ZTsKLSAgICAgICAgX3Jlc291cmNlRmlsZT1udWxsOwotICAgICAgICBfZXh0cmFPcHRpb25zPW51bGw7ICAgICAKLSAgICB9Ci0KLSAgICAvKiogc291cmNlIGRpcmVjdG9yeSB1cG9uIHdoaWNoIHRoZSBzZWFyY2ggcGF0dGVybiBpcyBhcHBsaWVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIF9zcmNEaXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzb3VyY2UgZGlyIHRvIGZpbmQgdGhlIGZpbGVzIHRvIGJlIGNvbXBpbGVkCi0gICAgICogQHBhcmFtICBzcmNEaXJOYW1lICBUaGUgbmV3IFNyY0RpciB2YWx1ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmNEaXIoRmlsZSBzcmNEaXJOYW1lKXsKLSAgICAgICAgX3NyY0RpciA9IHNyY0Rpck5hbWU7Ci0gICAgfQotICAgIAotCi0gICAgLyoqIHR5cGUgb2YgdGFyZ2V0LiBTaG91bGQgYmUgb25lIG9mIGV4ZXxsaWJyYXJ5fG1vZHVsZXx3aW5leGV8KG51bGwpCi0gICAgZGVmYXVsdCBpcyBleGU7IHRoZSBhY3R1YWwgdmFsdWUgKGlmIG5vdCBudWxsKSBpcyBmZWQgdG8gdGhlIGNvbW1hbmQgbGluZS4KLSAgICA8YnI+U2VlIC90YXJnZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIF90YXJnZXRUeXBlOwotICAgIAotICAgIC8qKiBkZWZpbmUgdGhlIHRhcmdldAotICAgICAqIEBwYXJhbSAgdGFyZ2V0VHlwZSAgICAgICAgICBvbmUgb2YgZXhlfGxpYnJhcnl8Ci0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0YXJnZXQgaXMgbm90IG9uZSBvZiBleGV8bGlicmFyeXxtb2R1bGV8d2luZXhlIAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldFR5cGUoU3RyaW5nIHRhcmdldFR5cGUpCi0gICAgICAgIHRocm93cyAgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0YXJnZXRUeXBlPXRhcmdldFR5cGUudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYodGFyZ2V0VHlwZS5lcXVhbHMoImV4ZSIpIHx8IHRhcmdldFR5cGUuZXF1YWxzKCJsaWJyYXJ5IikpIHsKLSAgICAgICAgICAgIF90YXJnZXRUeXBlPXRhcmdldFR5cGU7IAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRhcmdldFR5cGUgIiArdGFyZ2V0VHlwZSsiIGlzIG5vdCBhIHZhbGlkIHR5cGUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhY2Nlc3NvciBtZXRob2QgZm9yIHRhcmdldCB0eXBlCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCB0YXJnZXQgb3B0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUeXBlKCkgeyAKLSAgICAgICAgcmV0dXJuIF90YXJnZXRUeXBlOwotICAgIH0gICAKLSAgICAKLSAgICAvKiogZwotICAgICAqICBnZXQgdGhlIHRhcmdldCB0eXBlIG9yIG51bGwgZm9yIG5vIGFyZ3VtZW50IG5lZWRlZCAKLSAgICAgKgotICAgICAqIEByZXR1cm4gICAgVGhlIFRhcmdldFR5cGVQYXJhbWV0ZXIgdmFsdWUgCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0VHlwZVBhcmFtZXRlcigpIHsKLSAgICAgICAgaWYoIW5vdEVtcHR5KF90YXJnZXRUeXBlKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAoX3RhcmdldFR5cGUuZXF1YWxzKCJleGUiKSkKLSAgICAgICAgICAgIHJldHVybiAiL2V4ZSI7Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIGlmIChfdGFyZ2V0VHlwZS5lcXVhbHMoImxpYnJhcnkiKSkKLSAgICAgICAgICAgIHJldHVybiAiL2RsbCI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIE93bmVyIGF0dHJpYnV0ZSAKLSAgICAgKgotICAgICAqIEBwYXJhbSAgcyAgVGhlIG5ldyBPd25lciB2YWx1ZSAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRPd25lcihTdHJpbmcgcykgewotICAgICAgIGxvZygiVGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBJTEFTTSBhcyBvZiBCZXRhLTIsIGFuZCB3aWxsIGJlIGlnbm9yZWQiLFByb2plY3QuTVNHX1dBUk4pOyAKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgLyoqIHRlc3QgZm9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgc29tZXRoaW5nIHVzZWZ1bAotICAgICAqIEBwYXJhbSBzdHJpbmcgdG8gdGVzdAotICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5Ci0gICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBub3RFbXB0eShTdHJpbmcgcykKLSAgICAgICAge3JldHVybiBzIT1udWxsICYmIHMubGVuZ3RoKCkhPTA7fQotICAgIAotICAgIC8qKiB2ZXJib3NlIGZsYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfdmVyYm9zZTsKLQotICAgIC8qKiAKLSAgICAgKiBlbmFibGUvZGlzYWJsZSB2ZXJib3NlIElMQVNNIG91dHB1dAotICAgICAqIEBwYXJhbSBiIGZsYWcgc2V0IHRvIHRydWUgZm9yIHZlcmJvc2Ugb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gYikgewotICAgICAgICBfdmVyYm9zZT1iOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogdHVybiB0aGUgdmVyYm9zZSBmbGFnIGludG8gYSBwYXJhbWV0ZXIgZm9yIElMQVNNCi0gICAgICogQHJldHVybiBudWxsIG9yIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kIGxpbmUgc3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJib3NlUGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gX3ZlcmJvc2U/bnVsbDoiL3F1aWV0IjsKLSAgICB9ICAgCi0gICAgCi0gICAgICAgIAotICAgIC8qKiBsaXN0aW5nIGZsYWcKLSAgICAgKi8KLSAgICAgICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIF9saXN0aW5nOwotCi0gICAgLyoqIAotICAgICAqIGVuYWJsZS9kaXNhYmxlIGxpc3RpbmcKLSAgICAgKiBAcGFyYW0gYiBmbGFnIHNldCB0byB0cnVlIGZvciBsaXN0aW5nIG9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdGluZyhib29sZWFuIGIpIHsKLSAgICAgICAgX2xpc3Rpbmc9YjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIHR1cm4gdGhlIGxpc3RpbmcgZmxhZyBpbnRvIGEgcGFyYW1ldGVyIGZvciBJTEFTTQotICAgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHN0cmluZyBmcm9tIHRoZSBzdGF0ZSBvZiB0aGUgbGlzdGluZyBmbGFnCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0aW5nUGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gX2xpc3Rpbmc/Ii9saXN0aW5nIjoiL25vbGlzdGluZyI7Ci0gICAgfQotICAgICAgIAotICAgIAotICAgIC8qKgotICAgICAqIG91dHB1dCBmaWxlLiBJZiBub3Qgc3VwcGxpZWQgdGhpcyBpcyBkZXJpdmVkIGZyb20gdGhlCi0gICAgICogIHNvdXJjZSBmaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgX291dHB1dEZpbGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZWZpbml0aW9ucwotICAgICAqIEBwYXJhbSBsaXN0IG9mIGRlZmluaXRpb25zIHNwbGl0IGJ5IDsgb3IgLCBvciBldmVuIDoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlKEZpbGUgcGFyYW1zKSB7Ci0gICAgICAgIF9vdXRwdXRGaWxlID0gcGFyYW1zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIG91dHB1dCBmaWxlIAotICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IHN0cmluZyBvciBudWxsIGZvciBubyBhcmd1bWVudAotICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPdXRwdXRGaWxlUGFyYW1ldGVyKCkgewotICAgICAgICBpZiAoX291dHB1dEZpbGU9PW51bGwgfHwgX291dHB1dEZpbGUubGVuZ3RoKCk9PTApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgRmlsZSBmID0gX291dHB1dEZpbGU7Ci0gICAgICAgIHJldHVybiAiL291dHB1dD0iK2YudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIHJlc291cmNlIGZpbGUgKC5yZXMgZm9ybWF0KSB0byBpbmNsdWRlIGluIHRoZSBhcHAuIAotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIF9yZXNvdXJjZUZpbGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSByZXNvdXJjZSBmaWxlIAotICAgICAqIEBwYXJhbSBmaWxlTmFtZSBwYXRoIHRvIHRoZSBmaWxlLiBDYW4gYmUgcmVsYXRpdmUsIGFic29sdXRlLCB3aGF0ZXZlci4KLSAgICAgKi9wdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUZpbGUoRmlsZSBmaWxlTmFtZSkgewotICAgICAgICBfcmVzb3VyY2VGaWxlID0gZmlsZU5hbWU7Ci0gICAgfQotICAgICAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRmlsZVBhcmFtZXRlcigpIHsKLSAgICAgICAgaWYoX3Jlc291cmNlRmlsZSE9bnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIvcmVzb3VyY2U9IitfcmVzb3VyY2VGaWxlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiogZmxhZyB0byBjb250cm9sIGFjdGlvbiBvbiBleGVjdXRpb24gdHJvdWJsZQotICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2ZhaWxPbkVycm9yOwotICAgIAotICAgIC8qKnNldCBmYWlsIG9uIGVycm9yIGZsYWcKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gYil7Ci0gICAgICAgIF9mYWlsT25FcnJvcj1iOwotICAgIH0KLSAgICAKLSAgICAvKiogcXVlcnkgZmFpbCBvbiBlcnJvciBmbGFnCi0gICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsRmFpbE9uRXJyb3IoKSB7Ci0gICAgICAgIHJldHVybiBfZmFpbE9uRXJyb3I7Ci0gICAgfQotICAgICAgICAKLSAgICAvKiogZGVidWcgZmxhZy4gQ29udHJvbHMgZ2VuZXJhdGlvbiBvZiBkZWJ1ZyBpbmZvcm1hdGlvbi4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2RlYnVnOwotICAgIAotICAgIC8qKiBzZXQgdGhlIGRlYnVnIGZsYWcgb24gb3Igb2ZmCi0gICAgICogQHBhcmFtIGYgb24vb2ZmIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGYpCi0gICAgICAgIHtfZGVidWc9Zjt9Ci0gICAgICAgIAotICAgIC8qKiBxdWVyeSB0aGUgZGVidWcgZmxhZwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkZWJ1ZyBpcyB0dXJuZWQgb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWJ1ZygpIHsKLSAgICAgICAgcmV0dXJuIF9kZWJ1ZzsKLSAgICB9Ci0gICAgCi0gICAgLyoqIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlYnVnUGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gX2RlYnVnPyIvZGVidWciOm51bGw7Ci0gICAgfSAgIAotCi0gICAgLyoqIGZpbGUgY29udGFpbmluZyBwcml2YXRlIGtleQotICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBGaWxlIF9rZXlmaWxlOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEtleWZpbGUoRmlsZSBrZXlmaWxlKSB7Ci0gICAgICAgIHRoaXMuX2tleWZpbGU9a2V5ZmlsZTsKLSAgICB9Ci0KLSAgICAvKiogZ2V0IHRoZSBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKLSAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5ZmlsZVBhcmFtZXRlcigpIHsKLSAgICAgICAgaWYoX2tleWZpbGUhPW51bGwpCi0gICAgICAgICAgICAgcmV0dXJuICIva2V5ZmlsZToiK19rZXlmaWxlLnRvU3RyaW5nKCk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSAgICAgICAKLSAgICAKLSAgICAvKiogYW55IGV4dHJhIGNvbW1hbmQgb3B0aW9ucz8KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIF9leHRyYU9wdGlvbnM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIEV4dHJhT3B0aW9ucyBhdHRyaWJ1dGUKLSAgICAgKgotICAgICAqIEBwYXJhbSAgZXh0cmFPcHRpb25zICBUaGUgbmV3IEV4dHJhT3B0aW9ucyB2YWx1ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYU9wdGlvbnMoU3RyaW5nIGV4dHJhT3B0aW9ucykKLSAgICAgICAge3RoaXMuX2V4dHJhT3B0aW9ucz1leHRyYU9wdGlvbnM7fQotICAgIAotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBFeHRyYU9wdGlvbnMgYXR0cmlidXRlIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgRXh0cmFPcHRpb25zIHZhbHVlIAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0cmFPcHRpb25zKCkKLSAgICAgICAge3JldHVybiB0aGlzLl9leHRyYU9wdGlvbnM7fQotICAgIAotICAgIC8qKgotICAgICAqICBnZXQgYW55IGV4dHJhIG9wdGlvbnMgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkIAotICAgICAqCi0gICAgICogQHJldHVybiAgICBUaGUgRXh0cmFPcHRpb25zIFBhcmFtZXRlciB0byBDU0MgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRyYU9wdGlvbnNQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIGlmIChfZXh0cmFPcHRpb25zIT1udWxsICYmIF9leHRyYU9wdGlvbnMubGVuZ3RoKCkhPTApCi0gICAgICAgICAgICByZXR1cm4gX2V4dHJhT3B0aW9uczsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSAKLQotICAgICAgICAKLSAgICAvKiogVGhpcyBpcyB0aGUgZXhlY3V0aW9uIGVudHJ5IHBvaW50LiBCdWlsZCBhIGxpc3Qgb2YgZmlsZXMgYW5kCi0gICAgICogIGNhbGwgaWxhc20gb24gZWFjaCBvZiB0aGVtLgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGFzc2VtYmx5IGZhaWxlZCBhbmQgRmFpbE9uRXJyb3IgaXMgdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKF9zcmNEaXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfc3JjRGlyPXByb2plY3QucmVzb2x2ZUZpbGUoIi4iKTsKLSAgICAKLSAgICAgICAgLy9nZXQgZGVwZW5kZW5jaWVzIGxpc3QuIAotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKF9zcmNEaXIpOwotICAgICAgICBTdHJpbmdbXSBkZXBlbmRlbmNpZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgbG9nKCJhc3NlbWJsaW5nICIrZGVwZW5kZW5jaWVzLmxlbmd0aCsiIGZpbGUiKygoZGVwZW5kZW5jaWVzLmxlbmd0aD09MSk/IiI6InMiKSk7Ci0gICAgICAgIFN0cmluZyBiYXNlRGlyPXNjYW5uZXIuZ2V0QmFzZWRpcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vYWRkIHRvIHRoZSBjb21tYW5kCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0RmlsZT1kZXBlbmRlbmNpZXNbaV07Ci0gICAgICAgICAgICB0YXJnZXRGaWxlPWJhc2VEaXIrRmlsZS5zZXBhcmF0b3IrdGFyZ2V0RmlsZTsKLSAgICAgICAgICAgIGV4ZWN1dGVPbmVGaWxlKHRhcmdldEZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0gLy8gZW5kIGV4ZWN1dGUKLSAgICAKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogZG8gdGhlIHdvcmsgZm9yIG9uZSBmaWxlIGJ5IGJ1aWxkaW5nIHRoZSBjb21tYW5kIGxpbmUgdGhlbiBjYWxsaW5nIGl0Ci0gICAgICogQHBhcmFtIHRhcmdldEZpbGUgbmFtZSBvZiB0aGUgdGhlIGZpbGUgdG8gYXNzZW1ibGUKLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhc3NlbWJseSBmYWlsZWQgYW5kIEZhaWxPbkVycm9yIGlzIHRydWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlT25lRmlsZShTdHJpbmcgdGFyZ2V0RmlsZSkgCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE5ldENvbW1hbmQgY29tbWFuZD1uZXcgTmV0Q29tbWFuZCh0aGlzLGV4ZV90aXRsZSxleGVfbmFtZSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0RmFpbE9uRXJyb3IoZ2V0RmFpbEZhaWxPbkVycm9yKCkpOwotICAgICAgICAvL0RFQlVHIGhlbHBlcgotICAgICAgICBjb21tYW5kLnNldFRyYWNlQ29tbWFuZExpbmUodHJ1ZSk7Ci0gICAgICAgIC8vZmlsbCBpbiBhcmdzCi0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0RGVidWdQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0VGFyZ2V0VHlwZVBhcmFtZXRlcigpKTsKLSAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRMaXN0aW5nUGFyYW1ldGVyKCkpOwotICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldE91dHB1dEZpbGVQYXJhbWV0ZXIoKSk7ICAgCi0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0UmVzb3VyY2VGaWxlUGFyYW1ldGVyKCkpOwotICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldFZlcmJvc2VQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0S2V5ZmlsZVBhcmFtZXRlcigpKTsKLSAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRFeHRyYU9wdGlvbnNQYXJhbWV0ZXIoKSk7Ci0gCi0KLSAgICAgICAgLyogc3BhY2UgZm9yIG1vcmUgYXJndW1lbnRhdGl2ZW5lc3MKLSAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgpOwotICAgICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCk7Ci0gICAgICAgICovCi0gICAgCi0gICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQodGFyZ2V0RmlsZSk7Ci0gICAgICAgIC8vbm93IHJ1biB0aGUgY29tbWFuZCBvZiBleGUgKyBzZXR0aW5ncyArIGZpbGUKLSAgICAgICAgY29tbWFuZC5ydW5Db21tYW5kKCk7Ci0gICAgfSAvLyBlbmQgZXhlY3V0ZU9uZUZpbGUKLX0gLy9jbGFzcwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L05ldENvbW1hbmQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9OZXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjZkN2MuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L05ldENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vKiBidWlsZCBub3RlcwotCi1UaGUgcmVmZXJlbmNlIENEIHRvIGxpc3RlbiB0byB3aGlsZSBlZGl0aW5nIHRoaXMgZmlsZSBpcwotVW5kZXJ3b3JsZCBFdmVyeXRoaW5nLCBFdmVyeXRoaW5nCi12YXJpYWJsZSBuYW1pbmcgcG9saWN5IGZyb20gRm93bGVyJ3MgcmVmYWN0b3JpbmcgYm9vay4KLSAqLwotCi0vLyBwbGFjZSBiZWxvdyB0aGUgb3B0aW9uYWwgYW50IHRhc2tzIHBhY2thZ2UKLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQ7Ci0KLS8vIGltcG9ydHMKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLQotCi0vKioKLVRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gc3Bhd24gbmV0IGNvbW1hbmRzIG91dC4gCi1JbiBpdHMgaW5pdGlhbCBmb3JtIGl0IGNvbnRhaW5zIG5vIC5uZXQgc3BlY2lmaWNzLCBqdXN0IGNvbnRhaW5zCi1hbGwgdGhlIGNvbW1hbmQgbGluZS9leGUgY29uc3RydWN0aW9uIHN0dWZmLiBIb3dldmVyLCBpdCBtYXkgYmUgaGFuZHkgaW4gZnV0dXJlCi10byBoYXZlIGEgbWVhbnMgb2Ygc2V0dGluZyB0aGUgcGF0aCB0byBwb2ludCB0byB0aGUgZG90bmV0IGJpbiBkaXJlY3Rvcnk7IGluIHdoaWNoCi1jYXNlIHRoZSBzaGFyZWQgY29kZSBzaG91bGQgZ28gaW4gaGVyZS4KLUBhdXRob3IgU3RldmUgTG91Z2hyYW4gc3RldmVfbEBpc2VyYW4uY29tCi1AY3JlYXRlZCAyMDAwLTExLTAxCi1AdmVyc2lvbiAwLjMKLSAqLwotCi1wdWJsaWMgY2xhc3MgTmV0Q29tbWFuZCB7Ci0gICAgCi0gICAgLyoqIGNvbnN0cnVjdG9yCi0gICAgQHBhcmFtIG93bmluZyB0YXNrCi0gICAgQHBhcmFtIHRpdGxlIChmb3IgbG9nZ2luZy9lcnJvcnMpCi0gICAgQHBhcmFtIGV4ZWN1dGFibGUuIExlYXZlIG9mZiB0aGUgJy5leGUuIGZvciBmdXR1cmUgcG9ydGFiaWxpdHkKLSAgICAqLwotICAgIAotICAgIHB1YmxpYyBOZXRDb21tYW5kKFRhc2sgb3duZXIsIFN0cmluZyB0aXRsZSwgU3RyaW5nIHByb2dyYW0pIHsKLSAgICAgICAgX293bmVyPW93bmVyOwotICAgICAgICBfdGl0bGU9dGl0bGU7Ci0gICAgICAgIF9wcm9ncmFtPXByb2dyYW07Ci0gICAgICAgIF9jb21tYW5kTGluZT1uZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgX2NvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoX3Byb2dyYW0pOwotICAgICAgICBwcmVwYXJlRXhlY3V0b3IoKTsKLSAgICAgICAgfQotICAgIAotICAgIC8qKiBvd25lciBwcm9qZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhc2sgX293bmVyOwotICAgIAotICAgIC8qKiBleGVjdXRhYmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRXhlY3V0ZSBfZXhlOwotICAgIAotICAgIC8qKiB3aGF0IGlzIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgX2NvbW1hbmRMaW5lOwotICAgIAotICAgIC8qKiB0aXRsZSBvZiB0aGUgY29tbWFuZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgX3RpdGxlOwotICAgIAotICAgIC8qKiBhY3R1YWwgcHJvZ3JhbSB0byBpbnZva2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIF9wcm9ncmFtOwotICAgIAotICAgIC8qKiB0cmFjZSBmbGFnCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX3RyYWNlQ29tbWFuZExpbmU9ZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogdHVybiB0cmFjaW5nIG9uIG9yIG9mZgotICAgICAqIEBwYXJhbSBiIHRyYWNlIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFjZUNvbW1hbmRMaW5lKGJvb2xlYW4gYil7Ci0gICAgICAgIF90cmFjZUNvbW1hbmRMaW5lPWI7Ci0gICAgfQotICAgIAotICAgIC8qKiBmbGFnIHRvIGNvbnRyb2wgYWN0aW9uIG9uIGV4ZWN1dGlvbiB0cm91YmxlCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfZmFpbE9uRXJyb3I7Ci0gICAgCi0gICAgLyoqCi0gICAgICogc2V0IGZhaWwgb24gZXJyb3IgZmxhZwotICAgICAqIEBwYXJhbSBiIGZhaWwgZmxhZyAtc2V0IHRvIHRydWUgdG8gY2F1c2UgYW4gZXhjZXB0aW9uIHRvIGJlIHJhaXNlZCBpZgotICAgICAqIHRoZSByZXR1cm4gdmFsdWUgIT0gMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gYil7Ci0gICAgICAgIF9mYWlsT25FcnJvcj1iOwotICAgIH0KLSAgICAKLSAgICAvKiogcXVlcnkgZmFpbCBvbiBlcnJvciBmbGFnCi0gICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsRmFpbE9uRXJyb3IoKSB7Ci0gICAgICAgIHJldHVybiBfZmFpbE9uRXJyb3I7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiB2ZXJib3NlIHRleHQgbG9nCi0gICAgICogQHBhcmFtIG1zZyBzdHJpbmcgdG8gYWRkIHRvIGxvZyBpZmYgdmVyYm9zZSBpcyBkZWZpbmVkIGZvciB0aGUgYnVpbGQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dWZXJib3NlKFN0cmluZyBtc2cpewotICAgICAgICBfb3duZXIuZ2V0UHJvamVjdCgpLmxvZyhtc2csUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBlcnJvciB0ZXh0IGxvZwotICAgICAqIEBwYXJhbSAgbXNnICBtZXNzYWdlIHRvIGRpc3BsYXkgYXMgYW4gZXJyb3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihTdHJpbmcgbXNnKSB7Ci0gICAgICAgIF9vd25lci5nZXRQcm9qZWN0KCkubG9nKG1zZyxQcm9qZWN0Lk1TR19FUlIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBhZGQgYW4gYXJndW1lbnQgdG8gYSBjb21tYW5kIGxpbmU7IGRvIG5vdGhpbmcgaWYgdGhlIGFyZyBpcyBudWxsIG9yIGVtcHR5IHN0cmluZwotICAgICAqIEBwYXJhbSAgYXJndW1lbnQgIFRoZSBmZWF0dXJlIHRvIGJlIGFkZGVkIHRvIHRoZSBBcmd1bWVudCBhdHRyaWJ1dGUgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ3VtZW50KXsKLSAgICAgICAgaWYoYXJndW1lbnQhPW51bGwgJiYgYXJndW1lbnQubGVuZ3RoKCkhPTApIHsKLSAgICAgICAgICAgIF9jb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZ3VtZW50KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBzZXQgdXAgdGhlIGNvbW1hbmQgc2VxdWVuY2UuLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmVFeGVjdXRvcigpIHsKLSAgICAgICAgLy8gZGVmYXVsdCBkaXJlY3RvcnkgdG8gdGhlIHByb2plY3QncyBiYXNlIGRpcmVjdG9yeQotICAgICAgICBGaWxlIGRpciA9IF9vd25lci5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpOwotICAgICAgICBFeGVjdXRlU3RyZWFtSGFuZGxlciBoYW5kbGVyPW5ldyBMb2dTdHJlYW1IYW5kbGVyKF9vd25lciwKLSAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgX2V4ZSA9IG5ldyBFeGVjdXRlKGhhbmRsZXIsIG51bGwpOwotICAgICAgICBfZXhlLnNldEFudFJ1bihfb3duZXIuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgX2V4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGRpcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJ1biB0aGUgY29tbWFuZCB1c2luZyB0aGUgZ2l2ZW4gRXhlY3V0ZSBpbnN0YW5jZS4KLSAgICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiBzb21ldGhpbmcgZ29lcyB3cm9uZyBhbmQgdGhlIGZhaWxPbkVycm9yIGZsYWcgaXMgdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bkNvbW1hbmQoKQotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpbnQgZXJyID0gLTE7IC8vIGFzc3VtZSB0aGUgd29yc3QKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmKF90cmFjZUNvbW1hbmRMaW5lKSB7Ci0gICAgICAgICAgICAgICAgX293bmVyLmxvZyhfY29tbWFuZExpbmUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL2luIHZlcmJvc2UgbW9kZSB3ZSBhbHdheXMgbG9nIHN0dWZmCi0gICAgICAgICAgICAgICAgbG9nVmVyYm9zZShfY29tbWFuZExpbmUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZXhlLnNldENvbW1hbmRsaW5lKF9jb21tYW5kTGluZS5nZXRDb21tYW5kbGluZSgpKTsKLSAgICAgICAgICAgIGVyciA9IF9leGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKF9mYWlsT25FcnJvcikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oX3RpdGxlKyIgcmV0dXJuZWQ6ICIrZXJyLCBfb3duZXIuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgX293bmVyLmxvZyhfdGl0bGUrIiAgUmVzdWx0OiAiICsgZXJyLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKF90aXRsZSsiIGZhaWxlZDogIiArIGUsIGUsIF9vd25lci5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0gLy9jbGFzcwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0JvcmxhbmREZXBsb3ltZW50VG9vbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0JvcmxhbmREZXBsb3ltZW50VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzgzMTYzLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Cb3JsYW5kRGVwbG95bWVudFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0vKioKLSAqIEJvcmxhbmREZXBsb3ltZW50VG9vbCBpcyBkZWRpY2F0ZWQgdG8gdGhlIEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIDQuNSBhbmQgNC41LjEKLSAqIFRoaXMgdGFzayBnZW5lcmF0ZXMgYW5kIGNvbXBpbGVzIHRoZSBzdHVicyBhbmQgc2tlbGV0b25zIGZvciBhbGwgZWpiIGRlc2NyaWJlZCBpbnRvIHRoZQotICogRGVwbG95ZW1lbnQgRGVzY3JpcHRvciwgYnVpbGRzIHRoZSBqYXIgZmlsZSBpbmNsdWRpbmcgdGhlIHN1cHBvcnQgZmlsZXMgYW5kIHZlcmlmeQotICogd2hldGhlciB0aGUgcHJvZHVjZWQgamFyIGlzIHZhbGlkIG9yIG5vdC4KLSAqIFRoZSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6Ci0gKiA8dWw+Ci0gKiA8bGk+ZGVidWcgIChib29sZWFuKSAgICA6IHR1cm4gb24gdGhlIGRlYnVnIG1vZGUgZm9yIGdlbmVyYXRpb24gb2Ygc3R1YnMgYW5kIHNrZWxldG9ucyAoZGVmYXVsdDpmYWxzZSk8L2xpPgotICogPGxpPnZlcmlmeSAoYm9vbGVhbikgICAgOiB0dXJuIG9uIHRoZSB2ZXJpZmljYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgamFyIHByb2R1Y3Rpb24gICAgKGRlZmF1bHQ6dHJ1ZSkgPC9saT4KLSAqIDxsaT52ZXJpZnlhcmdzIChTdHJpbmcpIDogYWRkIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHZlcmlmeSBjb21tYW5kIChzZWUgdmJqIGNvbS5pbnByaXNlLmVqYi51dGlsLlZlcmlmeSk8L2xpPgotICogPGxpPmJhc2R0ZCAoU3RyaW5nKSAgICAgOiBsb2NhdGlvbiBvZiB0aGUgQkFTIERURCA8L2xpPgotICogPGxpPmdlbmVyYXRlY2xpZW50IChib29sZWFuKSA6IHR1cm4gb24gdGhlIGNsaWVudCBqYXIgZmlsZSBnZW5lcmF0aW9uIDwvbGk+Ci0gKiA8L3VsPgotICoKLSAqPFBSRT4KLSAqCi0gKiAgICAgICZsdDtlamJqYXIgc3JjZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlc30mcXVvdDsgIGJhc2VqYXJuYW1lPSZxdW90O3ZzbXAmcXVvdDsgIGRlc2NyaXB0b3JkaXI9JnF1b3Q7JHtyc2MuZGlyfS9ocm1hbmFnZXImcXVvdDsmZ3Q7Ci0gKiAgICAgICAgJmx0O2JvcmxhbmQgZGVzdGRpcj0mcXVvdDt0c3RsaWImcXVvdDsmZ3Q7Ci0gKiAgICAgICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSZxdW90O2NsYXNzcGF0aCZxdW90OyAvJmd0OwotICogICAgICAgICZsdDsvYm9ybGFuZCZndDsgICAgICAKLSAqICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqXGVqYi1qYXIueG1sJnF1b3Q7LyZndDsKLSAqICAgICAgICAmbHQ7c3VwcG9ydCBkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OyZndDsKLSAqICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7ZGVtb1xzbXBcKi5jbGFzcyZxdW90Oy8mZ3Q7Ci0gKiAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2RlbW9caGVscGVyXCouY2xhc3MmcXVvdDsvJmd0OwotICogICAgICAgICAmbHQ7L3N1cHBvcnQmZ3Q7Ci0gKiAgICAgJmx0Oy9lamJqYXImZ3Q7Ci0gKjwvUFJFPgotICogQGF1dGhvciAgICAgPGEgaHJlZj0ibWFpbHRvOmJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb20iPkJlbm9pdCBNb3Vzc2F1ZDwvYT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JsYW5kRGVwbG95bWVudFRvb2wgZXh0ZW5kcyBHZW5lcmljRGVwbG95bWVudFRvb2wgIGltcGxlbWVudHMgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDSURfQk9STEFORF9FSkIKLSAgICA9ICItLy9JbnByaXNlIENvcnBvcmF0aW9uLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JBUzQ1X0VKQjExX0RURF9MT0NBVElPTiAKLSAgICA9ICIvY29tL2lucHJpc2UvajJlZS94bWwvZHRkcy9lamItamFyLmR0ZCI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CQVNfRFREX0xPQ0FUSU9OIAotICAgID0gIi9jb20vaW5wcmlzZS9qMmVlL3htbC9kdGRzL2VqYi1pbnByaXNlLmR0ZCI7ICAgICAgIAotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU19ERCA9ICJlamItaW5wcmlzZS54bWwiOyAgICAKLQotICAgIC8qKiBKYXZhMmlpb3AgZXhlY3V0YWJsZSAqKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBMklJT1AgPSAiamF2YTJpaW9wIjsKLQotICAgIC8qKiBWZXJpZnkgY2xhc3MgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJJRlkgPSAiY29tLmlucHJpc2UuZWpiLnV0aWwuVmVyaWZ5IjsKLQotICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgc3VmZml4IGZvciB0aGUgYm9ybGFuZCBqYXJmaWxlLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIGphclN1ZmZpeCA9ICItZWpiLmphciI7Ci0KLSAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBib3JsYW5kIERURCBmaWxlLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIGJvcmxhbmREVEQ7Ci0gICAgICAgIAotICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZGVidWcgbW9kZSBpcyBvbiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBqYXZhMmlpb3BkZWJ1ZyA9IGZhbHNlOwotCi0gICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0Z2VyIHRoZSBjbGllbnQgamFyIGZpbGUgaXMgZ2VuZXJhdGVkICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlY2xpZW50ID0gZmFsc2U7Ci0gICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IGlzIG5lY2Vzc2FyeSB0byB2ZXJpZnkgdGhlIHByb2R1Y2VkIGphciAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJpZnkgICAgID0gdHJ1ZTsKLSAgICBwcml2YXRlIFN0cmluZyAgdmVyaWZ5QXJncyA9ICIiOwotCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgX2dlbmZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLyoqIAotICAgICAqIHNldCB0aGUgZGVidWcgbW9kZSBmb3IgamF2YTJpaW9wIChkZWZhdWx0IGZhbHNlKQotICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGRlYnVnKSB7Ci0gICAgICAgIHRoaXMuamF2YTJpaW9wZGVidWcgPSBkZWJ1ZzsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogc2V0IHRoZSB2ZXJpZnkgIG1vZGUgZm9yIHRoZSBwcm9kdWNlZCBqYXIgKGRlZmF1bHQgdHJ1ZSkKLSAgICAgKiovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyaWZ5KGJvb2xlYW4gdmVyaWZ5KSB7Ci0gICAgICAgIHRoaXMudmVyaWZ5ID0gdmVyaWZ5OwotICAgIH0KLQotICAgCi0gICAgLyoqCi0gICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBib3JsYW5kIGphciBmaWxlLgotICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgc3VmZml4LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN1ZmZpeChTdHJpbmcgaW5TdHJpbmcpIHsKLSAgICAgICAgdGhpcy5qYXJTdWZmaXggPSBpblN0cmluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHNldHMgc29tZSBhZGRpdGlvbmFsIGFyZ3MgdG8gc2VuZCB0byB2ZXJpZnkgY29tbWFuZAotICAgICAqIEBwYXJhbSBhcmdzIGFkZHRpb25zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyaWZ5QXJncyhTdHJpbmcgYXJncykgewotICAgICAgICB0aGlzLnZlcmlmeUFyZ3MgPSBhcmdzOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBib3JsYW5kIERURC4gVGhpcyBjYW4gYmUgYSBmaWxlIG9uIHRoZSBzeXN0ZW0gCi0gICAgICogb3IgYSByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLiAKLSAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIERURCBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCQVNkdGQoU3RyaW5nIGluU3RyaW5nKSB7Ci0gICAgICAgIHRoaXMuYm9ybGFuZERURCA9IGluU3RyaW5nOwotICAgIH0KLQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBzZXR0ZXIgdXNlZCB0byBzdG9yZSB3aGV0aGVyIHRoZSB0YXNrIHdpbGwgaW5jbHVkZSB0aGUgZ2VuZXJhdGUgY2xpZW50IHRhc2suCi0gICAgICogKHNlZSA6IEJvcmxhbmRHZW5lcmF0ZUNsaWVudCB0YXNrKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlY2xpZW50KGJvb2xlYW4gYikgewotICAgICAgICB0aGlzLmdlbmVyYXRlY2xpZW50ID0gYjsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBEZXNjcmlwdG9ySGFuZGxlciBnZXRCb3JsYW5kRGVzY3JpcHRvckhhbmRsZXIoZmluYWwgRmlsZSBzcmNEaXIpIHsKLSAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9Ci0gICAgICAgICAgICBuZXcgRGVzY3JpcHRvckhhbmRsZXIoZ2V0VGFzaygpLCBzcmNEaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZXF1YWxzKCJ0eXBlLXN0b3JhZ2UiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmlsZW5hbWUgb2YgdmVuZG9yIHNwZWNpZmljIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWVXaXRoTUVUQSA9IGN1cnJlbnRUZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJpbSB0aGUgTUVUQV9JTkZcIG9mZiBvZiB0aGUgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZU5hbWVXaXRoTUVUQS5zdWJzdHJpbmcoTUVUQV9ESVIubGVuZ3RoKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lV2l0aE1FVEEubGVuZ3RoKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc2NyaXB0b3JGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChmaWxlTmFtZVdpdGhNRVRBLCBkZXNjcmlwdG9yRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX0JPUkxBTkRfRUpCLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JsYW5kRFREID09IG51bGwgPyBERUZBVUxUX0JBU19EVERfTE9DQVRJT04gOiBib3JsYW5kRFREKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q29uZmlnKCkuZHRkTG9jYXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRWpiSmFyLkRURExvY2F0aW9uIGR0ZExvY2F0aW9uID0gKEVqYkphci5EVERMb2NhdGlvbilpLm5leHQoKTsKLSAgICAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoZHRkTG9jYXRpb24uZ2V0UHVibGljSWQoKSwgZHRkTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFueSB2ZW5kb3Igc3BlY2lmaWMgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSAKLSAgICAgKiBFSkIgSmFyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7Ci0KLSAgICAgICAgRmlsZSBib3JsYW5kREQgPSBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLEJBU19ERCk7Ci0gICAgICAgIGlmIChib3JsYW5kREQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGxvZygiQm9ybGFuZCBzcGVjaWZpYyBmaWxlIGZvdW5kICIrIGJvcmxhbmRERCwgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgQkFTX0RELCBkZFByZWZpeCArIGJvcmxhbmRERCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgYm9ybGFuZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IHdhcyBleHBlY3RlZCB0byBiZSBpbiAiICsgCi0gICAgICAgICAgICAgICAgYm9ybGFuZERELmdldFBhdGgoKSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2ZW5kb3Igc3BlY2lmaWMgbmFtZSBvZiB0aGUgSmFyIHRoYXQgd2lsbCBiZSBvdXRwdXQuIFRoZSBtb2RpZmljYXRpb24gZGF0ZQotICAgICAqIG9mIHRoaXMgamFyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBkZXBlbmRlbnQgYmVhbiBjbGFzc2VzLgotICAgICAqLwotICAgIEZpbGUgZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShTdHJpbmcgYmFzZU5hbWUpIHsgICAKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERlc3REaXIoKSwgYmFzZU5hbWUgKyAgamFyU3VmZml4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhlIHByb2R1Y2VkIGphciBmaWxlIGJ5IGludm9raW5nIHRoZSBCb3JsYW5kIHZlcmlmeSB0b29sCi0gICAgICogQHBhcmFtIHNvdXJjZUphciBqYXZhLmlvLkZpbGUgcmVwcmVzZW50aW5nIHRoZSBwcm9kdWNlZCBqYXIgZmlsZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlCb3JsYW5kSmFyKEZpbGUgc291cmNlSmFyKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmEgamF2YVRhc2sgPSBudWxsOwotICAgICAgICBsb2coInZlcmlmeSAiK3NvdXJjZUphcixQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgU3RyaW5nIGFyZ3MgPSB2ZXJpZnlBcmdzOyAgICAgICAgICAgIAotICAgICAgICAgICAgYXJncyArPSAiICIrc291cmNlSmFyLmdldFBhdGgoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgamF2YVRhc2sgPSAoSmF2YSkgZ2V0VGFzaygpLmdldFByb2plY3QoKS5jcmVhdGVUYXNrKCJqYXZhIik7Ci0gICAgICAgICAgICBqYXZhVGFzay5zZXRUYXNrTmFtZSgidmVyaWZ5Iik7Ci0gICAgICAgICAgICBqYXZhVGFzay5zZXRDbGFzc25hbWUoVkVSSUZZKTsKLSAgICAgICAgICAgIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZ3VtZW50cyA9IGphdmFUYXNrLmNyZWF0ZUFyZygpOwotICAgICAgICAgICAgYXJndW1lbnRzLnNldExpbmUoYXJncyk7Ci0gICAgICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IGdldENvbWJpbmVkQ2xhc3NwYXRoKCk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBqYXZhVGFzay5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgICAgICBqYXZhVGFzay5zZXRGb3JrKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsb2coIkNhbGxpbmcgIitWRVJJRlkrIiBmb3IgIiArIHNvdXJjZUphci50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIGphdmFUYXNrLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vVE8gRE8gOiBkZWxldGUgdGhlIGZpbGUgaWYgaXQgaXMgbm90IGEgdmFsaWQgZmlsZS4KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgIitWRVJJRlkrIiBEZXRhaWxzOiAiICsgZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSB0aGUgY2xpZW50IGphciBjb3JyZXNwb25kaW5nIHRvIHRoZSBqYXIgZmlsZSBwYXNzZWQgYXMgcGFyZW1ldGVyCi0gICAgICogdGhlIG1ldGhvZCB1c2VzIHRoZSBCb3JsYW5kR2VuZXJhdGVDbGllbnQgdGFzay4KLSAgICAgKiBAcGFyYW0gc291cmNlSmFyIGphdmEuaW8uRmlsZSByZXByZXNlbnRpbmcgdGhlIHByb2R1Y2VkIGphciBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ2xpZW50KEZpbGUgc291cmNlSmFyKSB7Ci0gICAgICAgIGdldFRhc2soKS5nZXRQcm9qZWN0KCkuYWRkVGFza0RlZmluaXRpb24oImludGVybmFsX2Jhc19nZW5lcmF0ZWNsaWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkJvcmxhbmRHZW5lcmF0ZUNsaWVudC5jbGFzcyk7Ci0KLSAgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkJvcmxhbmRHZW5lcmF0ZUNsaWVudCBnZW50YXNrID0gbnVsbDsKLSAgICAgICAgbG9nKCJnZW5lcmF0ZSBjbGllbnQgZm9yICIrc291cmNlSmFyLFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGFyZ3MgPSB2ZXJpZnlBcmdzOyAgICAgICAgICAgIAotICAgICAgICAgICAgYXJncyArPSAiICIrc291cmNlSmFyLmdldFBhdGgoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2VudGFzayA9IChCb3JsYW5kR2VuZXJhdGVDbGllbnQpIGdldFRhc2soKS5nZXRQcm9qZWN0KCkuY3JlYXRlVGFzaygiaW50ZXJuYWxfYmFzX2dlbmVyYXRlY2xpZW50Iik7Ci0gICAgICAgICAgICBnZW50YXNrLnNldEVqYmphcihzb3VyY2VKYXIpOwotICAgICAgICAgICAgZ2VudGFzay5zZXREZWJ1ZyhqYXZhMmlpb3BkZWJ1Zyk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IGdldENvbWJpbmVkQ2xhc3NwYXRoKCk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2VudGFzay5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdlbnRhc2suc2V0VGFza05hbWUoImdlbmVyYXRlIGNsaWVudCIpOwotICAgICAgICAgICAgZ2VudGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL1RPIERPIDogZGVsZXRlIHRoZSBmaWxlIGlmIGl0IGlzIG5vdCBhIHZhbGlkIGZpbGUuCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nICIrVkVSSUZZKyIgRGV0YWlsczogIiArIGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgc3R1YnMgJiBza2V0ZWx0b24gZm9yIGVhY2ggaG9tZSBmb3VuZCBpbnRvIHRoZSBERAotICAgICAqIEFkZCBhbGwgdGhlIGdlbmVyYXRlIGNsYXNzIGZpbGUgaW50byB0aGUgZWpiIGZpbGVzCi0gICAgICogQHBhcmFtIGl0aG9tZXMgOiBpdGVyYXRvciBvbiBob21lIGNsYXNzCi0gICAgICogQHBhcmFtIGZpbGVzICAgOiBmaWxlIGxpc3QgLCB1cGRhdGVkIGJ5IHRoZSBhZGRpbmcgZ2VuZXJhdGVkIGZpbGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkQm9ybGFuZFN0dWJzKEl0ZXJhdG9yIGl0aG9tZXMsSGFzaHRhYmxlIGZpbGVzICkgewotICAgICAgICBFeGVjdXRlIGV4ZWNUYXNrID0gbnVsbDsKLQotICAgICAgICBleGVjVGFzayA9IG5ldyBFeGVjdXRlKHRoaXMpOwotICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBnZXRUYXNrKCkuZ2V0UHJvamVjdCgpOwotICAgICAgICBleGVjVGFzay5zZXRBbnRSdW4ocHJvamVjdCk7Ci0gICAgICAgIGV4ZWNUYXNrLnNldFdvcmtpbmdEaXJlY3RvcnkocHJvamVjdC5nZXRCYXNlRGlyKCkpOwotICAgICAgICAKLSAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZGxpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgY29tbWFuZGxpbmUuc2V0RXhlY3V0YWJsZShKQVZBMklJT1ApOwotICAgICAgICAvL2RlYnVnID8KLSAgICAgICAgaWYgKCBqYXZhMmlpb3BkZWJ1ZyApIHsKLSAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1WQkpkZWJ1ZyIpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKLSAgICAgICAgLy9zZXQgdGhlIGNsYXNzcGF0aCAKLSAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVZCSmNsYXNzcGF0aCIpOwotICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoZ2V0Q29tYmluZWRDbGFzc3BhdGgoKSk7Ci0gICAgICAgIC8vbGlzdCBmaWxlCi0gICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1saXN0X2ZpbGVzIik7Ci0gICAgICAgIC8vbm8gVElFIGNsYXNzZXMKLSAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vX3RpZSIpOwotICAgICAgICAvL3Jvb3QgZGlyCi0gICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1yb290X2RpciIpOwotICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbmZpZygpLnNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIC8vY29tcGlsaW5nIG9yZGVyCi0gICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jb21waWxlIik7Ci0gICAgICAgIC8vYWRkIHRoZSBob21lIGNsYXNzCi0gICAgICAgIHdoaWxlICggaXRob21lcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoaXRob21lcy5uZXh0KCkudG9TdHJpbmcoKSk7ICAgICAgICAgICAgICAgIAotICAgICAgICB9IC8vIGVuZCBvZiB3aGlsZSAoKQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2coIkNhbGxpbmcgamF2YTJpaW9wIixQcm9qZWN0Lk1TR19WRVJCT1NFKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgbG9nKGNvbW1hbmRsaW5lLnRvU3RyaW5nKCksUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgZXhlY1Rhc2suc2V0Q29tbWFuZGxpbmUoY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gZXhlY1Rhc2suZXhlY3V0ZSgpOwotICAgICAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmcgamF2YTJpaW9wIChyZXQgY29kZSBpcyAiK3Jlc3VsdCsiKSI7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0VGFzaygpLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nKCJqYXZhMmlpb3AgZXhjZXB0aW9uIDoiK2UuZ2V0TWVzc2FnZSgpLFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSxnZXRUYXNrKCkuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgd3JpdGluZyBvZiB0aGUgSkFSIGZpbGUuIEl0ZXJhdGVzIG92ZXIgdGhlCi0gICAgICogZmlsZW5hbWVzL2phdmEuaW8uRmlsZXMgaW4gdGhlIEhhc2h0YWJsZSBzdG9yZWQgb24gdGhlIGluc3RhbmNlIHZhcmlhYmxlCi0gICAgICogZWpiRmlsZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVKYXIoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIGphckZpbGUsIEhhc2h0YWJsZSBmaWxlcywgU3RyaW5nIHB1YmxpY0lkKSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgLy9idWlsZCB0aGUgaG9tZSBjbGFzc2VzIGxpc3QuCi0gICAgICAgIFZlY3RvciBob21lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBmaWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoIGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXp6ID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKCBjbGF6ei5lbmRzV2l0aCgiSG9tZS5jbGFzcyIpICkgewotICAgICAgICAgICAgICAgIC8vcmVtb3ZlIC5jbGFzcyBleHRlbnNpb24KLSAgICAgICAgICAgICAgICBTdHJpbmcgaG9tZSA9IHRvQ2xhc3MoY2xhenopOwotICAgICAgICAgICAgICAgIGhvbWVzLmFkZChob21lKTsKLSAgICAgICAgICAgICAgICBsb2coIiBIb21lICIraG9tZSxQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gLy8gZW5kIG9mIHdoaWxlICgpCi0gICAgICAgIAotICAgICAgICBidWlsZEJvcmxhbmRTdHVicyhob21lcy5pdGVyYXRvcigpLGZpbGVzKTsKLQotICAgICAgICAvL2FkZCB0aGUgZ2VuIGZpbGVzIHRvIHRoZSBjb2xsZWN0aW9uCi0gICAgICAgIGZpbGVzLnB1dEFsbChfZ2VuZmlsZXMpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIud3JpdGVKYXIoYmFzZU5hbWUsIGphckZpbGUsIGZpbGVzLCBwdWJsaWNJZCk7Ci0KLSAgICAgICAgaWYgKCB2ZXJpZnkgKSB7Ci0gICAgICAgICAgICB2ZXJpZnlCb3JsYW5kSmFyKGphckZpbGUpOwotICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKQotCi0gICAgICAgIGlmICggZ2VuZXJhdGVjbGllbnQpIHsKLSAgICAgICAgICAgIGdlbmVyYXRlQ2xpZW50KGphckZpbGUpOwotICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29udmVydCBhIGNsYXNzIGZpbGUgbmFtZSA6IEEvQi9DL3RvdG8uY2xhc3MKLSAgICAgKiBpbnRvICAgIGEgY2xhc3MgbmFtZTogQS5CLkMudG90bwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRvQ2xhc3MoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIC8vcmVtb3ZlIHRoZSAuY2xhc3MKLSAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSk7Ci0gICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5yZXBsYWNlKCdcXCcsJy4nKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb252ZXJ0IGEgZmlsZSBuYW1lIDogQS9CL0MvdG90by5qYXZhCi0gICAgICogaW50byAgICBhIGNsYXNzIG5hbWU6IEEvQi9DL3RvdG8uY2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlICBTdHJpbmcgdG9DbGFzc0ZpbGUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIC8vcmVtb3ZlIHRoZSAuY2xhc3MKLSAgICAgICAgU3RyaW5nIGNsYXNzZmlsZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpKTsKLSAgICAgICAgY2xhc3NmaWxlID0gY2xhc3NmaWxlKyIuY2xhc3MiOwotICAgICAgICByZXR1cm4gY2xhc3NmaWxlOwotICAgIH0KLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyIGludGVyZmFjZQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gIHsgfQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSAgeyAgfQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NJbnB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcGFyYW0xKSB0aHJvd3MgSU9FeGNlcHRpb24gICB7IH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtMSA8ZGVzY3JpcHRpb24+Ci0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIDxkZXNjcmlwdGlvbj4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzT3V0cHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YWZpbGU7Ci0gICAgICAgICAgICB3aGlsZSAoICggamF2YWZpbGUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZygiYnVmZmVyOiIgK2phdmFmaWxlLFByb2plY3QuTVNHX0RFQlVHKTsgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCBqYXZhZmlsZS5lbmRzV2l0aCgiLmphdmEiKSApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzZmlsZSA9IHRvQ2xhc3NGaWxlKGphdmFmaWxlKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGNsYXNzZmlsZS5zdWJzdHJpbmcoZ2V0Q29uZmlnKCkuc3JjRGlyLmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpKzEpOwotICAgICAgICAgICAgICAgICAgICBsb2coIiBnZW5lcmF0ZWQgOiAiKyBjbGFzc2ZpbGUgLFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCIga2V5ICAgICAgIDogIisga2V5ICAgICAgICxQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgICAgIF9nZW5maWxlcy5wdXQoa2V5LCBuZXcgRmlsZShjbGFzc2ZpbGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IC8vIGVuZCBvZiB3aGlsZSAoKQotICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIHdoaWxlIHBhcnNpbmcgIGphdmEyaWlvcCBvdXRwdXQuIERldGFpbHM6ICIgKyBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbTEgPGRlc2NyaXB0aW9uPgotICAgICAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiA8ZGVzY3JpcHRpb24+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKLSAgICAgICAgU3RyaW5nIHMgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgaWYgKCBzICE9IG51bGwpIAotICAgICAgICB7Ci0gICAgICAgICAgICBsb2coIltqYXZhMmlpb3BdICIrcyxQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgIH0gLy8gZW5kIG9mIGlmICgpICAgICAgICAKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvQm9ybGFuZEdlbmVyYXRlQ2xpZW50LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvQm9ybGFuZEdlbmVyYXRlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjQ0MzcuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0JvcmxhbmRHZW5lcmF0ZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBCb3JsYW5kR2VuZXJhdGVDbGllbnQgaXMgZGVkaWNhdGVkIHRvIHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA0LjUKLSAqIFRoaXMgdGFzayBnZW5lcmF0ZXMgdGhlIGNsaWVudCBqYXIgdXNpbmcgYXMgaW5wdXQgdGhlIGVqYiBqYXIgZmlsZS4KLSAqIFR3byBtb2RlIGFyZSBhdmFpbGFibGU6IGphdmEgbW9kZSAoZGVmYXVsdCkgYW5kIGZvcmsgbW9kZS4gV2l0aCB0aGUgZm9yayBtb2RlLAotICogaXQgaXMgaW1wb3NzaWJsZSB0byBhZGQgY2xhc3NwYXRoIHRvIHRoZSBjb21tbWFuZCBsaW5lLgotICogCi0gKiBAYXV0aG9yICA8YSBocmVmPSJtYWlsdG86YmVub2l0Lm1vdXNzYXVkQGNyaWx0ZWxlY29tLmNvbSI+QmVub2l0IE1vdXNzYXVkPC9hPgotICoKLSAqLwotcHVibGljIGNsYXNzIEJvcmxhbmRHZW5lcmF0ZUNsaWVudCBleHRlbmRzIFRhc2sKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTU9ERSA9ICJqYXZhIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUktfTU9ERSA9ICJmb3JrIjsKLQotICAgIC8qKiBkZWJ1ZyB0aGUgZ2VuZXJhdGVjbGllbnQgdGFzayAqLwotICAgIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotICAgIC8qKiBob2xkIHRoZSBlamJqYXIgZmlsZSBuYW1lICovCi0gICAgRmlsZSBlamJqYXJmaWxlID0gbnVsbDsKLQotICAgIC8qKiBob2xkIHRoZSBjbGllbnQgamFyIGZpbGUgbmFtZSAqLwotICAgIEZpbGUgY2xpZW50amFyZmlsZSA9IG51bGw7Ci0KLSAgICAvKiogaG9sZCB0aGUgY2xhc3NwYXRoICovCi0gICAgUGF0aCBjbGFzc3BhdGg7Ci0KLSAgICAvKiogaG9sZCB0aGUgbW9kZSAoamF2YXxmb3JrKSAqLwotICAgIFN0cmluZyBtb2RlID0gSkFWQV9NT0RFOwotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgcykgewotICAgICAgICBtb2RlID0gczsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykgewotICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWpiamFyKEZpbGUgZWpiZmlsZSkgewotICAgICAgICBlamJqYXJmaWxlID0gZWpiZmlsZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50amFyKEZpbGUgY2xpZW50amFyKSB7Ci0gICAgICAgIGNsaWVudGphcmZpbGUgPSBjbGllbnRqYXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7Ci0gICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIERvIHRoZSB3b3JrLgotICAgICAqCi0gICAgICogVGhlIHdvcmsgaXMgYWN0dWFsbHkgZG9uZSBieSBjcmVhdGluZyBhIHNlcGFyYXRlIEpWTSB0byBydW4gYSBqYXZhIHRhc2suIAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggZWpiamFyZmlsZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgZWpiamFyZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImludmFsaWQgZWpiIGphciBmaWxlLiIpOwotICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKQotCi0gICAgICAgIGlmICggY2xpZW50amFyZmlsZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgY2xpZW50amFyZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBsb2coImludmFsaWQgb3IgbWlzc2luZyBjbGllbnQgamFyIGZpbGUuIixQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIFN0cmluZyBlamJqYXJuYW1lID0gZWpiamFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIC8vY2xpZW50bmFtZSA9IGVqYmphcmZpbGUrY2xpZW50LmphcgotICAgICAgICAgICAgU3RyaW5nIGNsaWVudG5hbWUgPSBlamJqYXJuYW1lLnN1YnN0cmluZygwLGVqYmphcm5hbWUubGFzdEluZGV4T2YoIi4iKSk7Ci0gICAgICAgICAgICBjbGllbnRuYW1lID0gY2xpZW50bmFtZSArICJjbGllbnQuamFyIjsKLSAgICAgICAgICAgIGNsaWVudGphcmZpbGUgPSBuZXcgRmlsZShjbGllbnRuYW1lKTsKLQotICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKQotCi0gICAgICAgIGlmICggbW9kZSA9PSBudWxsICkgewotICAgICAgICAgICAgbG9nKCJtb2RlIGlzIG51bGwgZGVmYXVsdCBtb2RlICBpcyBqYXZhIik7Ci0gICAgICAgICAgICBzZXRNb2RlKEpBVkFfTU9ERSk7Ci0gICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCi0KLSAgICAgICAgbG9nKCJjbGllbnQgamFyIGZpbGUgaXMgIiArIGNsaWVudGphcmZpbGUpOwotCi0gICAgICAgIGlmICggbW9kZS5lcXVhbHNJZ25vcmVDYXNlKEZPUktfTU9ERSkpIHsKLSAgICAgICAgICAgIGV4ZWN1dGVGb3JrKCk7Ci0gICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCi0gICAgICAgIGVsc2UgeyAgICAgICAgICAgIAotICAgICAgICAgICAgZXhlY3V0ZUphdmEoKTsKLSAgICAgICAgfSAvLyBlbmQgb2YgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKiBsYXVuY2ggdGhlIGdlbmVyYXRlIGNsaWVudCB1c2luZyBqYXZhIGFwaSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVKYXZhKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvZygibW9kZSA6IGphdmEiKTsKLQotICAgICAgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YSBleGVjVGFzayA9IG51bGw7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZXhlY1Rhc2sgPSAoSmF2YSkgZ2V0UHJvamVjdCgpLmNyZWF0ZVRhc2soImphdmEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBleGVjVGFzay5zZXREaXIobmV3IEZpbGUoIi4iKSk7Ci0gICAgICAgICAgICBleGVjVGFzay5zZXRDbGFzc25hbWUoImNvbS5pbnByaXNlLnNlcnZlci5jb21tYW5kbGluZS5FSkJVdGlsaXRpZXMiKTsKLSAgICAgICAgICAgIC8vY2xhc3NwYXRoCi0gICAgICAgICAgICAvL2FkZCBhdCB0aGUgZW5kIG9mIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgICAgIC8vdGhlIHN5c3RlbSBjbGFzc3BhdGggaW4gb3JkZXIgdG8gZmluZCB0aGUgdG9vbHMuamFyIGZpbGUKLSAgICAgICAgICAgIGV4ZWNUYXNrLnNldENsYXNzcGF0aChjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCkpOwotCi0gICAgICAgICAgICBleGVjVGFzay5zZXRGb3JrKHRydWUpOwotICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoImdlbmVyYXRlY2xpZW50Iik7Ci0gICAgICAgICAgICBpZiAoIGRlYnVnICkgewotICAgICAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItdHJhY2UiKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IC8vIGVuZCBvZiBpZiAoKQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1zaG9ydCIpOwotICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1qYXJmaWxlIik7Ci0gICAgICAgICAgICAvLyBlamIgamFyIGZpbGUKLSAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKGVqYmphcmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgLy9jbGllbnQgamFyIGZpbGUKLSAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItc2luZ2xlIik7Ci0gICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWNsaWVudGphcmZpbGUiKTsKLSAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKGNsaWVudGphcmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgICAgICBsb2coIkNhbGxpbmcgRUpCVXRpbGl0aWVzIixQcm9qZWN0Lk1TR19WRVJCT1NFKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZXhlY1Rhc2suZXhlY3V0ZSgpOyAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEhhdmUgdG8gY2F0Y2ggdGhpcyBiZWNhdXNlIG9mIHRoZSBzZW1hbnRpY3Mgb2YgY2FsbGluZyBtYWluKCkKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgZ2VuZXJhdGVjbGllbnQgRGV0YWlsczogIiArIGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIGxhdW5jaCB0aGUgZ2VuZXJhdGUgY2xpZW50IHVzaW5nIHN5c3RlbSBhcGkgKi8KLSAgICBwcm90ZWN0ZWQgIHZvaWQgZXhlY3V0ZUZvcmsoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9nKCJtb2RlIDogZm9yayIpOwotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjVGFzayBleGVjVGFzayA9IG51bGw7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZXhlY1Rhc2sgPSAoRXhlY1Rhc2spIGdldFByb2plY3QoKS5jcmVhdGVUYXNrKCJleGVjIik7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZXhlY1Rhc2suc2V0RGlyKG5ldyBGaWxlKCIuIikpOwotICAgICAgICAgICAgZXhlY1Rhc2suc2V0RXhlY3V0YWJsZSgiaWFzdG9vbCIpOwotICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoImdlbmVyYXRlY2xpZW50Iik7Ci0gICAgICAgICAgICBpZiAoIGRlYnVnICl7Ci0gICAgICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi10cmFjZSIpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCi0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXNob3J0Iik7Ci0gICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWphcmZpbGUiKTsKLSAgICAgICAgICAgIC8vIGVqYiBqYXIgZmlsZQotICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoZWpiamFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAvL2NsaWVudCBqYXIgZmlsZQotICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1zaW5nbGUiKTsKLSAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItY2xpZW50amFyZmlsZSIpOwotICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoY2xpZW50amFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgIGxvZygiQ2FsbGluZyBqYXZhMmlpb3AiLFByb2plY3QuTVNHX1ZFUkJPU0UpOyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBleGVjVGFzay5leGVjdXRlKCk7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEhhdmUgdG8gY2F0Y2ggdGhpcyBiZWNhdXNlIG9mIHRoZSBzZW1hbnRpY3Mgb2YgY2FsbGluZyBtYWluKCkKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgZ2VuZXJhdGVjbGllbnQgRGV0YWlsczogIiArIGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRERDcmVhdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRERDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMmZmOGIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0REQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEJ1aWxkIGEgc2VyaWFsaXNlZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZ2l2ZW4gYSB0ZXh0IGZpbGUgZGVzY3JpcHRpb24gb2YgdGhlIAotICogZGVzY3JpcHRvciBpbiB0aGUgZm9ybWF0IHN1cHBvcnRlZCBieSBXZWJMb2dpYy4KLSAqCi0gKiBUaGlzIGFudCB0YXNrIGlzIGEgZnJvbnQgZW5kIGZvciB0aGUgd2VibG9naWMgRERDcmVhdG9yIHRvb2wuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAY29ydGV4ZWJ1c2luZXNzLmNvbS5hdSI+Q29ub3IgTWFjTmVpbGw8L2E+LCBDb3J0ZXggZWJ1c2luZXNzIFB0eSBMaW1pdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBERENyZWF0b3IgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotICAgIC8qKgotICAgICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgdHJlZSBjb250YWluaW5nIHRoZSB0ZXh0dWFsIGRlcGxveW1lbnQgZGVzY2lwdG9ycy4gVGhlIGFjdHVhbAotICAgICAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcyBhcmUgc2VsZWN0ZWQgdXNpbmcgaW5jbHVkZSBhbmQgZXhjbHVkZSBjb25zdHJ1Y3RzCi0gICAgICogb24gdGhlIEVKQkMgdGFzaywgYXMgc3VwcG9ydGVkIGJ5IHRoZSBNYXRjaGluZ1Rhc2sgc3VwZXJjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZGVzY3JpcHRvckRpcmVjdG9yeTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIGdlbmVyYXRlZCBzZXJpYWxpc2VkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlIHBsYWNlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2VuZXJhdGVkRmlsZXNEaXJlY3Rvcnk7Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBpbiB0aGUgd2VibG9naWMgZWpiYyBjYWxscy4gSXQgbXVzdCBjb250YWluIHRoZSB3ZWJsb2dpYwotICAgICAqIGNsYXNzZXMgbmVjZXNzYXJ5IGZybyBERENyZWF0b3IgPGI+YW5kPC9iPiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBvZiB0aGUgCi0gICAgICogaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NwYXRoOwotICAgIAotICAgIC8qKgotICAgICAqIERvIHRoZSB3b3JrLgotICAgICAqCi0gICAgICogVGhlIHdvcmsgaXMgYWN0dWFsbHkgZG9uZSBieSBjcmVhdGluZyBhIGhlbHBlciB0YXNrLiBUaGlzIGFwcHJvYWNoIGFsbG93cwotICAgICAqIHRoZSBjbGFzc3BhdGggb2YgdGhlIGhlbHBlciB0YXNrIHRvIGJlIHNldC4gU2luY2UgdGhlIHdlYmxvZ2ljIHRvb2xzIHJlcXVpcmUKLSAgICAgKiB0aGUgY2xhc3MgZmlsZXMgb2YgdGhlIHByb2plY3QncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyB0byBiZSBhdmFpbGFibGUgaW4KLSAgICAgKiB0aGUgY2xhc3NwYXRoLCB0aGlzIGFsc28gYXZvaWRzIGhhdmluZyB0byBzdGFydCBhbnQgd2l0aCB0aGUgY2xhc3MgcGF0aCBvZiB0aGUKLSAgICAgKiBwcm9qZWN0IGl0IGlzIGJ1aWxkaW5nLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yRGlyZWN0b3J5ID09IG51bGwgfHwKLSAgICAgICAgICAgICFkZXNjcmlwdG9yRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzY3JpcHRvcnMgZGlyZWN0b3J5ICIgKyBkZXNjcmlwdG9yRGlyZWN0b3J5LmdldFBhdGgoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IHZhbGlkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdlbmVyYXRlZEZpbGVzRGlyZWN0b3J5ID09IG51bGwgfHwKLSAgICAgICAgICAgICFnZW5lcmF0ZWRGaWxlc0RpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3QgZGlyZWN0b3J5ICIgKyBnZW5lcmF0ZWRGaWxlc0RpcmVjdG9yeS5nZXRQYXRoKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCB2YWxpZCIpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIGFyZ3MgPSBkZXNjcmlwdG9yRGlyZWN0b3J5ICsgIiAiICsgZ2VuZXJhdGVkRmlsZXNEaXJlY3Rvcnk7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gZ2V0IGFsbCB0aGUgZmlsZXMgaW4gdGhlIGRlc2NyaXB0b3IgZGlyZWN0b3J5Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKGRlc2NyaXB0b3JEaXJlY3RvcnkpOwotICAgIAotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBhcmdzICs9ICIgIiArIGZpbGVzW2ldOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHN5c3RlbUNsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0gICAgICAgIFN0cmluZyBleGVjQ2xhc3NQYXRoID0gcHJvamVjdC50cmFuc2xhdGVQYXRoKHN5c3RlbUNsYXNzUGF0aCArICI6IiArIGNsYXNzcGF0aCk7Ci0gICAgICAgIEphdmEgZGRDcmVhdG9yVGFzayA9IChKYXZhKXByb2plY3QuY3JlYXRlVGFzaygiamF2YSIpOwotICAgICAgICBkZENyZWF0b3JUYXNrLnNldFRhc2tOYW1lKGdldFRhc2tOYW1lKCkpOwotICAgICAgICBkZENyZWF0b3JUYXNrLnNldEZvcmsodHJ1ZSk7Ci0gICAgICAgIGRkQ3JlYXRvclRhc2suc2V0Q2xhc3NuYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRERDcmVhdG9ySGVscGVyIik7Ci0gICAgICAgIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZ3VtZW50cyA9IGRkQ3JlYXRvclRhc2suY3JlYXRlQXJnKCk7Ci0gICAgICAgIGFyZ3VtZW50cy5zZXRMaW5lKGFyZ3MpOwotICAgICAgICBkZENyZWF0b3JUYXNrLnNldENsYXNzcGF0aChuZXcgUGF0aChwcm9qZWN0LCBleGVjQ2xhc3NQYXRoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoZGRDcmVhdG9yVGFzay5leGVjdXRlSmF2YSgpICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4ZWN1dGlvbiBvZiBkZGNyZWF0b3IgaGVscGVyIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0aGUgdGV4dCBkZXNjcmlwdGlvbnMgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlCi0gICAgICogdG8gYmUgcmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkaXJOYW1lIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGV4dCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvcnMoU3RyaW5nIGRpck5hbWUpIHsKLSAgICAgICAgZGVzY3JpcHRvckRpcmVjdG9yeSA9IG5ldyBGaWxlKGRpck5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBzZXJpYWxpc2VkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlIHRvIAotICAgICAqIGJlIHdyaXR0ZW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGlyTmFtZSB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHNlcmlhbGlzZWQgZGVwbG95bWVudAotICAgICAqICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGFyZSB3cml0dGVuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3QoU3RyaW5nIGRpck5hbWUpIHsKLSAgICAgICAgZ2VuZXJhdGVkRmlsZXNEaXJlY3RvcnkgPSBuZXcgRmlsZShkaXJOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIGNsYXNzcGF0aCB0byB1c2UgZm9yIHRoZSBkZGNyZWF0b3IgdG9vbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoU3RyaW5nIHMpIHsKLSAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBwcm9qZWN0LnRyYW5zbGF0ZVBhdGgocyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0REQ3JlYXRvckhlbHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0REQ3JlYXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWNjMTIzLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9ERENyZWF0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LmVqYi5kZXBsb3ltZW50LkRlcGxveW1lbnREZXNjcmlwdG9yOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHdoaWNoIHBlcmZvcm1zIHRoZSBhY3R1YWwgd29yayBvZiB0aGUgZGRjcmVhdG9yIHRhc2suCi0gKgotICogVGhpcyBjbGFzcyBpcyBydW4gd2l0aCBhIGNsYXNzcGF0aCB3aGljaCBpbmNsdWRlcyB0aGUgd2VibG9naWMgdG9vbHMgYW5kIHRoZSBob21lIGFuZCByZW1vdGUKLSAqIGludGVyZmFjZSBjbGFzcyBmaWxlcyByZWZlcmVuY2VkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGJlaW5nIGJ1aWx0LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGNvcnRleGVidXNpbmVzcy5jb20uYXUiPkNvbm9yIE1hY05laWxsPC9hPiwgQ29ydGV4IGVidXNpbmVzcyBQdHkgTGltaXRlZAotICovCi1wdWJsaWMgY2xhc3MgRERDcmVhdG9ySGVscGVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHRyZWUgY29udGFpbmluZyB0aGUgdGV4dHVhbCBkZXBsb3ltZW50IGRlc2NpcHRvcnMuIAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBkZXNjcmlwdG9yRGlyZWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgZ2VuZXJhdGVkIHNlcmlhbGlzZWQgZGVzcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlIHdyaXR0ZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGdlbmVyYXRlZEZpbGVzRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlc2NyaXB0b3IgdGV4dCBmaWxlcyBmb3Igd2hpY2ggYSBzZXJpYWxpc2VkIGRlc2NyaXB0b3IgaXMgdG8gYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBkZXNjcmlwdG9yczsgCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbWFpbiBtZXRob2QuCi0gICAgICoKLSAgICAgKiBUaGUgbWFpbiBtZXRob2QgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgRERDcmVhdG9ySGVscGVyLCBwYXNzaW5nIGl0IHRoZSAKLSAgICAgKiBhcmdzIHdoaWNoIGl0IHRoZW4gcHJvY2Vzc2VzLgotICAgICAqLyAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRERDcmVhdG9ySGVscGVyIGhlbHBlciA9IG5ldyBERENyZWF0b3JIZWxwZXIoYXJncyk7Ci0gICAgICAgIGhlbHBlci5wcm9jZXNzKCk7Ci0gICAgfQotICAKLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXNlIHRoZSBoZWxwZXIgd2l0aCB0aGUgY29tbWFuZCBhcmd1bWVudHMuCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIEREQ3JlYXRvckhlbHBlcihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGRlc2NyaXB0b3JEaXJlY3RvcnkgPSBuZXcgRmlsZShhcmdzW2luZGV4KytdKTsKLSAgICAgICAgZ2VuZXJhdGVkRmlsZXNEaXJlY3RvcnkgPSBuZXcgRmlsZShhcmdzW2luZGV4KytdKTsKLSAgICAgICAgCi0gICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIGluZGV4XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZGVzY3JpcHRvcnNbaV0gPSBhcmdzW2luZGV4KytdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERvIHRoZSBhY3R1YWwgd29yay4KLSAgICAgKgotICAgICAqIFRoZSB3b3JrIHByb2NlZWRzIGJ5IGV4YW1pbmluZyBlYWNoIGRlc2NyaXB0b3IgZ2l2ZW4uIElmIHRoZSBzZXJpYWxpc2VkCi0gICAgICogZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBvbGRlciB0aGFuIHRoZSB0ZXh0IGRlc2NyaXB0aW9uLCB0aGUgd2VibG9naWMKLSAgICAgKiBERENyZWF0b3IgdG9vbCBpcyBpbnZva2VkIGRpcmVjdGx5IHRvIGJ1aWxkIHRoZSBzZXJpYWxpc2VkIGRlc2NyaXB0b3IuCi0gICAgICovICAgIAotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdG9yTmFtZSA9IGRlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgRmlsZSBkZXNjcmlwdG9yRmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3JEaXJlY3RvcnksIGRlc2NyaXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaW50IGV4dEluZGV4ID0gZGVzY3JpcHRvck5hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXJOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChleHRJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHNlck5hbWUgPSBkZXNjcmlwdG9yTmFtZS5zdWJzdHJpbmcoMCwgZXh0SW5kZXgpICsgIi5zZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VyTmFtZSA9IGRlc2NyaXB0b3JOYW1lICsgIi5zZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSBzZXJGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkRmlsZXNEaXJlY3RvcnksIHNlck5hbWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZG8gd2UgbmVlZCB0byByZWdlbmVyYXRlIHRoZSBmaWxlCi0gICAgICAgICAgICBpZiAoIXNlckZpbGUuZXhpc3RzKCkgfHwgc2VyRmlsZS5sYXN0TW9kaWZpZWQoKSA8IGRlc2NyaXB0b3JGaWxlLmxhc3RNb2RpZmllZCgpCi0gICAgICAgICAgICAgICAgfHwgcmVnZW5lcmF0ZVNlcmlhbGl6ZWRGaWxlKHNlckZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gYXJncyA9IHsiLW5vZXhpdCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1kIiwgc2VyRmlsZS5nZXRQYXJlbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItb3V0cHV0ZmlsZSIsIHNlckZpbGUuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvckZpbGUuZ2V0UGF0aCgpfTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3ZWJsb2dpYy5lamIudXRpbHMuRERDcmVhdG9yLm1haW4oYXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uIC0gcnVuIHdpdGggbm8gZXhpdCB0byBnZXQgcHJvcGVyIGVycm9yCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG5ld0FyZ3MgPSB7Ii1kIiwgZ2VuZXJhdGVkRmlsZXNEaXJlY3RvcnkuZ2V0UGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1vdXRwdXRmaWxlIiwgc2VyRmlsZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yRmlsZS5nZXRQYXRoKCl9OwotICAgICAgICAgICAgICAgICAgICB3ZWJsb2dpYy5lamIudXRpbHMuRERDcmVhdG9yLm1haW4obmV3QXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRUpCQyB3aWxsIGZhaWwgaWYgdGhlIHNlcmlhbGl6ZWQgZGVzY3JpcHRvciBmaWxlIGRvZXMgbm90IG1hdGNoIHRoZSBiZWFuIGNsYXNzZXMuCi0gICAgICogWW91IGNhbiB0ZXN0IGZvciB0aGlzIGJ5IHRyeWluZyB0byBsb2FkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJZiBpdCBmYWlscywKLSAgICAgKiB0aGUgc2VyaWFsaXplZCBmaWxlIG5lZWRzIHRvIGJlIHJlZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIGFzc29jaWF0ZWQgY2xhc3MgZmlsZXMKLSAgICAgKiBkb24ndCBtYXRjaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVnZW5lcmF0ZVNlcmlhbGl6ZWRGaWxlKEZpbGUgc2VyRmlsZSkgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzZXJGaWxlKTsKLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShmaXMpOwotICAgICAgICAgICAgRGVwbG95bWVudERlc2NyaXB0b3IgZGQgPSAoRGVwbG95bWVudERlc2NyaXB0b3IpIG9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICBmaXMuY2xvc2UoKTsKLQotICAgICAgICAgICAgLy8gU2luY2UgdGhlIGRlc2NyaXB0b3IgcmVhZCBwcm9wZXJseSwgZXZlcnl0aGluZyBzaG91bGQgYmUgby5rLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlYmxvZ2ljIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2VzIAotICAgICAgICAgICAgLy8gbm90IG1hdGNoIHRoZSBjbGFzcyBmaWxlcy4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRGVzY3JpcHRvckhhbmRsZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9EZXNjcmlwdG9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYThkZjlhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9EZXNjcmlwdG9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogSW5uZXIgY2xhc3MgdXNlZCBieSBFamJKYXIgdG8gZmFjaWxpdGF0ZSB0aGUgcGFyc2luZyBvZiBkZXBsb3ltZW50Ci0gKiBkZXNjcmlwdG9ycyBhbmQgdGhlIGNhcHR1cmUgb2YgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIEV4dGVuZHMKLSAqIEhhbmRsZXJCYXNlIHNvIGl0IG9ubHkgaW1wbGVtZW50cyB0aGUgbWV0aG9kcyBuZWVkZWQuIER1cmluZyBwYXJzaW5nCi0gKiBjcmVhdGVzIGEgaGFzaHRhYmxlIGNvbnNpc3Rpbmcgb2YgZW50cmllcyBtYXBwaW5nIHRoZSBuYW1lIGl0IHNob3VsZCBiZQotICogaW5zZXJ0ZWQgaW50byBhbiBFSkIgamFyIGFzIHRvIGEgRmlsZSByZXByZXNlbnRpbmcgdGhlIGZpbGUgb24gZGlzay4gVGhpcwotICogbGlzdCBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBnZXRGaWxlcygpIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JIYW5kbGVyIGV4dGVuZHMgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UgewotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MT09LSU5HX0VKQkpBUiA9IDE7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0lOX0VKQkpBUiA9IDI7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0lOX0JFQU5TID0gMzsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfSU5fU0VTU0lPTiA9IDQ7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0lOX0VOVElUWSA9IDU7Ci0gICAgCi0gICAgcHJpdmF0ZSBUYXNrIG93bmluZ1Rhc2s7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIEJ1bmNoIG9mIGNvbnN0YW50cyB1c2VkIGZvciBzdG9yaW5nIGVudHJpZXMgaW4gYSBoYXNodGFibGUsIGFuZCBmb3IKLSAgICAgKiBjb25zdHJ1Y3RpbmcgdGhlIGZpbGVuYW1lcyBvZiB2YXJpb3VzIHBhcnRzIG9mIHRoZSBlamIgamFyLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUkVGICAgPSAiZWpiLXJlZiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfSU5URVJGQUNFICAgPSAiaG9tZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9JTlRFUkZBQ0UgPSAicmVtb3RlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9DTEFTUyAgICAgICA9ICJlamItY2xhc3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS19DTEFTUyAgICAgICAgID0gInByaW0ta2V5LWNsYXNzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX05BTUUgICAgICAgICA9ICJlamItbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9KQVIgICAgICAgICAgPSAiZWpiLWphciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVEVSUFJJU0VfQkVBTlMgPSAiZW50ZXJwcmlzZS1iZWFucyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9CRUFOICAgICAgPSAiZW50aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9CRUFOICAgICA9ICJzZXNzaW9uIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBzdGF0ZSBvZiB0aGUgcGFyc2luZwotICAgICAqLwotICAgIHByaXZhdGUgaW50IHBhcnNlU3RhdGUgPSBTVEFURV9MT09LSU5HX0VKQkpBUjsKLQotICAgIC8qKgotICAgICAqIEluc3RhbmNlIHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBiZWluZwotICAgICAqIHByb2Nlc3NlZCBieSB0aGUgU0FYIHBhcnNlci4gIEFjY2Vzc2VkIGJ5IHRoZSBTQVggcGFyc2VyIGNhbGwtYmFjayBtZXRob2RzCi0gICAgICogc3RhcnRFbGVtZW50KCkgYW5kIGVuZEVsZW1lbnQoKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXh0IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRUZXh0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgYXMgdGhleSB3aWxsIGJlCi0gICAgICogcHV0IGludG8gdGhlIGphciBmaWxlLCBtYXBwZWQgdG8gRmlsZSBvYmplY3RzICBBY2Nlc3NlZCBieSB0aGUgU0FYCi0gICAgICogcGFyc2VyIGNhbGwtYmFjayBtZXRob2QgY2hhcmFjdGVycygpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBIYXNodGFibGUgZWpiRmlsZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHZhbHVlIGZvdW5kIGluIHRoZSA8ZWpiLW5hbWU+IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVqYk5hbWUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgZmlsZURURHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgcmVzb3VyY2VEVERzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGluRUpCUmVmID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIEhhc2h0YWJsZSB1cmxEVERzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBiZWFuIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuIFRoaXMgaXMgCi0gICAgICogdXNlZCBmb3IgcGVyZm9ybWluZyBkZXBlbmRlbmN5IGZpbGUgbG9va3Vwcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgc3JjRGlyOwotCi0gICAgcHVibGljIERlc2NyaXB0b3JIYW5kbGVyKFRhc2sgdGFzaywgRmlsZSBzcmNEaXIpIHsKLSAgICAgICAgdGhpcy5vd25pbmdUYXNrID0gdGFzazsKLSAgICAgICAgdGhpcy5zcmNEaXIgPSBzcmNEaXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRFREKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEZpbGUgZmlsZURURCA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLSAgICAgICAgaWYgKGZpbGVEVEQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGlmIChwdWJsaWNJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmlsZURURHMucHV0KHB1YmxpY0lkLCBmaWxlRFREKTsKLSAgICAgICAgICAgICAgICBvd25pbmdUYXNrLmxvZygiTWFwcGVkIHB1YmxpY0lkICIgKyBwdWJsaWNJZCArICIgdG8gZmlsZSAiICsgZmlsZURURCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChnZXRDbGFzcygpLmdldFJlc291cmNlKGxvY2F0aW9uKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc291cmNlRFREcy5wdXQocHVibGljSWQsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBvd25pbmdUYXNrLmxvZygiTWFwcGVkIHB1YmxpY0lkICIgKyBwdWJsaWNJZCArICIgdG8gcmVzb3VyY2UgIiArIGxvY2F0aW9uLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFVSTCB1cmxkdGQgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB1cmxEVERzLnB1dChwdWJsaWNJZCwgdXJsZHRkKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoIGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiAgIGUpIHsKLSAgICAgICAgICAgIC8vaWdub3JlZAotICAgICAgICB9IAotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotICAgICAgICAKLSAgICAgICAgRmlsZSBkdGRGaWxlID0gKEZpbGUpIGZpbGVEVERzLmdldChwdWJsaWNJZCk7Ci0gICAgICAgIGlmIChkdGRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3duaW5nVGFzay5sb2coIlJlc29sdmVkICIgKyBwdWJsaWNJZCArICIgdG8gbG9jYWwgZmlsZSAiICsgZHRkRmlsZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKGR0ZEZpbGUpKTsKLSAgICAgICAgICAgIH0gY2F0Y2goIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCApIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkdGRSZXNvdXJjZU5hbWUgPSAoU3RyaW5nKXJlc291cmNlRFREcy5nZXQocHVibGljSWQpOyAKLSAgICAgICAgaWYgKGR0ZFJlc291cmNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGR0ZFJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG93bmluZ1Rhc2subG9nKCJSZXNvbHZlZCAiICsgcHVibGljSWQgKyAiIHRvIGxvY2FsIHJlc291cmNlICIgKyBkdGRSZXNvdXJjZU5hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVVJMIGR0ZFVybCA9IChVUkwpIHVybERURHMuZ2V0KHB1YmxpY0lkKTsKLSAgICAgICAgaWYgKCBkdGRVcmwgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBkdGRVcmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgIG93bmluZ1Rhc2subG9nKCJSZXNvbHZlZCAiICsgcHVibGljSWQgKyAiIHRvIHVybCAiICsgZHRkVXJsLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGlzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAvL2lnbm9yZQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9IAotICAgICAgICAgICAgICAgIAotICAgICAgICBvd25pbmdUYXNrLmxvZygiQ291bGQgbm90IHJlc29sdmUgKCBwdWJsaWNJZDogIiArIHB1YmxpY0lkICsgIiwgc3lzdGVtSWQ6ICIgKyBzeXN0ZW1JZCArICIpIHRvIGEgbG9jYWwgZW50aXR5IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBzZXQgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgRUpCIGphci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEZpbGVzKCkgewotICAgICAgICByZXR1cm4gKGVqYkZpbGVzID09IG51bGwpID8gbmV3IEhhc2h0YWJsZSgpIDogZWpiRmlsZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwdWJsaWNJZCBvZiB0aGUgRFRECi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLSAgICAgICAgcmV0dXJuIHB1YmxpY0lkOwotICAgIH0KLSAgICAKLSAgICAgLyoqCi0gICAgICogR2V0dGVyIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSA8ZWpiLW5hbWU+IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFamJOYW1lKCkgewotICAgICAgICByZXR1cm4gZWpiTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTQVggcGFyc2VyIGNhbGwtYmFjayBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHZhbHVlcyBvZiBzb21lCi0gICAgICogaW5zdGFuY2UgdmFyaWFibGVzIHRvIGVuc3VyZSBzYWZlIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZWpiRmlsZXMgPSBuZXcgSGFzaHRhYmxlKDEwLCAxKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGluRUpCUmVmID0gZmFsc2U7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTQVggcGFyc2VyIGNhbGwtYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIHdoZW4gYSBuZXcgZWxlbWVudCBpcyBlbnRlcmVkCi0gICAgICogaW50by4gIFVzZWQgdG8gc3RvcmUgdGhlIGNvbnRleHQgKGF0dHJpYnV0ZSBuYW1lKSBpbiB0aGUgY3VycmVudEF0dHJpYnV0ZQotICAgICAqIGluc3RhbmNlIHZhcmlhYmxlLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGJlaW5nIGVudGVyZWQuCi0gICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB0byB0aGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIAotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IG5hbWU7Ci0gICAgICAgIGN1cnJlbnRUZXh0ID0gIiI7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhFSkJfUkVGKSkgewotICAgICAgICAgICAgaW5FSkJSZWYgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfTE9PS0lOR19FSkJKQVIgJiYgbmFtZS5lcXVhbHMoRUpCX0pBUikpIHsKLSAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9FSkJKQVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyc2VTdGF0ZSA9PSBTVEFURV9JTl9FSkJKQVIgJiYgbmFtZS5lcXVhbHMoRU5URVJQUklTRV9CRUFOUykpIHsKLSAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9CRUFOUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJzZVN0YXRlID09IFNUQVRFX0lOX0JFQU5TICYmIG5hbWUuZXF1YWxzKFNFU1NJT05fQkVBTikpIHsKLSAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9TRVNTSU9OOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fQkVBTlMgJiYgbmFtZS5lcXVhbHMoRU5USVRZX0JFQU4gKSkgewotICAgICAgICAgICAgcGFyc2VTdGF0ZSA9IFNUQVRFX0lOX0VOVElUWTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU0FYIHBhcnNlciBjYWxsLWJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCB3aGVuIGFuIGVsZW1lbnQgaXMgZXhpdGVkLgotICAgICAqIFVzZWQgdG8gYmxhbmsgb3V0IChzZXQgdG8gdGhlIGVtcHR5IHN0cmluZywgbm90IG51bGxpZnkpIHRoZSBuYW1lIG9mCi0gICAgICogdGhlIGN1cnJlbnRBdHRyaWJ1dGUuICBBIGJldHRlciBtZXRob2Qgd291bGQgYmUgdG8gdXNlIGEgc3RhY2sgYXMgYW4KLSAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZSwgaG93ZXZlciBzaW5jZSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGxlYWYtbm9kZQotICAgICAqIGRhdGEgdGhpcyBpcyBhIHNpbXBsZXIgYW5kIHdvcmthYmxlIHNvbHV0aW9uLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYmVpbmcgZXhpdGVkLiBJZ25vcmVkCi0gICAgICogICAgICAgIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2Nlc3NFbGVtZW50KCk7Ci0gICAgICAgIGN1cnJlbnRUZXh0ID0gIiI7Ci0gICAgICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSAiIjsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKEVKQl9SRUYpKSB7Ci0gICAgICAgICAgICBpbkVKQlJlZiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fRU5USVRZICYmIG5hbWUuZXF1YWxzKEVOVElUWV9CRUFOICkpIHsKLSAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9CRUFOUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJzZVN0YXRlID09IFNUQVRFX0lOX1NFU1NJT04gJiYgbmFtZS5lcXVhbHMoU0VTU0lPTl9CRUFOKSkgewotICAgICAgICAgICAgcGFyc2VTdGF0ZSA9IFNUQVRFX0lOX0JFQU5TOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fQkVBTlMgJiYgbmFtZS5lcXVhbHMoRU5URVJQUklTRV9CRUFOUykpIHsKLSAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9FSkJKQVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyc2VTdGF0ZSA9PSBTVEFURV9JTl9FSkJKQVIgJiYgbmFtZS5lcXVhbHMoRUpCX0pBUikpIHsKLSAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9MT09LSU5HX0VKQkpBUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNBWCBwYXJzZXIgY2FsbC1iYWNrIG1ldGhvZCBpbnZva2VkIHdoZW5ldmVyIGNoYXJhY3RlcnMgYXJlIGxvY2F0ZWQgd2l0aGluCi0gICAgICogYW4gZWxlbWVudC4gIGN1cnJlbnRBdHRyaWJ1dGUgKG1vZGlmaWVkIGJ5IHN0YXJ0RWxlbWVudCBhbmQgZW5kRWxlbWVudCkKLSAgICAgKiB0ZWxscyB1cyB3aGV0aGVyIHdlIGFyZSBpbiBhbiBpbnRlcmVzdGluZyBlbGVtZW50IChvbmUgb2YgdGhlIHVwIHRvIGZvdXIKLSAgICAgKiBjbGFzc2VzIG9mIGFuIEVKQikuICBJZiBzbyB0aGVuIGNvbnZlcnRzIHRoZSBjbGFzc25hbWUgZnJvbSB0aGUgZm9ybWF0Ci0gICAgICogb3JnLmFwYWNoZS50b29scy5hbnQuUGFyc2VyIHRvIHRoZSBjb252ZW50aW9uIGZvciBzdG9yaW5nIHN1Y2ggYSBjbGFzcywKLSAgICAgKiBvcmcvYXBhY2hlL3Rvb2xzL2FudC9QYXJzZXIuY2xhc3MuICBUaGlzIGlzIHRoZW4gcmVzb2x2ZWQgaW50byBhIGZpbGUKLSAgICAgKiBvYmplY3QgdW5kZXIgdGhlIHNyY2RpciB3aGljaCBpcyBzdG9yZWQgaW4gYSBIYXNodGFibGUuCi0gICAgICogQHBhcmFtIGNoIEEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBjaGFyYWN0ZXJzIGluCi0gICAgICogICAgICAgIHRoZSBlbGVtZW50LCBhbmQgbWF5YmUgb3RoZXJzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICogQHBhcmFtIHN0YXJ0IEFuIGludGVnZXIgbWFya2luZyB0aGUgcG9zaXRpb24gaW4gdGhlIGNoYXIKLSAgICAgKiAgICAgICAgYXJyYXkgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgotICAgICAqIEBwYXJhbSBsZW5ndGggQW4gaW50ZWdlciByZXByZXNlbnRpbmcgYW4gb2Zmc2V0IGludG8gdGhlCi0gICAgICogICAgICAgIGNoYXIgYXJyYXkgd2hlcmUgdGhlIGN1cnJlbnQgZGF0YSB0ZXJtaW5hdGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIGN1cnJlbnRUZXh0ICs9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudCgpIHsKLSAgICAgICAgaWYgKGluRUpCUmVmIHx8IAotICAgICAgICAgICAgKHBhcnNlU3RhdGUgIT0gU1RBVEVfSU5fRU5USVRZICYmIHBhcnNlU3RhdGUgIT0gU1RBVEVfSU5fU0VTU0lPTikpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhIT01FX0lOVEVSRkFDRSkgICB8fAotICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuZXF1YWxzKFJFTU9URV9JTlRFUkZBQ0UpIHx8Ci0gICAgICAgICAgICBjdXJyZW50RWxlbWVudC5lcXVhbHMoQkVBTl9DTEFTUykgICAgICAgfHwKLSAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmVxdWFscyhQS19DTEFTUykpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IHRoZSBmaWxlbmFtZSBpbnRvIGEgU3RyaW5nIG9iamVjdAotICAgICAgICAgICAgRmlsZSBjbGFzc0ZpbGUgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGN1cnJlbnRUZXh0LnRyaW0oKTsKLQotICAgICAgICAgICAgLy8gSWYgaXQncyBhIHByaW1pdGl2ZSB3cmFwcGVyIHRoZW4gd2Ugc2hvdWxkbid0IHRyeSBhbmQgcHV0Ci0gICAgICAgICAgICAvLyBpdCBpbnRvIHRoZSBqYXIsIHNvIGlnbm9yZSBpdC4KLSAgICAgICAgICAgIGlmICghY2xhc3NOYW1lLnN0YXJ0c1dpdGgoImphdmEuIikgJiYKLSAgICAgICAgICAgICAgICAhY2xhc3NOYW1lLnN0YXJ0c1dpdGgoImphdmF4LiIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJhbnNsYXRlIHBlcmlvZHMgaW50byBwYXRoIHNlcGFyYXRvcnMsIGFkZCAuY2xhc3MgdG8gdGhlCi0gICAgICAgICAgICAgICAgLy8gbmFtZSwgY3JlYXRlIHRoZSBGaWxlIG9iamVjdCBhbmQgYWRkIGl0IHRvIHRoZSBIYXNodGFibGUuCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArPSAiLmNsYXNzIjsKLSAgICAgICAgICAgICAgICBjbGFzc0ZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgZWpiRmlsZXMucHV0KGNsYXNzTmFtZSwgY2xhc3NGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgPGVqYi1uYW1lPiB0YWcuICBPbmx5IHRoZSBmaXJzdCBvY2N1cmVuY2UuCi0gICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5lcXVhbHMoRUpCX05BTUUpKSB7Ci0gICAgICAgICAgICBpZiAoIGVqYk5hbWUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBlamJOYW1lID0gY3VycmVudFRleHQudHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0VKQkRlcGxveW1lbnRUb29sLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRUpCRGVwbG95bWVudFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4YWJmMC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRUpCRGVwbG95bWVudFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkRlcGxveW1lbnRUb29sIHsKLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBnZW5lcmF0aW5nIHRoZSBuZWNlc3NhcnkgdmVuZG9yIHNwZWNpZmljCi0gICAgICogZGVwbG95bWVudCBmaWxlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yRmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAqIEBwYXJhbSBzYXhQYXJzZXIgYSBTQVggcGFyc2VyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBhcnNlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NEZXNjcmlwdG9yKFN0cmluZyBkZXNjcmlwdG9yRmlsZW5hbWUsIFNBWFBhcnNlciBzYXhQYXJzZXIpIAotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIHRvb2wgcGFyYW1ldGVycyBoYXZlIGJlZW4gY29uZmlndXJlZC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJlZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdGFzayB3aGljaCBvd25zIHRoaXMgdG9vbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhc2soVGFzayB0YXNrKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgdGhpcyB0b29sIGZvciB1c2UgaW4gdGhlIGVqYmphciB0YXNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShFamJKYXIuQ29uZmlnIGNvbmZpZyk7ICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRWpiSmFyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRWpiSmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxY2I1NDkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0VqYkphci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi0vLyBTdGFuZGFyZCBqYXZhIGltcG9ydHMKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8vIFhNTCBpbXBvcnRzCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8vIEFwYWNoZS9BbnQgaW1wb3J0cwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLQotLyoqCi0gKiA8cD5Qcm92aWRlcyBhdXRvbWF0ZWQgZWpiIGphciBmaWxlIGNyZWF0aW9uIGZvciBhbnQuICBFeHRlbmRzIHRoZSBNYXRjaGluZ1Rhc2sKLSAqIGNsYXNzIHByb3ZpZGVkIGluIHRoZSBkZWZhdWx0IGFudCBkaXN0cmlidXRpb24gdG8gcHJvdmlkZSBhIGRpcmVjdG9yeSBzY2FubmluZwotICogRUpCIGphcmZpbGUgZ2VuZXJhdG9yLjwvcD4KLSAqCi0gKiA8cD5UaGUgdGFzayB3b3JrcyBieSB0YWtpbmcgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgb25lIGF0IGEgdGltZSBhbmQKLSAqIHBhcnNpbmcgdGhlbSB0byBsb2NhdGUgdGhlIG5hbWVzIG9mIHRoZSBjbGFzc2VzIHdoaWNoIHNob3VsZCBiZSBwbGFjZWQgaW4KLSAqIHRoZSBqYXIuICBUaGUgY2xhc3NuYW1lcyBhcmUgdHJhbnNsYXRlZCB0byBqYXZhLmlvLkZpbGVzIGJ5IHJlcGxhY2luZyBwZXJpb2RzCi0gKiB3aXRoIEZpbGUuc2VwYXJhdG9yQ2hhciBhbmQgcmVzb2x2aW5nIHRoZSBnZW5lcmF0ZWQgZmlsZW5hbWUgYXMgYSByZWxhdGl2ZQotICogcGF0aCB1bmRlciB0aGUgc3JjRGlyIGF0dHJpYnV0ZS4gIEFsbCBuZWNlc3NhcnkgZmlsZXMgYXJlIHRoZW4gYXNzZW1ibGVkIGludG8KLSAqIGEgamFyZmlsZS4gIE9uZSBqYXJmaWxlIGlzIGNvbnN0cnVjdGVkIGZvciBlYWNoIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3VuZC4KLSAqIDwvcD4KLSAqCi0gKiA8cD5GdW5jdGlvbmFsaXR5IGlzIGN1cnJlbnRseSBwcm92aWRlZCBmb3Igc3RhbmRhcmQgRUpCMS4xIGphcnMgYW5kIFdlYmxvZ2ljCi0gKiA1LjEgamFycy4gVGhlIHdlYmxvZ2ljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMsIHVzZWQgaW4gY29uc3RydWN0aW5nIHRoZSAKLSAqIFdlYmxvZ2ljIGphciwgYXJlIGxvY2F0ZWQgYmFzZWQgb24gYSBzaW1wbGUgbmFtaW5nIGNvbnZlbnRpb24uIFRoZSBuYW1lIG9mIHRoZQotICogc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIHRha2VuIHVwdG8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIGEgU3RyaW5nLAotICogc3BlY2lmaWVkIGJ5IHRoZSBhdHRyaWJ1dGUgYmFzZU5hbWVUZXJtaW5hdG9yLCBhbmQgdGhlbiB0aGUgcmVndWxhciBXZWJsb2dpYwotICogZGVzY3JpcHRvciBuYW1lIGlzIGFwcGVuZGVkLiBGb3IgZXhhbXBsZSBpZiBiYXNlTmFtZVRlcm1pbmF0b3IgaXMgc2V0IHRvICctJywKLSAqIGl0cyBkZWZhdWx0IHZhbHVlLCBhbmQgYSBzdGFuZGFyZCBkZXNjcmlwdG9yIGlzIGNhbGxlZCBGb28tZWpiLWphci54bWwgdGhlbgotICogdGhlIGZpbGVzIEZvby13ZWJsb2dpYy1lamItamFyLnhtbCBhbmQgRm9vLXdlYmxvZ2ljLWNtcC1yZGJtcy1qYXIueG1sIHdpbGwgYmUKLSAqIGxvb2tlZCBmb3IsIGFuZCBpZiBmb3VuZCwgaW5jbHVkZWQgaW4gdGhlIGphcmZpbGUuPC9wPgotICoKLSAqIDxwPkF0dHJpYnV0ZXMgYW5kIHNldHRlciBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBzdXBwb3J0IG9wdGlvbmFsIGdlbmVyYXRpb24KLSAqIG9mIFdlYmxvZ2ljNS4xIGphcnMsIG9wdGlvbmFsIGRlbGV0aW9uIG9mIGdlbmVyaWMgamFyIGZpbGVzLCBzZXR0aW5nIGFsdGVybmF0ZQotICogdmFsdWVzIGZvciBiYXNlTmFtZVRlcm1pbmF0b3IsIGFuZCBzZXR0aW5nIHRoZSBzdHJpbmdzIHRvIGFwcGVuZCB0byB0aGUgbmFtZXMKLSAqIG9mIHRoZSBnZW5lcmF0ZWQgamFyZmlsZXMuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnRmZW5uZWxsQHNhcGllbnQuY29tIj5UaW0gRmVubmVsbDwvYT4KLSAqLwotcHVibGljIGNsYXNzIEVqYkphciBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBEVERMb2NhdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0gICAgICAgICAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotICAgICAgICAgICAgcmV0dXJuIHB1YmxpY0lkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB3aGljaCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBzdGF0ZSBvZiB0aGUgZWpiamFyIHRhc2suCi0gICAgICogVGhpcyBzdGF0ZSBpcyBwYXNzZWQgdG8gdGhlIGRlcGxveW1lbnQgdG9vbHMgZm9yIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgQ29uZmlnIHsKLSAgICAgICAgLyoqIFN0b3JlcyBhIGhhbmRsZSB0byB0aGUgZGlyZWN0b3J5IHVuZGVyIHdoaWNoIHRvIHNlYXJjaCBmb3IgY2xhc3MgZmlsZXMgKi8KLSAgICAgICAgcHVibGljIEZpbGUgc3JjRGlyOwotCi0gICAgICAgIC8qKiBTdG9yZXMgYSBoYW5kbGUgdG8gdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCB0byBzZWFyY2ggZm9yIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgKi8KLSAgICAgICAgcHVibGljIEZpbGUgZGVzY3JpcHRvckRpcjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgdGhlICdiYXNlbmFtZScgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBiYXNlTmFtZVRlcm1pbmF0b3IgPSAiLSI7Ci0KLSAgICAgICAgLyoqIFN0b3JlcyBhIGhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24gRUpCIEphciBmaWxlICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgYmFzZUphck5hbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSBhIHBhY2thZ2Ugc3RydWN0dXJlCi0gICAgICAgICAqIG9mIGEgZmxhdCBkaXJlY3RvcnkgYXMgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgamFyIGZpbGVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZmxhdERlc3REaXIgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgY2xhc3NlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFBhdGggY2xhc3NwYXRoOwotICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQSBGaWxlc2V0IG9mIHN1cHBvcnQgY2xhc3NlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Qgc3VwcG9ydEZpbGVTZXRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBsaXN0IG9mIGNvbmZpZ3VyZWQgRFREIGxvY2F0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEFycmF5TGlzdCBkdGRMb2NhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5hbWluZyBzY2hlbWUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGdlbmVyYXRlZCBqYXIgbmFtZQotICAgICAgICAgKiBmcm9tIHRoZSBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTmFtaW5nU2NoZW1lIG5hbWluZ1NjaGVtZTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgTWFuaWZlc3QgZmlsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZpbGUgbWFuaWZlc3Q7Ci0gICAgfTsKLQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1pbmdTY2hlbWUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUpCX05BTUUgPSAiZWpiLW5hbWUiOwotICAgICAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUlkgPSAiZGlyZWN0b3J5IjsKLSAgICAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUiA9ICJkZXNjcmlwdG9yIjsKLSAgICAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQkFTRUpBUk5BTUUgPSAiYmFzZWphcm5hbWUiOwotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7RUpCX05BTUUsIERJUkVDVE9SWSwgREVTQ1JJUFRPUiwgQkFTRUpBUk5BTUV9OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25maWcgY29uZmlnID0gbmV3IENvbmZpZygpOwotCi0KLSAgICAvKiogU3RvcmVzIGEgaGFuZGxlIHRvIHRoZSBkaXJlY3RvcnkgdG8gcHV0IHRoZSBKYXIgZmlsZXMgaW4uIFRoaXMgaXMgb25seSB1c2VkCi0gICAgICAgIGJ5IHRoZSBnZW5lcmljIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0b29sIHdoaWNoIGlzIGNyZWF0ZWQgaWYgbm8gb3RoZXIKLSAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvb2xzIGFyZSBwcm92aWRlZC4gTm9ybWFsbHkgZWFjaCBkZXBsb3ltZW50IHRvb2wKLSAgICAgICAgd2lsbCBzcGVjaWZ5IHRoZSBkZXNpdGluYXRpb24gZGlyIGl0c2VsZi4gKi8KLSAgICBwcml2YXRlIEZpbGUgZGVzdERpcjsKLSAKLSAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBqYXJmaWxlLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyaWNKYXJTdWZmaXggPSAiLWdlbmVyaWMuamFyIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IG9mIGRlcGxveW1lbnQgdG9vbHMgd2UgYXJlIGdvaW5nIHRvIHJ1bi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdCBkZXBsb3ltZW50VG9vbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB3ZWJsb2dpYyBuZXN0ZWQgZWxlbWVudCB1c2VkIHRvIGNvbmZpZ3VyZSBhCi0gICAgICogZGVwbG95bWVudCB0b29sIGZvciBXZWJsb2dpYyBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXBsb3ltZW50IHRvb2wgaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2VibG9naWNEZXBsb3ltZW50VG9vbCBjcmVhdGVXZWJsb2dpYygpIHsKLSAgICAgICAgV2VibG9naWNEZXBsb3ltZW50VG9vbCB0b29sID0gbmV3IFdlYmxvZ2ljRGVwbG95bWVudFRvb2woKTsKLSAgICAgICAgdG9vbC5zZXRUYXNrKHRoaXMpOwotICAgICAgICBkZXBsb3ltZW50VG9vbHMuYWRkKHRvb2wpOwotICAgICAgICByZXR1cm4gdG9vbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCb3JsYW5kIG5lc3RlZCBlbGVtZW50IHVzZWQgdG8gY29uZmlndXJlIGEKLSAgICAgKiBkZXBsb3ltZW50IHRvb2wgZm9yIEJvcmxhbmQgc2VydmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGVwbG95bWVudCB0b29sIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIEJvcmxhbmREZXBsb3ltZW50VG9vbCBjcmVhdGVCb3JsYW5kKCkgewotICAgICAgICBsb2coIkJvcmxhbmQgZGVwbG95bWVudCB0b29scyIsICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQotICAgICAgICBCb3JsYW5kRGVwbG95bWVudFRvb2wgdG9vbCA9IG5ldyBCb3JsYW5kRGVwbG95bWVudFRvb2woKTsKLSAgICAgICAgdG9vbC5zZXRUYXNrKHRoaXMpOwotICAgICAgICBkZXBsb3ltZW50VG9vbHMuYWRkKHRvb2wpOwotICAgICAgICByZXR1cm4gdG9vbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgZWxlbWVudCB1c2VkIHRvIGNvbmZpZ3VyZSBhIGRlcGxveW1lbnQgdG9vbCBmb3IgaVBsYW5ldAotCSAqIEFwcGxpY2F0aW9uIFNlcnZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGRlcGxveW1lbnQgdG9vbCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBJUGxhbmV0RGVwbG95bWVudFRvb2wgY3JlYXRlSXBsYW5ldCgpIHsKLSAgICAgICAgbG9nKCJpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciBkZXBsb3ltZW50IHRvb2xzIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgSVBsYW5ldERlcGxveW1lbnRUb29sIHRvb2wgPSBuZXcgSVBsYW5ldERlcGxveW1lbnRUb29sKCk7Ci0gICAgICAgIHRvb2wuc2V0VGFzayh0aGlzKTsKLSAgICAgICAgZGVwbG95bWVudFRvb2xzLmFkZCh0b29sKTsKLSAgICAgICAgcmV0dXJuIHRvb2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgamJvc3MgbmVzdGVkIGVsZW1lbnQgdXNlZCB0byBjb25maWd1cmUgYQotICAgICAqIGRlcGxveW1lbnQgdG9vbCBmb3IgSmJvc3Mgc2VydmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGVwbG95bWVudCB0b29sIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIEpib3NzRGVwbG95bWVudFRvb2wgY3JlYXRlSmJvc3MoKSB7Ci0gICAgICAgIEpib3NzRGVwbG95bWVudFRvb2wgdG9vbCA9IG5ldyBKYm9zc0RlcGxveW1lbnRUb29sKCk7Ci0gICAgICAgIHRvb2wuc2V0VGFzayh0aGlzKTsKLSAgICAgICAgZGVwbG95bWVudFRvb2xzLmFkZCh0b29sKTsKLSAgICAgICAgcmV0dXJuIHRvb2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmVzdGVkIGVsZW1lbnQgZm9yIHdlYmxvZ2ljIHdoZW4gdXNpbmcgdGhlIFRvcGxpbmsKLSAgICAgKiBPYmplY3QtIFJlbGF0aW9uYWwgbWFwcGluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGRlcGxveW1lbnQgdG9vbCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBXZWJsb2dpY1RPUExpbmtEZXBsb3ltZW50VG9vbCBjcmVhdGVXZWJsb2dpY3RvcGxpbmsoKSB7Ci0gICAgICAgIFdlYmxvZ2ljVE9QTGlua0RlcGxveW1lbnRUb29sIHRvb2wgPSBuZXcgV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2woKTsKLSAgICAgICAgdG9vbC5zZXRUYXNrKHRoaXMpOwotICAgICAgICBkZXBsb3ltZW50VG9vbHMuYWRkKHRvb2wpOwotICAgICAgICByZXR1cm4gdG9vbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LgotICAgICAqCi0gICAgICogVGhpcyBjbGFzc3BhdGggaXMgdXNlZCB0byBsb2NhdGUgdGhlIHN1cGVyIGNsYXNzZXMgYW5kIGludGVyZmFjZXMKLSAgICAgKiBvZiB0aGUgY2xhc3NlcyB0aGF0IHdpbGwgbWFrZSB1cCB0aGUgRUpCIGphci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQuCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAoY29uZmlnLmNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWcuY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbmZpZy5jbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIERURCBsb2NhdGlvbiByZWNvcmQuIFRoaXMgc3RvcmVzIHRoZSBsb2NhdGlvbiBvZiBhIERURC4gVGhlIERURCBpcyBpZGVudGlmaWVkCi0gICAgICogYnkgaXRzIHB1YmxpYyBJZC4gVGhlIGxvY2F0aW9uIG1heSBlaXRoZXIgYmUgYSBmaWxlIGxvY2F0aW9uIG9yIGEgcmVzb3VyY2UgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIERURExvY2F0aW9uIGNyZWF0ZURURCgpIHsKLSAgICAgICAgRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSBuZXcgRFRETG9jYXRpb24oKTsKLSAgICAgICAgY29uZmlnLmR0ZExvY2F0aW9ucy5hZGQoZHRkTG9jYXRpb24pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGR0ZExvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGZpbGUgc2V0IGZvciBzdXBwb3J0IGVsZW1lbnRzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgZmlsZXNldCB3aGljaCBjYW4gYmUgcG9wdWxhdGVkIHdpdGggc3VwcG9ydCBmaWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVNldCBjcmVhdGVTdXBwb3J0KCkgewotICAgICAgICBGaWxlU2V0IHN1cHBvcnRGaWxlU2V0ID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgY29uZmlnLnN1cHBvcnRGaWxlU2V0cy5hZGQoc3VwcG9ydEZpbGVTZXQpOwotICAgICAgICByZXR1cm4gc3VwcG9ydEZpbGVTZXQ7Ci0gICAgfQotICAgIAotCi0gICAgIC8qKgotICAgICAgKiBTZXQgdGhlIE1hbmlmZXN0IGZpbGUgdG8gdXNlIHdoZW4gamFycmluZy4KLSAgICAgICoKLSAgICAgICogQXMgb2YgRUpCIDEuMSwgbWFuaWZlc3QgZmlsZXMgYXJlIG5vIGxvbmdlciB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgRUpCLiBIb3dldmVyLCB0aGV5Ci0gICAgICAqIHN0aWxsIGhhdmUgYSB2aXRhbCBpbXBvcnRhbmNlIGlmIHRoZSBFSkIgaXMgaW50ZW5kZWQgdG8gYmUgcGFja2FnZWQgaW4gYW4gRUFSIGZpbGUuCi0gICAgICAqIEJ5IGFkZGluZyAiQ2xhc3MtUGF0aCIgc2V0dGluZ3MgdG8gYSBNYW5pZmVzdCBmaWxlLCB0aGUgRUpCIGNhbiBsb29rIGZvciBjbGFzc2VzIGluc2lkZQotICAgICAgKiB0aGUgRUFSIGZpbGUgaXRzZWxmLCBhbGxvd2luZyBmb3IgZWFzaWVyIGRlcGxveW1lbnQuIFRoaXMgaXMgb3V0bGluZWQgaW4gdGhlIEoyRUUKLSAgICAgICogc3BlY2lmaWNhdGlvbiwgYW5kIGFsbCBKMkVFIGNvbXBvbmVudHMgYXJlIG1lYW50IHRvIHN1cHBvcnQgaXQuCi0gICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChGaWxlIG1hbmlmZXN0KSB7Ci0gICAgICAgICBjb25maWcubWFuaWZlc3QgPSBtYW5pZmVzdDsKLSAgICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzcmNkaXIgYXR0cmlidXRlLiBUaGUgc291cmNlIGRpcmVjdG9yeSBpcyB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMKLSAgICAgKiB0aGUgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEVKQiBqYXIuIFR5cGljYWxseSB0aGlzIHdpbGwgaW5jbHVkZSB0aGUgCi0gICAgICogaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgYW5kIHRoZSBiZWFuIGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGluRGlyIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNyY2RpcihGaWxlIGluRGlyKSB7Ci0gICAgICAgIGNvbmZpZy5zcmNEaXIgPSBpbkRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlc2NyaXB0b3IgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogVGhlIGRlc2NyaXB0b3IgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gVGhlc2UgYXJlIFhNTAotICAgICAqIGZpbGVzIHRoYXQgZGVjbGFyZSB0aGUgcHJvcGVydGllcyBvZiBhIGJlYW4gaW4gYSBwYXJ0aWN1bGFyIGRlcGxveW1lbnQgc2NlbmFyaW8uIFN1Y2gKLSAgICAgKiBwcm9wZXJ0aWVzIGluY2x1ZGUsIGZvciBleGFtcGxlLCB0aGUgdHJhbnNhY3Rpb25hbCBuYXR1cmUgb2YgdGhlIGJlYW4gYW5kIHRoZSBzZWN1cml0eQotICAgICAqIGFjY2VzcyBjb250cm9sIHRvIHRoZSBiZWFuJ3MgbWV0aG9kcy4gIAotICAgICAqCi0gICAgICogQHBhcmFtIGluRGlyIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yZGlyKEZpbGUgaW5EaXIpIHsKLSAgICAgICAgY29uZmlnLmRlc2NyaXB0b3JEaXIgPSBpbkRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGJhc2UgbmFtZSBvZiB0aGUgRUpCIGphciB0aGF0IGlzIHRvIGJlIGNyZWF0ZWQgaWYgaXQgaXMgbm90IHRvIGJlCi0gICAgICogZGV0ZXJtaW5lZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBpblZhbHVlIHRoZSBiYXNlbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHdyaXRpbmcgdGhlIGphciBmaWxlIGNvbnRhaW5pbmcKLSAgICAgKiB0aGUgRUpCCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZWphcm5hbWUoU3RyaW5nIGluVmFsdWUpIHsKLSAgICAgICAgY29uZmlnLmJhc2VKYXJOYW1lID0gaW5WYWx1ZTsKLSAgICAgICAgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLm5hbWluZ1NjaGVtZSA9IG5ldyBOYW1pbmdTY2hlbWUoKTsKLSAgICAgICAgICAgIGNvbmZpZy5uYW1pbmdTY2hlbWUuc2V0VmFsdWUoTmFtaW5nU2NoZW1lLkJBU0VKQVJOQU1FKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhOYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBiYXNlamFybmFtZSBhdHRyaWJ1dGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKSArICIgbmFtaW5nIHNjaGVtZSIpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtaW5nIHNjaGVtZSB1c2VkIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGphcnMKLSAgICAgKiBmcm9tIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBOYW1pbmdTY2hlbWUgdGhlIG5hbWlnbiBzY2hlbWUgdG8gYmUgdXNlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWluZyhOYW1pbmdTY2hlbWUgbmFtaW5nU2NoZW1lKSB7Ci0gICAgICAgIGNvbmZpZy5uYW1pbmdTY2hlbWUgPSBuYW1pbmdTY2hlbWU7Ci0gICAgICAgIGlmICghY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhOYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpICYmCi0gICAgICAgICAgICBjb25maWcuYmFzZUphck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgYmFzZWphcm5hbWUgYXR0cmlidXRlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkgKyAiIG5hbWluZyBzY2hlbWUiKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBUaGUgRUpCIGphciBmaWxlcyB3aWxsIGJlIHdyaXR0ZW4gaW50byB0aGlzIGRpcmVjdG9yeS4gVGhlIGphciBmaWxlcyB0aGF0IGV4aXN0IGluCi0gICAgICogdGhpcyBkaXJlY3RvcnkgYXJlIGFsc28gdXNlZCB3aGVuIGRldGVybWluaW5nIGlmIHRoZSBjb250ZW50cyBvZiB0aGUgamFyIGZpbGUgCi0gICAgICogaGF2ZSBjaGFuZ2VkLgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBpZiBubyBkZXBsb3ltZW50IHRvb2xzIGFyZSBzcGVjaWZpZWQuIFR5cGljYWxseQotICAgICAqIGVhY2ggZGVwbG95bWVudCB0b29sIHdpbGwgc3BlY2lmeSBpdHMgb3duIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5GaWxlIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGluRGlyKSB7Ci0gICAgICAgIHRoaXMuZGVzdERpciA9IGluRGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIHJlc29sdmluZyBjbGFzc2VzIGZvciBpbmNsdXNpb24gaW4gdGhlIGphci4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRoZSBjbGFzc3BhdGggdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgewotICAgICAgICBjb25maWcuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZmxhdCBkZXN0IGRpciBmbGFnLgotICAgICAqCi0gICAgICogVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIGphcnMgYXJlIHdyaXR0ZW4gb3V0IGluIHRoZSAKLSAgICAgKiBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2l0aCB0aGUgc2FtZSBoaWVyYXJjaGFsIHN0cnVjdHVyZSBmcm9tIHdoaWNoIAotICAgICAqIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGhhdmUgYmVlbiByZWFkLiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZSAKLSAgICAgKiBnZW5lcmF0ZWQgRUpCIGphcnMgYXJlIHdyaXR0ZW4gaW50byB0aGUgcm9vdCBvZiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LAotICAgICAqIG90aGVyd2lzZSB0aGV5IGFyZSB3cml0dGVuIG91dCBpbiB0aGUgc2FtZSByZWxhdGl2ZSBwb3NpdGlvbiBhcyB0aGUgZGVwbG95bWVudAotICAgICAqIGRlc2NyaXB0b3JzIGluIHRoZSBkZXNjcmlwdG9yIGRpcmVjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5WYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGF0ZGVzdGRpciBmbGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZsYXRkZXN0ZGlyKGJvb2xlYW4gaW5WYWx1ZSkgewotICAgICAgICBjb25maWcuZmxhdERlc3REaXIgPSBpblZhbHVlOwotICAgIH0KLSAgICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzdWZmaXggZm9yIHRoZSBnZW5lcmF0ZWQgamFyIGZpbGUuCi0gICAgICogV2hlbiBnZW5lcmljIGphcnMgYXJlIGdlbmVyYXRlZCwgdGhleSBoYXZlIGEgc3VmZml4IHdoaWNoIGlzIGFwcGVuZGVkIHRvIHRoZQotICAgICAqIHRoZSBiZWFuIG5hbWUgdG8gY3JlYXRlIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZS4gTm90ZSB0aGF0IHRoaXMgc3VmZml4IGluY2x1ZGVzCi0gICAgICogdGhlIGV4dGVuc2lvbiBmbyB0ZSBqYXIgZmlsZSBhbmQgc2hvdWxkIHRoZXJlZm9yZSBlbmQgd2l0aCBhbiBhcHByb3ByaWF0ZSAKLSAgICAgKiBleHRlbnNpb24gc3VjaCBhcyAuamFyIG9yIC5lYXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHN1ZmZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmljamFyc3VmZml4KFN0cmluZyBpblN0cmluZykgewotICAgICAgICB0aGlzLmdlbmVyaWNKYXJTdWZmaXggPSBpblN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGJhc2VOYW1lVGVybWluYXRvci4KLSAgICAgKgotICAgICAqIFRoZSBiYXNlbmFtZSB0ZXJtaW5hdG9yIGlzIHRoZSBzdHJpbmcgd2hpY2ggdGVybWluYXRlcyB0aGUgYmVhbiBuYW1lLiBUaGUgY29udmVudGlvbgotICAgICAqIHVzZWQgYnkgdGhpcyB0YXNrIGlzIHRoYXQgYmVhbiBkZXNjcmlwdG9ycyBhcmUgbmFtZWQgYXMgdGhlIEJlYW5OYW1lIHdpdGggc29tZSBzdWZmaXguIAotICAgICAqIFRoZSBiYXNlTmFtZVRlcm1pbmF0b3Igc3RyaW5nIHNlcGFyYXRlcyB0aGUgYmVhbiBuYW1lIGFuZCB0aGUgc3VmZml4IGFuZCBpcyB1c2VkIHRvCi0gICAgICogZGV0ZXJtaW5lIHRoZSBiZWFuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5WYWx1ZSBhIHN0cmluZyB3aGljaCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBiYXNlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlbmFtZXRlcm1pbmF0b3IoU3RyaW5nIGluVmFsdWUpIHsKLSAgICAgICAgY29uZmlnLmJhc2VOYW1lVGVybWluYXRvciA9IGluVmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29uZmlnKCkgewotICAgICAgICBpZiAoY29uZmlnLnNyY0RpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBzcmNEaXIgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uZmlnLmRlc2NyaXB0b3JEaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLmRlc2NyaXB0b3JEaXIgPSBjb25maWcuc3JjRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLm5hbWluZ1NjaGVtZSA9IG5ldyBOYW1pbmdTY2hlbWUoKTsKLSAgICAgICAgICAgIGNvbmZpZy5uYW1pbmdTY2hlbWUuc2V0VmFsdWUoTmFtaW5nU2NoZW1lLkRFU0NSSVBUT1IpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKS5lcXVhbHMoTmFtaW5nU2NoZW1lLkJBU0VKQVJOQU1FKSAmJgotICAgICAgICAgICAgICAgICBjb25maWcuYmFzZUphck5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgYmFzZWphcm5hbWUgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aGUgYmFzZWphcm5hbWUgbmFtaW5nIHNjaGVtZSIpOwotICAgICAgICB9Ci0gICAgfSAgICAgICAgCi0KLSAgICAvKioKLSAgICAgKiBJbnZva2VkIGJ5IEFudCBhZnRlciB0aGUgdGFzayBpcyBwcmVwYXJlZCwgd2hlbiBpdCBpcyByZWFkeSB0byBleGVjdXRlCi0gICAgICogdGhpcyB0YXNrLiAgCi0gICAgICoKLSAgICAgKiBUaGlzIHdpbGwgY29uZmlndXJlIGFsbCBvZiB0aGUgbmVzdGVkIGRlcGxveW1lbnQgdG9vbHMgdG8gYWxsb3cgdGhlbSB0byAKLSAgICAgKiBwcm9jZXNzIHRoZSBqYXIuIElmIG5vIGRlcGxveW1lbnQgdG9vbHMgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgYSBnZW5lcmljIAotICAgICAqIHRvb2wgaXMgY3JlYXRlZCB0byBoYW5kbGUgdGhlIGphci4KLSAgICAgKiAKLSAgICAgKiBBIHBhcnNlciBpcyBjb25maWd1cmVkIGFuZCB0aGVuIGVhY2ggZGVzY3JpcHRvciBmb3VuZCBpcyBwYXNzZWQgdG8gYWxsCi0gICAgICogdGhlIGRlcGxveW1lbnQgdG9vbCBlbGVtZW50cyBmb3IgcHJvY2Vzc2luZy4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gdGhyb3duIHdoZW5ldmVyIGEgcHJvYmxlbSBpcwotICAgICAqICAgICAgICAgICAgZW5jb3VudGVyZWQgdGhhdCBjYW5ub3QgYmUgcmVjb3ZlcmVkIGZyb20sIHRvIHNpZ25hbCB0byBhbnQKLSAgICAgKiAgICAgICAgICAgIHRoYXQgYSBtYWpvciBwcm9ibGVtIG9jY3VycmVkIHdpdGhpbiB0aGlzIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlQ29uZmlnKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVwbG95bWVudFRvb2xzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBHZW5lcmljRGVwbG95bWVudFRvb2wgZ2VuZXJpY1Rvb2wgPSBuZXcgR2VuZXJpY0RlcGxveW1lbnRUb29sKCk7Ci0gICAgICAgICAgICBnZW5lcmljVG9vbC5zZXRUYXNrKHRoaXMpOwotICAgICAgICAgICAgZ2VuZXJpY1Rvb2wuc2V0RGVzdGRpcihkZXN0RGlyKTsKLSAgICAgICAgICAgIGdlbmVyaWNUb29sLnNldEdlbmVyaWNKYXJTdWZmaXgoZ2VuZXJpY0phclN1ZmZpeCk7Ci0gICAgICAgICAgICBkZXBsb3ltZW50VG9vbHMuYWRkKGdlbmVyaWNUb29sKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVwbG95bWVudFRvb2xzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIEVKQkRlcGxveW1lbnRUb29sIHRvb2wgPSAoRUpCRGVwbG95bWVudFRvb2wpaS5uZXh0KCk7Ci0gICAgICAgICAgICB0b29sLmNvbmZpZ3VyZShjb25maWcpOwotICAgICAgICAgICAgdG9vbC52YWxpZGF0ZUNvbmZpZ3VyZWQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcGFyc2VyIHVzaW5nIHdoYXRldmVyIHBhcnNlciB0aGUgc3lzdGVtIGRpY3RhdGVzCi0gICAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBzYXhQYXJzZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7Ci0gICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4UGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoY29uZmlnLmRlc2NyaXB0b3JEaXIpOwotICAgICAgICAgICAgZHMuc2NhbigpOwotICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgCi0gICAgICAgICAgICBsb2coZmlsZXMubGVuZ3RoICsgIiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGxvY2F0ZWQuIiwKLSAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmaWxlcy4gRWFjaCBmaWxlIHJlcHJlc2VudHMgb25lIGRlcGxveW1lbnQKLSAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IsIGFuZCBoZW5jZSBvbmUgYmVhbiBpbiBvdXIgbW9kZWwuCi0gICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZmlsZXMubGVuZ3RoOyArK2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluIGVhY2ggdG9vbAotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlcGxveW1lbnRUb29scy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVKQkRlcGxveW1lbnRUb29sIHRvb2wgPSAoRUpCRGVwbG95bWVudFRvb2wpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvb2wucHJvY2Vzc0Rlc2NyaXB0b3IoZmlsZXNbaW5kZXhdLCBzYXhQYXJzZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJTQVhFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgcGFyc2VyLiIKLSAgICAgICAgICAgICAgICArICIgIERldGFpbHM6ICIKLSAgICAgICAgICAgICAgICArIHNlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIHNlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyBwYXJzZXIuICIKLSAgICAgICAgICAgICAgICAgICAgICAgKyAiRGV0YWlsczogIiArIHBjZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBwY2UpOwotICAgICAgICB9Ci0gICAgfSAvLyBlbmQgb2YgZXhlY3V0ZSgpCi19Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9FamJjLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRWpiYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTIyY2RhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9FamJjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQnVpbGQgRUpCIHN1cHBvcnQgY2xhc3NlcyB1c2luZyBXZWJsb2dpYydzIGVqYmMgdG9vbCBmcm9tIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcKLSAqIGEgc2V0IG9mIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0gCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAY29ydGV4ZWJ1c2luZXNzLmNvbS5hdSI+Q29ub3IgTWFjTmVpbGw8L2E+LCBDb3J0ZXggZWJ1c2luZXNzIFB0eSBMaW1pdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJjIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKLSAgICAvKioKLSAgICAgKiBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHRyZWUgY29udGFpbmluZyB0aGUgc2VyaWFsaXNlZCBkZXBsb3ltZW50IGRlc2NpcHRvcnMuIFRoZSBhY3R1YWwKLSAgICAgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMgYXJlIHNlbGVjdGVkIHVzaW5nIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgY29uc3RydWN0cwotICAgICAqIG9uIHRoZSBlamJjIHRhc2sgcHJvdmlkZWQgYnkgdGhlIE1hdGNoaW5nVGFzayBzdXBlcmNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBkZXNjcmlwdG9yRGlyZWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgZ2VuZXJhdGVkIGZpbGVzIGFyZSBwbGFjZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGdlbmVyYXRlZEZpbGVzRGlyZWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtYW5pZmVzdCBmaWxlIGdlbmVyYXRlZCBmb3IgdGhlIEVKQiBqYXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGdlbmVyYXRlZE1hbmlmZXN0RmlsZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgaW4gdGhlIHdlYmxvZ2ljIGVqYmMgY2FsbHMuIEl0IG11c3QgY29udGFpbiB0aGUgd2VibG9naWMKLSAgICAgKiBjbGFzc2VzIDxiPmFuZDwvYj4gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgb2YgdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzcGF0aDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgc291cmNlIGRpcmVjdG9yeSBmb3IgdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0gICAgICogdGhlIGdlbmVyYXRlZCBkZXBsb3ltZW50IGNsYXNzZXMgYXJlIG91dCBvZiBkYXRlLgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4ga2VlcGdlbmVyYXRlZDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEbyB0aGUgd29yay4KLSAgICAgKgotICAgICAqIFRoZSB3b3JrIGlzIGFjdHVhbGx5IGRvbmUgYnkgY3JlYXRpbmcgYSBzZXBhcmF0ZSBKVk0gdG8gcnVuIGEgaGVscGVyIHRhc2suIAotICAgICAqIFRoaXMgYXBwcm9hY2ggYWxsb3dzIHRoZSBjbGFzc3BhdGggb2YgdGhlIGhlbHBlciB0YXNrIHRvIGJlIHNldC4gU2luY2UgdGhlIAotICAgICAqIHdlYmxvZ2ljIHRvb2xzIHJlcXVpcmUgdGhlIGNsYXNzIGZpbGVzIG9mIHRoZSBwcm9qZWN0J3MgaG9tZSBhbmQgcmVtb3RlIAotICAgICAqIGludGVyZmFjZXMgdG8gYmUgYXZhaWxhYmxlIGluIHRoZSBjbGFzc3BhdGgsIHRoaXMgYWxzbyBhdm9pZHMgaGF2aW5nIHRvIAotICAgICAqIHN0YXJ0IGFudCB3aXRoIHRoZSBjbGFzcyBwYXRoIG9mIHRoZSBwcm9qZWN0IGl0IGlzIGJ1aWxkaW5nLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yRGlyZWN0b3J5ID09IG51bGwgfHwKLSAgICAgICAgICAgICFkZXNjcmlwdG9yRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzY3JpcHRvcnMgZGlyZWN0b3J5ICIgKyBkZXNjcmlwdG9yRGlyZWN0b3J5LmdldFBhdGgoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IHZhbGlkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdlbmVyYXRlZEZpbGVzRGlyZWN0b3J5ID09IG51bGwgfHwKLSAgICAgICAgICAgICFnZW5lcmF0ZWRGaWxlc0RpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3QgZGlyZWN0b3J5ICIgKyBnZW5lcmF0ZWRGaWxlc0RpcmVjdG9yeS5nZXRQYXRoKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCB2YWxpZCIpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKHNvdXJjZURpcmVjdG9yeSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAhc291cmNlRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjIGRpcmVjdG9yeSAiICsgc291cmNlRGlyZWN0b3J5LmdldFBhdGgoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IHZhbGlkIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzeXN0ZW1DbGFzc1BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOwotICAgICAgICBTdHJpbmcgZXhlY0NsYXNzUGF0aCA9IHByb2plY3QudHJhbnNsYXRlUGF0aChzeXN0ZW1DbGFzc1BhdGggKyAiOiIgKyBjbGFzc3BhdGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiICsgZ2VuZXJhdGVkRmlsZXNEaXJlY3RvcnkpOwotICAgICAgICAvLyBnZXQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgZGVzY3JpcHRvciBkaXJlY3RvcnkKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHN1cGVyLmdldERpcmVjdG9yeVNjYW5uZXIoZGVzY3JpcHRvckRpcmVjdG9yeSk7Ci0gICAKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0KLSAgICAgICAgSmF2YSBoZWxwZXJUYXNrID0gKEphdmEpcHJvamVjdC5jcmVhdGVUYXNrKCJqYXZhIik7Ci0gICAgICAgIGhlbHBlclRhc2suc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgIGhlbHBlclRhc2suc2V0Rm9yayh0cnVlKTsKLSAgICAgICAgaGVscGVyVGFzay5zZXRDbGFzc25hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5FamJjSGVscGVyIik7Ci0gICAgICAgIFN0cmluZyBhcmdzID0gIiI7Ci0gICAgICAgIGFyZ3MgKz0gIiAiICsgZGVzY3JpcHRvckRpcmVjdG9yeTsKLSAgICAgICAgYXJncyArPSAiICIgKyBnZW5lcmF0ZWRGaWxlc0RpcmVjdG9yeTsKLSAgICAgICAgYXJncyArPSAiICIgKyBzb3VyY2VEaXJlY3Rvcnk7Ci0gICAgICAgIGFyZ3MgKz0gIiAiICsgZ2VuZXJhdGVkTWFuaWZlc3RGaWxlOwotICAgICAgICBhcmdzICs9ICIgIiArIGtlZXBnZW5lcmF0ZWQ7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBhcmdzICs9ICIgIiArIGZpbGVzW2ldOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ29tbWFuZGxpbmUuQXJndW1lbnQgYXJndW1lbnRzID0gaGVscGVyVGFzay5jcmVhdGVBcmcoKTsKLSAgICAgICAgYXJndW1lbnRzLnNldExpbmUoYXJncyk7Ci0gICAgICAgIGhlbHBlclRhc2suc2V0Q2xhc3NwYXRoKG5ldyBQYXRoKHByb2plY3QsIGV4ZWNDbGFzc1BhdGgpKTsKLSAgICAgICAgaWYgKGhlbHBlclRhc2suZXhlY3V0ZUphdmEoKSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGVjdXRpb24gb2YgZWpiYyBoZWxwZXIgZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0S2VlcGdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGtlZXBnZW5lcmF0ZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IGZyb20gd2hlcmUgdGhlIHNlcmlhbGlzZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUKLSAgICAgKiB0byBiZSByZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpck5hbWUgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzZXJpYWxpc2VkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvcnMoU3RyaW5nIGRpck5hbWUpIHsKLSAgICAgICAgZGVzY3JpcHRvckRpcmVjdG9yeSA9IG5ldyBGaWxlKGRpck5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBzdXBwb3J0IGNsYXNzZXMsIFJNSSBzdHVicywgZXRjIGFyZSB0byBiZSB3cml0dGVuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGlyTmFtZSB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggY29kZSBpcyBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0KFN0cmluZyBkaXJOYW1lKSB7Ci0gICAgICAgIGdlbmVyYXRlZEZpbGVzRGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEtlZXBnZW5lcmF0ZWQoU3RyaW5nIG5ld0tlZXBnZW5lcmF0ZWQpIHsKLSAgICAgICAga2VlcGdlbmVyYXRlZCA9IEJvb2xlYW4udmFsdWVPZihuZXdLZWVwZ2VuZXJhdGVkLnRyaW0oKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGdlbmVyYXRlZCBtYW5pZmVzdCBmaWxlLiAKLSAgICAgKgotICAgICAqIEZvciBlYWNoIEVKQiB0aGF0IGlzIHByb2Nlc3NlZCBhbiBlbnRyeSBpcyBjcmVhdGVkIGluIHRoaXMgZmlsZS4gVGhpcyBjYW4gdGhlbiBiZSB1c2VkCi0gICAgICogdG8gY3JlYXRlIGEgamFyIGZpbGUgZm9yIGRwbG95aW5nIHRoZSBiZWFucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYW5mZXN0RmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIG1hbmlmZXN0IGZpbGUgdG8gYmUgZ2VuZXJhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KFN0cmluZyBtYW5pZmVzdEZpbGVuYW1lKSB7Ci0gICAgICAgIGdlbmVyYXRlZE1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKG1hbmlmZXN0RmlsZW5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgcykgewotICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IHByb2plY3QudHJhbnNsYXRlUGF0aChzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZQotICAgICAqIGFuZCBwdWJsaWMga2V5IGNsYXNzIGRlZmluaXRpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpck5hbWUgdGhlIGRpcmVjdG9yeSBjb250YWluZyB0aGUgc291cmNlIHRyZWUgZm9yIHRoZSBFSkIncyBpbnRlcmZhY2UgY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIGRpck5hbWUpIHsKLSAgICAgICAgc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0VqYmNIZWxwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9FamJjSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzU1NmQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0VqYmNIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC5lamIuZGVwbG95bWVudC5FbnRpdHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmF4LmVqYi5kZXBsb3ltZW50LkRlcGxveW1lbnREZXNjcmlwdG9yOwotCi0KLS8qKgotICogQSBoZWxwZXIgY2xhc3Mgd2hpY2ggcGVyZm9ybXMgdGhlIGFjdHVhbCB3b3JrIG9mIHRoZSBlamJjIHRhc2suCi0gKgotICogVGhpcyBjbGFzcyBpcyBydW4gd2l0aCBhIGNsYXNzcGF0aCB3aGljaCBpbmNsdWRlcyB0aGUgd2VibG9naWMgdG9vbHMgYW5kIHRoZSBob21lIGFuZCByZW1vdGUKLSAqIGludGVyZmFjZSBjbGFzcyBmaWxlcyByZWZlcmVuY2VkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGJlaW5nIHByb2Nlc3NlZC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1Ij5Db25vciBNYWNOZWlsbDwvYT4sIENvcnRleCBlYnVzaW5lc3MgUHR5IExpbWl0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYmNIZWxwZXIgewotICAgIC8qKgotICAgICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgdHJlZSBjb250YWluaW5nIHRoZSBzZXJpYWxpc2VkIGRlcGxveW1lbnQgZGVzY2lwdG9ycy4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGRlc2NyaXB0b3JEaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSBnZW5lcmF0ZWQgZmlsZXMgYXJlIHBsYWNlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2VuZXJhdGVkRmlsZXNEaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIG1hbmlmZXN0IGZpbGUgZ2VuZXJhdGVkIGZvciB0aGUgRUpCIGphci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgbWFuaWZlc3RGaWxlOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBpbiB0aGUgd2VibG9naWMgZWpiYyBjYWxscy4gSXQgbXVzdCBjb250YWluIHRoZSB3ZWJsb2dpYwotICAgICAqIGNsYXNzZXMgPGI+YW5kPC9iPiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBvZiB0aGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NwYXRoOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBzb3VyY2UgZGlyZWN0b3J5IGZvciB0aGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYKLSAgICAgKiB0aGUgZ2VuZXJhdGVkIGRlcGxveW1lbnQgY2xhc3NlcyBhcmUgb3V0IG9mIGRhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHNvdXJjZURpcmVjdG9yeTsKLSAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lcyBvZiB0aGUgc2VyaWFsaXNlZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi0gICAgICovCi0gICAgU3RyaW5nW10gZGVzY3JpcHRvcnM7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4ga2VlcEdlbmVyYXRlZDsKLQotICAgIC8qKgotICAgICAqIENvbW1hbmQgbGluZSBpbnRlcmZhY2UgZm9yIHRoZSBlamJjIGhlbHBlciB0YXNrLgotICAgICAqLyAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRWpiY0hlbHBlciBoZWxwZXIgPSBuZXcgRWpiY0hlbHBlcihhcmdzKTsKLSAgICAgICAgaGVscGVyLnByb2Nlc3MoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGlzZSB0aGUgRWpiY0hlbHBlciBieSByZWFkaW5nIHRoZSBjb21tYW5kIGFyZ3VtZW50cy4KLSAgICAgKi8gICAgCi0gICAgcHJpdmF0ZSBFamJjSGVscGVyKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZGVzY3JpcHRvckRpcmVjdG9yeSA9IG5ldyBGaWxlKGFyZ3NbaW5kZXgrK10pOwotICAgICAgICBnZW5lcmF0ZWRGaWxlc0RpcmVjdG9yeSA9IG5ldyBGaWxlKGFyZ3NbaW5kZXgrK10pOwotICAgICAgICBzb3VyY2VEaXJlY3RvcnkgPSBuZXcgRmlsZShhcmdzW2luZGV4KytdKTsKLSAgICAgICAgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUoYXJnc1tpbmRleCsrXSk7Ci0gICAgICAgIGtlZXBHZW5lcmF0ZWQgPSBCb29sZWFuLnZhbHVlT2YoYXJnc1tpbmRleCsrXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIAotICAgICAgICBkZXNjcmlwdG9ycyA9IG5ldyBTdHJpbmdbYXJncy5sZW5ndGggLSBpbmRleF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpbmRleCA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldID0gYXJnc1tpbmRleCsrXTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldENvbW1hbmRMaW5lKGJvb2xlYW4gZGVidWcsIEZpbGUgZGVzY3JpcHRvckZpbGUpIHsKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGlmICghZGVidWcpIHsKLSAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLW5vZXhpdCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZWVwR2VuZXJhdGVkKSB7Ci0gICAgICAgICAgICB2LmFkZEVsZW1lbnQoIi1rZWVwZ2VuZXJhdGVkIik7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgICB2LmFkZEVsZW1lbnQoIi1kIik7Ci0gICAgICAgIHYuYWRkRWxlbWVudChnZW5lcmF0ZWRGaWxlc0RpcmVjdG9yeS5nZXRQYXRoKCkpOwotICAgICAgICB2LmFkZEVsZW1lbnQoZGVzY3JpcHRvckZpbGUuZ2V0UGF0aCgpKTsKLSAgICAKLSAgICAgICAgU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOwotICAgICAgICB2LmNvcHlJbnRvKGFyZ3MpOwotICAgICAgICByZXR1cm4gYXJnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHdlYmxvZ2ljIEVKQiBzdXBwb3J0IGNsYXNzZXMgbmVlZCB0byBiZSByZWdlbmVyYXRlZAotICAgICAqIGZvciBhIGdpdmVuIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgICAgKgotICAgICAqIFRoaXMgcHJvY2VzcyBhdHRlbXB0cyB0byBkZXRlcm1pbmUgaWYgdGhlIHN1cHBvcnQgY2xhc3NlcyBuZWVkIHRvIGJlCi0gICAgICogcmVidWlsdC4gSXQgZG9lcyB0aGlzIGJ5IGV4YW1pbmluZyBvbmx5IHNvbWUgb2YgdGhlIHN1cHBvcnQgY2xhc3NlcyAKLSAgICAgKiB3aGljaCBhcmUgdHlwaWNhbGx5IGdlbmVyYXRlZC4gSWYgdGhlIGVqYmMgdGFzayBpcyBpbnRlcnJ1cHRlZCBnZW5lcmF0aW5nCi0gICAgICogdGhlIHN1cHBvcnQgY2xhc3NlcyBmb3IgYSBiZWFuLCBhbGwgb2YgdGhlIHN1cHBvcnQgY2xhc3NlcyBzaG91bGQgYmUgcmVtb3ZlZAotICAgICAqIHRvIGZvcmNlIHJlZ2VuZXJhdGlvbiBvZiB0aGUgc3VwcG9ydCBjbGFzc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWxlIHRoZSBzZXJpYWxpc2VkIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXBwb3J0IGNsYXNzZXMgbmVlZCB0byBiZSByZWdlbmVyYXRlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGRlc2NyaXB0b3IgZmlsZSBjYW5ub3QgYmUgY2xvc2VkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlZ2VuUmVxdWlyZWQoRmlsZSBkZXNjcmlwdG9yRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gcmVhZCBpbiB0aGUgZGVzY3JpcHRvci4gVW5kZXIgd2VibG9naWMsIHRoZSBkZXNjcmlwdG9yIGlzIGEgd2VibG9naWMKLSAgICAgICAgLy8gc3BlY2lmaWMgc3ViY2xhc3Mgd2hpY2ggaGFzIHJlZmVyZW5jZXMgdG8gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuCi0gICAgICAgIC8vIFRoZXNlIGNsYXNzZXMgbXVzdCwgdGhlcmVmb3JlLCBiZSBpbiB0aGUgY2xhc3NwYXRoIHdoZW4gdGhlIGRlcGxveW1lbnQKLSAgICAgICAgLy8gZGVzY3JpcHRvciBpcyBsb2FkZWQgZnJvbSB0aGUgLnNlciBmaWxlCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShkZXNjcmlwdG9yRmlsZSk7Ci0gICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oZmlzKTsKLSAgICAgICAgICAgIERlcGxveW1lbnREZXNjcmlwdG9yIGRkID0gKERlcGxveW1lbnREZXNjcmlwdG9yKW9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGhvbWVJbnRlcmZhY2VQYXRoID0gZGQuZ2V0SG9tZUludGVyZmFjZUNsYXNzTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5qYXZhIjsKLSAgICAgICAgICAgIFN0cmluZyByZW1vdGVJbnRlcmZhY2VQYXRoID0gZGQuZ2V0UmVtb3RlSW50ZXJmYWNlQ2xhc3NOYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmphdmEiOwotICAgICAgICAgICAgU3RyaW5nIHByaW1hcnlLZXlDbGFzc1BhdGggPSBudWxsOwotICAgICAgICAgICAgaWYgKGRkIGluc3RhbmNlb2YgRW50aXR5RGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIHByaW1hcnlLZXlDbGFzc1BhdGggPSAoKEVudGl0eURlc2NyaXB0b3IpZGQpLmdldFByaW1hcnlLZXlDbGFzc05hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuamF2YSI7OwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgaG9tZUludGVyZmFjZVNvdXJjZSA9IG5ldyBGaWxlKHNvdXJjZURpcmVjdG9yeSwgaG9tZUludGVyZmFjZVBhdGgpOwotICAgICAgICAgICAgRmlsZSByZW1vdGVJbnRlcmZhY2VTb3VyY2UgPSBuZXcgRmlsZShzb3VyY2VEaXJlY3RvcnksIHJlbW90ZUludGVyZmFjZVBhdGgpOwotICAgICAgICAgICAgRmlsZSBwcmltYXJ5S2V5Q2xhc3NTb3VyY2UgPSBudWxsOwotICAgICAgICAgICAgaWYgKHByaW1hcnlLZXlDbGFzc1BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW1hcnlLZXlDbGFzc1NvdXJjZSA9IG5ldyBGaWxlKHNvdXJjZURpcmVjdG9yeSwgcmVtb3RlSW50ZXJmYWNlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFyZSBhbnkgb2YgdGhlIGFib3ZlIG91dCBvZiBkYXRlLiAKLSAgICAgICAgICAgIC8vIHdlIGZpbmQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgYW5kIHNlZSBpZiB0aGV5IGFyZSBvbGRlciB0aGFuIGFueQotICAgICAgICAgICAgLy8gb2YgdGhlIGFib3ZlIG9yIHRoZSAuc2VyIGZpbGUgaXRzZWxmLgotICAgICAgICAgICAgU3RyaW5nIGJlYW5DbGFzc0Jhc2UgPSBkZC5nZXRFbnRlcnByaXNlQmVhbkNsYXNzTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOwotICAgICAgICAgICAgRmlsZSBlamJJbXBsZW50YXRpb25DbGFzcyAKLSAgICAgICAgICAgICAgICA9IG5ldyBGaWxlKGdlbmVyYXRlZEZpbGVzRGlyZWN0b3J5LCBiZWFuQ2xhc3NCYXNlICsgIkVPSW1wbC5jbGFzcyIpOwotICAgICAgICAgICAgRmlsZSBob21lSW1wbGVtZW50YXRpb25DbGFzcyAKLSAgICAgICAgICAgICAgICA9IG5ldyBGaWxlKGdlbmVyYXRlZEZpbGVzRGlyZWN0b3J5LCBiZWFuQ2xhc3NCYXNlICsgIkhvbWVJbXBsLmNsYXNzIik7Ci0gICAgICAgICAgICBGaWxlIGJlYW5TdHViQ2xhc3MgCi0gICAgICAgICAgICAgICAgPSBuZXcgRmlsZShnZW5lcmF0ZWRGaWxlc0RpcmVjdG9yeSwgYmVhbkNsYXNzQmFzZSArICJFT0ltcGxfV0xTdHViLmNsYXNzIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBkb247dCBleGlzdCByZWdlbmVyYXRlICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFlamJJbXBsZW50YXRpb25DbGFzcy5leGlzdHMoKSB8fCAhaG9tZUltcGxlbWVudGF0aW9uQ2xhc3MuZXhpc3RzKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgIWJlYW5TdHViQ2xhc3MuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElzIHRoZSBzZXIgZmlsZSBvciBhbnkgb2YgdGhlIHNvdXJjZSBmaWxlcyBuZXdlciB0aGVuIHRoZSBjbGFzcyBmaWxlcy4KLSAgICAgICAgICAgIC8vIGZpcnN0bHkgZmluZCB0aGUgb2xkZXN0IG9mIHRoZSB0d28gY2xhc3MgZmlsZXMuCi0gICAgICAgICAgICBsb25nIGNsYXNzTW9kaWZpY2F0aW9uVGltZSA9IGVqYkltcGxlbnRhdGlvbkNsYXNzLmxhc3RNb2RpZmllZCgpOwotICAgICAgICAgICAgaWYgKGhvbWVJbXBsZW1lbnRhdGlvbkNsYXNzLmxhc3RNb2RpZmllZCgpIDwgY2xhc3NNb2RpZmljYXRpb25UaW1lKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NNb2RpZmljYXRpb25UaW1lID0gaG9tZUltcGxlbWVudGF0aW9uQ2xhc3MubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYmVhblN0dWJDbGFzcy5sYXN0TW9kaWZpZWQoKSA8IGNsYXNzTW9kaWZpY2F0aW9uVGltZSkgewotICAgICAgICAgICAgICAgIGNsYXNzTW9kaWZpY2F0aW9uVGltZSA9IGJlYW5TdHViQ2xhc3MubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNsYXNzTW9kaWZpY2F0aW9uVGltZSB8fAotICAgICAgICAgICAgICAgICAgICBob21lSW50ZXJmYWNlU291cmNlLmxhc3RNb2RpZmllZCgpID4gY2xhc3NNb2RpZmljYXRpb25UaW1lIHx8Ci0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUludGVyZmFjZVNvdXJjZS5sYXN0TW9kaWZpZWQoKSA+IGNsYXNzTW9kaWZpY2F0aW9uVGltZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocHJpbWFyeUtleUNsYXNzU291cmNlICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlLZXlDbGFzc1NvdXJjZS5sYXN0TW9kaWZpZWQoKSA+IGNsYXNzTW9kaWZpY2F0aW9uVGltZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZGVzY3JpcHRvckxvYWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgIiArIGRlc2NyaXB0b3JGaWxlLmdldE5hbWUoKSArICIgLSBjb250aW51aW5nIik7Ci0gICAgICAgICAgICAvLyBhbnkgcHJvYmxlbXMgLSBqdXN0IHJlZ2VuZXJhdGUKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGUgZGVzY3JpcHRvcnMgaW4gdHVybiBnZW5lcmF0aW5nIHN1cHBvcnQgY2xhc3NlcyBmb3IgZWFjaCBhbmQgYSBtYW5pZmVzdAotICAgICAqIGZpbGUgZm9yIGFsbCBvZiB0aGUgYmVhbnMuCi0gICAgICovICAgICAgICAgICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0ID0gIk1hbmlmZXN0LVZlcnNpb246IDEuMFxuXG4iOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRvck5hbWUgPSBkZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIEZpbGUgZGVzY3JpcHRvckZpbGUgPSBuZXcgRmlsZShkZXNjcmlwdG9yRGlyZWN0b3J5LCBkZXNjcmlwdG9yTmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpc1JlZ2VuUmVxdWlyZWQoZGVzY3JpcHRvckZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIGVqYmMgZm9yICIgKyBkZXNjcmlwdG9yRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHJlZ2VuZXJhdGVTdXBwb3J0Q2xhc3NlcyhkZXNjcmlwdG9yRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVzY3JpcHRvckZpbGUuZ2V0TmFtZSgpICsgIiBpcyB1cCB0byBkYXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYW5pZmVzdCArPSAiTmFtZTogIiArIGRlc2NyaXB0b3JOYW1lLnJlcGxhY2UoJ1xcJywgJy8nKSArICJcbkVudGVycHJpc2UtQmVhbjogVHJ1ZVxuXG4iOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIobWFuaWZlc3RGaWxlKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoZncpOwotICAgICAgICBwdy5wcmludChtYW5pZmVzdCk7Ci0gICAgICAgIGZ3LmZsdXNoKCk7Ci0gICAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHdlYmxvZ2ljLmVqYmMgY2FsbCB0byByZWdlbmVyYXRlIHRoZSBzdXBwb3J0IGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgcmVsaWVzIG9uIGFuIHVuZG9jdW1lbnRlZCAtbm9leGl0IG9wdGlvbiB0byB0aGUgCi0gICAgICogZWpiYyB0b29sIHRvIHN0b3AgdGhlIGVqYmMgdG9vbCBleGl0aW5nIHRoZSBWTSBhbHRvZ2V0aGVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWdlbmVyYXRlU3VwcG9ydENsYXNzZXMoRmlsZSBkZXNjcmlwdG9yRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIEphdmEgdGFzayB0byBkbyB0aGUgcmVidWlsZAotCi0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBhcmdzID0gZ2V0Q29tbWFuZExpbmUoZmFsc2UsZGVzY3JpcHRvckZpbGUpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdlYmxvZ2ljLmVqYmMubWFpbihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHJ1biB3aXRoIG5vIGV4aXQgZm9yIGJldHRlciByZXBvcnRpbmcKLSAgICAgICAgICAgIFN0cmluZ1tdIG5ld0FyZ3MgPSBnZXRDb21tYW5kTGluZSh0cnVlLCBkZXNjcmlwdG9yRmlsZSk7Ci0gICAgICAgICAgICB3ZWJsb2dpYy5lamJjLm1haW4obmV3QXJncyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvR2VuZXJpY0RlcGxveW1lbnRUb29sLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvR2VuZXJpY0RlcGxveW1lbnRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYzIwZjAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0dlbmVyaWNEZXBsb3ltZW50VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi0vKioKLSAqIEEgZGVwbG95bWVudCB0b29sIHdoaWNoIGNyZWF0ZXMgZ2VuZXJpYyBFSkIgamFycy4gR2VuZXJpYyBqYXJzIGNvbnRhaW5zCi0gKiBvbmx5IHRob3NlIGNsYXNzZXMgYW5kIE1FVEEtSU5GIGVudHJpZXMgc3BlY2lmaWVkIGluIHRoZSBFSkIgMS4xIHN0YW5kYXJkCi0gKgotICogVGhpcyBjbGFzcyBpcyBhbHNvIHVzZWQgYXMgYSBmcmFtZXdvcmsgZm9yIHRoZSBjcmVhdGlvbiBvZiB2ZW5kb3Igc3BlY2lmaWMKLSAqIGRlcGxveW1lbnQgdG9vbHMuIEEgbnVtYmVyIG9mIHRlbXBsYXRlIG1ldGhvZHMgYXJlIHByb3ZpZGVkIHRocm91Z2ggd2hpY2ggdGhlCi0gKiB2ZW5kb3Igc3BlY2lmaWMgdG9vbCBjYW4gaG9vayBpbnRvIHRoZSBFSkIgY3JlYXRpb24gcHJvY2Vzcy4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNEZXBsb3ltZW50VG9vbCBpbXBsZW1lbnRzIEVKQkRlcGxveW1lbnRUb29sIHsKLSAgICAvKiogUHJpdmF0ZSBjb25zdGFudHMgdGhhdCBhcmUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgc3RhbmRhcmQgamFyZmlsZSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfRElSICA9ICJNRVRBLUlORi8iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9ERCAgICA9ICJlamItamFyLnhtbCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBjb250YWluaW5nIHRhc2suIFRoaXMgY29uZmlnIGNvbWJpbmVkIHdpdGggdGhlIAotICAgICAqIHNldHRpbmdzIG9mIHRoZSBpbmRpdmlkdWFsIGF0dHJpYnV0ZXMgaGVyZSBjb25zdGl0dWVzIHRoZSBjb21wbGV0ZSBjb25maWcgZm9yCi0gICAgICogdGhpcyBkZXBsb3ltZW50IHRvb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFamJKYXIuQ29uZmlnIGNvbmZpZzsKLQotICAgIC8qKiBTdG9yZXMgYSBoYW5kbGUgdG8gdGhlIGRpcmVjdG9yeSB0byBwdXQgdGhlIEphciBmaWxlcyBpbiAqLwotICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOwotICAgIAotICAgIC8qKiBUaGUgY2xhc3NwYXRoIHRvIHVzZSB3aXRoIHRoaXMgZGVwbG95bWVudCB0b29sLiBUaGlzIGlzIGFwcGVuZGVkIHRvIAotICAgICAgICBhbnkgcGF0aHMgZnJvbSB0aGUgZWpiamFyIHRhc2sgaXRzZWxmLiovCi0gICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aDsKLQotICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgc3VmZml4IGZvciB0aGUgZ2VuZXJhdGVkIGphcmZpbGUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJpY0phclN1ZmZpeCA9ICItZ2VuZXJpYy5qYXIiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRhc2sgdG8gd2hpY2ggdGhpcyB0b29sIGJlbG9uZ3MuIFRoaXMgaXMgdXNlZCB0byBhY2Nlc3Mgc2VydmljZXMgcHJvdmlkZWQKLSAgICAgKiBieSB0aGUgYW50IGNvcmUsIHN1Y2ggYXMgbG9nZ2luZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRhc2sgdGFzazsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3Nsb2FkZXIgZ2VuZXJhdGVkIGZyb20gdGhlIGdpdmVuIGNsYXNzcGF0aCB0byBsb2FkCi0gICAgICogdGhlIHN1cGVyIGNsYXNzZXMgYW5kIHN1cGVyIGludGVyZmFjZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc3BhdGhMb2FkZXIgPSBudWxsOwotICAgIAotICAgICAvKioKLSAgICAgKiBMaXN0IG9mIGZpbGVzIGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGUgRUpCIGphcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBhZGRlZGZpbGVzOwotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB1c2VkIHRvIHBhcnNlIHRoZSBFSkIgWE1MIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwcml2YXRlIERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgdXNlZCB0byBzdG9yZSB0aGUgdmFsdWUgb2YgZGVzdGluYXRpb24gZGlyZWN0b3J5IHByaW9yIHRvIGV4ZWN1dGUoKQotICAgICAqIGJlaW5nIGNhbGxlZC4KLSAgICAgKiBAcGFyYW0gaW5EaXIgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKEZpbGUgaW5EaXIpIHsKLSAgICAgICAgdGhpcy5kZXN0RGlyID0gaW5EaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZXNpdGluYXRpb24gZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldERlc3REaXIoKSB7Ci0gICAgICAgIHJldHVybiBkZXN0RGlyOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdGFzayB3aGljaCBvd25zIHRoaXMgdG9vbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhc2soVGFzayB0YXNrKSB7Ci0gICAgICAgIHRoaXMudGFzayA9IHRhc2s7Ci0gICAgfQotICAgICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdGFzayBmb3IgdGhpcyB0b29sLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUYXNrIGdldFRhc2soKSB7Ci0gICAgICAgIHJldHVybiB0YXNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYmFzZW5hbWUgdGVybWluYXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWpiSmFyLkNvbmZpZyBnZXRDb25maWcoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIG1ldGEtaW5mIGRpciBpcyBiZWluZyBleHBsaWNpdGx5IHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVzaW5nQmFzZUphck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWcuYmFzZUphck5hbWUgIT0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBqYXIgZmlsZS4KLSAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHN1ZmZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmljSmFyU3VmZml4KFN0cmluZyBpblN0cmluZykgewotICAgICAgICB0aGlzLmdlbmVyaWNKYXJTdWZmaXggPSBpblN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHVzZXIgY2xhc3NlcwotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aCh0YXNrLmdldFByb2plY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKLSAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGFzc3BhdGggYnkgY29tYmluaW5nIHRoZSBvbmUgZnJvbSB0aGUgc3Vycm91bmRpbmcgdGFzaywgaWYgYW55Ci0gICAgICogYW5kIHRoZSBvbmUgZnJvbSB0aXMgdG9vbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUGF0aCBnZXRDb21iaW5lZENsYXNzcGF0aCgpIHsKLSAgICAgICAgUGF0aCBjb21iaW5lZFBhdGggPSBjbGFzc3BhdGg7Ci0gICAgICAgIGlmIChjb25maWcuY2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb21iaW5lZFBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbWJpbmVkUGF0aCA9IGNvbmZpZy5jbGFzc3BhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb21iaW5lZFBhdGguYXBwZW5kKGNvbmZpZy5jbGFzc3BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tYmluZWRQYXRoOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIGludCBsZXZlbCkgewotICAgICAgICBnZXRUYXNrKCkubG9nKG1lc3NhZ2UsIGxldmVsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRUYXNrKCkuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSB0aGlzIHRvb2wgZm9yIHVzZSBpbiB0aGUgZWpiamFyIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKEVqYkphci5Db25maWcgY29uZmlnKSB7Ci0gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwotICAgICAgICAKLSAgICAgICAgY2xhc3NwYXRoTG9hZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgb2YgYWRkaW5nIGEgZmlsZSBlbnRyeSB0bwotICAgICAqIGEgLmphciBmaWxlLiAgVXNlZCBieSBleGVjdXRlKCkgdG8gYWRkIGVudHJpZXMgdG8gdGhlIGphciBmaWxlIGFzIGl0IGlzCi0gICAgICogY29uc3RydWN0ZWQuCi0gICAgICogQHBhcmFtIGpTdHJlYW0gQSBKYXJPdXRwdXRTdHJlYW0gaW50byB3aGljaCB0byB3cml0ZSB0aGUKLSAgICAgKiAgICAgICAgamFyIGVudHJ5LgotICAgICAqIEBwYXJhbSBpbnB1dEZpbGUgQSBGaWxlIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudHMgdGhlIGZpbGUgYmVpbmcgYWRkZWQuCi0gICAgICogQHBhcmFtIGxvZ2ljYWxGaWxlbmFtZSBBIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUsIGluY2x1ZGluZwotICAgICAqICAgICAgICBhbGwgcmVsZXZhbnQgcGF0aCBpbmZvcm1hdGlvbiwgdGhhdCBzaG91bGQgYmUgc3RvcmVkIGZvciB0aGUgZW50cnkKLSAgICAgKiAgICAgICAgYmVpbmcgYWRkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRmlsZVRvSmFyKEphck91dHB1dFN0cmVhbSBqU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGlucHV0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZ2ljYWxGaWxlbmFtZSkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFhZGRlZGZpbGVzLmNvbnRhaW5zKGxvZ2ljYWxGaWxlbmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOwotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgemlwIGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIGphciBmaWxlCi0gICAgICAgICAgICAgICAgWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkobG9naWNhbEZpbGVuYW1lLnJlcGxhY2UoJ1xcJywnLycpKTsKLSAgICAgICAgICAgICAgICBqU3RyZWFtLnB1dE5leHRFbnRyeSh6aXBFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlIGlucHV0IHN0cmVhbSwgYW5kIGJ1ZmZlciBldmVyeXRoaW5nIG92ZXIKLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgamFyIG91dHB1dCBzdHJlYW0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZUJ1ZmZlciA9IG5ldyBieXRlWzIgKiAxMDI0XTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgalN0cmVhbS53cml0ZShieXRlQnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gaVN0cmVhbS5yZWFkKGJ5dGVCdWZmZXIsIDAsIGJ5dGVCdWZmZXIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAtMSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9hZGQgaXQgdG8gbGlzdCBvZiBmaWxlcyBpbiBqYXIKLSAgICAgICAgICAgICAgICBhZGRlZGZpbGVzLmFkZChsb2dpY2FsRmlsZW5hbWUpOwotICAgICAgICAgICB9ICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIGxvZygiV0FSTklORzogSU9FeGNlcHRpb24gd2hpbGUgYWRkaW5nIGVudHJ5ICIgKyAKLSAgICAgICAgICAgICAgICBsb2dpY2FsRmlsZW5hbWUgKyAiIHRvIGphcmZpbGUgZnJvbSAiICsgaW5wdXRGaWxlLmdldFBhdGgoKSArICIgIiArIAotICAgICAgICAgICAgICAgIGlvZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICItIiArIGlvZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgLy8gQ2xvc2UgdXAgdGhlIGZpbGUgaW5wdXQgc3RyZWFtIGZvciB0aGUgY2xhc3MgZmlsZQotICAgICAgICAgICAgaWYgKGlTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXhjZXB0aW9uKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlc2NyaXB0b3JIYW5kbGVyIGdldERlc2NyaXB0b3JIYW5kbGVyKEZpbGUgc3JjRGlyKSB7IAotICAgICAgICBEZXNjcmlwdG9ySGFuZGxlciBoYW5kbGVyID0gbmV3IERlc2NyaXB0b3JIYW5kbGVyKGdldFRhc2soKSwgc3JjRGlyKTsgCi0gICAgICAgIAotICAgICAgICByZWdpc3Rlcktub3duRFREcyhoYW5kbGVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJlZ2lzdGVyIGFueSBEVERzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENvbmZpZygpLmR0ZExvY2F0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgCi0gICAgICAgICAgICBFamJKYXIuRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSAoRWpiSmFyLkRURExvY2F0aW9uKWkubmV4dCgpOyAKLSAgICAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoZHRkTG9jYXRpb24uZ2V0UHVibGljSWQoKSwgZHRkTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7IAotICAgICAgICB9IAotICAgICAgICByZXR1cm4gaGFuZGxlcjsgCi0gICAgfSAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciB0aGUgbG9jYXRpb25zIG9mIGFsbCBrbm93biBEVERzLgotICAgICAqCi0gICAgICogdmVuZG9yLXNwZWNpZmljIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRlZmluZQotICAgICAqIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbG9jYXRpb25zIG9mIHRoZSBFSkIgRFREcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyS25vd25EVERzKERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgLy8gbm9uZSB0byByZWdpc3RlciBmb3IgZ2VuZXJpYwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NEZXNjcmlwdG9yKFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUsIFNBWFBhcnNlciBzYXhQYXJzZXIpIHsKLQotICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oZGVzY3JpcHRvckZpbGVOYW1lLCBzYXhQYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhhbmRsZXIgPSBnZXREZXNjcmlwdG9ySGFuZGxlcihjb25maWcuc3JjRGlyKTsKLQotICAgICAgICAgICAgLy8gUmV0cml2ZSB0aGUgZmlsZXMgdG8gYmUgYWRkZWQgdG8gSkFSIGZyb20gRUpCIGRlc2NyaXB0b3IKLSAgICAgICAgICAgIEhhc2h0YWJsZSBlamJGaWxlcyA9IHBhcnNlRWpiRmlsZXMoZGVzY3JpcHRvckZpbGVOYW1lLCBzYXhQYXJzZXIpOwotCi0gICAgICAgICAgICAvLyBBZGQgYW55IHN1cHBvcnQgY2xhc3NlcyBzcGVjaWZpZWQgaW4gdGhlIGJ1aWxkIGZpbGUKLSAgICAgICAgICAgIGFkZFN1cHBvcnRDbGFzc2VzKGVqYkZpbGVzKTsKLQotICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBKQVIgZmlsZW5hbWUgKHdpdGhvdXQgZmlsZW5hbWUgZXh0ZW5zaW9uKQotICAgICAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gZ2V0SmFyQmFzZU5hbWUoZGVzY3JpcHRvckZpbGVOYW1lKTsKLQotICAgICAgICAgICAgU3RyaW5nIGRkUHJlZml4ID0gZ2V0VmVuZG9yRERQcmVmaXgoYmFzZU5hbWUsIGRlc2NyaXB0b3JGaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIEZpcnN0IHRoZSByZWd1bGFyIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgRUpCX0RELAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGNvbmZpZy5kZXNjcmlwdG9yRGlyLCBkZXNjcmlwdG9yRmlsZU5hbWUpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbm93IHRoZSB2ZW5kb3Igc3BlY2lmaWMgZmlsZXMsIGlmIGFueSAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFkZFZlbmRvckZpbGVzKGVqYkZpbGVzLCBkZFByZWZpeCk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBhbnkgaW5oZXJpdGVkIGZpbGVzCi0gICAgICAgICAgICBjaGVja0FuZEFkZEluaGVyaXRlZChlamJGaWxlcyk7Ci0KLSAgICAgICAgICAgIC8vIExhc3RseSBjcmVhdGUgRmlsZSBvYmplY3QgZm9yIHRoZSBKYXIgZmlsZXMuIElmIHdlIGFyZSB1c2luZwotICAgICAgICAgICAgLy8gYSBmbGF0IGRlc3RpbmF0aW9uIGRpciwgdGhlbiB3ZSBuZWVkIHRvIHJlZGVmaW5lIGJhc2VOYW1lIQotICAgICAgICAgICAgaWYgKGNvbmZpZy5mbGF0RGVzdERpciAmJiBiYXNlTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0TmFtZSA9IGJhc2VOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnROYW1lID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0TmFtZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBlbmROYW1lICAgPSBiYXNlTmFtZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBiYXNlTmFtZSA9IGJhc2VOYW1lLnN1YnN0cmluZyhzdGFydE5hbWUsIGVuZE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBGaWxlIGphckZpbGUgPSBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKGJhc2VOYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCBhIGJ1aWxkIGFuZCBzdGFydCBkb2luZyB0aGUgd29yayEKLSAgICAgICAgICAgIGlmIChuZWVkVG9SZWJ1aWxkKGVqYkZpbGVzLCBqYXJGaWxlKSkgewotICAgICAgICAgICAgICAgIC8vIExvZyB0aGF0IHdlIGFyZSBnb2luZyB0byBidWlsZC4uLgotICAgICAgICAgICAgICAgIGxvZyggImJ1aWxkaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgamFyRmlsZS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nLnZhbHVlT2YoZWpiRmlsZXMuc2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZpbGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOwotICAgIAotICAgICAgICAgICAgICAgIC8vIFVzZSBoZWxwZXIgbWV0aG9kIHRvIHdyaXRlIHRoZSBqYXJmaWxlCi0gICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkID0gZ2V0UHVibGljSWQoKTsKLSAgICAgICAgICAgICAgICB3cml0ZUphcihiYXNlTmFtZSwgamFyRmlsZSwgZWpiRmlsZXMsIHB1YmxpY0lkKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTG9nIHRoYXQgdGhlIGZpbGUgaXMgdXAgdG8gZGF0ZS4uLgotICAgICAgICAgICAgICAgIGxvZyhqYXJGaWxlLnRvU3RyaW5nKCkgKyAiIGlzIHVwIHRvIGRhdGUuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJTQVhFeGNlcHRpb24gd2hpbGUgcGFyc2luZyAnIgotICAgICAgICAgICAgICAgICsgZGVzY3JpcHRvckZpbGVOYW1lLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICInLiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyBiYWRseS1mb3JtZWQgWE1MLiIKLSAgICAgICAgICAgICAgICArICIgIERldGFpbHM6ICIKLSAgICAgICAgICAgICAgICArIHNlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIHNlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIklPRXhjZXB0aW9uIHdoaWxlIHBhcnNpbmcnIgotICAgICAgICAgICAgICAgICsgZGVzY3JpcHRvckZpbGVOYW1lLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICInLiAgVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgICArICIgZG9lc24ndCBleGlzdC4gRGV0YWlsczogIgotICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHRoZSBmaXJzdCBzdGVwIGluIHRoZSBwcm9jZXNzRGVzY3JpcHRvciBtZXRob2QKLSAgICAgKiB0byBhbGxvdyB2ZW5kb3Itc3BlY2lmaWMgc3ViY2xhc3NlcyB0byB2YWxpZGF0ZSB0aGUgdGFzayBjb25maWd1cmF0aW9uCi0gICAgICogcHJpb3IgdG8gcHJvY2Vzc2luZyB0aGUgZGVzY3JpcHRvci4gIElmIHRoZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQsCi0gICAgICogYSBCdWlsZEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWxlTmFtZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWUgb2YgYW4gRUpCCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHRvIGJlIHByb2Nlc3NlZAotICAgICAqIEBwYXJhbSBzYXhQYXJzZXIgICAgICAgICAgU0FYUGFyc2VyIHdoaWNoIG1heSBiZSB1c2VkIHRvIHBhcnNlIHRoZSBYTUwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IKLSAgICAgKiBAdGhvd3MgQnVpbGRFeGNlcHRpb24gICAgIFRocm93biBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICAvKiAKLSAgICAgICAgICogRm9yIHRoZSBHZW5lcmljRGVwbG95bWVudFRvb2wsIGRvIG5vdGhpbmcuICBWZW5kb3Igc3BlY2lmaWMgCi0gICAgICAgICAqIHN1YmNsYXNzZXMgc2hvdWxkIHRocm93IGEgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgCi0gICAgICAgICAqIGludmFsaWQgZm9yIHRoZWlyIHNlcnZlci4KLSAgICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgRUpCIGZpbGVzIGZvdW5kIHdoZW4gdGhlIHNwZWNpZmllZCBFSkIKLSAgICAgKiBkZXNjcmlwdG9yIGlzIHBhcnNlZCBhbmQgcHJvY2Vzc2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWxlTmFtZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWUgb2YgYW4gRUpCCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHRvIGJlIHByb2Nlc3NlZAotICAgICAqIEBwYXJhbSBzYXhQYXJzZXIgICAgICAgICAgU0FYUGFyc2VyIHdoaWNoIG1heSBiZSB1c2VkIHRvIHBhcnNlIHRoZSBYTUwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBvZiBFSkIgY2xhc3MgKGFuZCBvdGhlcikgZmlsZXMgdG8gYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBjb21wbGV0ZWQgSkFSIGZpbGUKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgICAgIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseSB3cmFwcGluZyBhbm90aGVyIAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICBBbiBJT0V4Y2VwdGlvbiBmcm9tIHRoZSBwYXJzZXIsIHBvc3NpYmx5IGZyb20gYQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ5dGUgc3RyZWFtIG9yIGNoYXJhY3RlciBzdHJlYW0gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBwYXJzZUVqYkZpbGVzKFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUsIFNBWFBhcnNlciBzYXhQYXJzZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZGVzY3JpcHRvclN0cmVhbSA9IG51bGw7Ci0gICAgICAgIEhhc2h0YWJsZSBlamJGaWxlcyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLyogUGFyc2UgdGhlIGVqYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBXaGlsZSBpdCBtYXkgbm90Ci0gICAgICAgICAgICAgKiBsb29rIGxpa2UgbXVjaCwgd2UgdXNlIGEgU0FYUGFyc2VyIGFuZCBhbiBpbm5lciBjbGFzcyB0bwotICAgICAgICAgICAgICogZ2V0IGhvbGQgb2YgYWxsIHRoZSBjbGFzc2ZpbGUgbmFtZXMgZm9yIHRoZSBkZXNjcmlwdG9yLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBkZXNjcmlwdG9yU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShjb25maWcuZGVzY3JpcHRvckRpciwgZGVzY3JpcHRvckZpbGVOYW1lKSk7Ci0gICAgICAgICAgICBzYXhQYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGRlc2NyaXB0b3JTdHJlYW0pLCBoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGVqYkZpbGVzID0gaGFuZGxlci5nZXRGaWxlcygpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvclN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gY2xvc2VFeGNlcHRpb24pIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZWpiRmlsZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbnkgY2xhc3NlcyB0aGUgdXNlciBzcGVjaWZpZXMgdXNpbmcgPGk+c3VwcG9ydDwvaT4gbmVzdGVkIGVsZW1lbnRzCi0gICAgICogdG8gdGhlIDxjb2RlPmVqYkZpbGVzPC9jb2RlPiBIYXNodGFibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWpiRmlsZXMgSGFzaHRhYmxlIG9mIEVKQiBjbGFzc2VzIChhbmQgb3RoZXIpIGZpbGVzIHRoYXQgd2lsbCBiZQotICAgICAqICAgICAgICAgICAgICAgICBhZGRlZCB0byB0aGUgY29tcGxldGVkIEpBUiBmaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU3VwcG9ydENsYXNzZXMoSGFzaHRhYmxlIGVqYkZpbGVzKSB7Ci0gICAgICAgIC8vIGFkZCBpbiBzdXBwb3J0IGNsYXNzZXMgaWYgYW55Ci0gICAgICAgIFByb2plY3QgcHJvamVjdCA9IHRhc2suZ2V0UHJvamVjdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25maWcuc3VwcG9ydEZpbGVTZXRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRmlsZVNldCBzdXBwb3J0RmlsZVNldCA9IChGaWxlU2V0KWkubmV4dCgpOwotICAgICAgICAgICAgRmlsZSBzdXBwb3J0QmFzZURpciA9IHN1cHBvcnRGaWxlU2V0LmdldERpcihwcm9qZWN0KTsKLSAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc3VwcG9ydFNjYW5uZXIgPSBzdXBwb3J0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgc3VwcG9ydFNjYW5uZXIuc2NhbigpOwotICAgICAgICAgICAgU3RyaW5nW10gc3VwcG9ydEZpbGVzID0gc3VwcG9ydFNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdXBwb3J0RmlsZXMubGVuZ3RoOyArK2opIHsKLSAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoc3VwcG9ydEZpbGVzW2pdLCBuZXcgRmlsZShzdXBwb3J0QmFzZURpciwgc3VwcG9ydEZpbGVzW2pdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFVzaW5nIHRoZSBFSkIgZGVzY3JpcHRvciBmaWxlIG5hbWUgcGFzc2VkIGZyb20gdGhlIDxjb2RlPmVqYmphcjwvY29kZT4KLSAgICAgKiB0YXNrLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSAiYmFzZW5hbWUiIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBuYW1lIHRoZQotICAgICAqIGNvbXBsZXRlZCBKQVIgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yRmlsZU5hbWUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmlsZSBuYW1lIG9mIGFuIEVKQgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIFRoZSAiYmFzZW5hbWUiIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBuYW1lIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkIEpBUiBmaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRKYXJCYXNlTmFtZShTdHJpbmcgZGVzY3JpcHRvckZpbGVOYW1lKSB7Ci0KLSAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gIiI7Ci0KLSAgICAgICAgLy8gV29yayBvdXQgd2hhdCB0aGUgYmFzZSBuYW1lIGlzCi0gICAgICAgIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2Fub25pY2FsRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JGaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBjYW5vbmljYWxEZXNjcmlwdG9yLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBiYXNlTmFtZSA9IGRlc2NyaXB0b3JGaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJhc2VOYW1lICs9IGNvbmZpZy5iYXNlSmFyTmFtZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuREVTQ1JJUFRPUikpIHsKLSAgICAgICAgICAgIGludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBkZXNjcmlwdG9yRmlsZU5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICAgICAgaW50IGVuZEJhc2VOYW1lID0gLTE7Ci0gICAgICAgICAgICBpZiAobGFzdFNlcGFyYXRvckluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZW5kQmFzZU5hbWUgPSBkZXNjcmlwdG9yRmlsZU5hbWUuaW5kZXhPZihjb25maWcuYmFzZU5hbWVUZXJtaW5hdG9yLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXBhcmF0b3JJbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuZEJhc2VOYW1lID0gZGVzY3JpcHRvckZpbGVOYW1lLmluZGV4T2YoY29uZmlnLmJhc2VOYW1lVGVybWluYXRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbmRCYXNlTmFtZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gZGVzY3JpcHRvckZpbGVOYW1lLnN1YnN0cmluZygwLCBlbmRCYXNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiYXNlTmFtZSA9IGRlc2NyaXB0b3JGaWxlTmFtZS5zdWJzdHJpbmcoMCwgZW5kQmFzZU5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKS5lcXVhbHMoRWpiSmFyLk5hbWluZ1NjaGVtZS5ESVJFQ1RPUlkpKSB7Ci0gICAgICAgICAgICBpbnQgbGFzdFNlcGFyYXRvckluZGV4ID0gZGVzY3JpcHRvckZpbGVOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgICAgIFN0cmluZyBkaXJOYW1lID0gZGVzY3JpcHRvckZpbGVOYW1lLnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9ySW5kZXgpOwotICAgICAgICAgICAgaW50IGRpclNlcGFyYXRvckluZGV4ID0gZGlyTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgICAgICBpZiAoZGlyU2VwYXJhdG9ySW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBkaXJOYW1lID0gZGlyTmFtZS5zdWJzdHJpbmcoZGlyU2VwYXJhdG9ySW5kZXggKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYmFzZU5hbWUgPSBkaXJOYW1lOwotICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKS5lcXVhbHMoRWpiSmFyLk5hbWluZ1NjaGVtZS5FSkJfTkFNRSkpIHsKLSAgICAgICAgICAgIGJhc2VOYW1lID0gaGFuZGxlci5nZXRFamJOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJlZml4IGZvciB2ZW5kb3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAgICAgKgotICAgICAqIFRoaXMgd2lsbCBjb250YWluIHRoZSBwYXRoIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGRlc2NyaXB0b3IgbmFtZSwgCi0gICAgICogZGVwZW5kaW5nIG9uIHRoZSBuYW1pbmcgc2NoZW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWZW5kb3JERFByZWZpeChTdHJpbmcgYmFzZU5hbWUsIFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIGRkUHJlZml4ID0gbnVsbDsKLQotICAgICAgICBpZiAoY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhFamJKYXIuTmFtaW5nU2NoZW1lLkRFU0NSSVBUT1IpKSB7Ci0gICAgICAgICAgICBkZFByZWZpeCA9IGJhc2VOYW1lICsgY29uZmlnLmJhc2VOYW1lVGVybWluYXRvcjsKLSAgICAgICAgfSBlbHNlIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpIHx8Ci0gICAgICAgICAgICAgICAgICAgY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhFamJKYXIuTmFtaW5nU2NoZW1lLkVKQl9OQU1FKSB8fAotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKS5lcXVhbHMoRWpiSmFyLk5hbWluZ1NjaGVtZS5ESVJFQ1RPUlkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2Fub25pY2FsRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JGaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBjYW5vbmljYWxEZXNjcmlwdG9yLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBkZFByZWZpeCA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGRQcmVmaXggPSBkZXNjcmlwdG9yRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRkUHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbnkgdmVuZG9yIHNwZWNpZmljIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgCi0gICAgICogRUpCIEphci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgewotICAgICAgICAvLyBub3RoaW5nIHRvIGFkZCBmb3IgZ2VuZXJpYyB0b29sLgotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2ZW5kb3Igc3BlY2lmaWMgbmFtZSBvZiB0aGUgSmFyIHRoYXQgd2lsbCBiZSBvdXRwdXQuIFRoZSBtb2RpZmljYXRpb24gZGF0ZQotICAgICAqIG9mIHRoaXMgamFyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBkZXBlbmRlbnQgYmVhbiBjbGFzc2VzLgotICAgICAqLwotICAgIEZpbGUgZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShTdHJpbmcgYmFzZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGRlc3REaXIsIGJhc2VOYW1lICsgZ2VuZXJpY0phclN1ZmZpeCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHRoZSB0aW1lc3RhbXAgb24gZWFjaCBmaWxlIGxpc3RlZCBpbiB0aGUgPGNvZGU+Ci0gICAgICogZWpiRmlsZXM8L2NvZGU+IGFuZCBjb21wYXJlcyB0aGVtIHRvIHRoZSB0aW1lc3RhbXAgb24gdGhlIDxjb2RlPmphckZpbGUKLSAgICAgKiA8L2NvZGU+LiAgSWYgdGhlIDxjb2RlPmphckZpbGU8L2NvZGU+J3MgdGltZXN0YW1wIGlzIG1vcmUgcmVjZW50IHRoYW4KLSAgICAgKiBlYWNoIEVKQiBmaWxlLCA8Y29kZT50cnVlPC9jb2RlPiBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgPGNvZGU+ZmFsc2UKLSAgICAgKiA8L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVqYkZpbGVzIEhhc2h0YWJsZSBvZiBFSkIgY2xhc3NlcyAoYW5kIG90aGVyKSBmaWxlcyB0aGF0IHdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGNvbXBsZXRlZCBKQVIgZmlsZQotICAgICAqIEBwYXJhbSBqYXJGaWxlICBKQVIgZmlsZSB3aGljaCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBFSkIgY2xhc3NlcyAoYW5kCi0gICAgICogICAgICAgICAgICAgICAgIG90aGVyKSBmaWxlcwotICAgICAqIEByZXR1cm4gICAgICAgICBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIDxjb2RlPmphckZpbGU8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgIGlzIHVwIHRvIGRhdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkVG9SZWJ1aWxkKEhhc2h0YWJsZSBlamJGaWxlcywgRmlsZSBqYXJGaWxlKSB7Ci0gICAgICAgIGlmIChqYXJGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBsb25nIGxhc3RCdWlsZCA9IGphckZpbGUubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLm1hbmlmZXN0ICE9IG51bGwgJiYgY29uZmlnLm1hbmlmZXN0LmV4aXN0cygpICYmCi0gICAgICAgICAgICAgICAgY29uZmlnLm1hbmlmZXN0Lmxhc3RNb2RpZmllZCgpID4gbGFzdEJ1aWxkKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJCdWlsZCBuZWVkZWQgYmVjYXVzZSBtYW5pZmVzdCAiICsgY29uZmlnLm1hbmlmZXN0ICsgIiBpcyBvdXQgb2YgZGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBJdGVyYXRvciBmaWxlSXRlciA9IGVqYkZpbGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZmlsZXMgc2VlaW5nIGlmIGFueSBoYXMgYmVlbiB0b3VjaGVkCi0gICAgICAgICAgICAvLyBtb3JlIHJlY2VudGx5IHRoYW4gdGhlIGRlc3RpbmF0aW9uIGphci4KLSAgICAgICAgICAgIHdoaWxlKGZpbGVJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEZpbGUgY3VycmVudEZpbGUgPSAoRmlsZSkgZmlsZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0QnVpbGQgPCBjdXJyZW50RmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIkJ1aWxkIG5lZWRlZCBiZWNhdXNlICIgKyBjdXJyZW50RmlsZS5nZXRQYXRoKCkgKyAiIGlzIG91dCBvZiBkYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFB1YmxpYyBJRCBvZiB0aGUgRFREIHNwZWNpZmllZCBpbiB0aGUgRUpCIGRlc2NyaXB0b3IuICBOb3QKLSAgICAgKiBldmVyeSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+RGVwbG95bWVudFRvb2w8L2NvZGU+IHdpbGwgbmVlZCB0byByZWZlcmVuY2UKLSAgICAgKiB0aGlzIHZhbHVlIG9yIG1heSB3YW50IHRvIGRldGVybWluZSB0aGlzIHZhbHVlIGluIGEgdmVuZG9yLXNwZWNpZmljIHdheS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gICAgICAgICBQdWJsaWMgSUQgb2YgdGhlIERURCBzcGVjaWZpZWQgaW4gdGhlIEVKQiBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyLmdldFB1YmxpY0lkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIHdyaXRpbmcgb2YgdGhlIEpBUiBmaWxlLiBJdGVyYXRlcyBvdmVyIHRoZQotICAgICAqIGZpbGVuYW1lcy9qYXZhLmlvLkZpbGVzIGluIHRoZSBIYXNodGFibGUgc3RvcmVkIG9uIHRoZSBpbnN0YW5jZSB2YXJpYWJsZQotICAgICAqIGVqYkZpbGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSmFyKFN0cmluZyBiYXNlTmFtZSwgRmlsZSBqYXJmaWxlLCBIYXNodGFibGUgZmlsZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uewotCi0gICAgICAgIEphck91dHB1dFN0cmVhbSBqYXJTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY2xlYW4gdGhlIGFkZGVkZmlsZXMgVmVjdG9yIAotICAgICAgICAgICAgYWRkZWRmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgLyogSWYgdGhlIGphcmZpbGUgYWxyZWFkeSBleGlzdHMgdGhlbiB3aGFjayBpdCBhbmQgcmVjcmVhdGUgaXQuCi0gICAgICAgICAgICAgKiBTaG91bGQgcHJvYmFibHkgdGhpbmsgb2YgYSBtb3JlIGVsZWdhbnQgd2F5IHRvIGhhbmRsZSB0aGlzCi0gICAgICAgICAgICAgKiBzbyB0aGF0IGluIGNhc2Ugb2YgZXJyb3JzIHdlIGRvbid0IGxlYXZlIHBlb3BsZSB3b3JzZSBvZmYKLSAgICAgICAgICAgICAqIHRoYW4gd2hlbiB3ZSBzdGFydGVkID0pCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChqYXJmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgamFyZmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGphcmZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgamFyZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYW5pZmVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWcubWFuaWZlc3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIGluID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIG1hbmlmZXN0IGZpbGU6ICIgKyBjb25maWcubWFuaWZlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRNYW5pZmVzdCA9ICIvb3JnL2FwYWNoZS90b29scy9hbnQvZGVmYXVsdE1hbmlmZXN0Lm1mIjsKLSAgICAgICAgICAgICAgICAgICAgaW4gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShkZWZhdWx0TWFuaWZlc3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIGluID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGRlZmF1bHQgbWFuaWZlc3Q6ICIgKyBkZWZhdWx0TWFuaWZlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uICgiVW5hYmxlIHRvIHJlYWQgbWFuaWZlc3QiLCBlLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHN0cmVhbXMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSBqYXJmaWxlCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGphclN0cmVhbSA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oamFyZmlsZSksIG1hbmlmZXN0KTsKLSAgICAgICAgICAgIGphclN0cmVhbS5zZXRNZXRob2QoSmFyT3V0cHV0U3RyZWFtLkRFRkxBVEVEKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgY2xhc3MgZmlsZXMgZm91bmQgYW5kIGFkZCB0aGVtIHRvIHRoZSBqYXIKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZW50cnlJdGVyYXRvciA9IGZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gKFN0cmluZykgZW50cnlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBlbnRyeUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGVudHJ5TmFtZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbG9nKCJhZGRpbmcgZmlsZSAnIiArIGVudHJ5TmFtZSArICInIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCi0gICAgICAgICAgICAgICAgYWRkRmlsZVRvSmFyKGphclN0cmVhbSwgZW50cnlGaWxlLCBlbnRyeU5hbWUpOwotCi0gICAgICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGFyZSBhbnkgaW5uZXIgY2xhc3NlcyBmb3IgdGhpcyBjbGFzcyBhbmQgYWRkIHRoZW0gaW4gaWYgdGhlcmUgYXJlCi0gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyIGZsdCA9IG5ldyBJbm5lckNsYXNzRmlsZW5hbWVGaWx0ZXIoZW50cnlGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgRmlsZSBlbnRyeURpciA9IGVudHJ5RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gaW5uZXJmaWxlcyA9IGVudHJ5RGlyLmxpc3QoZmx0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IGlubmVyZmlsZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy9nZXQgYW5kIGNsZWFuIHVwIGlubmVyY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgICAgICBpbnQgZW50cnlJbmRleCA9IGVudHJ5TmFtZS5sYXN0SW5kZXhPZihlbnRyeUZpbGUuZ2V0TmFtZSgpKSAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBlbnRyeUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlOYW1lID0gaW5uZXJmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGVudHJ5TmFtZS5zdWJzdHJpbmcoMCwgZW50cnlJbmRleCkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBpbm5lcmZpbGVzW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxpbmsgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgZW50cnlGaWxlID0gbmV3IEZpbGUoY29uZmlnLnNyY0RpciwgZW50cnlOYW1lKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGxvZygiYWRkaW5nIGlubmVyY2xhc3MgZmlsZSAnIiArIGVudHJ5TmFtZSArICInIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9KYXIoamFyU3RyZWFtLCBlbnRyeUZpbGUsIGVudHJ5TmFtZSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSU9FeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyBlamItamFyIGZpbGUgJyIKLSAgICAgICAgICAgICAgICArIGphcmZpbGUudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIicuIERldGFpbHM6ICIKLSAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGphclN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgamFyU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBjbG9zZUV4Y2VwdGlvbikge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLy8gZW5kIG9mIHdyaXRlSmFyCi0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIEVKQiBDbGFzcyBJbmhlcml0cyBmcm9tIGEgU3VwZXJjbGFzcywgYW5kIGlmIGEgUmVtb3RlIEludGVyZmFjZQotICAgICAqIGV4dGVuZHMgYW4gaW50ZXJmYWNlIG90aGVyIHRoZW4gamF2YXguZWpiLkVKQk9iamVjdCBkaXJlY3RseS4gIFRoZW4gYWRkIHRob3NlIAotICAgICAqIGNsYXNzZXMgdG8gdGhlIGdlbmVyaWMtamFyIHNvIHRoZXkgZG9udCBoYXZlIHRvIGFkZGVkIGVsc2V3aGVyZS4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQW5kQWRkSW5oZXJpdGVkKEhhc2h0YWJsZSBjaGVja0VudHJpZXMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy9Db3B5IGhhc2h0YWJsZSBzbyB3ZXJlIG5vdCBjaGFuZ2luZyB0aGUgb25lIHdlIGl0ZXJhdGUgdGhyb3VnaAotICAgICAgICBIYXNodGFibGUgY29waWVkSGFzaCA9IChIYXNodGFibGUpY2hlY2tFbnRyaWVzLmNsb25lKCk7Ci0KLSAgICAgICAgLy8gV2FsayBiYXNlIGxldmVsIEVKQnMgYW5kIHNlZSBpZiB0aGV5IGhhdmUgc3VwZXJjbGFzc2VzIG9yIGV4dGVuZCBleHRyYSBpbnRlcmZhY2VzIHdoaWNoIGV4dGVuZCBFSkJPYmplY3QKLSAgICAgICAgZm9yIChJdGVyYXRvciBlbnRyeUl0ZXJhdG9yID0gY29waWVkSGFzaC5rZXlTZXQoKS5pdGVyYXRvcigpOyBlbnRyeUl0ZXJhdG9yLmhhc05leHQoKTsgKSAKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9IChTdHJpbmcpZW50cnlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBGaWxlIGVudHJ5RmlsZSA9IChGaWxlKWNvcGllZEhhc2guZ2V0KGVudHJ5TmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIG9ubHkgd2FudCBjbGFzcyBmaWxlcywgeG1sIGRvZXNudCByZWZsZWN0IHZlcnkgd2VsbCA9KQotICAgICAgICAgICAgaWYgKGVudHJ5TmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGVudHJ5TmFtZS5zdWJzdHJpbmcoMCxlbnRyeU5hbWUubGFzdEluZGV4T2YoIi5jbGFzcyIpKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwnLicpOwotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzTG9hZGVyRm9yQnVpbGQoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBjID0gbG9hZGVyLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vIHByaW1hdGl2ZXMhISAgc2FuaXR5IGNoZWNrLCBwcm9iYWJseSBub3QgbmVzc2VzYXJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYy5pc1ByaW1pdGl2ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5pc0ludGVyZmFjZSgpKSAvL2dldCBhcyBhbiBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImxvb2tpbmcgYXQgaW50ZXJmYWNlICIgKyBjLmdldE5hbWUoKSwgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gaW50ZXJmYWNlcyA9IGMuZ2V0SW50ZXJmYWNlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiICAgICBpbXBsZW1lbnRzICIgKyBpbnRlcmZhY2VzW2ldLmdldE5hbWUoKSwgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnRlcmZhY2UoaW50ZXJmYWNlc1tpXSwgY2hlY2tFbnRyaWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAvLyBnZXQgYXMgYSBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygibG9va2luZyBhdCBjbGFzcyAiICsgYy5nZXROYW1lKCksICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzID0gYy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3VwZXJDbGFzcyhjLmdldFN1cGVyY2xhc3MoKSwgY2hlY2tFbnRyaWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSAvL2lmIHByaW1hdGl2ZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGxvYWQgY2xhc3MgIiArIGNsYXNzbmFtZSArICIgZm9yIHN1cGVyIGNsYXNzIGNoZWNrIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgbmNkZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDb3VsZCBub3QgZnVsbHkgbG9hZCBjbGFzcyAiICsgY2xhc3NuYW1lICsgIiBmb3Igc3VwZXIgY2xhc3MgY2hlY2siLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAvL2lmIAotICAgICAgICB9IC8vIHdoaWxlIAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRJbnRlcmZhY2UoQ2xhc3MgdGhlSW50ZXJmYWNlLCBIYXNodGFibGUgY2hlY2tFbnRyaWVzKSB7Ci0gICAgICAgIGlmICghdGhlSW50ZXJmYWNlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhIikpIC8vIGRvIG5vdCBhZGQgc3lzdGVtIGludGVyZmFjZXMKLSAgICAgICAgeyAKLSAgICAgICAgICAgIEZpbGUgaW50ZXJmYWNlRmlsZSA9IG5ldyBGaWxlKGNvbmZpZy5zcmNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvckNoYXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVJbnRlcmZhY2UuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLEZpbGUuc2VwYXJhdG9yQ2hhcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VGaWxlLmV4aXN0cygpICYmIGludGVyZmFjZUZpbGUuaXNGaWxlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hlY2tFbnRyaWVzLnB1dCh0aGVJbnRlcmZhY2UuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLEZpbGUuc2VwYXJhdG9yQ2hhcikrIi5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VGaWxlKTsKLSAgICAgICAgICAgICAgICBDbGFzc1tdIHN1cGVySW50ZXJmYWNlcyA9IHRoZUludGVyZmFjZS5nZXRJbnRlcmZhY2VzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkSW50ZXJmYWNlKHN1cGVySW50ZXJmYWNlc1tpXSwgY2hlY2tFbnRyaWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRTdXBlckNsYXNzKENsYXNzIHN1cGVyQ2xhc3MsIEhhc2h0YWJsZSBjaGVja0VudHJpZXMpIHsKLSAgICAKLSAgICAgICAgaWYgKCFzdXBlckNsYXNzLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgc3VwZXJDbGFzc0ZpbGUgPSBuZXcgRmlsZShjb25maWcuc3JjRGlyLmdldEFic29sdXRlUGF0aCgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yQ2hhciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdXBlckNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCcuJyxGaWxlLnNlcGFyYXRvckNoYXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5jbGFzcyIpOwotICAgICAgICAgICAgaWYgKHN1cGVyQ2xhc3NGaWxlLmV4aXN0cygpICYmIHN1cGVyQ2xhc3NGaWxlLmlzRmlsZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoZWNrRW50cmllcy5wdXQoc3VwZXJDbGFzcy5nZXROYW1lKCkucmVwbGFjZSgnLicsRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuY2xhc3MiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3NGaWxlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBub3cgbmVlZCB0byBnZXQgc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBmb3IgdGhpcyBjbGFzcwotICAgICAgICAgICAgICAgIENsYXNzW10gc3VwZXJJbnRlcmZhY2VzID0gc3VwZXJDbGFzcy5nZXRJbnRlcmZhY2VzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkSW50ZXJmYWNlKHN1cGVySW50ZXJmYWNlc1tpXSwgY2hlY2tFbnRyaWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYWRkU3VwZXJDbGFzcyhzdXBlckNsYXNzLmdldFN1cGVyY2xhc3MoKSwgY2hlY2tFbnRyaWVzKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ2xhc3Nsb2FkZXIgb2JqZWN0IHdoaWNoIHBhcnNlcyB0aGUgcGFzc2VkIGluIGdlbmVyaWMgRWpiSmFyIGNsYXNzcGF0aC4KLSAgICAgKiBUaGUgbG9hZGVyIGlzIHVzZWQgdG8gZHluYW1pY2FsbHkgbG9hZCBjbGFzc2VzIGZyb20gamF2YXguZWpiLiogYW5kIHRoZSBjbGFzc2VzIAotICAgICAqIGJlaW5nIGFkZGVkIHRvIHRoZSBqYXIuCi0gICAgICoKLSAgICAgKi8gCi0gICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyRm9yQnVpbGQoKQotICAgIHsKLSAgICAgICAgaWYgKGNsYXNzcGF0aExvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NwYXRoTG9hZGVyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBQYXRoIGNvbWJpbmVkQ2xhc3NwYXRoID0gZ2V0Q29tYmluZWRDbGFzc3BhdGgoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG9ubHkgZ2VuZXJhdGUgYSBuZXcgQ2xhc3NMb2FkZXIgaWYgd2UgaGF2ZSBhIGNsYXNzcGF0aAotICAgICAgICBpZiAoY29tYmluZWRDbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NwYXRoTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2xhc3NwYXRoTG9hZGVyID0gbmV3IEFudENsYXNzTG9hZGVyKGdldFRhc2soKS5nZXRQcm9qZWN0KCksIGNvbWJpbmVkQ2xhc3NwYXRoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aExvYWRlcjsKLSAgICB9Ci0gCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIHRvb2wgcGFyYW1ldGVycyBoYXZlIGJlZW4gY29uZmlndXJlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gSWYgdGhlIERlcGxveW1lbnQgVG9vbCdzIGNvbmZpZ3VyYXRpb24gaXNuJ3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb25maWd1cmVkKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChkZXN0RGlyID09IG51bGwpIHx8ICghZGVzdERpci5pc0RpcmVjdG9yeSgpKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBIHZhbGlkIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIHNwZWNpZmllZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidXNpbmcgdGhlIFwiZGVzdGRpclwiIGF0dHJpYnV0ZS4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldERlcGxveW1lbnRUb29sLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldERlcGxveW1lbnRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMWYwZDEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXREZXBsb3ltZW50VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZW5lcmF0ZSBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciAoaUFTKSA2LjAgc3R1YnMgYW5kIAotICogc2tlbGV0b25zIGFuZCBidWlsZCBhbiBFSkIgSmFyIGZpbGUuICBJdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggdGhlIEFudAotICogPGNvZGU+ZWpiamFyPC9jb2RlPiB0YXNrLiAgSWYgb25seSBzdHVicyBhbmQgc2tlbGV0b25zIG5lZWQgdG8gYmUgZ2VuZXJhdGVkCi0gKiAoaW4gb3RoZXIgd29yZHMsIGlmIG5vIEpBUiBmaWxlIG5lZWRzIHRvIGJlIGNyZWF0ZWQpLCByZWZlciB0byB0aGUKLSAqIDxjb2RlPmlwbGFuZXQtZWpiYzwvY29kZT4gdGFzayBhbmQgdGhlIDxjb2RlPklQbGFuZXRFamJjVGFzazwvY29kZT4gY2xhc3MuCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyOgotICogICA8dWw+Ci0gKiAgICAgPGxpPjxpPmRlc3RkaXI8L2k+IC0tIFRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgSkFSCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHdpbGwgYmUgd3JpdHRlbi4gIEVhY2ggSkFSIGZpbGUgaXMgd3JpdHRlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBkaXJlY3RvcmllcyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZWlyIGxvY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgImRlc2NyaXB0b3JkaXIiIG5hbWVzcGFjZS4gIFRoaXMgaXMgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBhdHRyaWJ1dGUuCi0gKiAgICAgPGxpPjxpPmNsYXNzcGF0aDwvaT4gLS0gVGhlIGNsYXNzcGF0aCB1c2VkIHdoZW4gZ2VuZXJhdGluZyBFSkIgc3R1YnMgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b25zLiAgVGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgKGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQsIHRoZSBjbGFzc3BhdGggc3BlY2lmaWVkIGluIHRoZSAiZWpiamFyIgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCB0YXNrIHdpbGwgYmUgdXNlZCkuICBJZiBzcGVjaWZpZWQsIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCBlbGVtZW50cyB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGggc3BlY2lmaWVkIGluIHRoZSBwYXJlbnQgImVqYmphciIgdGFzay4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgbmVzdGVkICJjbGFzc3BhdGgiIGVsZW1lbnRzIG1heSBhbHNvIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZC4KLSAqICAgICA8bGk+PGk+a2VlcGdlbmVyYXRlZDwvaT4gLS0gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBKYXZhIHNvdXJjZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSBlamJjIHdpbGwgYmUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkIG9yIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4gIElmICJ5ZXMiLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlcyB3aWxsIGJlIHJldGFpbmVkLiAgVGhpcyBpcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIChpZiBvbWl0dGVkLCBpdCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gIm5vIikuCi0gKiAgICAgPGxpPjxpPmRlYnVnPC9pPiAtLSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGVqYmMgdXRpbGl0eSBzaG91bGQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHRvIHRoZSBzdGFuZGFyZAotICogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiAgSWYgInllcyIsIHRoZSBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCAoaWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIm5vIikuCi0gKiAgICAgPGxpPjxpPmlhc2hvbWU8L2k+IC0tIE1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlICJob21lIiBkaXJlY3RvcnkgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaVBsYW5ldCBBcHBsaWNhdGlvbiBzZXJ2ZXIgaW5zdGFsbGF0aW9uLiAgVGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIHRvIGZpbmQgdGhlIGVqYmMgdXRpbGl0eSBpZiBpdCBpc24ndCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHVzZXIncyBzeXN0ZW0gcGF0aC4gIFRoaXMgaXMgYW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSAoaWYgc3BlY2lmaWVkLCBpdCBzaG91bGQgcmVmZXIgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgPGNvZGU+W2luc3RhbGwtbG9jYXRpb25dL2lwbGFuZXQvaWFzNi9pYXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2RlPiBkaXJlY3RvcnkpLiAgSWYgb21pdHRlZCwgdGhlIGVqYmMgdXRpbGl0eSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBvbiB0aGUgdXNlcidzIHN5c3RlbSBwYXRoLgotICogICAgIDxsaT48aT5zdWZmaXg8L2k+IC0tIFN0cmluZyB2YWx1ZSBhcHBlbmRlZCB0byB0aGUgSkFSIGZpbGVuYW1lIHdoZW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgZWFjaCBKQVIuICBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIi5qYXIiKS4KLSAqICAgPC91bD4KLSAqIDxwPgotICogRm9yIGVhY2ggRUpCIGRlc2NyaXB0b3IgZm91bmQgaW4gdGhlICJlamJqYXIiIHBhcmVudCB0YXNrLCB0aGlzIGRlcGxveW1lbnQKLSAqIHRvb2wgd2lsbCBsb2NhdGUgdGhlIHRocmVlIGNsYXNzZXMgdGhhdCBjb21wcmlzZSB0aGUgRUpCLiAgSWYgdGhlc2UgY2xhc3MgCi0gKiBmaWxlcyBjYW5ub3QgYmUgbG9jYXRlZCBpbiB0aGUgc3BlY2lmaWVkIDxjb2RlPnNyY2RpcjwvY29kZT4gZGlyZWN0b3J5LCB0aGUgCi0gKiB0YXNrIHdpbGwgZmFpbC4gIFRoZSB0YXNrIHdpbGwgYWxzbyBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgRUpCIHN0dWJzIGFuZCAKLSAqIHNrZWxldG9ucyBpbiB0aGlzIGRpcmVjdG9yeS4gIElmIGZvdW5kLCB0aGUgdGltZXN0YW1wcyBvbiB0aGUgc3R1YnMgYW5kIAotICogc2tlbGV0b25zIHdpbGwgYmUgY2hlY2tlZCB0byBlbnN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZS4gIE9ubHkgaWYgdGhlc2UgZmlsZXMgCi0gKiBjYW5ub3QgYmUgZm91bmQgb3IgaWYgdGhleSBhcmUgb3V0IG9mIGRhdGUgd2lsbCBlamJjIGJlIGNhbGxlZC4KLSAqCi0gKiBAc2VlICAgIElQbGFuZXRFamJjCi0gKiBAYXV0aG9yIEdyZWcgTmVsc29uIDxhIGhyZWY9Im1haWx0bzpncmVnQG5ldHNjYXBlLmNvbSI+Z3JlZ0BuZXRzY2FwZS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJUGxhbmV0RGVwbG95bWVudFRvb2wgZXh0ZW5kcyBHZW5lcmljRGVwbG95bWVudFRvb2wgewotCi0gICAgLyogQXR0cmlidXRlcyBzZXQgYnkgdGhlIEFudCBidWlsZCBmaWxlICovCi0gICAgcHJpdmF0ZSBGaWxlICAgIGlhc2hvbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgIGphclN1ZmZpeCAgICAgPSAiLmphciI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGtlZXBnZW5lcmF0ZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVidWcgICAgICAgICA9IGZhbHNlOwotCi0gICAgLyoKLSAgICAgKiBGaWxlbmFtZXMgb2YgdGhlIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yICh3aGljaCBpcyBwYXNzZWQgdG8gdGhpcyBjbGFzcwotICAgICAqIGZyb20gdGhlIHBhcmVudCAiZWpiamFyIiB0YXNrKSBhbmQgdGhlIGlBUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvcgotICAgICAqICh3aG9zZSBuYW1lIGlzIGRldGVybWluZWQgYnkgdGhpcyBjbGFzcykuICBCb3RoIGZpbGVuYW1lcyBhcmUgcmVsYXRpdmUKLSAgICAgKiB0byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUgInNyY2RpciIgYXR0cmlidXRlIGluIHRoZSBlamJqYXIgdGFzay4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgIGRlc2NyaXB0b3JOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nICBpYXNEZXNjcmlwdG9yTmFtZTsKLQotICAgIC8qCi0gICAgICogVGhlIGRpc3BsYXlOYW1lIHZhcmlhYmxlIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlICJkaXNwbGF5LW5hbWUiIGVsZW1lbnQKLSAgICAgKiBmcm9tIHRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvci4gIEFzIGEgZnV0dXJlIGVuaGFuY2VtZW50IHRvIHRoaXMgdGFzaywKLSAgICAgKiB3ZSBtYXkgZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBFSkIgSkFSIGZpbGUgdXNpbmcgdGhpcyBkaXNwbGF5LW5hbWUsCi0gICAgICogYnV0IHRoaXMgaGFzIG5vdCBiZSBpbXBsZW1lbnRlZCB5ZXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgIGRpc3BsYXlOYW1lOwotCi0gICAgLyoKLSAgICAgKiBSZWdhcmRsZXNzIG9mIHRoZSBuYW1lIG9mIHRoZSBpQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IgZmlsZSwgaXQgd2lsbAotICAgICAqIHdyaXR0ZW4gaW4gdGhlIGNvbXBsZXRlZCBKQVIgZmlsZSBhcyAiaWFzLWVqYi1qYXIueG1sIi4gIFRoaXMgaXMgdGhlCi0gICAgICogbmFtaW5nIGNvbnZlbnRpb24gaW1wbGVtZW50ZWQgYnkgaUFTLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQVNfREQgPSAiaWFzLWVqYi1qYXIueG1sIjsgICAgCi0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgbWV0aG9kIHVzZWQgdG8gc3RvcmUgdGhlICJob21lIiBkaXJlY3Rvcnkgb2YgdGhlIHVzZXIncyBpQVMKLSAgICAgKiBpbnN0YWxsYXRpb24uICBUaGUgZGlyZWN0b3J5IHNwZWNpZmllZCBzaG91bGQgdHlwaWNhbGx5IGJlCi0gICAgICogPGNvZGU+W2luc3RhbGwtbG9jYXRpb25dL2lwbGFuZXQvaWFzNi9pYXM8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGlhc2hvbWUgVGhlIGhvbWUgZGlyZWN0b3J5IGZvciB0aGUgdXNlcidzIGlBUyBpbnN0YWxsYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWFzaG9tZShGaWxlIGlhc2hvbWUpIHsKLSAgICAgICAgdGhpcy5pYXNob21lID0gaWFzaG9tZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgbWV0aG9kIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBKYXZhIHNvdXJjZSBmaWxlcyBnZW5lcmF0ZWQgYnkKLSAgICAgKiB0aGUgZWpiYyB1dGlsaXR5IHNob3VsZCBiZSBzYXZlZCBvciBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2VlcGdlbmVyYXRlZCBib29sZWFuIHdoaWNoLCBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW5kaWNhdGVzIHRoYXQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBKYXZhIHNvdXJjZSBmaWxlcyBnZW5lcmF0ZWQgYnkgZWpiYyBmb3IgdGhlIHN0dWJzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kIHNrZWxldG9ucyBzaG91bGQgYmUga2VwdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRLZWVwZ2VuZXJhdGVkKGJvb2xlYW4ga2VlcGdlbmVyYXRlZCkgewotICAgICAgICB0aGlzLmtlZXBnZW5lcmF0ZWQgPSBrZWVwZ2VuZXJhdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBvciBub3QgZGVidWdnaW5nIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGVqYmMgaXMKLSAgICAgKiBleGVjdXRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWJ1ZyBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBkZWJ1Z2dpbmcgb3V0cHV0IHNob3VsZCBiZSBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGRlYnVnKSB7Ci0gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgbWV0aG9kIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZW5hbWUgc3VmZml4IChmb3IgZXhhbXBsZSwgIi5qYXIiKQotICAgICAqIGZvciB0aGUgSkFSIGZpbGVzIHRvIGJlIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamFyU3VmZml4IFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBKQVIgZmlsZW5hbWUgc3VmZml4LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN1ZmZpeChTdHJpbmcgamFyU3VmZml4KSB7Ci0gICAgICAgIHRoaXMuamFyU3VmZml4ID0gamFyU3VmZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbmNlIGlBUyBkb2Vzbid0IGdlbmVyYXRlIGEgImdlbmVyaWMiIEpBUiBhcyBwYXJ0IG9mIGl0cyBwcm9jZXNzaW5nLCAKLSAgICAgKiB0aGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGFuZCBhIHdhcm5pbmcgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHN1ZmZpeC4gIFRoaXMgcGFyYW1ldGVyIGlzCi0gICAgICogICAgICAgICAgICAgICAgIGlnbm9yZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJpY0phclN1ZmZpeChTdHJpbmcgaW5TdHJpbmcpIHsKLSAgICAgICAgbG9nKCJTaW5jZSBhIGdlbmVyaWMgSkFSIGZpbGUgaXMgbm90IGNyZWF0ZWQgZHVyaW5nIHByb2Nlc3NpbmcsIHRoZSAiCi0gICAgICAgICAgICAgICAgKyAiaVBsYW5ldCBEZXBsb3ltZW50IFRvb2wgZG9lcyBub3Qgc3VwcG9ydCB0aGUgIgotICAgICAgICAgICAgICAgICsgIlwiZ2VuZXJpY2phcnN1ZmZpeFwiIGF0dHJpYnV0ZS4gIEl0IHdpbGwgYmUgaWdub3JlZC4iLAotICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0Rlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3JOYW1lLCBTQVhQYXJzZXIgc2F4UGFyc2VyKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRvck5hbWUgPSBkZXNjcmlwdG9yTmFtZTsKLQotICAgICAgICBsb2coImlQbGFuZXQgRGVwbG95bWVudCBUb29sIHByb2Nlc3Npbmc6ICIgKyBkZXNjcmlwdG9yTmFtZSArICIgKGFuZCAiIAotICAgICAgICAgICAgICAgICsgZ2V0SWFzRGVzY3JpcHRvck5hbWUoKSArICIpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3IoZGVzY3JpcHRvck5hbWUsIHNheFBhcnNlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgdXNlciBzZWxlY3Rpb25zIGFyZSB2YWxpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yRmlsZU5hbWUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmlsZSBuYW1lIG9mIGFuIEVKQgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gc2F4UGFyc2VyICAgICAgICAgIFNBWFBhcnNlciB3aGljaCBtYXkgYmUgdXNlZCB0byBwYXJzZSB0aGUgWE1MCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yCi0gICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBJZiB0aGUgdXNlciBzZWxlY3Rpb25zIGFyZSBpbnZhbGlkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbihTdHJpbmcgZGVzY3JpcHRvckZpbGVOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW50IHN0YXJ0T2ZOYW1lID0gZGVzY3JpcHRvckZpbGVOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAxOwotICAgICAgICBTdHJpbmcgc3RkWG1sID0gZGVzY3JpcHRvckZpbGVOYW1lLnN1YnN0cmluZyhzdGFydE9mTmFtZSk7Ci0gICAgICAgIGlmIChzdGRYbWwuZXF1YWxzKEVKQl9ERCkgJiYgKGdldENvbmZpZygpLmJhc2VKYXJOYW1lID09IG51bGwpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIk5vIG5hbWUgc3BlY2lmaWVkIGZvciB0aGUgY29tcGxldGVkIEpBUiBmaWxlLiAgVGhlIEVKQiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGVzY3JpcHRvciBzaG91bGQgYmUgcHJlcGVuZGVkIHdpdGggdGhlIEpBUiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibmFtZSBvciBpdCBzaG91bGQgYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIFwiYmFzZWphcm5hbWVcIiBpbiB0aGUgXCJlamJqYXJcIiB0YXNrLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgaWFzRGVzY3JpcHRvciA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWFzRGVzY3JpcHRvck5hbWUoKSk7Ci0gICAgICAgIGlmICgoIWlhc0Rlc2NyaXB0b3IuZXhpc3RzKCkpIHx8ICghaWFzRGVzY3JpcHRvci5pc0ZpbGUoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGhlIGlBUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvciAoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlhc0Rlc2NyaXB0b3IgKyAiKSB3YXMgbm90IGZvdW5kLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoaWFzaG9tZSAhPSBudWxsKSAmJiAoIWlhc2hvbWUuaXNEaXJlY3RvcnkoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSWYgXCJpYXNob21lXCIgaXMgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGEgdmFsaWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeSAoaXQgd2FzIHNldCB0byAiICsgaWFzaG9tZSArICIpLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIEVKQiBmaWxlcyBmb3VuZCB3aGVuIHRoZSBzcGVjaWZpZWQgRUpCCi0gICAgICogZGVzY3JpcHRvciBpcyBwYXJzZWQgYW5kIHByb2Nlc3NlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yRmlsZU5hbWUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmlsZSBuYW1lIG9mIGFuIEVKQgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gc2F4UGFyc2VyICAgICAgICAgIFNBWFBhcnNlciB3aGljaCBtYXkgYmUgdXNlZCB0byBwYXJzZSB0aGUgWE1MCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgb2YgRUpCIGNsYXNzIChhbmQgb3RoZXIpIGZpbGVzIHRvIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCB0byB0aGUgY29tcGxldGVkIEpBUiBmaWxlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICBBbiBJT0V4Y2VwdGlvbiBmcm9tIHRoZSBwYXJzZXIsIHBvc3NpYmx5IGZyb20gCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnl0ZSBzdHJlYW0gb3IgY2hhcmFjdGVyIHN0cmVhbSAKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgICAgIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseSB3cmFwcGluZyBhbm90aGVyIAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBwYXJzZUVqYkZpbGVzKFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBIYXNodGFibGUgZmlsZXM7Ci0KLSAgICAgICAgLyogQnVpbGQgYW5kIHBvcHVsYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBlamJjIHV0aWxpdHkgKi8KLSAgICAgICAgSVBsYW5ldEVqYmMgZWpiYyA9IG5ldyBJUGxhbmV0RWpiYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yRmlsZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElhc0Rlc2NyaXB0b3JOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnKCkuc3JjRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29tYmluZWRDbGFzc3BhdGgoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F4UGFyc2VyKTsKLSAgICAgICAgZWpiYy5zZXRSZXRhaW5Tb3VyY2Uoa2VlcGdlbmVyYXRlZCk7Ci0gICAgICAgIGVqYmMuc2V0RGVidWdPdXRwdXQoZGVidWcpOwotICAgICAgICBpZiAoaWFzaG9tZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlamJjLnNldElhc0hvbWVEaXIoaWFzaG9tZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBFeGVjdXRlIHRoZSBlamJjIHV0aWxpdHkgLS0gc3R1YnMvc2tlbGV0b25zIGFyZSByZWJ1aWx0LCBpZiBuZWVkZWQgKi8KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVqYmMuZXhlY3V0ZSgpOwotICAgICAgICB9IGNhdGNoIChJUGxhbmV0RWpiYy5FamJjRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJleGVjdXRlIHRoZSBpQVMgZWpiYyB1dGlsaXR5IiwgZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkaXNwbGF5TmFtZSAgICA9IGVqYmMuZ2V0RGlzcGxheU5hbWUoKTsKLSAgICAgICAgZmlsZXMgICAgICAgICAgPSBlamJjLmdldEVqYkZpbGVzKCk7Ci0KLSAgICAgICAgLyogQWRkIENNUCBkZXNjcmlwdG9ycyB0byB0aGUgbGlzdCBvZiBFSkIgZmlsZXMgKi8KLSAgICAgICAgU3RyaW5nW10gY21wRGVzY3JpcHRvcnMgPSBlamJjLmdldENtcERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChjbXBEZXNjcmlwdG9ycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBGaWxlIGJhc2VEaXIgPSBnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyOwotCi0gICAgICAgICAgICBpbnQgZW5kT2ZQYXRoID0gZGVzY3JpcHRvckZpbGVOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSBkZXNjcmlwdG9yRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGVuZE9mUGF0aCArIDEpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtcERlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVuZE9mQ21wID0gY21wRGVzY3JpcHRvcnNbaV0ubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY21wRGVzY3JpcHRvciA9IGNtcERlc2NyaXB0b3JzW2ldLnN1YnN0cmluZyhlbmRPZkNtcCArIDEpOwotCi0gICAgICAgICAgICAgICAgRmlsZSAgIGNtcEZpbGUgPSBuZXcgRmlsZShiYXNlRGlyLCByZWxhdGl2ZVBhdGggKyBjbXBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNtcEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgQ01QIGRlc2NyaXB0b3IgZmlsZSAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY21wRmlsZSArICIpIGNvdWxkIG5vdCBiZSBmb3VuZC4iLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlsZXMucHV0KGNtcERlc2NyaXB0b3JzW2ldLCBjbXBGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmaWxlczsgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIGlBUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvciB0byB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCB3aWxsIGJlCi0gICAgICogd3JpdHRlbiB0byB0aGUgSkFSIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWpiRmlsZXMgSGFzaHRhYmxlIG9mIEVKQiBjbGFzcyAoYW5kIG90aGVyKSBmaWxlcyB0byBiZSBhZGRlZCB0bwotICAgICAqICAgICAgICAgICAgICAgICB0aGUgY29tcGxldGVkIEpBUiBmaWxlLgotICAgICAqIEBwYXJhbSBiYXNlTmFtZSBTdHJpbmcgbmFtZSBvZiB0aGUgRUpCIEpBUiBmaWxlIHRvIGJlIHdyaXR0ZW4gKHdpdGhvdXQKLSAgICAgKiAgICAgICAgICAgICAgICAgYSBmaWxlbmFtZSBleHRlbnNpb24pLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7Ci0gICAgICAgIGVqYkZpbGVzLnB1dChNRVRBX0RJUiArIElBU19ERCwgbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwKLSAgICAgICAgICAgICAgICAgICAgIGdldElhc0Rlc2NyaXB0b3JOYW1lKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIEphciB0aGF0IHdpbGwgYmUgd3JpdHRlbi4gVGhlIG1vZGlmaWNhdGlvbiBkYXRlCi0gICAgICogb2YgdGhpcyBqYXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIGRlcGVuZGVudCBiZWFuIGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZU5hbWUgU3RyaW5nIG5hbWUgb2YgdGhlIEVKQiBKQVIgZmlsZSB0byBiZSB3cml0dGVuICh3aXRob3V0Ci0gICAgICogICAgICAgICAgICAgICAgIGEgZmlsZW5hbWUgZXh0ZW5zaW9uKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gRmlsZSByZXByZXNlbnRpbmcgdGhlIEpBUiBmaWxlIHdoaWNoIHdpbGwgYmUgd3JpdHRlbi4KLSAgICAgKi8KLSAgICBGaWxlIGdldFZlbmRvck91dHB1dEphckZpbGUoU3RyaW5nIGJhc2VOYW1lKSB7Ci0gICAgICAgIEZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGdldERlc3REaXIoKSwgYmFzZU5hbWUgKyBqYXJTdWZmaXgpOwotICAgICAgICBsb2coIkpBUiBmaWxlIG5hbWU6ICIgKyBqYXJGaWxlLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICByZXR1cm4gamFyRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaUFTIGVqYmMgdXRpbGl0eSBkb2Vzbid0IHJlcXVpcmUgdGhlIFB1YmxpYyBJRCBvZiB0aGUgZGVzY3JpcHRvcidzCi0gICAgICogRFREIGZvciBpdCB0byBwcm9jZXNzIGNvcnJlY3RseS0tdGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbAotICAgICAqIDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGlBUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvciB1c2luZyB0aGUKLSAgICAgKiBzcGVjaWZpZWQgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgbmFtZS4gIEluIGdlbmVyYWwsIHRoZSBzdGFuZGFyZCAKLSAgICAgKiBkZXNjcmlwdG9yIHdpbGwgYmUgbmFtZWQgIltiYXNlbmFtZV0tZWpiLWphci54bWwiLCBhbmQgdGhpcyBtZXRob2Qgd2lsbAotICAgICAqIHJldHVybiAiW2Jhc2VuYW1lXS1pYXMtZWpiLWphci54bWwiLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgaUFTLXNwZWNpZmljIEVKQiBkZXNjcmlwdG9yIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SWFzRGVzY3JpcHRvck5hbWUoKSB7Ci0gICAgICAgIAotICAgICAgICAvKiBPbmx5IGNhbGN1bGF0ZSB0aGUgZGVzY3JpcHRvciBuYW1lIG9uY2UgKi8KLSAgICAgICAgaWYgKGlhc0Rlc2NyaXB0b3JOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBpYXNEZXNjcmlwdG9yTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwYXRoID0gIiI7ICAgLy8gRGlyZWN0b3J5IHBhdGggb2YgdGhlIEVKQiBkZXNjcmlwdG9yCi0gICAgICAgIFN0cmluZyBiYXNlbmFtZTsgICAgLy8gRmlsZW5hbWUgYXBwZWFyaW5nIGJlZm9yZSBuYW1lIHRlcm1pbmF0b3IKLSAgICAgICAgU3RyaW5nIHJlbWFpbmRlcjsgICAvLyBGaWxlbmFtZSBhcHBlYXJpbmcgYWZ0ZXIgdGhlIG5hbWUgdGVybWluYXRvcgotCi0gICAgICAgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgc3RhbmRhcmQgZGVzY3JpcHRvcidzIHJlbGF0aXZlIHBhdGggKi8KLSAgICAgICAgaW50IHN0YXJ0T2ZGaWxlTmFtZSA9IGRlc2NyaXB0b3JOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgIGlmIChzdGFydE9mRmlsZU5hbWUgIT0gLTEpIHsKLSAgICAgICAgICAgIHBhdGggPSBkZXNjcmlwdG9yTmFtZS5zdWJzdHJpbmcoMCwgc3RhcnRPZkZpbGVOYW1lICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHN0YW5kYXJkIG5hbWUgaXMgdXNlZCAodGhlcmUncyBubyBiYXNlbmFtZSkgKi8KLSAgICAgICAgaWYgKGRlc2NyaXB0b3JOYW1lLnN1YnN0cmluZyhzdGFydE9mRmlsZU5hbWUgKyAxKS5lcXVhbHMoRUpCX0REKSkgewotICAgICAgICAgICAgYmFzZW5hbWUgPSAiIjsKLSAgICAgICAgICAgIHJlbWFpbmRlciA9IEVKQl9ERDsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGVuZE9mQmFzZU5hbWUgPSBkZXNjcmlwdG9yTmFtZS5pbmRleE9mKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnKCkuYmFzZU5hbWVUZXJtaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkZpbGVOYW1lKTsKLSAgICAgICAgICAgIC8qIAotICAgICAgICAgICAgICogQ2hlY2sgZm9yIHRoZSBvZGQgY2FzZSB3aGVyZSB0aGUgdGVybWluYXRvciBhbmQvb3IgZmlsZW5hbWUKLSAgICAgICAgICAgICAqIGV4dGVuc2lvbiBhcmVuJ3QgZm91bmQuICBUaGVzZSB3aWxsIGVuc3VyZSAiaWFzLSIgYXBwZWFycyBhdCB0aGUKLSAgICAgICAgICAgICAqIGVuZCBvZiB0aGUgbmFtZSBhbmQgYmVmb3JlIHRoZSAnLicgKGlmIHByZXNlbnQpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoZW5kT2ZCYXNlTmFtZSA8IDApIHsKLSAgICAgICAgICAgICAgICBlbmRPZkJhc2VOYW1lID0gZGVzY3JpcHRvck5hbWUubGFzdEluZGV4T2YoJy4nKSAtIDE7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZE9mQmFzZU5hbWUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZE9mQmFzZU5hbWUgPSBkZXNjcmlwdG9yTmFtZS5sZW5ndGgoKSAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiYXNlbmFtZSA9IGRlc2NyaXB0b3JOYW1lLnN1YnN0cmluZyhzdGFydE9mRmlsZU5hbWUgKyAxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZE9mQmFzZU5hbWUgKyAxKTsKLSAgICAgICAgICAgIHJlbWFpbmRlciA9IGRlc2NyaXB0b3JOYW1lLnN1YnN0cmluZyhlbmRPZkJhc2VOYW1lICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpYXNEZXNjcmlwdG9yTmFtZSA9IHBhdGggKyBiYXNlbmFtZSArICJpYXMtIiArIHJlbWFpbmRlcjsKLSAgICAgICAgcmV0dXJuIGlhc0Rlc2NyaXB0b3JOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9JUGxhbmV0RWpiYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGExNTYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5IYW5kbGVyQmFzZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGNvbXBpbGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgZm9yIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uIAotICogU2VydmVyIChpQVMpLiAgVGhlIGNsYXNzIHdpbGwgcmVhZCBhIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yIChhcyB3ZWxsIGFzIGFuCi0gKiBFSkIgZGVzY3JpcHRvciBzcGVjaWZpYyB0byBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlcikgdG8gaWRlbnRpZnkgb25lIG9yIAotICogbW9yZSBFSkJzIHRvIHByb2Nlc3MuICBJdCB3aWxsIHNlYXJjaCBmb3IgRUpCICJzb3VyY2UiIGNsYXNzZXMgKHRoZSByZW1vdGUgCi0gKiBpbnRlcmZhY2UsIGhvbWUgaW50ZXJmYWNlLCBhbmQgRUpCIGltcGxlbWVudGF0aW9uIGNsYXNzKSBhbmQgdGhlIEVKQiBzdHVicwotICogYW5kIHNrZWxldG9ucyBpbiB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gIE9ubHkgaWYgdGhlIHN0dWJzIGFuZCAKLSAqIHNrZWxldG9ucyBjYW5ub3QgYmUgZm91bmQgb3IgaWYgdGhleSdyZSBvdXQgb2YgZGF0ZSB3aWxsIHRoZSBpUGxhbmV0Ci0gKiBBcHBsaWNhdGlvbiBTZXJ2ZXIgZWpiYyB1dGlsaXR5IGJlIHJ1bi4KLSAqIDxwPgotICogQmVjYXVzZSB0aGlzIGNsYXNzIChhbmQgaXQncyBhc3NvcnRlZCBpbm5lciBjbGFzc2VzKSBtYXkgYmUgYnVuZGxlZCBpbnRvIHRoZQotICogaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgZGlzdHJpYnV0aW9uIGF0IHNvbWUgcG9pbnQgKGFuZCByZW1vdmVkIGZyb20gdGhlIAotICogQW50IGRpc3RyaWJ1dGlvbiksIHRoZSBjbGFzcyBoYXMgYmVlbiB3cml0dGVuIHRvIGJlIGluZGVwZW5kZW50IG9mIGFsbCAKLSAqIEFudC1zcGVjaWZpYyBjbGFzc2VzLiAgSXQgaXMgYWxzbyBmb3IgdGhpcyByZWFzb24gKGFuZCB0byBhdm9pZCBjbHV0dGVyaW5nIAotICogdGhlIEFwYWNoZSBBbnQgc291cmNlIGZpbGVzKSB0aGF0IHRoaXMgdXRpbGl0eSBoYXMgYmVlbiBwYWNrYWdlZCBpbnRvIGEgCi0gKiBzaW5nbGUgc291cmNlIGZpbGUuCi0gKiA8cD4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEFudCBUYXNrcyBmb3IgaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIsIHNlZSB0aGUgCi0gKiA8Y29kZT5JUGxhbmV0RGVwbG95bWVudFRvb2w8L2NvZGU+IGFuZCA8Y29kZT5JUGxhbmV0RWpiY1Rhc2s8L2NvZGU+IGNsYXNzZXMuCi0gKgotICogQHNlZSAgICBJUGxhbmV0RGVwbG95bWVudFRvb2wKLSAqIEBzZWUgICAgSVBsYW5ldEVqYmNUYXNrCi0gKiBAYXV0aG9yIEdyZWcgTmVsc29uIDxhIGhyZWY9Im1haWx0bzpncmVnQG5ldHNjYXBlLmNvbSI+Z3JlZ0BuZXRzY2FwZS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJUGxhbmV0RWpiYyB7Ci0KLQkvKiBDb25zdGFudHMgdXNlZCBmb3IgdGhlICJiZWFudHlwZSIgYXR0cmlidXRlICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9CRUFOICAgICAgID0gImVudGl0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFTEVTU19TRVNTSU9OID0gInN0YXRlbGVzcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFRlVMX1NFU1NJT04gID0gInN0YXRlZnVsIjsKLQotCS8qIEZpbGVuYW1lcyBvZiB0aGUgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgYW5kIHRoZSBpQVMtc3BlY2lmaWMgZGVzY3JpcHRvciAqLwotCXByaXZhdGUgRmlsZSAgICAgICAgc3RkRGVzY3JpcHRvcjsKLQlwcml2YXRlIEZpbGUgICAgICAgIGlhc0Rlc2NyaXB0b3I7Ci0KLQkvKiAKLQkgKiBEaXJlY3Rvcnkgd2hlcmUgInNvdXJjZSIgRUpCIGZpbGVzIGFyZSBzdG9yZWQgYW5kIHdoZXJlIHN0dWJzIGFuZAotCSAqIHNrZWxldG9ucyB3aWxsIGFsc28gYmUgd3JpdHRlbi4KLQkgKi8KLQlwcml2YXRlIEZpbGUgICAgICAgIGRlc3REaXJlY3Rvcnk7Ci0KLQkvKiBDbGFzc3BhdGggdXNlZCB3aGVuIHRoZSBpQVMgZWpiYyBpcyBjYWxsZWQgKi8KLQlwcml2YXRlIFN0cmluZyAgICAgIGNsYXNzcGF0aDsKLQlwcml2YXRlIFN0cmluZ1tdICAgIGNsYXNzcGF0aEVsZW1lbnRzOwotCi0JLyogT3B0aW9ucyBwYXNzZWQgdG8gdGhlIGlBUyBlamJjICovCi0JcHJpdmF0ZSBib29sZWFuICAgICByZXRhaW5Tb3VyY2UgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gICAgIGRlYnVnT3V0cHV0ICA9IGZhbHNlOwotCi0JLyogaUFTIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKHVzZWQgaWYgZWpiYyBpc24ndCBvbiB1c2VyJ3MgUEFUSCkgKi8KLQlwcml2YXRlIEZpbGUgICAgICAgIGlhc0hvbWVEaXI7Ci0KLQkvKiBQYXJzZXIgYW5kIGhhbmRsZXIgdXNlZCB0byBwcm9jZXNzIGJvdGggRUpCIGRlc2NyaXB0b3IgZmlsZXMgKi8KLQlwcml2YXRlIFNBWFBhcnNlciAgIHBhcnNlcjsKLQlwcml2YXRlIEVqYmNIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRWpiY0hhbmRsZXIoKTsKLQotCS8qCi0JICogVGhpcyBIYXNodGFibGUgbWFpbnRhaW5zIGEgbGlzdCBvZiBFSkIgY2xhc3MgZmlsZXMgcHJvY2Vzc2VkIGJ5IHRoZSBlamJjCi0JICogdXRpbGl0eSAoYm90aCAic291cmNlIiBjbGFzcyBmaWxlcyBhcyB3ZWxsIGFzIHN0dWJzIGFuZCBza2VsZXRvbnMpLiBUaGUKLQkgKiBrZXkgZm9yIHRoZSBIYXNodGFibGUgaXMgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSBjbGFzcyBmaWxlCi0JICogKHJlbGF0aXZlIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkpLiAgVGhlIHZhbHVlIGZvciB0aGUgSGFzaHRhYmxlIGlzCi0JICogYSBGaWxlIG9iamVjdCB3aGljaCByZWZlcmVuY2UgdGhlIGFjdHVhbCBjbGFzcyBmaWxlLgotCSAqLwotCXByaXZhdGUgSGFzaHRhYmxlICAgZWpiRmlsZXMgICAgID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLyogVmFsdWUgb2YgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IHJlYWQgZnJvbSB0aGUgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgKi8KLQlwcml2YXRlIFN0cmluZyAgICAgIGRpc3BsYXlOYW1lOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aGljaCBtYXkgYmUgdXNlZCB0byBwcm9jZXNzIEVKQiBkZXNjcmlwdG9ycyBhbmQKLQkgKiBnZW5lcmF0ZSBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucywgaWYgbmVlZGVkLgotCSAqCi0JICogQHBhcmFtIHN0ZERlc2NyaXB0b3IgRmlsZSByZWZlcmVuY2luZyBhIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yLgotCSAqIEBwYXJhbSBpYXNEZXNjcmlwdG9yIEZpbGUgcmVmZXJlbmNpbmcgYW4gaUFTLXNwZWNpZmljIEVKQiBkZXNjcmlwdG9yLgotCSAqIEBwYXJhbSBkZXN0RGlyZWN0b3J5IEZpbGUgcmVmZXJlbmNpbmcgdGhlIGJhc2UgZGlyZWN0b3J5IHdoZXJlIGJvdGgKLQkgKiAgICAgICAgICAgICAgICAgICAgICBFSkIgInNvdXJjZSIgZmlsZXMgYXJlIGZvdW5kIGFuZCB3aGVyZSBzdHVicyBhbmQKLQkgKiAgICAgICAgICAgICAgICAgICAgICBza2VsZXRvbnMgd2lsbCBiZSB3cml0dGVuLgotCSAqIEBwYXJhbSBjbGFzc3BhdGggICAgIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgaUFTIGVqYmMgdXRpbGl0eS4KLQkgKiBAcGFyYW0gcGFyc2VyICAgICAgICBTQVhQYXJzZXIgdG8gYmUgdXNlZCB0byBwcm9jZXNzIGJvdGggb2YgdGhlIEVKQgotCSAqICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzLgotCSAqLwotCXB1YmxpYyBJUGxhbmV0RWpiYyhGaWxlIHN0ZERlc2NyaXB0b3IsCi0JCQkJCSAgIEZpbGUgaWFzRGVzY3JpcHRvciwKLQkJCQkJICAgRmlsZSBkZXN0RGlyZWN0b3J5LAotCQkJCQkgICBTdHJpbmcgY2xhc3NwYXRoLAotCQkJCQkgICBTQVhQYXJzZXIgcGFyc2VyKSB7Ci0JCXRoaXMuc3RkRGVzY3JpcHRvciA9IHN0ZERlc2NyaXB0b3I7Ci0JCXRoaXMuaWFzRGVzY3JpcHRvciAgICAgID0gaWFzRGVzY3JpcHRvcjsKLQkJdGhpcy5kZXN0RGlyZWN0b3J5ICAgICAgPSBkZXN0RGlyZWN0b3J5OwotCQl0aGlzLmNsYXNzcGF0aCAgICAgICAgICA9IGNsYXNzcGF0aDsKLQkJdGhpcy5wYXJzZXIgICAgICAgICAgICAgPSBwYXJzZXI7Ci0KLQkJLyoKLQkJICogUGFyc2UgdGhlIGNsYXNzcGF0aCBpbnRvIGl0J3MgaW5kaXZpZHVhbCBlbGVtZW50cyBhbmQgc3RvcmUgdGhlCi0JCSAqIHJlc3VsdHMgaW4gdGhlICJjbGFzc3BhdGhFbGVtZW50cyIgaW5zdGFuY2UgdmFyaWFibGUuCi0JCSAqLwotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NwYXRoLCAKLQkJCQkJCQkJCQkJCQkJRmlsZS5wYXRoU2VwYXJhdG9yKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQllbGVtZW50cy5hZGQoc3QubmV4dFRva2VuKCkpOwotCQkJfQotCQkJY2xhc3NwYXRoRWxlbWVudHMgCi0JCQkJCT0gKFN0cmluZ1tdKWVsZW1lbnRzLnRvQXJyYXkobmV3IFN0cmluZ1tlbGVtZW50cy5zaXplKCldKTsKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBvciBub3QgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIAotCSAqIGVqYmMgcHJvY2VzcyBzaG91bGQgYmUgcmV0YWluZWQgb3IgYXV0b21hdGljYWxseSBkZWxldGVkLgotCSAqCi0JICogQHBhcmFtIHJldGFpbnNvdXJjZSBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgSmF2YSBzb3VyY2UgZmlsZXMgZm9yCi0JICogICAgICAgICAgICAgICAgICAgICB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyBzaG91bGQgYmUgcmV0YWluZWQuCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0UmV0YWluU291cmNlKGJvb2xlYW4gcmV0YWluU291cmNlKSB7Ci0JCXRoaXMucmV0YWluU291cmNlID0gcmV0YWluU291cmNlOwotCX0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBvciBub3QgZGVidWdnaW5nIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGVqYmMgaXMKLQkgKiBleGVjdXRlZC4KLQkgKgotCSAqIEBwYXJhbSBkZWJ1Z091dHB1dCBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBkZWJ1Z2dpbmcgb3V0cHV0IHNob3VsZCBiZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0RGVidWdPdXRwdXQoYm9vbGVhbiBkZWJ1Z091dHB1dCkgewotCQl0aGlzLmRlYnVnT3V0cHV0ID0gZGVidWdPdXRwdXQ7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIHRoZSBsb2NhdGlvbiBvZiBhIGxvY2FsIERURCBmaWxlIG9yIHJlc291cmNlLiAgQnkgcmVnaXN0ZXJpbmcKLQkgKiBhIGxvY2FsIERURCwgRUpCIGRlc2NyaXB0b3JzIGNhbiBiZSBwYXJzZWQgZXZlbiB3aGVuIHRoZSByZW1vdGUgc2VydmVycwotCSAqIHdoaWNoIGNvbnRhaW4gdGhlICJwdWJsaWMiIERURHMgY2Fubm90IGJlIGFjY2Vzc2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHB1YmxpY0lEIFRoZSBwdWJsaWMgRFREIGlkZW50aWZpZXIgZm91bmQgaW4gYW4gWE1MIGRvY3VtZW50LgotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgZmlsZSBvciByZXNvdXJjZSBuYW1lIGZvciB0aGUgYXBwcm9wcmlhdGUgRFREIHN0b3JlZAotCSAqICAgICAgICAgICAgICAgICBvbiB0aGUgbG9jYWwgbWFjaGluZS4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckRURChTdHJpbmcgcHVibGljSUQsIFN0cmluZyBsb2NhdGlvbikgewotCQloYW5kbGVyLnJlZ2lzdGVyRFREKHB1YmxpY0lELCBsb2NhdGlvbik7Ci0JfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIG1ldGhvZCB1c2VkIHRvIHN0b3JlIHRoZSAiaG9tZSIgZGlyZWN0b3J5IG9mIHRoZSB1c2VyJ3MgaUFTCi0JICogaW5zdGFsbGF0aW9uLiAgVGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgc2hvdWxkIHR5cGljYWxseSBiZQotCSAqIDxjb2RlPltpbnN0YWxsLWxvY2F0aW9uXS9pcGxhbmV0L2lhczYvaWFzPC9jb2RlPi4KLQkgKgotICAgICAqIEBwYXJhbSBpYXNob21lIFRoZSBob21lIGRpcmVjdG9yeSBmb3IgdGhlIHVzZXIncyBpQVMgaW5zdGFsbGF0aW9uLgotICAgICAqLwotCXB1YmxpYyB2b2lkIHNldElhc0hvbWVEaXIoRmlsZSBpYXNIb21lRGlyKSB7Ci0JCXRoaXMuaWFzSG9tZURpciA9IGlhc0hvbWVEaXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIEhhc2h0YWJsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YgRUpCIGNsYXNzIGZpbGVzIHByb2Nlc3NlZCBieQotCSAqIHRoZSBlamJjIHV0aWxpdHkgKGJvdGggInNvdXJjZSIgY2xhc3MgZmlsZXMgYXMgd2VsbCBhcyBzdHVicyBhbmQgCi0JICogc2tlbGV0b25zKS4gVGhlIGtleSBmb3IgdGhlIEhhc2h0YWJsZSBpcyBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggCi0JICogdG8gdGhlIGNsYXNzIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkpLiAgVGhlIHZhbHVlIGZvcgotCSAqIHRoZSBIYXNodGFibGUgaXMgYSBGaWxlIG9iamVjdCB3aGljaCByZWZlcmVuY2UgdGhlIGFjdHVhbCBjbGFzcyBmaWxlLgotCSAqCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFSkIgZmlsZXMgcHJvY2Vzc2VkIGJ5IHRoZSBlamJjIHV0aWxpdHkuCi0JICovCi0JcHVibGljIEhhc2h0YWJsZSBnZXRFamJGaWxlcygpIHsKLQkJcmV0dXJuIGVqYkZpbGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IHJlYWQgZnJvbSB0aGUgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBFSkItSkFSIGRpc3BsYXkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBDTVAgZGVzY3JpcHRvcnMgcmVmZXJlbmNlZCBpbiB0aGUgRUpCIGRlc2NyaXB0b3JzLgotCSAqCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBDTVAgZGVzY3JpcHRvcnMuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENtcERlc2NyaXB0b3JzKCkgewotCQlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJRWpiSW5mb1tdIGVqYnMgPSBoYW5kbGVyLmdldEVqYnMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVqYnMubGVuZ3RoIDsgaSsrKSB7Ci0JCQlMaXN0IGRlc2NyaXB0b3JzID0gKExpc3QpIGVqYnNbaV0uZ2V0Q21wRGVzY3JpcHRvcnMoKTsKLQkJCXJldHVybkxpc3QuYWRkQWxsKGRlc2NyaXB0b3JzKTsKLQkJfQotCi0JCXJldHVybiAoU3RyaW5nW10pIHJldHVybkxpc3QudG9BcnJheShuZXcgU3RyaW5nW3JldHVybkxpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogTWFpbiBhcHBsaWNhdGlvbiBtZXRob2QgZm9yIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciBlamJjIHV0aWxpdHkuCi0JICogSWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1biB3aXRoIG5vIGNvbW1hbmRsaW5lIGFyZ3VtZW50cywgYSB1c2FnZQotCSAqIHN0YXRlbWVudCBpcyBwcmludGVkIGZvciB0aGUgdXNlci4KLQkgKgotCSAqIEBwYXJhbSBhcmdzIFRoZSBjb21tYW5kbGluZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUZpbGUgICAgICAgIHN0ZERlc2NyaXB0b3I7Ci0JCUZpbGUgICAgICAgIGlhc0Rlc2NyaXB0b3I7Ci0JCUZpbGUgICAgICAgIGRlc3REaXJlY3RvcnkgPSBudWxsOwotCQlTdHJpbmcgICAgICBjbGFzc3BhdGggICAgID0gbnVsbDsKLQkJU0FYUGFyc2VyICAgcGFyc2VyCQkgID0gbnVsbDsKLQkJYm9vbGVhbiAgICAgZGVidWcgICAgICAgICA9IGZhbHNlOwotCQlib29sZWFuICAgICByZXRhaW5Tb3VyY2UgID0gZmFsc2U7Ci0JCUlQbGFuZXRFamJjIGVqYmM7Ci0JCQotCQlpZiAoKGFyZ3MubGVuZ3RoIDwgMikgfHwgKGFyZ3MubGVuZ3RoID4gOCkpIHsKLQkJCXVzYWdlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdGREZXNjcmlwdG9yID0gbmV3IEZpbGUoYXJnc1thcmdzLmxlbmd0aCAtIDJdKTsKLQkJaWFzRGVzY3JpcHRvciA9IG5ldyBGaWxlKGFyZ3NbYXJncy5sZW5ndGggLSAxXSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aCAtIDI7IGkrKykgewotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItY2xhc3NwYXRoIikpIHsKLQkJCQljbGFzc3BhdGggPSBhcmdzWysraV07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZCIpKSB7Ci0JCQkJZGVzdERpcmVjdG9yeSA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZGVidWciKSkgewotCQkJCWRlYnVnID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1rZWVwc291cmNlIikpIHsKLQkJCQlyZXRhaW5Tb3VyY2UgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQl1c2FnZSgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qIElmIHRoZSAtY2xhc3NwYXRoIGZsYWcgaXNuJ3Qgc3BlY2lmaWVkLCB1c2UgdGhlIHN5c3RlbSBjbGFzc3BhdGggKi8KLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0JCQlQcm9wZXJ0aWVzIHByb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKLQkJCWNsYXNzcGF0aCA9IHByb3BzLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKLQkJfQotCi0JCS8qIAotCQkgKiBJZiB0aGUgLWQgZmxhZyBpc24ndCBzcGVjaWZpZWQsIHVzZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYXMgdGhlIAotCQkgKiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLQkJICovCi0JCWlmIChkZXN0RGlyZWN0b3J5ID09IG51bGwpIHsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOwotCQkJZGVzdERpcmVjdG9yeSA9IG5ldyBGaWxlKHByb3BzLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKLQkJfQotCi0JCS8qIENvbnN0cnVjdCBhIFNBWFBhcnNlciB1c2VkIHRvIHByb2Nlc3MgdGhlIGRlc2NyaXB0b3JzICovCi0JCVNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJcGFyc2VyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOwotCQl0cnkgewotCQkJcGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNBWEV4Y2VwdGlvbiBvciBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIG1heSBiZSB0aHJvd24KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXhjZXB0aW9uIHdhcyBnZW5lcmF0ZWQgd2hpbGUgdHJ5aW5nIHRvICIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgYSBuZXcgU0FYUGFyc2VyLiIpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIEJ1aWxkIGFuZCBwb3B1bGF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZWpiYyB1dGlsaXR5ICovCi0JCWVqYmMgPSBuZXcgSVBsYW5ldEVqYmMoc3RkRGVzY3JpcHRvciwgaWFzRGVzY3JpcHRvciwgZGVzdERpcmVjdG9yeSwKLQkJCQkJCQkJY2xhc3NwYXRoLCBwYXJzZXIpOwotCQllamJjLnNldERlYnVnT3V0cHV0KGRlYnVnKTsKLQkJZWpiYy5zZXRSZXRhaW5Tb3VyY2UocmV0YWluU291cmNlKTsKLQotCQkvKiBFeGVjdXRlIHRoZSBlamJjIHV0aWxpdHkgLS0gc3R1YnMvc2tlbGV0b25zIGFyZSByZWJ1aWx0LCBpZiBuZWVkZWQgKi8KLQkJdHJ5IHsKLQkJCWVqYmMuZXhlY3V0ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFuIElPRXhjZXB0aW9uIGhhcyBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIHRoZSAiCi0JCQkJCSsgIlhNTCBkZXNjcmlwdG9ycyAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikuIik7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkEgU0FYRXhjZXB0aW9uIGhhcyBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIHRoZSAiCi0JCQkJCSsgIlhNTCBkZXNjcmlwdG9ycyAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikuIik7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKElQbGFuZXRFamJjLkVqYmNFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHRoZSBlamJjICIKLQkJCQkJKyAidXRpbGl0eSAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhIHVzYWdlIHN0YXRlbWVudC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImphdmEgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLklQbGFuZXRFamJjIFxcIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICBbT1BUSU9OU10gW0VKQiAxLjEgZGVzY3JpcHRvcl0gW2lBUyBFSkIgZGVzY3JpcHRvcl0iKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJXaGVyZSBPUFRJT05TIGFyZToiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1kZWJ1ZyAtLSBmb3IgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgb3V0cHV0Iik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAta2VlcHNvdXJjZSAtLSB0byByZXRhaW4gSmF2YSBzb3VyY2UgZmlsZXMgZ2VuZXJhdGVkIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAtY2xhc3NwYXRoIFtjbGFzc3BhdGhdIC0tIGNsYXNzcGF0aCB1c2VkIGZvciBjb21waWxhdGlvbiIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWQgW2Rlc3RpbmF0aW9uIGRpcmVjdG9yeV0gLS0gZGlyZWN0b3J5IGZvciBjb21waWxlZCBjbGFzc2VzIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSWYgYSBjbGFzc3BhdGggaXMgbm90IHNwZWNpZmllZCwgdGhlIHN5c3RlbSBjbGFzc3BhdGgiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ3aWxsIGJlIHVzZWQuICBJZiBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpcyBub3Qgc3BlY2lmaWVkLCIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZCAoY2xhc3NlcyB3aWxsIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigic3RpbGwgYmUgcGxhY2VkIGluIHN1YmZvbGRlcnMgd2hpY2ggY29ycmVzcG9uZCB0byB0aGVpciIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oInBhY2thZ2UgbmFtZSkuIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIEVKQiBob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwgYW5kIGltcGxlbWVudGF0aW9uIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiY2xhc3MgbXVzdCBiZSBmb3VuZCBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LiAgSW4iKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRpdGlvbiwgdGhlIGRlc3RpbmF0aW9uIHdpbGwgbG9vayBmb3IgdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHRvIGVuc3VyZSB0aGV5IGFyZSB1cCB0byBkYXRlLiIpOwotCX0KLQotCS8qKgotICAgICAqIENvbXBpbGVzIHRoZSBzdHViIGFuZCBza2VsZXRvbnMgZm9yIHRoZSBzcGVjaWZpZWQgRUpCcywgaWYgdGhleSBuZWVkIHRvIAotCSAqIGJlIHVwZGF0ZWQuCi0JICoKLQkgKiBAdGhyb3dzIEVqYmNFeGNlcHRpb24gSWYgdGhlIGVqYmMgdXRpbGl0eSBjYW5ub3QgYmUgY29ycmVjdGx5IGNvbmZpZ3VyZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgb25lIG9yIG1vcmUgb2YgdGhlIEVKQiAic291cmNlIiBjbGFzc2VzCi0JICogICAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgIElmIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIHByb2JsZW0gcmVhZGluZyB0aGUgWE1MCi0JICogICAgICAgICAgICAgICAgICAgICAgIGZpbGUgCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24gIElmIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIHByb2JsZW0gcHJvY2Vzc2luZyB0aGUKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgWE1MIGRlc2NyaXB0b3IgKGl0IG1heSB3cmFwIGFub3RoZXIgZXhjZXB0aW9uKQotICAgICAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgRWpiY0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJY2hlY2tDb25maWd1cmF0aW9uKCk7CS8vIFRocm93cyBFamJjRXhjZXB0aW9uIGlmIHVuc3VjY2Vzc2Z1bAotCi0JCUVqYkluZm9bXSBlamJzID0gZ2V0RWpicygpOwkvLyBSZXR1cm5zIGxpc3Qgb2YgRUpCcyBmb3IgcHJvY2Vzc2luZwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWpicy5sZW5ndGggOyBpKyspIHsKLQkJCWxvZygiRUpCSW5mby4uLiIpOwotCQkJbG9nKGVqYnNbaV0udG9TdHJpbmcoKSk7Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9MDsgaSA8IGVqYnMubGVuZ3RoOyBpKyspIHsKLQkJCUVqYkluZm8gZWpiID0gZWpic1tpXTsKLQotCQkJZWpiLmNoZWNrQ29uZmlndXJhdGlvbihkZXN0RGlyZWN0b3J5KTsgIC8vIFRocm93cyBFamJjRXhjZXB0aW9uCi0KLQkJCWlmIChlamIubXVzdEJlUmVjb21waWxlZChkZXN0RGlyZWN0b3J5KSkgewotCQkJCWxvZyhlamIuZ2V0TmFtZSgpICsgIiBtdXN0IGJlIHJlY29tcGlsZWQgdXNpbmcgZWpiYy4iKTsKLQotCQkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IGJ1aWxkQXJndW1lbnRMaXN0KGVqYik7Ci0JCQkJY2FsbEVqYmMoYXJndW1lbnRzKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlsb2coZWpiLmdldE5hbWUoKSArICIgaXMgdXAgdG8gZGF0ZS4iKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciBlamJjIGNvbW1hbmQtbGluZSB1dGlsaXR5LgotCSAqCi0JICogQHBhcmFtIGFyZ3VtZW50cyBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZWpiYyB1dGlsaXR5LgotICAgICAqLwotCXByaXZhdGUgdm9pZCBjYWxsRWpiYyhTdHJpbmdbXSBhcmd1bWVudHMpIHsKLQkJCi0JCS8qIENvbmNhdGVuYXRlIGFsbCBvZiB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIFN0cmluZyAqLwotCQlTdHJpbmdCdWZmZXIgYXJncyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWFyZ3MuYXBwZW5kKGFyZ3VtZW50c1tpXSkuYXBwZW5kKCIgIik7Ci0JCX0KLQotCQkvKiBJZiBhbiBpQVMgaG9tZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCBwcmVwZW5kIGl0IHRvIHRoZSBjb21tbWFuZCAqLwotCQlTdHJpbmcgY29tbWFuZDsKLQkJaWYgKGlhc0hvbWVEaXIgPT0gbnVsbCkgewotCQkJY29tbWFuZCA9ICIiOwotCQl9IGVsc2UgewotCQkJY29tbWFuZCA9IGlhc0hvbWVEaXIudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImJpbiIgCi0JCQkJCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQkJY29tbWFuZCArPSAiZWpiYyAiOwotCQkKLQkJbG9nKGNvbW1hbmQgKyBhcmdzKTsKLQotCQkvKiAKLQkJICogVXNlIHRoZSBSdW50aW1lIG9iamVjdCB0byBleGVjdXRlIGFuIGV4dGVybmFsIGNvbW1hbmQuICBVc2UgdGhlCi0JCSAqIFJlZGlyZWN0T3V0cHV0IGlubmVyIGNsYXNzIHRvIGRpcmVjdCB0aGUgc3RhbmRhcmQgYW5kIGVycm9yIG91dHB1dAotCQkgKiBmcm9tIHRoZSBjb21tYW5kIHRvIHRoZSBKUkUncyBzdGFuZGFyZCBvdXRwdXQKLQkJICovCi0JCXRyeSB7Ci0JCQlQcm9jZXNzIHAgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQgKyBhcmdzKTsKLQkJCVJlZGlyZWN0T3V0cHV0IG91dHB1dCA9IG5ldyBSZWRpcmVjdE91dHB1dChwLmdldElucHV0U3RyZWFtKCkpOwotCQkJUmVkaXJlY3RPdXRwdXQgZXJyb3IgID0gbmV3IFJlZGlyZWN0T3V0cHV0KHAuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0JCQlvdXRwdXQuc3RhcnQoKTsKLQkJCWVycm9yLnN0YXJ0KCk7Ci0JCQlwLndhaXRGb3IoKTsgIAotCQkJcC5kZXN0cm95KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiQW4gSU9FeGNlcHRpb24gaGFzIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBleGVjdXRlIGVqYmMuIik7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEbyBub3RoaW5nCi0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSB1c2VyIHNlbGVjdGlvbnMgYXJlIHZhbGlkLgotCSAqCi0JICogQHRocm93cyBFamJjRXhjZXB0aW9uIElmIHRoZSB1c2VyIHNlbGVjdGlvbnMgYXJlIGludmFsaWQuCi0gICAgICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEVqYmNFeGNlcHRpb24gewkJCi0KLQkJU3RyaW5nIG1zZyA9ICIiOwotCi0JCWlmIChzdGREZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCW1zZyArPSAiQSBzdGFuZGFyZCBYTUwgZGVzY3JpcHRvciBmaWxlIG11c3QgYmUgc3BlY2lmaWVkLiAgIjsKLQkJfQotCQlpZiAoaWFzRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQltc2cgKz0gIkFuIGlBUy1zcGVjaWZpYyBYTUwgZGVzY3JpcHRvciBmaWxlIG11c3QgYmUgc3BlY2lmaWVkLiAgIjsKLQkJfQotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLQkJCW1zZyArPSAiQSBjbGFzc3BhdGggbXVzdCBiZSBzcGVjaWZpZWQuICAgICI7Ci0JCX0KLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQltc2cgKz0gIkFuIFhNTCBwYXJzZXIgbXVzdCBiZSBzcGVjaWZpZWQuICAgICI7Ci0JCX0KLQotCQlpZiAoZGVzdERpcmVjdG9yeSA9PSBudWxsKSB7Ci0JCQltc2cgKz0gIkEgZGVzdGluYXRpb24gZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkLiAgIjsKLQkJfSBlbHNlIGlmICghZGVzdERpcmVjdG9yeS5leGlzdHMoKSkgewotCQkJbXNnICs9ICJUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdC4gICI7Ci0JCX0gZWxzZSBpZiAoIWRlc3REaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJbXNnICs9ICJUaGUgZGVzdGluYXRpb24gc3BlY2lmaWVkIGlzIG5vdCBhIGRpcmVjdG9yeS4gICI7Ci0JCX0KLQotCQlpZiAobXNnLmxlbmd0aCgpID4gMCkgewotCQkJdGhyb3cgbmV3IEVqYmNFeGNlcHRpb24obXNnKTsKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgRUpCIGRlc2NyaXB0b3JzIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBFSkJzIHdoaWNoIG1heSBuZWVkIHRvCi0JICogYmUgY29tcGlsZWQuCi0JICogCi0JICogQHJldHVybiAgICAgICAgICAgICAgIEFuIGFycmF5IG9mIG9iamVjdHMgd2hpY2ggZGVzY3JpYmUgdGhlIEVKQnMgdG8gYmUgCi0JICogICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgSWYgdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBYTUwKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMKLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgSWYgdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgcHJvYmxlbSBwcm9jZXNzaW5nIHRoZQotCSAqICAgICAgICAgICAgICAgICAgICAgICBYTUwgZGVzY3JpcHRvciAoaXQgbWF5IHdyYXAgYW5vdGhlciBleGNlcHRpb24pCi0JICovCi0JcHJpdmF0ZSBFamJJbmZvW10gZ2V0RWpicygpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJRWpiSW5mb1tdIGVqYnMgPSBudWxsOwotCi0JCS8qCi0JCSAqIFRoZSBFSkIgaW5mb3JtYXRpb24gaXMgZ2F0aGVyZWQgZnJvbSB0aGUgc3RhbmRhcmQgWE1MIEVKQiBkZXNjcmlwdG9yCi0JCSAqIGFuZCB0aGUgaUFTLXNwZWNpZmljIFhNTCBFSkIgZGVzY3JpcHRvciB1c2luZyBhIFNBWCBwYXJzZXIuCi0JCSAqLwotCi0JCXBhcnNlci5wYXJzZShzdGREZXNjcmlwdG9yLCBoYW5kbGVyKTsKLQkJcGFyc2VyLnBhcnNlKGlhc0Rlc2NyaXB0b3IsIGhhbmRsZXIpOwotCQllamJzID0gaGFuZGxlci5nZXRFamJzKCk7Ci0KLQkJcmV0dXJuIGVqYnM7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQmFzZWQgb24gdGhpcyBvYmplY3QncyBpbnN0YW5jZSB2YXJpYWJsZXMgYXMgd2VsbCBhcyB0aGUgRUpCIHRvIGJlCi0JICogcHJvY2Vzc2VkLCB0aGUgY29ycmVjdCBmbGFncyBhbmQgcGFyYW1ldGVycyBhcmUgc2V0IGZvciB0aGUgZWpiYyAKLQkgKiBjb21tYW5kLWxpbmUgdXRpbGl0eS4KLQkgKiBAcGFyYW0gZWpiIFRoZSBFSkIgZm9yIHdoaWNoIHN0dWJzIGFuZCBza2VsZXRvbnMgd2lsbCBiZSBjb21waWxlZC4KLQkgKiBAcmV0dXJuICAgIEFuIGFycmF5IG9mIFN0cmluZ3Mgd2hpY2ggYXJlIHRoZSBjb21tYW5kLWxpbmUgcGFyYW1ldGVycyBmb3IKLQkgKiAgICAgICAgICAgIGZvciB0aGUgZWpiYyB1dGlsaXR5LgotCSAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gYnVpbGRBcmd1bWVudExpc3QoRWpiSW5mbyBlamIpIHsKLQotCQlMaXN0IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvKiBPUFRJT05BTCBDT01NQU5EIExJTkUgUEFSQU1FVEVSUyAqLwotCi0JCWlmIChkZWJ1Z091dHB1dCkgewotCQkJYXJndW1lbnRzLmFkZCgiLWRlYnVnIik7IAotCQl9Ci0KLQkJLyogTm8gYmVhbnR5cGUgZmxhZyBpcyBuZWVkZWQgZm9yIGFuIGVudGl0eSBiZWFuICovCi0JCWlmIChlamIuZ2V0QmVhbnR5cGUoKS5lcXVhbHMoU1RBVEVMRVNTX1NFU1NJT04pKSB7Ci0JCQlhcmd1bWVudHMuYWRkKCItc2wiKTsKLQkJfSBlbHNlIGlmIChlamIuZ2V0QmVhbnR5cGUoKS5lcXVhbHMoU1RBVEVGVUxfU0VTU0lPTikpIHsKLQkJCWFyZ3VtZW50cy5hZGQoIi1zZiIpOwotCQl9Ci0KLQkJaWYgKGVqYi5nZXRJaW9wKCkpIHsKLQkJCWFyZ3VtZW50cy5hZGQoIi1paW9wIik7Ci0JCX0KLQotCQlpZiAoZWpiLmdldENtcCgpKSB7Ci0JCQlhcmd1bWVudHMuYWRkKCItY21wIik7Ci0JCX0KLQotCQlpZiAocmV0YWluU291cmNlKSB7Ci0JCQlhcmd1bWVudHMuYWRkKCItZ3MiKTsKLQkJfQotCi0JCWlmIChlamIuZ2V0SGFzZXNzaW9uKCkpIHsKLQkJCWFyZ3VtZW50cy5hZGQoIi1mbyIpOwotCQl9Ci0KLQkJLyogUkVRVUlSRUQgQ09NTUFORCBMSU5FIFBBUkFNRVRFUlMgKi8KLQotCQlhcmd1bWVudHMuYWRkKCItY2xhc3NwYXRoIik7Ci0JCWFyZ3VtZW50cy5hZGQoY2xhc3NwYXRoKTsKLQotCQlhcmd1bWVudHMuYWRkKCItZCIpOwotCQlhcmd1bWVudHMuYWRkKGRlc3REaXJlY3RvcnkudG9TdHJpbmcoKSk7Ci0KLQkJYXJndW1lbnRzLmFkZChlamIuZ2V0SG9tZSgpLmdldFF1YWxpZmllZENsYXNzTmFtZSgpKTsKLQkJYXJndW1lbnRzLmFkZChlamIuZ2V0UmVtb3RlKCkuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkpOwotCQlhcmd1bWVudHMuYWRkKGVqYi5nZXRJbXBsZW1lbnRhdGlvbigpLmdldFF1YWxpZmllZENsYXNzTmFtZSgpKTsKLQotCQkvKiBDb252ZXJ0IHRoZSBMaXN0IGludG8gYW4gQXJyYXkgYW5kIHJldHVybiBpdCAqLwotCQlyZXR1cm4gKFN0cmluZ1tdKWFyZ3VtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbYXJndW1lbnRzLnNpemUoKV0pOwotCX0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB1c2VkIHRvIHByaW50IG1lc3NhZ2VzIHRvIHRoZSB1c2VyIGlmIGRlYnVnZ2luZwotCSAqIG1lc3NhZ2VzIGFyZSBlbmFibGVkLgotCSAqCi0JICogQHBhcmFtIG1zZyBUaGUgU3RyaW5nIHRvIHByaW50IHRvIHN0YW5kYXJkIG91dHB1dC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJaWYgKGRlYnVnT3V0cHV0KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCX0KLQotCi0JLyogSW5uZXIgY2xhc3NlcyBmb2xsb3cgKi8KLQotCi0JLyoqCi0JICogVGhpcyBpbm5lciBjbGFzcyBpcyB1c2VkIHRvIHNpZ25hbCBhbnkgcHJvYmxlbXMgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YKLQkgKiB0aGUgZWpiYyBjb21waWxlci4KLQkgKgotCSAqIEBhdXRob3IgR3JlZyBOZWxzb24gCi0JICogICAgICAgICA8YSBocmVmPSJtYWlsdG86Z3JlZ0BuZXRzY2FwZS5jb20iPmdyZWdAbmV0c2NhcGUuY29tPC9hPgotCSAqLwotCXB1YmxpYyBjbGFzcyBFamJjRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZS4KLQkJICoKLQkJICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHdoaWNoIGhhcyBvY2N1cnJlZC4KLQkJICovCi0JCXB1YmxpYyBFamJjRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJCXN1cGVyKG1zZyk7Ci0JCX0KLQl9ICAvLyBFbmQgb2YgRWpiY0V4Y2VwdGlvbiBpbm5lciBjbGFzcwotCi0KLQkvKioKLQkgKiBUaGlzIGlubmVyIGNsYXNzIGlzIGFuIFhNTCBkb2N1bWVudCBoYW5kbGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgRUpCCi0JICogZGVzY3JpcHRvcnMgKGJvdGggdGhlIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yIGFzIHdlbGwgYXMgdGhlIGlBUy1zcGVjaWZpYwotCSAqIGRlc2NyaXB0b3IgdGhhdCBzdG9yZXMgYWRkaXRpb25hbCB2YWx1ZXMgZm9yIGlBUykuICBPbmNlIHRoZSBkZXNjcmlwdG9ycyAKLQkgKiBoYXZlIGJlZW4gcHJvY2Vzc2VkLCB0aGUgbGlzdCBvZiBFSkJzIGZvdW5kIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIAotCSAqIHRoZSA8Y29kZT5nZXRFamJzKCk8L2NvZGU+IG1ldGhvZC4KLQkgKgotCSAqIEBzZWUgICAgRWpiSW5mbwotCSAqIEBhdXRob3IgR3JlZyBOZWxzb24gCi0JICogICAgICAgICA8YSBocmVmPSJtYWlsdG86Z3JlZ0BuZXRzY2FwZS5jb20iPmdyZWdAbmV0c2NhcGUuY29tPC9hPgotCSAqLwotICAgIHByaXZhdGUgY2xhc3MgRWpiY0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyQmFzZSB7Ci0KLQkJLyogCi0JCSAqIFR3byBNYXBzIGFyZSB1c2VkIHRvIHRyYWNrIGxvY2FsIERURHMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gY2FzZSB0aGUKLQkJICogcmVtb3RlIGNvcGllcyBvZiB0aGVzZSBEVERzIGNhbm5vdCBiZSBhY2Nlc3NlZC4gIFRoZSBrZXkgZm9yIHRoZSBNYXAKLQkJICogaXMgdGhlIERURHMgcHVibGljIElEIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGxvY2FsIGxvY2F0aW9uIGZvciB0aGUgRFRECi0JCSAqLwotCQlwcml2YXRlIE1hcCAgICAgICByZXNvdXJjZUR0ZHMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcml2YXRlIE1hcCAgICAgICBmaWxlRHRkcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBNYXAgICAgICAgZWpicyA9IG5ldyBIYXNoTWFwKCk7CSAgLy8gTGlzdCBvZiBFSkJzIGZvdW5kIGluIFhNTAotICAgICAgICBwcml2YXRlIEVqYkluZm8gICBjdXJyZW50RWpiOwkJCSAgLy8gT25lIGl0ZW0gd2l0aGluIHRoZSBNYXAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgaWFzRGVzY3JpcHRvciA9IGZhbHNlOyAgLy8gSXMgZG9jIGlBUyBvciBFSkIgZGVzY3JpcHRvcgotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nICAgIGN1cnJlbnRMb2MgPSAiIjsJCSAgLy8gVHJhY2tzIGN1cnJlbnQgZWxlbWVudAotCQlwcml2YXRlIFN0cmluZyAgICBjdXJyZW50VGV4dDsgICAgICAgICAgICAvLyBUcmFja3MgY3VycmVudCB0ZXh0IGRhdGEKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgZWpiVHlwZTsJCQkJICAvLyAic2Vzc2lvbiIgb3IgImVudGl0eSIKLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaGFuZGxlciBhbmQgcmVnaXN0ZXJzIGxvY2FsIGNvcGllcwotCQkgKiBvZiB0aGUgc3RhbmRhcmQgRUpCIDEuMSBkZXNjcmlwdG9yIERURCBhcyB3ZWxsIGFzIGlBUydzIEVKQgotCQkgKiBkZXNjcmlwdG9yIERURC4KLQkJICovCi0JCXB1YmxpYyBFamJjSGFuZGxlcigpIHsKLQkJCWZpbmFsIFN0cmluZyBQVUJMSUNJRF9FSkIxMSA9Ci0JCQkJIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIjsKLQkJCWZpbmFsIFN0cmluZyBQVUJMSUNJRF9JUExBTkVUX0VKQl82MCA9Ci0JCQkJIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBpQVMgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4wLy9FTiI7Ci0KLQkJCQotCQkJZmluYWwgU3RyaW5nIERFRkFVTFRfSUFTNjBfRUpCMTFfRFREX0xPQ0FUSU9OID0gCi0JCQkJImVqYi1qYXJfMV8xLmR0ZCI7Ci0JCQlmaW5hbCBTdHJpbmcgREVGQVVMVF9JQVM2MF9EVERfTE9DQVRJT04gPSAKLQkJCQkiSUFTRWpiX2phcl8xXzAuZHRkIjsKLQotCQkJcmVnaXN0ZXJEVEQoUFVCTElDSURfRUpCMTEsIERFRkFVTFRfSUFTNjBfRUpCMTFfRFREX0xPQ0FUSU9OKTsKLQkJCXJlZ2lzdGVyRFREKFBVQkxJQ0lEX0lQTEFORVRfRUpCXzYwLCBERUZBVUxUX0lBUzYwX0RURF9MT0NBVElPTik7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbGlzdCBvZiBFSkIgb2JqZWN0cyBmb3VuZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIAotCQkgKiBzdGFuZGFyZCBFSkIgMS4xIGRlc2NyaXB0b3IgYW5kIGlBUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvci4KLQkJICoKLQkJICogQHJldHVybiBBbiBhcnJheSBvZiBFSkJzIHdoaWNoIHdlcmUgZm91bmQgZHVyaW5nIHRoZSBkZXNjcmlwdG9yCi0JCSAqICAgICAgICAgcGFyc2luZy4KLQkJICovCi0JCXB1YmxpYyBFamJJbmZvW10gZ2V0RWpicygpIHsKLQkJCXJldHVybiAoRWpiSW5mb1tdKWVqYnMudmFsdWVzKCkudG9BcnJheShuZXcgRWpiSW5mb1tlamJzLnNpemUoKV0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBmb3VuZCBpbiB0aGUgc3RhbmRhcmQKLQkJICogRUpCIDEuMSBkZXNjcmlwdG9yLgotCQkgKgotCQkgKiBAcmV0dXJuIFN0cmluZyBkaXNwbGF5LW5hbWUgdmFsdWUuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlZ2lzdGVycyBhIGxvY2FsIERURCB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHBhcnNpbmcgYW4gRUpCIAotCQkgKiBkZXNjcmlwdG9yLiAgV2hlbiB0aGUgRFREJ3MgcHVibGljIGlkZW50aWZpZXIgaXMgZm91bmQgaW4gYW4gWE1MCi0JCSAqIGRvY3VtZW50LCB0aGUgcGFyc2VyIHdpbGwgcmVmZXJlbmNlIHRoZSBsb2NhbCBEVEQgcmF0aGVyIHRoYW4gdGhlCi0JCSAqIHJlbW90ZSBEVEQuICBUaGlzIGVuYWJsZXMgWE1MIGRvY3VtZW50cyB0byBiZSBwcm9jZXNzZWQgZXZlbiB3aGVuIHRoZQotCQkgKiBwdWJsaWMgRFREIGlzbid0IGF2YWlsYWJsZS4KLQkJICoKLQkJICogQHBhcmFtIHB1YmxpY0lEIFRoZSBEVEQncyBwdWJsaWMgaWRlbnRpZmllci4KLQkJICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgbG9jYWwgRFREIGNvcHkgLS0gdGhlIGxvY2F0aW9uCi0JCSAqICAgICAgICAgICAgICAgICBtYXkgZWl0aGVyIGJlIGEgcmVzb3VyY2UgZm91bmQgb24gdGhlIGNsYXNzcGF0aCBvciBhCi0JCSAqICAgICAgICAgICAgICAgICBsb2NhbCBmaWxlLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaXN0ZXJEVEQoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJCWxvZygiUmVnaXN0ZXJpbmc6ICIgKyBsb2NhdGlvbik7Ci0JCQlpZiAoKHB1YmxpY0lEID09IG51bGwpIHx8IChsb2NhdGlvbiA9PSBudWxsKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKGxvY2F0aW9uKSAhPSBudWxsKSB7Ci0JCQkJbG9nKCJGb3VuZCByZXNvdXJjZTogIiArIGxvY2F0aW9uKTsKLQkJCQlyZXNvdXJjZUR0ZHMucHV0KHB1YmxpY0lELCBsb2NhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGUgZHRkRmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJCQlpZiAoZHRkRmlsZS5leGlzdHMoKSAmJiBkdGRGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJCWxvZygiRm91bmQgZmlsZTogIiArIGxvY2F0aW9uKTsKLQkJCQkJZmlsZUR0ZHMucHV0KHB1YmxpY0lELCBsb2NhdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlc29sdmVzIGFuIGV4dGVybmFsIGVudGl0eSBmb3VuZCBkdXJpbmcgWE1MIHByb2Nlc3NpbmcuICBJZiBhIHB1YmxpYwotCQkgKiBJRCBpcyBmb3VuZCB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgaGFuZGxlciwgYW4gPGNvZGU+Ci0JCSAqIElucHV0U291cmNlPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkIHdoaWNoIHJlZmVycyB0byB0aGUgbG9jYWwgY29weS4KLQkJICogSWYgdGhlIHB1YmxpYyBJRCBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIG9yIGlmIGFuIGVycm9yIG9jY3VycywgdGhlCi0JCSAqIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24gaXMgdXNlZC4KLQkJICoKLQkJICogQHBhcmFtIHB1YmxpY0lkIFRoZSBEVEQncyBwdWJsaWMgaWRlbnRpZmllci4KLQkJICogQHBhcmFtIHN5c3RlbUlkIFRoZSBsb2NhdGlvbiBvZiB0aGUgRFRELCBhcyBmb3VuZCBpbiB0aGUgWE1MIGRvY3VtZW50LgotCQkgKi8KLQkJcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0KLQotCQkJdHJ5IHsKLQotCQkJCS8qIFNlYXJjaCB0aGUgcmVzb3VyY2UgTWFwIGFuZCAoaWYgbm90IGZvdW5kKSBmaWxlIE1hcCAqLwotCi0JCQkJU3RyaW5nIGxvY2F0aW9uID0gKFN0cmluZylyZXNvdXJjZUR0ZHMuZ2V0KHB1YmxpY0lkKTsKLQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlpbnB1dFN0cmVhbSAKLQkJCQkJCT0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UobG9jYXRpb24pLm9wZW5TdHJlYW0oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2NhdGlvbiA9IChTdHJpbmcpZmlsZUR0ZHMuZ2V0KHB1YmxpY0lkKTsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShsb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQotCQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGFydCBvZiBhbiBYTUwgZWxlbWVudCBoYXMgYmVlbiBmb3VuZC4KLQkJICoKLQkJICogQHBhcmFtIG5hbWUgU3RyaW5nIG5hbWUgb2YgdGhlIGVsZW1lbnQgZm91bmQuCi0JCSAqIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZUxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgaW5jbHVkZWQgd2l0aCB0aGUgZWxlbWVudAotCQkgKiAgICAgICAgICAgICAoaWYgYW55KS4KLQkJICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgdGhlIHBhcnNlciBjYW5ub3QgcHJvY2VzcyB0aGUgZG9jdW1lbnQuCi0JCSAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cykgCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJCS8qCi0JCQkgKiBJIG5lZWQgdG8gInB1c2giIHRoZSBlbGVtZW50IG9udG8gdGhlIFN0cmluZyAoY3VycmVudExvYykgd2hpY2ggCi0JCQkgKiBhbHdheXMgcmVwcmVzZW50cyB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgWE1MIGRvY3VtZW50LgotCQkJICovCi0JCQljdXJyZW50TG9jICs9ICJcXCIgKyBuYW1lOwotCi0JCQkvKiBBIG5ldyBlbGVtZW50IGhhcyBzdGFydGVkLCBzbyByZXNldCB0aGUgdGV4dCBiZWluZyBjYXB0dXJlZCAqLwotCQkJY3VycmVudFRleHQgPSAiIjsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKCJcXGVqYi1qYXIiKSkgewotICAgICAgICAgICAgICAgIGlhc0Rlc2NyaXB0b3IgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoIlxcaWFzLWVqYi1qYXIiKSkgewotICAgICAgICAgICAgICAgIGlhc0Rlc2NyaXB0b3IgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKG5hbWUuZXF1YWxzKCJzZXNzaW9uIikpIHx8IChuYW1lLmVxdWFscygiZW50aXR5IikpKSB7Ci0gICAgICAgICAgICAgICAgZWpiVHlwZSA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgCi0KLQkJLyoqCi0JCSAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgY2hhcmFjdGVyIGRhdGEgaGFzIGJlZW4gZm91bmQgaW4gdGhlIFhNTAotCQkgKiBkb2N1bWVudAotCQkgKgotCQkgKiBAcGFyYW0gY2ggQXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIGRvY3VtZW50LgotCQkgKiBAcGFyYW0gc3RhcnQgU3RhcnRpbmcgaW5kZXggb2YgdGhlIGRhdGEgZm91bmQgaW4gdGhlIGRvY3VtZW50LgotCQkgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3VuZCBpbiB0aGUgZG9jdW1lbnQuCi0JCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIElmIHRoZSBwYXJzZXIgY2Fubm90IHByb2Nlc3MgdGhlIGRvY3VtZW50LgotCQkgKi8KLSAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbikgCi0JCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGN1cnJlbnRUZXh0ICs9IG5ldyBTdHJpbmcoY2gpLnN1YnN0cmluZyhzdGFydCwgc3RhcnQgKyBsZW4pOwotICAgICAgICB9Ci0KLQkJLyoqCi0JCSAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhlIGVuZCBvZiBhbiBYTUwgZWxlbWVudCBoYXMgYmVlbiBmb3VuZC4KLQkJICoKLQkJICogQHBhcmFtIG5hbWUgU3RyaW5nIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0JCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIElmIHRoZSBwYXJzZXIgY2Fubm90IHByb2Nlc3MgdGhlIGRvY3VtZW50LgotCQkgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkKLQkJCS8qCi0JCQkgKiBJZiB0aGlzIGlzIGEgc3RhbmRhcmQgRUpCIDEuMSBkZXNjcmlwdG9yLCB3ZSBhcmUgbG9va2luZyBmb3Igb25lCi0JCQkgKiBzZXQgb2YgZGF0YSwgd2hpbGUgaWYgdGhpcyBpcyBhbiBpQVMtc3BlY2lmaWMgZGVzY3JpcHRvciwgd2UncmUKLQkJCSAqIGxvb2tpbmcgZm9yIGRpZmZlcmVudCBzZXQgb2YgZGF0YS4gIEhhbmQgdGhlIHByb2Nlc3Npbmcgb2ZmIHRvCi0JCQkgKiB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLgotCQkJICovCi0gICAgICAgICAgICBpZiAoaWFzRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIGlhc0NoYXJhY3RlcnMoY3VycmVudFRleHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGRDaGFyYWN0ZXJzKGN1cnJlbnRUZXh0KTsKLSAgICAgICAgICAgIH0KLQotCQkJLyoKLQkJCSAqIEkgbmVlZCB0byAicG9wIiB0aGUgZWxlbWVudCBvZmYgdGhlIFN0cmluZyAoY3VycmVudExvYykgd2hpY2ggCi0JCQkgKiBhbHdheXMgcmVwcmVzZW50cyBteSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBYTUwgZG9jdW1lbnQuCi0JCQkgKi8KLQotICAgICAgICAgICAgaW50IG5hbWVMZW5ndGggPSBuYW1lLmxlbmd0aCgpICsgMTsgLy8gQWRkIG9uZSBmb3IgdGhlICJcIgotICAgICAgICAgICAgaW50IGxvY0xlbmd0aCAgPSBjdXJyZW50TG9jLmxlbmd0aCgpOwotCi0gICAgICAgICAgICBjdXJyZW50TG9jID0gY3VycmVudExvYy5zdWJzdHJpbmcoMCwgbG9jTGVuZ3RoIC0gbmFtZUxlbmd0aCk7Ci0gICAgICAgIH0KLQotCQkvKioKLQkJICogUmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCBjaGFyYWN0ZXIgZGF0YSBoYXMgYmVlbiBmb3VuZCBpbiBhIHN0YW5kYXJkCi0JCSAqIEVKQiAxLjEgZGVzY3JpcHRvci4gIFdlJ3JlIGludGVyZXN0ZWQgaW4gcmV0cmlldmluZyB0aGUgaG9tZSAKLQkJICogaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLCBpbXBsZW1lbnRhdGlvbiBjbGFzcywgdGhlIHR5cGUgb2YgYmVhbiwKLQkJICogYW5kIGlmIHRoZSBiZWFuIHVzZXMgQ01QLgotCQkgKgotCQkgKiBAcGFyYW0gdmFsdWUgU3RyaW5nIGRhdGEgZm91bmQgaW4gdGhlIFhNTCBkb2N1bWVudC4KLQkJICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBzdGRDaGFyYWN0ZXJzKFN0cmluZyB2YWx1ZSkgewotCi0JCQlpZiAoY3VycmVudExvYy5lcXVhbHMoIlxcZWpiLWphclxcZGlzcGxheS1uYW1lIikpIHsKLQkJCQlkaXNwbGF5TmFtZSA9IHZhbHVlOwotCQkJCXJldHVybjsKLQkJCX0KLQotICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSAiXFxlamItamFyXFxlbnRlcnByaXNlLWJlYW5zXFwiICsgZWpiVHlwZTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxlamItbmFtZSIpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVqYiA9IChFamJJbmZvKSBlamJzLmdldCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFamIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWpiID0gbmV3IEVqYkluZm8odmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBlamJzLnB1dCh2YWx1ZSwgY3VycmVudEVqYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcaG9tZSIpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVqYi5zZXRIb21lKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXHJlbW90ZSIpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVqYi5zZXRSZW1vdGUodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcZWpiLWNsYXNzIikpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldEltcGxlbWVudGF0aW9uKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXHNlc3Npb24tdHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVqYi5zZXRCZWFudHlwZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxwZXJzaXN0ZW5jZS10eXBlIikpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldENtcCh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCQkvKioKLQkJICogUmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCBjaGFyYWN0ZXIgZGF0YSBoYXMgYmVlbiBmb3VuZCBpbiBhbgotCQkgKiBpQVMtc3BlY2lmaWMgZGVzY3JpcHRvci4gIFdlJ3JlIGludGVyZXN0ZWQgaW4gcmV0cmlldmluZyBkYXRhIAotCQkgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGJlYW4gbXVzdCBzdXBwb3J0IFJNSS9JSU9QIGFjY2Vzcywgd2hldGhlcgotCQkgKiB0aGUgYmVhbiBtdXN0IHByb3ZpZGUgaGlnaGx5IGF2YWlsYWJsZSBzdHVicyBhbmQgc2tlbGV0b25zIChpbiB0aGUKLQkJICogY2FzZSBvZiBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW5zKSwgYW5kIGlmIHRoaXMgYmVhbiB1c2VzIGFkZGl0aW9uYWwKLQkJICogQ01QIFhNTCBkZXNjcmlwdG9ycyAoaW4gdGhlIGNhc2Ugb2YgZW50aXR5IGJlYW5zIHdpdGggQ01QKS4KLQkJICogCi0JCSAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgZGF0YSBmb3VuZCBpbiB0aGUgWE1MIGRvY3VtZW50LgotCQkgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGlhc0NoYXJhY3RlcnMoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZSA9ICJcXGlhcy1lamItamFyXFxlbnRlcnByaXNlLWJlYW5zXFwiICsgZWpiVHlwZTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxlamItbmFtZSIpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVqYiA9IChFamJJbmZvKSBlamJzLmdldCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFamIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWpiID0gbmV3IEVqYkluZm8odmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBlamJzLnB1dCh2YWx1ZSwgY3VycmVudEVqYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcaWlvcCIpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVqYi5zZXRJaW9wKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXGZhaWxvdmVyLXJlcXVpcmVkIikpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldEhhc2Vzc2lvbih2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxwZXJzaXN0ZW5jZS1tYW5hZ2VyIgotCQkJCQkJCQkJCQkgICsgIlxccHJvcGVydGllcy1maWxlLWxvY2F0aW9uIikpIHsKLQkJCQljdXJyZW50RWpiLmFkZENtcERlc2NyaXB0b3IodmFsdWUpOwotCQkJfQotICAgICAgICB9Ci0gICAgfSAgLy8gRW5kIG9mIEVqYmNIYW5kbGVyIGlubmVyIGNsYXNzCi0KLQotCS8qKgotCSAqIFRoaXMgaW5uZXIgY2xhc3MgcmVwcmVzZW50cyBhbiBFSkIgdGhhdCB3aWxsIGJlIGNvbXBpbGVkIHVzaW5nIGVqYmMuCi0JICoKLQkgKiBAYXV0aG9yIEdyZWcgTmVsc29uIAotCSAqICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmdyZWdAbmV0c2NhcGUuY29tIj5ncmVnQG5ldHNjYXBlLmNvbTwvYT4KLQkgKi8KLSAgICBwcml2YXRlIGNsYXNzIEVqYkluZm8gewotICAgICAgICBwcml2YXRlIFN0cmluZyAgICAgbmFtZTsJCQkgIC8vIEVKQidzIGRpc3BsYXkgbmFtZQotICAgICAgICBwcml2YXRlIENsYXNzbmFtZSAgaG9tZTsJCQkgIC8vIEVKQidzIGhvbWUgaW50ZXJmYWNlIG5hbWUKLSAgICAgICAgcHJpdmF0ZSBDbGFzc25hbWUgIHJlbW90ZTsJCQkgIC8vIEVKQidzIHJlbW90ZSBpbnRlcmZhY2UgbmFtZQotICAgICAgICBwcml2YXRlIENsYXNzbmFtZSAgaW1wbGVtZW50YXRpb247CSAgLy8gRUpCJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgIGJlYW50eXBlID0gImVudGl0eSI7ICAvLyBvciAic3RhdGVmdWwiIG9yICJzdGF0ZWxlc3MiCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjbXAgICAgICAgPSBmYWxzZTsJICAvLyBEb2VzIHRoaXMgRUpCIHN1cHBvcnQgQ01QPwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaWlvcCAgICAgID0gZmFsc2U7CSAgLy8gRG9lcyB0aGlzIEVKQiBzdXBwb3J0IElJT1A/Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNlc3Npb24gPSBmYWxzZTsJICAvLyBEb2VzIHRoaXMgRUpCIHJlcXVpcmUgZmFpbG92ZXI/Ci0JCXByaXZhdGUgTGlzdCBjbXBEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsgIC8vIENNUCBkZXNjcmlwdG9yIGxpc3QKLSAgICAgICAgICAgIAotCQkvKioKLQkJICogQ29uc3RydWN0IGEgbmV3IEVKQkluZm8gb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JCSAqCi0JCSAqIEBwYXJhbSBuYW1lIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBFSkIuCi0JCSAqLwotCQlwdWJsaWMgRWpiSW5mbyhTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIEVKQi4gIElmIGEgZGlzcGxheSBuYW1lIGhhcyBub3QgYmVlbgotCQkgKiBzZXQsIGl0IHJldHVybnMgdGhlIEVKQiBpbXBsZW1lbnRhdGlvbiBjbGFzc25hbWUgKGlmIHRoZQotCQkgKiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpcyBub3Qgc2V0LCBpdCByZXR1cm5zICJbdW5uYW1lZF0iKS4KLQkJICoKLQkJICogQHJldHVybiBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGUgRUpCLgotCQkgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCWlmIChpbXBsZW1lbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiW3VubmFtZWRdIjsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gaW1wbGVtZW50YXRpb24uZ2V0Q2xhc3NOYW1lKCk7Ci0JCQkJfQotCQkJfQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotCQkvKgotCQkgKiBCZWxvdyBhcmUgZ2V0dGVyJ3MgYW5kIHNldHRlcidzIGZvciBlYWNoIG9mIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMuCi0JCSAqIE5vdGUgdGhhdCAoaW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyBzZXR0ZXJzIHdpdGggdGhlIHNhbWUgdHlwZSBhcwotCQkgKiB0aGUgaW5zdGFuY2UgdmFyaWFibGUpIGEgc2V0dGVyIGlzIHByb3ZpZGVkIHdpdGggdGFrZXMgYSBTdHJpbmcKLQkJICogYXJndW1lbnQgLS0gdGhpcyBhcmUgcHJvdmlkZWQgc28gdGhlIFhNTCBkb2N1bWVudCBoYW5kbGVyIGNhbiBzZXQKLQkJICogdGhlIEVKQiB2YWx1ZXMgdXNpbmcgdGhlIFN0cmluZ3MgaXQgcGFyc2VzLgotCQkgKi8KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyBob21lKSB7Ci0gICAgICAgICAgICBzZXRIb21lKG5ldyBDbGFzc25hbWUoaG9tZSkpOwotICAgICAgICB9Ci0KLQkJcHVibGljIHZvaWQgc2V0SG9tZShDbGFzc25hbWUgaG9tZSkgewotCQkJdGhpcy5ob21lID0gaG9tZTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBDbGFzc25hbWUgZ2V0SG9tZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBob21lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlKFN0cmluZyByZW1vdGUpIHsKLSAgICAgICAgICAgIHNldFJlbW90ZShuZXcgQ2xhc3NuYW1lKHJlbW90ZSkpOwotICAgICAgICB9Ci0KLQkJcHVibGljIHZvaWQgc2V0UmVtb3RlKENsYXNzbmFtZSByZW1vdGUpIHsKLQkJCXRoaXMucmVtb3RlID0gcmVtb3RlOwotCQl9Ci0KLSAgICAgICAgcHVibGljIENsYXNzbmFtZSBnZXRSZW1vdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVtb3RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb24oU3RyaW5nIGltcGxlbWVudGF0aW9uKSB7Ci0gICAgICAgICAgICBzZXRJbXBsZW1lbnRhdGlvbihuZXcgQ2xhc3NuYW1lKGltcGxlbWVudGF0aW9uKSk7Ci0gICAgICAgIH0KLQotCQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihDbGFzc25hbWUgaW1wbGVtZW50YXRpb24pIHsKLQkJCXRoaXMuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbjsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBDbGFzc25hbWUgZ2V0SW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCZWFudHlwZShTdHJpbmcgYmVhbnR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMuYmVhbnR5cGUgPSBiZWFudHlwZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRCZWFudHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBiZWFudHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENtcChib29sZWFuIGNtcCkgewotICAgICAgICAgICAgdGhpcy5jbXAgPSBjbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbXAoU3RyaW5nIGNtcCkgewotICAgICAgICAgICAgc2V0Q21wKGNtcC5lcXVhbHMoIkNvbnRhaW5lciIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldENtcCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJaW9wKGJvb2xlYW4gaWlvcCkgewotICAgICAgICAgICAgdGhpcy5paW9wID0gaWlvcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldElpb3AoU3RyaW5nIGlpb3ApIHsKLSAgICAgICAgICAgIHNldElpb3AoaWlvcC5lcXVhbHMoInRydWUiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRJaW9wKCkgewotICAgICAgICAgICAgcmV0dXJuIGlpb3A7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRIYXNlc3Npb24oYm9vbGVhbiBoYXNlc3Npb24pIHsKLSAgICAgICAgICAgIHRoaXMuaGFzZXNzaW9uID0gaGFzZXNzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SGFzZXNzaW9uKFN0cmluZyBoYXNlc3Npb24pIHsKLSAgICAgICAgICAgIHNldEhhc2Vzc2lvbihoYXNlc3Npb24uZXF1YWxzKCJ0cnVlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0SGFzZXNzaW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIGhhc2Vzc2lvbjsKLSAgICAgICAgfQotCi0JCXB1YmxpYyB2b2lkIGFkZENtcERlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3IpIHsKLQkJCWNtcERlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldENtcERlc2NyaXB0b3JzKCkgewotCQkJcmV0dXJuIGNtcERlc2NyaXB0b3JzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFZlcmlmaWVzIHRoYXQgdGhlIEVKQiBpcyB2YWxpZC0taWYgaXQgaXMgaW52YWxpZCwgYW4gZXhjZXB0aW9uIGlzCi0JCSAqIHRocm93bgotCQkgKgotCQkgKiAKLQkJICogQHBhcmFtIGJ1aWxkRGlyIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIEVKQiByZW1vdGUgaW50ZXJmYWNlLCBob21lCi0JCSAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBtdXN0IGJlIGZvdW5kLgotCQkgKiBAdGhyb3dzIEVqYmNFeGNlcHRpb24gSWYgdGhlIEVKQiBpcyBpbnZhbGlkLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbihGaWxlIGJ1aWxkRGlyKSB0aHJvd3MgRWpiY0V4Y2VwdGlvbiAgewotCi0JCQkvKiBDaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSB2YWxpZCAqLwotCQkJaWYgKGhvbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJBIGhvbWUgaW50ZXJmYWNlIHdhcyBub3QgZm91bmQgIgotCQkJCQkJCSsgImZvciB0aGUgIiArIG5hbWUgKyAiIEVKQi4iKTsKLQkJCX0KLQkJCWlmIChyZW1vdGUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJBIHJlbW90ZSBpbnRlcmZhY2Ugd2FzIG5vdCBmb3VuZCAiCi0JCQkJCQkJKyAiZm9yIHRoZSAiICsgbmFtZSArICIgRUpCLiIpOwotCQkJfQotCQkJaWYgKGltcGxlbWVudGF0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbigiQW4gRUpCIGltcGxlbWVudGF0aW9uIGNsYXNzIHdhcyBub3QgIgotCQkJCQkJCSsgImZvdW5kIGZvciB0aGUgIiArIG5hbWUgKyAiIEVKQi4iKTsKLQkJCX0KLQotCQkJaWYgKCghYmVhbnR5cGUuZXF1YWxzKEVOVElUWV9CRUFOKSkgCi0JCQkJCQkmJiAoIWJlYW50eXBlLmVxdWFscyhTVEFURUxFU1NfU0VTU0lPTikpIAotCQkJCQkJJiYgKCFiZWFudHlwZS5lcXVhbHMoU1RBVEVGVUxfU0VTU0lPTikpKSB7Ci0JCQkJdGhyb3cgbmV3IEVqYmNFeGNlcHRpb24oIlRoZSBiZWFudHlwZSBmb3VuZCAoIiArIGJlYW50eXBlICsgIikgIgotCQkJCQkJCSsgImlzbid0IHZhbGlkIGluIHRoZSAiICsgbmFtZSArICIgRUpCLiIpOwotCQkJfQotCi0JCQlpZiAoY21wICYmICghYmVhbnR5cGUuZXF1YWxzKEVOVElUWV9CRUFOKSkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNNUCBzdHVicyBhbmQgc2tlbGV0b25zIG1heSBub3QgYmUgZ2VuZXJhdGVkIgotCQkJCQkrICIgZm9yIGEgU2Vzc2lvbiBCZWFuIC0tIHRoZSBcImNtcFwiIGF0dHJpYnV0ZSB3aWxsIGJlIgotCQkJCQkrICIgaWdub3JlZGZvciB0aGUgIiArIG5hbWUgKyAiIEVKQi4iKTsKLQkJCX0KLQotCQkJaWYgKGhhc2Vzc2lvbiAmJiAoIWJlYW50eXBlLmVxdWFscyhTVEFURUZVTF9TRVNTSU9OKSkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkhpZ2hseSBhdmFpbGFibGUgc3R1YnMgYW5kIHNrZWxldG9ucyBtYXkgIgotCQkJCQkrICJvbmx5IGJlIGdlbmVyYXRlZCBmb3IgYSBTdGF0ZWZ1bCBTZXNzaW9uIEJlYW4gLS0gdGhlICIKLQkJCQkJKyAiXCJoYXNlc3Npb25cIiBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkIGZvciB0aGUgIiAKLQkJCQkJKyBuYW1lICsgIiBFSkIuIik7Ci0JCQl9Ci0KLQkJCS8qIENoZWNrIHRoYXQgdGhlIEVKQiAic291cmNlIiBjbGFzc2VzIGFsbCBleGlzdCAqLwotCQkJaWYgKCFyZW1vdGUuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKS5leGlzdHMoKSkgewotCQkJCXRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgcmVtb3RlIGludGVyZmFjZSAiCi0JCQkJCQkJKyByZW1vdGUuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgKyAiIGNvdWxkIG5vdCBiZSAiCi0JCQkJCQkJKyAiZm91bmQuIik7Ci0JCQl9Ci0JCQlpZiAoIWhvbWUuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKS5leGlzdHMoKSkgewotCQkJCXRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgaG9tZSBpbnRlcmZhY2UgIgotCQkJCQkJCSsgaG9tZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSArICIgY291bGQgbm90IGJlICIKLQkJCQkJCQkrICJmb3VuZC4iKTsKLQkJCX0KLQkJCWlmICghaW1wbGVtZW50YXRpb24uZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKS5leGlzdHMoKSkgewotCQkJCXRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgRUpCIGltcGxlbWVudGF0aW9uIGNsYXNzICIKLQkJCQkJCQkrIGltcGxlbWVudGF0aW9uLmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgIiBjb3VsZCAiCi0JCQkJCQkJKyAibm90IGJlIGZvdW5kLiIpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIERldGVybWluZXMgaWYgdGhlIGVqYmMgdXRpbGl0eSBuZWVkcyB0byBiZSBydW4gb3Igbm90LiAgSWYgdGhlIHN0dWJzIAotCQkgKiBhbmQgc2tlbGV0b25zIGNhbiBhbGwgYmUgZm91bmQgaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBBTkQgYWxsIAotCQkgKiBvZiB0aGVpciB0aW1lc3RhbXBzIGFyZSBtb3JlIHJlY2VudCB0aGFuIHRoZSBFSkIgc291cmNlIGNsYXNzZXMgCi0JCSAqIChob21lLCByZW1vdGUsIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzKSwgdGhlIG1ldGhvZCByZXR1cm5zIAotCQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uICBPdGhlcndpc2UsIHRoZSBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KLQkJICoKLQkJICogQHBhcmFtIGRlc3REaXIgVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgRUpCIHNvdXJjZSBjbGFzc2VzLCBzdHVicyBhbmQgCi0JCSAqICAgICAgICAgICAgICAgIHNrZWxldG9ucyBhcmUgbG9jYXRlZC4KLQkJICogQHJldHVybiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZWpiYyB1dGlsaXR5IG5lZWRzIHRvCi0JCSAqICAgICAgICAgYmUgcnVuIHRvIGJyaW5nIHRoZSBzdHVicyBhbmQgc2tlbGV0b25zIHVwIHRvIGRhdGUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtdXN0QmVSZWNvbXBpbGVkKEZpbGUgZGVzdERpcikgewotCi0JCQlsb25nIHNvdXJjZU1vZGlmaWVkID0gc291cmNlQ2xhc3Nlc01vZGlmaWVkKGRlc3REaXIpOwotCi0JCQlsb25nIGRlc3RNb2RpZmllZCA9IGRlc3RDbGFzc2VzTW9kaWZpZWQoZGVzdERpcik7Ci0KLQkJCXJldHVybiAoZGVzdE1vZGlmaWVkIDwgc291cmNlTW9kaWZpZWQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4YW1pbmVzIGVhY2ggb2YgdGhlIEVKQiBzb3VyY2UgY2xhc3NlcyAoaG9tZSwgcmVtb3RlLCBhbmQgCi0JCSAqIGltcGxlbWVudGF0aW9uKSBhbmQgcmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIAotCQkgKiAib2xkZXN0IiBjbGFzcy4KLQkJICoKLQkJICogQHBhcmFtIGNsYXNzcGF0aCBUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgdG8gZmluZCB0aGUgc291cmNlIEVKQgotCQkgKiAgICAgICAgICAgICAgICAgIGNsYXNzZXMuICBJZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIHN5c3RlbSBjbGFzc3BhdGgKLQkJICogICAgICAgICAgICAgICAgICBpcyB1c2VkLgotCQkgKiBAcmV0dXJuIFRoZSBtb2RpZmljYXRpb24gdGltZXN0YW1wIGZvciB0aGUgIm9sZGVzdCIgRUpCIHNvdXJjZSBjbGFzcy4KLQkJICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBJZiBvbmUgb2YgdGhlIEVKQiBzb3VyY2UgY2xhc3NlcyBjYW5ub3QgYmUKLQkJICogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoLgotCQkgKi8KLQkJcHJpdmF0ZSBsb25nIHNvdXJjZUNsYXNzZXNNb2RpZmllZChGaWxlIGJ1aWxkRGlyKSB7Ci0JCQlsb25nIGxhdGVzdE1vZGlmaWVkOyAvLyBUaGUgdGltZXN0YW1wIG9mIHRoZSAibmV3ZXN0IiBjbGFzcwotCQkJbG9uZyBtb2RpZmllZDsgICAgICAgLy8gVGltZXN0YW1wIGZvciBhIGdpdmVuIGNsYXNzCi0JCQlGaWxlIHJlbW90ZUZpbGU7ICAgICAvLyBGaWxlIGZvciB0aGUgcmVtb3RlIGludGVyZmFjZSBjbGFzcwotCQkJRmlsZSBob21lRmlsZTsgICAgICAgLy8gRmlsZSBmb3IgdGhlIGhvbWUgaW50ZXJmYWNlIGNsYXNzCi0JCQlGaWxlIGltcGxGaWxlOyAgICAgICAvLyBGaWxlIGZvciB0aGUgRUpCIGltcGxlbWVudGF0aW9uIGNsYXNzCi0KLQkJCS8qIENoZWNrIHRoZSB0aW1lc3RhbXAgb24gdGhlIHJlbW90ZSBpbnRlcmZhY2UgKi8KLQkJCXJlbW90ZUZpbGUgPSByZW1vdGUuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKTsKLQkJCW1vZGlmaWVkID0gcmVtb3RlRmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCWlmIChtb2RpZmllZCA9PSAtMSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGNsYXNzICIgCi0JCQkJCQkJCSsgcmVtb3RlLmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgIiBjb3VsZG4ndCAiCi0JCQkJCQkJCSsgImJlIGZvdW5kIG9uIHRoZSBjbGFzc3BhdGgiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlsYXRlc3RNb2RpZmllZCA9IG1vZGlmaWVkOwotCQkJCi0JCQkvKiBDaGVjayB0aGUgdGltZXN0YW1wIG9uIHRoZSBob21lIGludGVyZmFjZSAqLwotCQkJaG9tZUZpbGUgPSBob21lLmdldENsYXNzRmlsZShidWlsZERpcik7Ci0JCQltb2RpZmllZCA9IGhvbWVGaWxlLmxhc3RNb2RpZmllZCgpOwotCQkJaWYgKG1vZGlmaWVkID09IC0xKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGUgY2xhc3MgIiAKLQkJCQkJCQkJKyBob21lLmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgIiBjb3VsZG4ndCBiZSAiCi0JCQkJCQkJCSsgImZvdW5kIG9uIHRoZSBjbGFzc3BhdGgiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlsYXRlc3RNb2RpZmllZCA9IE1hdGgubWF4KGxhdGVzdE1vZGlmaWVkLCBtb2RpZmllZCk7Ci0JCQkKLQkJCS8qIENoZWNrIHRoZSB0aW1lc3RhbXAgb24gdGhlIEVKQiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQkJCSAqCi0JCQkgKiBOb3RlIHRoYXQgaWYgT05MWSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgaGFzIGNoYW5nZWQsIGl0J3Mgbm90Ci0JCQkgKiBuZWNlc3NhcnkgdG8gcmVidWlsZCB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMuICBGb3IgdGhpcwotCQkJICogcmVhc29uLCB3ZSBlbnN1cmUgdGhlIGZpbGUgZXhpc3RzICh1c2luZyBsYXN0TW9kaWZpZWQgYWJvdmUpLCBidXQKLQkJCSAqIHdlIERPTidUIGNvbXBhcmUgaXQncyB0aW1lc3RhbXAgd2l0aCB0aGUgdGltZXN0YW1wcyBvZiB0aGUgaG9tZQotCQkJICogYW5kIHJlbW90ZSBpbnRlcmZhY2VzIChiZWNhdXNlIGl0J3MgaXJyZWxldmFudCBpbiBkZXRlcm1pbmluZyBpZgotCQkJICogZWpiYyBtdXN0IGJlIHJ1bikKLQkJCSAqLwotCQkJaW1wbEZpbGUgPSBpbXBsZW1lbnRhdGlvbi5nZXRDbGFzc0ZpbGUoYnVpbGREaXIpOwotCQkJbW9kaWZpZWQgPSBpbXBsRmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCWlmIChtb2RpZmllZCA9PSAtMSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGNsYXNzICIgCi0JCQkJCQkJCSsgaW1wbGVtZW50YXRpb24uZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgCi0JCQkJCQkJCSsgIiBjb3VsZG4ndCBiZSBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlTdHJpbmcgcGF0aFRvRmlsZSA9IHJlbW90ZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKTsKLQkJCXBhdGhUb0ZpbGUgPSBwYXRoVG9GaWxlLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7Ci0JCQllamJGaWxlcy5wdXQocGF0aFRvRmlsZSwgcmVtb3RlRmlsZSk7Ci0KLQkJCXBhdGhUb0ZpbGUgPSBob21lLmdldFF1YWxpZmllZENsYXNzTmFtZSgpOwotCQkJcGF0aFRvRmlsZSA9IHBhdGhUb0ZpbGUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIjsKLQkJCWVqYkZpbGVzLnB1dChwYXRoVG9GaWxlLCBob21lRmlsZSk7Ci0KLQkJCXBhdGhUb0ZpbGUgPSBpbXBsZW1lbnRhdGlvbi5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKTsKLQkJCXBhdGhUb0ZpbGUgPSBwYXRoVG9GaWxlLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7Ci0JCQllamJGaWxlcy5wdXQocGF0aFRvRmlsZSwgaW1wbEZpbGUpOwotCQkJCi0JCQlyZXR1cm4gbGF0ZXN0TW9kaWZpZWQ7Ci0JCX0KLQotCQkvKioKLQkJICogRXhhbWluZXMgZWFjaCBvZiB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgaW4gdGhlIGRlc3RpbmF0aW9uCi0JCSAqIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBmb3IgdGhlICJvbGRlc3QiIAotCQkgKiBjbGFzcy4gSWYgb25lIG9mIHRoZSBzdHVicyBvciBza2VsZXRvbnMgY2Fubm90IGJlIGZvdW5kLCA8Y29kZT4tMQotCQkgKiA8L2NvZGU+IGlzIHJldHVybmVkLgotCQkgKgotCQkgKiBAcGFyYW0gZGVzdCBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucyBhcmUKLQkJICogICAgICAgICAgICAgc3RvcmVkLgotCQkgKiBAcmV0dXJuIFRoZSBtb2RpZmljYXRpb24gdGltZXN0YW1wIGZvciB0aGUgIm9sZGVzdCIgRUpCIHN0dWIgb3IKLQkJICogICAgICAgICBza2VsZXRvbi4gIElmIG9uZSBvZiB0aGUgY2xhc3NlcyBjYW5ub3QgYmUgZm91bmQsIDxjb2RlPi0xCi0JCSAqICAgICAgICAgPC9jb2RlPiBpcyByZXR1cm5lZC4gIAotCQkgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIElmIHRoZSBjYW5vbmljYWwgcGF0aCBvZiB0aGUgZGVzdGluYXRpb24KLQkJICogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgY2Fubm90IGJlIGZvdW5kLgotCQkgKi8KLQkJcHJpdmF0ZSBsb25nIGRlc3RDbGFzc2VzTW9kaWZpZWQoRmlsZSBkZXN0RGlyKSB7Ci0JCQlTdHJpbmdbXSBjbGFzc25hbWVzID0gY2xhc3Nlc1RvR2VuZXJhdGUoKTsgLy8gTGlzdCBvZiBhbGwgc3R1YnMgJiBza2VscwotCQkJbG9uZyBkZXN0Q2xhc3Nlc01vZGlmaWVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7IC8vIEVhcmxpZXN0IG1vZCB0aW1lCi0JCQlib29sZWFuIGFsbENsYXNzZXNGb3VuZCAgPSB0cnVlOyAgICAgICAgICAgLy8gSGFzIGVhY2ggYmVlbiBmb3VuZD8KLQotCQkJLyoKLQkJCSAqIExvb3AgdGhyb3VnaCBlYWNoIHN0dWIvc2tlbGV0b24gY2xhc3MgdGhhdCBtdXN0IGJlIGdlbmVyYXRlZCwgYW5kCi0JCQkgKiBkZXRlcm1pbmUgKGlmIGFsbCBleGlzdCkgd2hpY2ggZmlsZSBoYXMgdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcAotCQkJICovCi0JCQlmb3IgKGludCBpPTA7IGkgPCBjbGFzc25hbWVzLmxlbmd0aDsgaSsrKSB7Ci0KLQkJCQlTdHJpbmcgcGF0aFRvQ2xhc3MgPSAKLQkJCQkJCWNsYXNzbmFtZXNbaV0ucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIjsKLQkJCQlGaWxlIGNsYXNzRmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsIHBhdGhUb0NsYXNzKTsKLQotCQkJCS8qIAotCQkJCSAqIEFkZCBlYWNoIHN0dWIvc2tlbGV0b24gY2xhc3MgdG8gdGhlIGxpc3Qgb2YgRUpCIGZpbGVzLiAgTm90ZQotCQkJCSAqIHRoYXQgZWFjaCBjbGFzcyBpcyBhZGRlZCBldmVuIGlmIGl0IGRvZXNuJ3QgZXhpc3Qgbm93LgotCQkJCSAqLwotCQkJCWVqYkZpbGVzLnB1dChwYXRoVG9DbGFzcywgY2xhc3NGaWxlKTsKLQotCQkJCWFsbENsYXNzZXNGb3VuZCA9IGFsbENsYXNzZXNGb3VuZCAmJiBjbGFzc0ZpbGUuZXhpc3RzKCk7Ci0KLQkJCQlpZiAoYWxsQ2xhc3Nlc0ZvdW5kKSB7Ci0JCQkJCWxvbmcgZmlsZU1vZCA9IGNsYXNzRmlsZS5sYXN0TW9kaWZpZWQoKTsKLQotCQkJCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSBvbGRlc3QgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCAqLwotCQkJCQlkZXN0Q2xhc3Nlc01vZGlmaWVkID0gTWF0aC5taW4oZGVzdENsYXNzZXNNb2RpZmllZCwgZmlsZU1vZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gKGFsbENsYXNzZXNGb3VuZCkgPyBkZXN0Q2xhc3Nlc01vZGlmaWVkIDogLTE7Ci0JCX0KLQotCQkvKioKLQkJICogQnVpbGRzIGFuIGFycmF5IG9mIGNsYXNzIG5hbWVzIHdoaWNoIHJlcHJlc2VudCB0aGUgc3R1YnMgYW5kIAotCQkgKiBza2VsZXRvbnMgd2hpY2ggbmVlZCB0byBiZSBnZW5lcmF0ZWQgZm9yIGEgZ2l2ZW4gRUpCLiAgVGhlIGNsYXNzIAotCQkgKiBuYW1lcyBhcmUgZnVsbHkgcXVhbGlmaWVkLiAgTmluZSBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgZm9yIGFsbCBFSkJzIAotCQkgKiB3aGlsZSBhbiBhZGRpdGlvbmFsIHNpeCBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgZm9yIGJlYW5zIHJlcXVpcmluZyAKLQkJICogUk1JL0lJT1AgYWNjZXNzLgotCQkgKgotCQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgCi0JCSAqICAgICAgICAgbmFtZXMgZm9yIHRoZSBzdHVicyBhbmQgc2tlbGV0b25zIHRvIGJlIGdlbmVyYXRlZC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nW10gY2xhc3Nlc1RvR2VuZXJhdGUoKSB7Ci0JCQlTdHJpbmdbXSBjbGFzc25hbWVzID0gKGlpb3ApID8gbmV3IFN0cmluZ1sxNV0gOiBuZXcgU3RyaW5nWzldOwotCi0JCQlmaW5hbCBTdHJpbmcgcmVtb3RlUGtnICAgICA9IHJlbW90ZS5nZXRQYWNrYWdlTmFtZSgpICsgIi4iOwotCQkJZmluYWwgU3RyaW5nIHJlbW90ZUNsYXNzICAgPSByZW1vdGUuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQlmaW5hbCBTdHJpbmcgaG9tZVBrZyAgICAgICA9IGhvbWUuZ2V0UGFja2FnZU5hbWUoKSArICIuIjsKLQkJCWZpbmFsIFN0cmluZyBob21lQ2xhc3MgICAgID0gaG9tZS5nZXRDbGFzc05hbWUoKTsKLQkJCWZpbmFsIFN0cmluZyBpbXBsUGtnICAgICAgID0gaW1wbGVtZW50YXRpb24uZ2V0UGFja2FnZU5hbWUoKSArICIuIjsKLQkJCWZpbmFsIFN0cmluZyBpbXBsRnVsbENsYXNzID0gaW1wbGVtZW50YXRpb24uZ2V0UXVhbGlmaWVkV2l0aFVuZGVyc2NvcmVzKCk7Ci0JCQlpbnQgaW5kZXggPSAwOwotCi0JCQlTdHJpbmcgZnVsbFBhdGg7Ci0KLQkJCWNsYXNzbmFtZXNbaW5kZXgrK10gPSBpbXBsUGtnICsgImVqYl9mYWNfIiArIGltcGxGdWxsQ2xhc3M7Ci0JCQljbGFzc25hbWVzW2luZGV4KytdID0gaW1wbFBrZyArICJlamJfaG9tZV8iICsgaW1wbEZ1bGxDbGFzczsKLQkJCWNsYXNzbmFtZXNbaW5kZXgrK10gPSBpbXBsUGtnICsgImVqYl9za2VsXyIgKyBpbXBsRnVsbENsYXNzOwotCQkJY2xhc3NuYW1lc1tpbmRleCsrXSA9IHJlbW90ZVBrZyArICJlamJfa2NwX3NrZWxfIiArIHJlbW90ZUNsYXNzOwotCQkJY2xhc3NuYW1lc1tpbmRleCsrXSA9IGhvbWVQa2cgKyAiZWpiX2tjcF9za2VsXyIgKyBob21lQ2xhc3M7Ci0JCQljbGFzc25hbWVzW2luZGV4KytdID0gcmVtb3RlUGtnICsgImVqYl9rY3Bfc3R1Yl8iICsgcmVtb3RlQ2xhc3M7Ci0JCQljbGFzc25hbWVzW2luZGV4KytdID0gaG9tZVBrZyArICJlamJfa2NwX3N0dWJfIiArIGhvbWVDbGFzczsKLQkJCWNsYXNzbmFtZXNbaW5kZXgrK10gPSByZW1vdGVQa2cgKyAiZWpiX3N0dWJfIiArIHJlbW90ZUNsYXNzOwotCQkJY2xhc3NuYW1lc1tpbmRleCsrXSA9IGhvbWVQa2cgKyAiZWpiX3N0dWJfIiArIGhvbWVDbGFzczsKLQotCQkJaWYgKCFpaW9wKSB7Ci0JCQkJcmV0dXJuIGNsYXNzbmFtZXM7Ci0JCQl9Ci0KLQkJCWNsYXNzbmFtZXNbaW5kZXgrK10gPSByZW1vdGVQa2cgKyAiXyIgKyByZW1vdGVDbGFzcyArICJfU3R1YiI7Ci0JCQljbGFzc25hbWVzW2luZGV4KytdID0gaG9tZVBrZyArICJfIiArIGhvbWVDbGFzcyArICJfU3R1YiI7Ci0JCQljbGFzc25hbWVzW2luZGV4KytdID0gcmVtb3RlUGtnICsgIl9lamJfUm1pQ29yYmFCcmlkZ2VfIiAKLQkJCQkJCQkJCQkJCQkJKyByZW1vdGVDbGFzcyArICJfVGllIjsKLQkJCWNsYXNzbmFtZXNbaW5kZXgrK10gPSBob21lUGtnICsgIl9lamJfUm1pQ29yYmFCcmlkZ2VfIiArIGhvbWVDbGFzcyAKLQkJCQkJCQkJCQkJCQkJKyAiX1RpZSI7Ci0JCQljbGFzc25hbWVzW2luZGV4KytdID0gcmVtb3RlUGtnICsgImVqYl9SbWlDb3JiYUJyaWRnZV8iIAotCQkJCQkJCQkJCQkJCQkrIHJlbW90ZUNsYXNzOwotCQkJY2xhc3NuYW1lc1tpbmRleCsrXSA9IGhvbWVQa2cgKyAiZWpiX1JtaUNvcmJhQnJpZGdlXyIgKyBob21lQ2xhc3M7Ci0KLQkJCXJldHVybiBjbGFzc25hbWVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnZlbmllbmNlIG1ldGhvZCB3aGljaCBjcmVhdGVzIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFsbCB0aGUKLQkJICogaW5zdGFuY2UgdmFyaWFibGVzIG9mIGFuIEVqYkluZm8gb2JqZWN0LgotCQkgKgotCQkgKiBAcmV0dXJuIEEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgRWpiSW5mbyBpbnN0YW5jZS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmcgcyA9ICJFSkIgbmFtZTogIiArIG5hbWUKLQkJCQkJCSsgIlxuXHIgICAgICAgICAgICAgIGhvbWU6ICAgICAgIiArIGhvbWUgCi0JCQkJCQkrICJcblxyICAgICAgICAgICAgICByZW1vdGU6ICAgICIgKyByZW1vdGUgCi0JCQkJCQkrICJcblxyICAgICAgICAgICAgICBpbXBsOiAgICAgICIgKyBpbXBsZW1lbnRhdGlvbiAKLQkJCQkJCSsgIlxuXHIgICAgICAgICAgICAgIGJlYW50eXBlOiAgIiArIGJlYW50eXBlIAotCQkJCQkJKyAiXG5cciAgICAgICAgICAgICAgY21wOiAgICAgICAiICsgY21wIAotCQkJCQkJKyAiXG5cciAgICAgICAgICAgICAgaWlvcDogICAgICAiICsgaWlvcCAKLQkJCQkJCSsgIlxuXHIgICAgICAgICAgICAgIGhhc2Vzc2lvbjogIiArIGhhc2Vzc2lvbjsKLQotCQkJSXRlcmF0b3IgaSA9IGNtcERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlzICs9ICJcblxyICAgICAgICAgICAgICBDTVAgRGVzY3JpcHRvcjogIiArIGkubmV4dCgpOwotCQkJfQotCi0JCQlyZXR1cm4gczsKLQkJfQotCi0JfSAvLyBFbmQgb2YgRWpiSW5mbyBpbm5lciBjbGFzcwotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgY2xhc3MgdXNlZCB0byByZXByZXNlbnQgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSAKLQkgKiBjbGFzcy4gIEl0IHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIHJldHJpZXZlIGNvbXBvbmVudHMgb2YgdGhlIGNsYXNzIG5hbWUgCi0JICogaW4gYSBmb3JtYXQgdGhhdCBpcyBjb252ZW5pZW50IGZvciBidWlsZGluZyBpQVMgc3R1YnMgYW5kIHNrZWxldG9ucy4KLQkgKgotCSAqIEBhdXRob3IgR3JlZyBOZWxzb24gPGEgaHJlZj0ibWFpbHRvOmdyZWdAbmV0c2NhcGUuY29tIj5ncmVnQG5ldHNjYXBlLmNvbTwvYT4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENsYXNzbmFtZSB7Ci0JCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWU7ICAvLyBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcwotCQlwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsgICAgLy8gTmFtZSBvZiB0aGUgcGFja2FnZSBmb3IgdGhpcyBjbGFzcwotCQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7ICAgICAgLy8gTmFtZSBvZiB0aGUgY2xhc3Mgd2l0aG91dCB0aGUgcGFja2FnZQotCi0JCS8qKgotCQkgKiBUaGlzIGNvbnN0cnVjdG9yIGJ1aWxkcyBhbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhIEphdmEgCi0JCSAqIGNsYXNzLgotCQkgKgotCQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkJICogICAgICAgICAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBDbGFzc25hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJCWlmIChxdWFsaWZpZWROYW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXRoaXMucXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZE5hbWU7Ci0KLQkJCWludCBpbmRleCA9IHF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWNsYXNzTmFtZSA9IHF1YWxpZmllZE5hbWU7Ci0JCQkJcGFja2FnZU5hbWUgPSAiIjsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFja2FnZU5hbWUgPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJY2xhc3NOYW1lICAgPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLgotCQkgKgotCQkgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCQlyZXR1cm4gcXVhbGlmaWVkTmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBwYWNrYWdlIG5hbWUgZm9yIHRoZSBKYXZhIGNsYXNzLgotCQkgKgotCQkgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhlIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJCXJldHVybiBwYWNrYWdlTmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBKYXZhIGNsYXNzIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZSBzdHJ1Y3R1cmUuCi0JCSAqCi0JCSAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBmb3IgdGhlIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHdpdGggdW5kZXJzY29yZXMgCi0JCSAqIHNlcGFyYXRpbmcgdGhlIGNvbXBvbmVudHMgb2YgdGhlIGNsYXNzIG5hbWUgcmF0aGVyIHRoYW4gcGVyaW9kcy4gIAotCQkgKiBUaGlzIGZvcm1hdCBpcyB1c2VkIGluIG5hbWluZyBzb21lIG9mIHRoZSBzdHViIGFuZCBza2VsZXRvbiBjbGFzc2VzIAotCQkgKiBmb3IgdGhlIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyLiAgCi0JCSAqCi0JCSAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdXNpbmcgCi0JCSAqICAgICAgICAgdW5kZXJzY29yZXMgaW5zdGVhZCBvZiBwZXJpb2RzLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRXaXRoVW5kZXJzY29yZXMoKSB7Ci0JCQlyZXR1cm4gcXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgJ18nKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIGEgRmlsZSB3aGljaCByZWZlcmVuY2VzIHRoZSBjbGFzcyByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkCi0JCSAqIGRpcmVjdG9yeS4gIE5vdGUgdGhhdCB0aGUgY2xhc3MgZmlsZSBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLQkJICoKLQkJICogQHBhcmFtICBkaXJlY3RvcnkgQSBGaWxlIHJlZmVyZW5jaW5nIHRoZSBiYXNlIGRpcmVjdG9yeSBjb250YWluaW5nCi0JCSAqICAgICAgICAgICAgICAgICAgIGNsYXNzIGZpbGVzLgotCQkgKiBAcmV0dXJuIEZpbGUgcmVmZXJlbmNpbmcgdGhpcyBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBGaWxlIGdldENsYXNzRmlsZShGaWxlIGRpcmVjdG9yeSkgewotCQkJU3RyaW5nIHBhdGhUb0ZpbGUgPSBxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpIAotCQkJCQkJCQkJCQkrICIuY2xhc3MiOwotCQkJcmV0dXJuIG5ldyBGaWxlKGRpcmVjdG9yeSwgcGF0aFRvRmlsZSk7Ci0JCX0KLQotCQkvKioKLQkJICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2xhc3MgbmFtZS4gIEl0IHJldHVybnMgdGhlIGZ1bGx5Ci0JCSAqIHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCQkgKgotCQkgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBnZXRRdWFsaWZpZWRDbGFzc05hbWUoKTsKLQkJfQotCX0gIC8vIEVuZCBvZiBDbGFzc25hbWUgaW5uZXIgY2xhc3MKLQotCi0JLyoqCi0JICogVGhyZWFkIGNsYXNzIHVzZWQgdG8gcmVkaXJlY3Qgb3V0cHV0IGZyb20gYW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHRvIAotCSAqIHRoZSBKUkUgc3RhbmRhcmQgb3V0cHV0LiAgVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCB0byByZWRpcmVjdCBvdXRwdXQgZnJvbQotCSAqIGFuIGV4dGVybmFsIHByb2Nlc3MgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KLQkgKgotCSAqIEBhdXRob3IgR3JlZyBOZWxzb24gPGEgaHJlZj0ibWFpbHRvOmdyZWdAbmV0c2NhcGUuY29tIj5ncmVnQG5ldHNjYXBlLmNvbTwvYT4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlZGlyZWN0T3V0cHV0IGV4dGVuZHMgVGhyZWFkIHsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtOyAgLy8gU3RyZWFtIHRvIHJlYWQgYW5kIHJlZGlyZWN0IHRvIHN0YW5kYXJkIG91dHB1dAotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIHRoYXQgd2lsbCByZWRpcmVjdCBvdXRwdXQgZnJvbSB0aGUKLQkJICogc3BlY2lmaWVkIHN0cmVhbSB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCQkgKgotCQkgKiBAcGFyYW0gc3RyZWFtIElucHV0U3RyZWFtIHdoaWNoIHdpbGwgYmUgcmVhZCBhbmQgcmVkaXJlY3RlZCB0byB0aGUKLQkJICogICAgICAgICAgICAgICBzdGFuZGFyZCBvdXRwdXQuCi0JCSAqLwotCQlwdWJsaWMgUmVkaXJlY3RPdXRwdXQoSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCQl0aGlzLnN0cmVhbSA9IHN0cmVhbTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmVkaXJlY3RzIGl0IHRvIHN0YW5kYXJkIG91dHB1dAotCQkgKiB1c2luZyBhIHNlcGFyYXRlIHRocmVhZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQkJCQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJU3RyaW5nIHRleHQ7Ci0JCQl0cnkgewotCQkJCXdoaWxlICgodGV4dCA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0ZXh0KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBEbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQl9Ci0JfSAgLy8gRW5kIG9mIFJlZGlyZWN0T3V0cHV0IGlubmVyIGNsYXNzCi0KLX0gICAgICAgIAotICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldEVqYmNUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldEVqYmNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NGFiY2IuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUYXNrIHRvIGNvbXBpbGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgZm9yIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlci4gCi0gKiBUaGUgRUpCcyB0byBiZSBwcm9jZXNzZWQgYXJlIHNwZWNpZmllZCBieSB0aGUgRUpCIDEuMSBzdGFuZGFyZCBYTUwKLSAqIGRlc2NyaXB0b3IsIGFuZCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGlQbGFuZXQgQXBwbGljYXRpb24gCi0gKiBTZXJ2ZXItc3BlY2lmaWMgWE1MIGRlc2NyaXB0b3IuICBTaW5jZSB0aGUgWE1MIGRlc2NyaXB0b3JzIGNhbiBpbmNsdWRlIAotICogbXVsdGlwbGUgRUpCcywgdGhpcyBpcyBhIGNvbnZlbmllbnQgd2F5IG9mIHNwZWNpZnlpbmcgbWFueSBFSkJzIGluIGEgc2luZ2xlIAotICogQW50IHRhc2suICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGFsbG93ZWQ6Ci0gKiAgIDx1bD4KLSAqICAgICA8bGk+PGk+ZWpiZGVzY3JpcHRvcjwvaT4gLS0gU3RhbmRhcmQgRUpCIDEuMSBYTUwgZGVzY3JpcHRvciAodHlwaWNhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlZCAiZWpiLWphci54bWwiKS4gIFRoaXMgYXR0cmlidXRlIGlzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZC4KLSAqICAgICA8bGk+PGk+aWFzZGVzY3JpcHRvcjwvaT4gLS0gRUpCIFhNTCBkZXNjcmlwdG9yIGZvciBpUGxhbmV0IEFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlciAodHlwaWNhbGx5IHRpdGxlZCAiaWFzLWVqYi1qYXIueG1sKS4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLSAqICAgICA8bGk+PGk+ZGVzdDwvaT4gLS0gVGhlIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgUk1JIHN0dWJzIGFuZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b25zIGFyZSB3cml0dGVuLiAgSW4gYWRkaXRpb24sIHRoZSBjbGFzcyBmaWxlcwotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBiZWFuIChob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEVKQiBpbXBsZW1lbnRhdGlvbikgbXVzdCBiZSBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0gKiAgICAgPGxpPjxpPmNsYXNzcGF0aDwvaT4gLS0gVGhlIGNsYXNzcGF0aCB1c2VkIHdoZW4gZ2VuZXJhdGluZyBFSkIgc3R1YnMgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b25zLiAgVGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgKGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQsIHRoZSBjbGFzc3BhdGggc3BlY2lmaWVkIHdoZW4gQW50IHdhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkIHdpbGwgYmUgdXNlZCkuICBOZXN0ZWQgImNsYXNzcGF0aCIgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgbWF5IGFsc28gYmUgdXNlZC4KLSAqICAgICA8bGk+PGk+a2VlcGdlbmVyYXRlZDwvaT4gLS0gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBKYXZhIHNvdXJjZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSBlamJjIHdpbGwgYmUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkIG9yIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4gIElmICJ5ZXMiLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlcyB3aWxsIGJlIHJldGFpbmVkLiAgVGhpcyBpcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgYXR0cmlidXRlIChpZiBvbWl0dGVkLCBpdCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gIm5vIikuCi0gKiAgICAgPGxpPjxpPmRlYnVnPC9pPiAtLSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGVqYmMgdXRpbGl0eSBzaG91bGQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHRvIHRoZSBzdGFuZGFyZAotICogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiAgSWYgInllcyIsIHRoZSBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCAoaWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIm5vIikuCi0gKiAgICAgPGxpPjxpPmlhc2hvbWU8L2k+IC0tIE1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlICJob21lIiBkaXJlY3RvcnkgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgaW5zdGFsbGF0aW9uLiAgVGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIHRvIGZpbmQgdGhlIGVqYmMgdXRpbGl0eSBpZiBpdCBpc24ndCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHVzZXIncyBzeXN0ZW0gcGF0aC4gIFRoaXMgaXMgYW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSAoaWYgc3BlY2lmaWVkLCBpdCBzaG91bGQgcmVmZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5baW5zdGFsbC1sb2NhdGlvbl0vaXBsYW5ldC9pYXM2L2lhcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvZGU+IGRpcmVjdG9yeSkuICBJZiBvbWl0dGVkLCB0aGUgZWpiYyB1dGlsaXR5IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIG9uIHRoZSB1c2VyJ3Mgc3lzdGVtIHBhdGguCi0gKiAgIDwvdWw+Ci0gKiA8cD4KLSAqIEZvciBlYWNoIEVKQiBzcGVjaWZpZWQsIHRoaXMgdGFzayB3aWxsIGxvY2F0ZSB0aGUgdGhyZWUgY2xhc3NlcyB0aGF0IGNvbXByaXNlCi0gKiB0aGUgRUpCLiAgSWYgdGhlc2UgY2xhc3MgZmlsZXMgY2Fubm90IGJlIGxvY2F0ZWQgaW4gdGhlIDxjb2RlPmRlc3Q8L2NvZGU+Ci0gKiBkaXJlY3RvcnksIHRoZSB0YXNrIHdpbGwgZmFpbC4gIFRoZSB0YXNrIHdpbGwgYWxzbyBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgRUpCIAotICogc3R1YnMgYW5kIHNrZWxldG9ucyBpbiB0aGlzIGRpcmVjdG9yeS4gIElmIGZvdW5kLCB0aGUgdGltZXN0YW1wcyBvbiB0aGUgCi0gKiBzdHVicyBhbmQgc2tlbGV0b25zIHdpbGwgYmUgY2hlY2tlZCB0byBlbnN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZS4gIE9ubHkgaWYKLSAqIHRoZXNlIGZpbGVzIGNhbm5vdCBiZSBmb3VuZCBvciBpZiB0aGV5IGFyZSBvdXQgb2YgZGF0ZSB3aWxsIGVqYmMgYmUgY2FsbGVkCi0gKiB0byBnZW5lcmF0ZSBuZXcgc3R1YnMgYW5kIHNrZWxldG9ucy4KLSAqCi0gKiBAc2VlICAgIElQbGFuZXRFamJjCi0gKiBAYXV0aG9yIEdyZWcgTmVsc29uIDxhIGhyZWY9Im1haWx0bzpncmVnQG5ldHNjYXBlLmNvbSI+Z3JlZ0BuZXRzY2FwZS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJUGxhbmV0RWpiY1Rhc2sgZXh0ZW5kcyBUYXNrIHsKLQotCS8qIEF0dHJpYnV0ZXMgc2V0IGJ5IHRoZSBBbnQgYnVpbGQgZmlsZSAqLwotCXByaXZhdGUgRmlsZSAgICBlamJkZXNjcmlwdG9yOwotCXByaXZhdGUgRmlsZSAgICBpYXNkZXNjcmlwdG9yOwotCXByaXZhdGUgRmlsZSAgICBkZXN0OwotCXByaXZhdGUgUGF0aCAgICBjbGFzc3BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGtlZXBnZW5lcmF0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgICAgICAgICA9IGZhbHNlOwotCXByaXZhdGUgRmlsZSAgICBpYXNob21lOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YW5kYXJkIFhNTCBFSkIgZGVzY3JpcHRvci4gIFR5cGljYWxseSwgdGhpcwotCSAqIGZpbGUgaXMgbmFtZWQgImVqYi1qYXIueG1sIi4KLQkgKgotCSAqIEBwYXJhbSBlamJkZXNjcmlwdG9yIFRoZSBuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgRUpCIGRlc2NyaXB0b3IuCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0RWpiZGVzY3JpcHRvcihGaWxlIGVqYmRlc2NyaXB0b3IpIHsKLQkJdGhpcy5lamJkZXNjcmlwdG9yID0gZWpiZGVzY3JpcHRvcjsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgaUFTLXNwZWNpZmljIFhNTCBFSkIgZGVzY3JpcHRvci4gIFR5cGljYWxseSwgCi0JICogdGhpcyBmaWxlIGlzIG5hbWVkICJpYXMtZWpiLWphci54bWwiLgotCSAqCi0JICogQHBhcmFtIGlhc2Rlc2NyaXB0b3IgVGhlIG5hbWUgYW5kIGxvY2F0aW9uIG9mIHRoZSBpQVMtc3BlY2lmaWMgRUpCIAotCSAqICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0SWFzZGVzY3JpcHRvciAoRmlsZSBpYXNkZXNjcmlwdG9yKSB7Ci0JCXRoaXMuaWFzZGVzY3JpcHRvciA9IGlhc2Rlc2NyaXB0b3I7Ci0JfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBFSkIgInNvdXJjZSIgY2xhc3NlcyBtdXN0IGV4aXN0Ci0JICogYW5kIHdoZXJlIHRoZSBzdHVicyBhbmQgc2tlbGV0b25zIHdpbGwgYmUgd3JpdHRlbi4gIFRoZSBkZXN0aW5hdGlvbiAKLQkgKiBkaXJlY3RvcnkgbXVzdCBleGlzdCBiZWZvcmUgdGhpcyB0YXNrIGlzIGV4ZWN1dGVkLgotCSAqCi0JICogQHBhcmFtIGRlc3QgVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY29tcGlsZWQgY2xhc3NlcyB3aWxsIGJlIHdyaXR0ZW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3QpIHsKLSAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIGNvbXBpbGluZyB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMuCi0JICoKLQkgKiBAcGFyYW0gY2xhc3NwYXRoIFRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKLSAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoZSBKYXZhIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSAKLQkgKiBlamJjIHByb2Nlc3Mgc2hvdWxkIGJlIHJldGFpbmVkIG9yIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4KLQkgKgotCSAqIEBwYXJhbSBrZWVwZ2VuZXJhdGVkIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBKYXZhIHNvdXJjZSBmaWxlcyBmb3IKLQkgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyBzaG91bGQgYmUgcmV0YWluZWQuCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0S2VlcGdlbmVyYXRlZChib29sZWFuIGtlZXBnZW5lcmF0ZWQpIHsKLQkJdGhpcy5rZWVwZ2VuZXJhdGVkID0ga2VlcGdlbmVyYXRlZDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBlamJjIGlzCi0JICogZXhlY3V0ZWQuCi0JICoKLQkgKiBAcGFyYW0gZGVidWcgQSBib29sZWFuIGluZGljYXRpbmcgaWYgZGVidWdnaW5nIG91dHB1dCBzaG91bGQgYmUgZ2VuZXJhdGVkCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykgewotCQl0aGlzLmRlYnVnID0gZGVidWc7Ci0JfQotCQotICAgIC8qKgotICAgICAqIFNldHRlciBtZXRob2QgdXNlZCB0byBzdG9yZSB0aGUgImhvbWUiIGRpcmVjdG9yeSBvZiB0aGUgdXNlcidzIGlBUwotCSAqIGluc3RhbGxhdGlvbi4gIFRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHNob3VsZCB0eXBpY2FsbHkgYmUKLQkgKiA8Y29kZT5baW5zdGFsbC1sb2NhdGlvbl0vaXBsYW5ldC9pYXM2L2lhczwvY29kZT4uCi0JICoKLSAgICAgKiBAcGFyYW0gaWFzaG9tZSBUaGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSB1c2VyJ3MgaUFTIGluc3RhbGxhdGlvbi4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRJYXNob21lKEZpbGUgaWFzaG9tZSkgewotCQl0aGlzLmlhc2hvbWUgPSBpYXNob21lOwotCX0KLQotICAgIC8qKgotICAgICAqIERvZXMgdGhlIHdvcmsuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCWNoZWNrQ29uZmlndXJhdGlvbigpOwotCi0JCWV4ZWN1dGVFamJjKGdldFBhcnNlcigpKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgdXNlciBzZWxlY3Rpb25zIGFyZSB2YWxpZC4KLQkgKgotCSAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gSWYgdGhlIHVzZXIgc2VsZWN0aW9ucyBhcmUgaW52YWxpZC4KLSAgICAgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotCQlpZiAoZWpiZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbXNnID0gIlRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvciBtdXN0IGJlIHNwZWNpZmllZCB1c2luZyAiCi0JCQkJCQkJKyAidGhlIFwiZWpiZGVzY3JpcHRvclwiIGF0dHJpYnV0ZS4iOwotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotCQl9Ci0JCWlmICgoIWVqYmRlc2NyaXB0b3IuZXhpc3RzKCkpIHx8ICghZWpiZGVzY3JpcHRvci5pc0ZpbGUoKSkpIHsKLQkJCVN0cmluZyBtc2cgPSAiVGhlIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yICgiICsgZWpiZGVzY3JpcHRvciAKLQkJCQkJCQkrICIpIHdhcyBub3QgZm91bmQgb3IgaXNuJ3QgYSBmaWxlLiI7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0JCX0KLQotCQlpZiAoaWFzZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbXNnID0gIlRoZSBpQVMtc3BlaWZpYyBYTUwgZGVzY3JpcHRvciBtdXN0IGJlIHNwZWNpZmllZCB1c2luZyIKLQkJCQkJCQkrICIgdGhlIFwiaWFzZGVzY3JpcHRvclwiIGF0dHJpYnV0ZS4iOwotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotCQl9Ci0JCWlmICgoIWlhc2Rlc2NyaXB0b3IuZXhpc3RzKCkpIHx8ICghaWFzZGVzY3JpcHRvci5pc0ZpbGUoKSkpIHsKLQkJCVN0cmluZyBtc2cgPSAiVGhlIGlBUy1zcGVjaWZpYyBYTUwgZGVzY3JpcHRvciAoIiArIGlhc2Rlc2NyaXB0b3IgCi0JCQkJCQkJKyAiKSB3YXMgbm90IGZvdW5kIG9yIGlzbid0IGEgZmlsZS4iOwotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotCQl9Ci0KLQkJaWYgKGRlc3QgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1zZyA9ICJUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkIHVzaW5nICIKLQkJCQkJCQkrICJ0aGUgXCJkZXN0XCIgYXR0cmlidXRlLiI7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0JCX0KLQkJaWYgKCghZGVzdC5leGlzdHMoKSkgfHwgKCFkZXN0LmlzRGlyZWN0b3J5KCkpKSB7Ci0JCQlTdHJpbmcgbXNnID0gIlRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgKCIgKyBkZXN0ICsgIikgd2FzIG5vdCAiCi0JCQkJCQkJKyAiZm91bmQgb3IgaXNuJ3QgYSBkaXJlY3RvcnkuIjsKLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLQkJfQotCi0JCWlmICgoaWFzaG9tZSAhPSBudWxsKSAmJiAoIWlhc2hvbWUuaXNEaXJlY3RvcnkoKSkpIHsKLQkJCVN0cmluZyBtc2cgPSAiSWYgXCJpYXNob21lXCIgaXMgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGEgdmFsaWQgIgotCQkJCQkJCSsgImRpcmVjdG9yeSAoaXQgd2FzIHNldCB0byAiICsgaWFzaG9tZSArICIpLiI7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTQVhQYXJzZXIgdGhhdCBtYXkgYmUgdXNlZCB0byBwcm9jZXNzIHRoZSBYTUwgZGVzY3JpcHRvcnMuCi0JICoKLQkgKiBAcmV0dXJuIFBhcnNlciB3aGljaCBtYXkgYmUgdXNlZCB0byBwcm9jZXNzIHRoZSBFSkIgZGVzY3JpcHRvcnMuCi0JICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBJZiB0aGUgcGFyc2VyIGNhbm5vdCBiZSBjcmVhdGVkIG9yIGNvbmZpZ3VyZWQuCi0gICAgICovCi0JcHJpdmF0ZSBTQVhQYXJzZXIgZ2V0UGFyc2VyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotCQlTQVhQYXJzZXIgc2F4UGFyc2VyID0gbnVsbDsKLQkJdHJ5IHsKLSAgICAgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4UGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHNheFBhcnNlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyh0cnVlKTsKLSAgICAgICAgICAgIHNheFBhcnNlciA9IHNheFBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlVuYWJsZSB0byBjcmVhdGUgYSBTQVhQYXJzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlVuYWJsZSB0byBjcmVhdGUgYSBTQVhQYXJzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0JCXJldHVybiBzYXhQYXJzZXI7Ci0JfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIEVKQmMgdXRpbGl0eSB1c2luZyB0aGUgU0FYUGFyc2VyIHByb3ZpZGVkLgotCSAqCi0JICogQHBhcmFtIHNheFBhcnNlciBTQVhQYXJzZXIgdGhhdCBtYXkgYmUgdXNlZCB0byBwcm9jZXNzIHRoZSBFSkIKLQkgKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzCi0JICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIG9yIHBhcnNpbmcgdGhlIFhNTCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIAotICAgICAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlRWpiYyhTQVhQYXJzZXIgc2F4UGFyc2VyKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlJUGxhbmV0RWpiYyBlamJjID0gbmV3IElQbGFuZXRFamJjKGVqYmRlc2NyaXB0b3IsCi0JCQkJCQkJCQkJCWlhc2Rlc2NyaXB0b3IsCi0JCQkJCQkJCQkJCWRlc3QsCi0JCQkJCQkJCQkJCWdldENsYXNzcGF0aCgpLnRvU3RyaW5nKCksCi0JCQkJCQkJCQkJCXNheFBhcnNlcik7Ci0JCWVqYmMuc2V0UmV0YWluU291cmNlKGtlZXBnZW5lcmF0ZWQpOwotCQllamJjLnNldERlYnVnT3V0cHV0KGRlYnVnKTsKLQkJaWYgKGlhc2hvbWUgIT0gbnVsbCkgewotCQkJZWpiYy5zZXRJYXNIb21lRGlyKGlhc2hvbWUpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWVqYmMuZXhlY3V0ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkFuIElPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBYTUwgIgotCQkJCQkJCSsgImRlc2NyaXB0b3IgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgbG9jYXRpb24pOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBIFNBWEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVhZCB0aGUgWE1MICIKLQkJCQkJCQkrICJkZXNjcmlwdG9yIGZpbGU6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoSVBsYW5ldEVqYmMuRWpiY0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcnVuIHRoZSBlamJjICIKLQkJCQkJCQkrICJ1dGlsaXR5OiAiICsgZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDTEFTU1BBVEggdG8gYmUgdXNlZCB3aGVuIGNhbGxpbmcgRUpCYy4gIElmIG5vIHVzZXIgQ0xBU1NQQVRICi0JICogaXMgc3BlY2lmaWVkLCB0aGUgU3lzdGVtIGNsYXNzcGF0aCBpcyByZXR1cm5lZCBpbnN0ZWFkLgotCSAqCi0JICogQHJldHVybiBQYXRoIFRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgRUpCYy4KLQkgKi8KLQlwcml2YXRlIFBhdGggZ2V0Q2xhc3NwYXRoKCkgewotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLQkJCWNsYXNzcGF0aCA9IFBhdGguc3lzdGVtQ2xhc3NwYXRoOwotCQl9Ci0KLQkJcmV0dXJuIGNsYXNzcGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Yzg5MmEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lubmVyQ2xhc3NGaWxlbmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyIGltcGxlbWVudHMgRmlsZW5hbWVGaWx0ZXIgewotICAgIHByaXZhdGUgU3RyaW5nIGJhc2VDbGFzc05hbWU7Ci0KLSAgICBJbm5lckNsYXNzRmlsZW5hbWVGaWx0ZXIoU3RyaW5nIGJhc2VjbGFzcyl7Ci0gICAgICAgIGludCBleHRpZHggPSBiYXNlY2xhc3MubGFzdEluZGV4T2YoIi5jbGFzcyIpOwotICAgICAgICBpZiAoZXh0aWR4ID09IC0xKSB7Ci0gICAgICAgICAgICBleHRpZHggPSBiYXNlY2xhc3MubGVuZ3RoKCktMTsKLSAgICAgICAgfQotICAgICAgICBiYXNlQ2xhc3NOYW1lID0gYmFzZWNsYXNzLnN1YnN0cmluZygwLGV4dGlkeCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0IChGaWxlIERpciwgU3RyaW5nIGZpbGVuYW1lKXsKLSAgICAgICAgaWYgKChmaWxlbmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSkgCi0gICAgICAgICAgICB8fCAoZmlsZW5hbWUuaW5kZXhPZihiYXNlQ2xhc3NOYW1lICsgIiQiKSAhPSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9KYm9zc0RlcGxveW1lbnRUb29sLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSmJvc3NEZXBsb3ltZW50VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2U5YjQwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9KYm9zc0RlcGxveW1lbnRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogVGhlIGRlcGxveW1lbnQgdG9vbCB0byBhZGQgdGhlIGpib3NzIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byB0aGUgZWpiIGphciBmaWxlLgotICogSmJvc3Mgb25seSByZXF1aXJlcyBvbmUgYWRkaXRpb25hbCBmaWxlIGpib3NzLnhtbCBhbmQgZG9lcyBub3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbAotICogY29tcGlsYXRpb24uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cC5hdXN0aW5AdGFsazIxLmNvbSI+UGF1bCBBdXN0aW48L2E+Ci0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgRWpiSmFyI2NyZWF0ZUpib3NzCi0gKi8KLXB1YmxpYyBjbGFzcyBKYm9zc0RlcGxveW1lbnRUb29sIGV4dGVuZHMgR2VuZXJpY0RlcGxveW1lbnRUb29sIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQk9TU19ERCA9ICJqYm9zcy54bWwiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpCT1NTX0NNUEQgPSAiamF3cy54bWwiOwotCi0gICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBzdWZmaXggZm9yIHRoZSBqYm9zcyBqYXJmaWxlLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIGphclN1ZmZpeCA9ICIuamFyIjsKLQotICAgIC8qKgotICAgICAqIEFkZCBhbnkgdmVuZG9yIHNwZWNpZmljIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICAgKiBFSkIgSmFyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7Ci0gICAgICAgIEZpbGUgamJvc3NERCA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsIGRkUHJlZml4ICsgSkJPU1NfREQpOwotICAgICAgICBpZiAoamJvc3NERC5leGlzdHMoKSkgewotICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgSkJPU1NfREQsIGpib3NzREQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9jYXRlIGpib3NzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluICIgKyBqYm9zc0RELmdldFBhdGgoKSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEZpbGUgamJvc3NDTVBEID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyBKQk9TU19DTVBEKTsKLSAgICAgICAgaWYgKGpib3NzQ01QRC5leGlzdHMoKSkgewotICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgSkJPU1NfQ01QRCwgamJvc3NDTVBEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmVuZG9yIHNwZWNpZmljIG5hbWUgb2YgdGhlIEphciB0aGF0IHdpbGwgYmUgb3V0cHV0LiBUaGUgbW9kaWZpY2F0aW9uIGRhdGUKLSAgICAgKiBvZiB0aGlzIGphciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgZGVwZW5kZW50IGJlYW4gY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBGaWxlIGdldFZlbmRvck91dHB1dEphckZpbGUoU3RyaW5nIGJhc2VOYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShnZXREZXN0RGlyKCksIGJhc2VOYW1lICsgamFyU3VmZml4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvV0xSdW4uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XTFJ1bi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA3N2RhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XTFJ1bi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBFeGVjdXRlIGEgV2VibG9naWMgc2VydmVyLgotIAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbm9yQGNvcnRleGVidXNpbmVzcy5jb20uYXUiPkNvbm9yIE1hY05laWxsPC9hPiwgQ29ydGV4IGVidXNpbmVzcyBQdHkgTGltaXRlZAotICovCi1wdWJsaWMgY2xhc3MgV0xSdW4gZXh0ZW5kcyBUYXNrIHsKLSAgICBzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBERUZBVUxUX1dMNTFfUE9MSUNZX0ZJTEUgPSAid2VibG9naWMucG9saWN5IjsKLSAgICBzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBERUZBVUxUX1dMNjBfUE9MSUNZX0ZJTEUgPSAibGliL3dlYmxvZ2ljLnBvbGljeSI7Ci0gICAgc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUk9QRVJUSUVTX0ZJTEUgPSAid2VibG9naWMucHJvcGVydGllcyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBKYXZhIFZNLiBJdCBtdXN0IGNvbnRhaW4gdGhlIHdlYmxvZ2ljCi0gICAgICogY2xhc3NlcyA8Yj5hbmQ8L2I+IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIG9mIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOwotCi0gICAgLyoqCi0gICAgICogVGhlIHdlYmxvZ2ljIGNsYXNzcGF0aCB0byB0aGUgYmUgdXNlZCB3aGVuIHJ1bm5pbmcgd2VibG9naWMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQYXRoIHdlYmxvZ2ljQ2xhc3NwYXRoOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgd2VibG9naWNNYWluQ2xhc3MgPSAid2VibG9naWMuU2VydmVyIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgSlZNIHVzZWQgdG8gcnVuIHdlYmxvZ2ljCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYWRkaXRpb25hbEFyZ3MgPSAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgc2VjdXJpdHkgcG9saWN5IHRvIHVzZSB3aGVuIHJ1bm5pbmcgdGhlIHdlYmxvZ2ljIHNlcnZlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNlY3VyaXR5UG9saWN5OwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSB3ZWJsb2dpYyBzeXN0ZW0gaG9tZSBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgd2VibG9naWNTeXN0ZW1Ib21lOwotCi0gICAgLyoqCi0gICAgICogVGhlIHdlYmxvZ2ljIGRvbWFpbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHdlYmxvZ2ljRG9tYWluTmFtZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgd2VibG9naWMgc2VydmVyIC0gdXNlZCB0byBzZWxlY3QgdGhlIHNlcnZlcidzIGRpcmVjdG9yeSBpbiB0aGUgCi0gICAgICogd2VibG9naWMgaG9tZSBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgd2VibG9naWNTeXN0ZW1OYW1lID0gIm15c2VydmVyIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZmlsZSBjb250YWluaW5nIHRoZSB3ZWJsb2dpYyBwcm9wZXJ0aWVzIGZvciB0aGlzIHNlcnZlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB3ZWJsb2dpY1Byb3BlcnRpZXNGaWxlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIGFkZGl0aW9uYWwgYXJncyB0byBwYXNzIHRvIHRoZSBzcGF3bmVkIGp2bQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFkZGl0aW9uYWxKdm1BcmdzID0gIiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIEJFQSBIb21lIHVuZGVyIHdoaWNoIHRoaXMgc2VydmVyIGlzIHJ1bi4KLSAgICAgKiBXTDYgb25seQotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBiZWFIb21lID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYW5hZ2VtZW50IHVzZXJuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFuYWdlbWVudFVzZXJuYW1lID0gInN5c3RlbSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG1hbmFnZW1lbnQgcGFzc3dvcmQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYW5hZ2VtZW50UGFzc3dvcmQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIHByb3ZhdGUga2V5IHBhc3N3b3JkIC0gdXNlZCBmb3IgU1NMCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGtQYXNzd29yZCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHVzZXIgY2xhc3NlcwotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNsYXNzcGF0aCB0byB0aGUgd2VibG9naWMgY2xhc3NwYXRocwotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZVdMQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAod2VibG9naWNDbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgd2VibG9naWNDbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2VibG9naWNDbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSB3b3JrLgotICAgICAqCi0gICAgICogVGhlIHdvcmsgaXMgYWN0dWFsbHkgZG9uZSBieSBjcmVhdGluZyBhIHNlcGFyYXRlIEpWTSB0byBydW4gYSBoZWxwZXIgdGFzay4gCi0gICAgICogVGhpcyBhcHByb2FjaCBhbGxvd3MgdGhlIGNsYXNzcGF0aCBvZiB0aGUgaGVscGVyIHRhc2sgdG8gYmUgc2V0LiBTaW5jZSB0aGUgCi0gICAgICogd2VibG9naWMgdG9vbHMgcmVxdWlyZSB0aGUgY2xhc3MgZmlsZXMgb2YgdGhlIHByb2plY3QncyBob21lIGFuZCByZW1vdGUgCi0gICAgICogaW50ZXJmYWNlcyB0byBiZSBhdmFpbGFibGUgaW4gdGhlIGNsYXNzcGF0aCwgdGhpcyBhbHNvIGF2b2lkcyBoYXZpbmcgdG8gCi0gICAgICogc3RhcnQgYW50IHdpdGggdGhlIGNsYXNzIHBhdGggb2YgdGhlIHByb2plY3QgaXQgaXMgYnVpbGRpbmcuCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHdlYmxvZ2ljU3lzdGVtSG9tZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIndlYmxvZ2ljIGhvbWUgbXVzdCBiZSBzZXQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXdlYmxvZ2ljU3lzdGVtSG9tZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIndlYmxvZ2ljIGhvbWUgZGlyZWN0b3J5ICIgKyB3ZWJsb2dpY1N5c3RlbUhvbWUuZ2V0UGF0aCgpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3QgdmFsaWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgc2VjdXJpdHlQb2xpY3lGaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKHNlY3VyaXR5UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNlY3VyaXR5UG9saWN5RmlsZSA9IG5ldyBGaWxlKHdlYmxvZ2ljU3lzdGVtSG9tZSwgREVGQVVMVF9XTDYwX1BPTElDWV9GSUxFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNlY3VyaXR5UG9saWN5RmlsZSA9IG5ldyBGaWxlKHdlYmxvZ2ljU3lzdGVtSG9tZSwgc2VjdXJpdHlQb2xpY3kpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzZWN1cml0eVBvbGljeUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIC8vIE9LIGl0IG1heWJlIGFuIGFic29sdXRlIHBhdGguIFVzZSB0aGUgcHJvamVjdCB0byByZXNvbHZlIGl0Ci0gICAgICAgICAgICBzZWN1cml0eVBvbGljeUZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHNlY3VyaXR5UG9saWN5KTsKLSAgICAgICAgICAgIGlmICghc2VjdXJpdHlQb2xpY3lGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTZWN1cml0eSBwb2xpY3kgIiArIHNlY3VyaXR5UG9saWN5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChiZWFIb21lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWN1dGVXTFM2KHNlY3VyaXR5UG9saWN5RmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBleGVjdXRlV0xTKHNlY3VyaXR5UG9saWN5RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVXTFM2KEZpbGUgc2VjdXJpdHlQb2xpY3lGaWxlKSB7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWJlYUhvbWUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCRUEgaG9tZSAiICsgYmVhSG9tZS5nZXRQYXRoKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCB2YWxpZCIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZSh3ZWJsb2dpY1N5c3RlbUhvbWUsICJjb25maWcvIiArIHdlYmxvZ2ljRG9tYWluTmFtZSArICIvY29uZmlnLnhtbCIpOwotICAgICAgICBpZiAoIWNvbmZpZ0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU2VydmVyIGNvbmZpZyBmaWxlICIgKyBjb25maWdGaWxlICsgIiBub3QgZm91bmQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtYW5hZ2VtZW50UGFzc3dvcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBzdXBwbHkgYSBtYW5hZ2VtZW50IHBhc3N3b3JkIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEphdmEgd2VibG9naWNTZXJ2ZXIgPSAoSmF2YSlwcm9qZWN0LmNyZWF0ZVRhc2soImphdmEiKTsKLSAgICAgICAgd2VibG9naWNTZXJ2ZXIuc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgIHdlYmxvZ2ljU2VydmVyLnNldEZvcmsodHJ1ZSk7Ci0gICAgICAgIHdlYmxvZ2ljU2VydmVyLnNldERpcih3ZWJsb2dpY1N5c3RlbUhvbWUpOwotICAgICAgICB3ZWJsb2dpY1NlcnZlci5zZXRDbGFzc25hbWUod2VibG9naWNNYWluQ2xhc3MpOwotCi0gICAgICAgIFN0cmluZyBqdm1BcmdzID0gYWRkaXRpb25hbEp2bUFyZ3M7Ci0gICAgICAgIAotICAgICAgICBqdm1BcmdzICs9ICIgLUR3ZWJsb2dpYy5Eb21haW49IiArIHdlYmxvZ2ljRG9tYWluTmFtZTsKLSAgICAgICAganZtQXJncyArPSAiIC1Ed2VibG9naWMuTmFtZT0iICsgd2VibG9naWNTeXN0ZW1OYW1lOwotICAgICAgICBqdm1BcmdzICs9ICIgLUR3ZWJsb2dpYy5zeXN0ZW0uaG9tZT0iICsgd2VibG9naWNTeXN0ZW1Ib21lOwotCi0gICAgICAgIGp2bUFyZ3MgKz0gIiAtRGJlYS5ob21lPSIgKyBiZWFIb21lOwotICAgICAgICBqdm1BcmdzICs9ICIgLURqYXZhLnNlY3VyaXR5LnBvbGljeT09IiArIHNlY3VyaXR5UG9saWN5RmlsZTsKLSAgICAgICAgCi0gICAgICAgIGp2bUFyZ3MgKz0gIiAtRHdlYmxvZ2ljLm1hbmFnZW1lbnQudXNlcm5hbWU9IiArIG1hbmFnZW1lbnRVc2VybmFtZTsKLSAgICAgICAganZtQXJncyArPSAiIC1Ed2VibG9naWMubWFuYWdlbWVudC5wYXNzd29yZD0iICsgbWFuYWdlbWVudFBhc3N3b3JkOwotICAgICAgICBpZiAocGtQYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBqdm1BcmdzICs9ICIgLUR3ZWJsb2dpYy5wa3Bhc3N3b3JkPSIgKyBwa1Bhc3N3b3JkOwotICAgICAgICB9Ci0gICAgICAgIAotCi0gICAgICAgIHdlYmxvZ2ljU2VydmVyLmNyZWF0ZUp2bWFyZygpLnNldExpbmUoanZtQXJncyk7Ci0gICAgICAgIHdlYmxvZ2ljU2VydmVyLmNyZWF0ZUFyZygpLnNldExpbmUoYWRkaXRpb25hbEFyZ3MpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3ZWJsb2dpY1NlcnZlci5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBpZiAod2VibG9naWNTZXJ2ZXIuZXhlY3V0ZUphdmEoKSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGVjdXRpb24gb2Ygd2VibG9naWMgc2VydmVyIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVdMUyhGaWxlIHNlY3VyaXR5UG9saWN5RmlsZSkgewotCi0gICAgICAgIEZpbGUgcHJvcGVydGllc0ZpbGUgPSBudWxsOwotICAgICAgICAKLQotICAgICAgICBpZiAod2VibG9naWNQcm9wZXJ0aWVzRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3ZWJsb2dpY1Byb3BlcnRpZXNGaWxlID0gREVGQVVMVF9QUk9QRVJUSUVTX0ZJTEU7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydGllc0ZpbGUgPSBuZXcgRmlsZSh3ZWJsb2dpY1N5c3RlbUhvbWUsIHdlYmxvZ2ljUHJvcGVydGllc0ZpbGUpOwotICAgICAgICBpZiAoIXByb3BlcnRpZXNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAvLyBPSywgcHJvcGVydGllcyBmaWxlIG1heSBiZSBhYnNvbHV0ZQotICAgICAgICAgICAgcHJvcGVydGllc0ZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHdlYmxvZ2ljUHJvcGVydGllc0ZpbGUpOwotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvcGVydGllcyBmaWxlICIgKyB3ZWJsb2dpY1Byb3BlcnRpZXNGaWxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBub3QgZm91bmQgaW4gd2VibG9naWMgaG9tZSAiICsgd2VibG9naWNTeXN0ZW1Ib21lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvciBhcyBhYnNvbHV0ZSBmaWxlIik7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIEphdmEgd2VibG9naWNTZXJ2ZXIgPSAoSmF2YSlwcm9qZWN0LmNyZWF0ZVRhc2soImphdmEiKTsKLSAgICAgICAgd2VibG9naWNTZXJ2ZXIuc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgIHdlYmxvZ2ljU2VydmVyLnNldEZvcmsodHJ1ZSk7Ci0gICAgICAgIHdlYmxvZ2ljU2VydmVyLnNldENsYXNzbmFtZSh3ZWJsb2dpY01haW5DbGFzcyk7Ci0KLSAgICAgICAgU3RyaW5nIGp2bUFyZ3MgPSBhZGRpdGlvbmFsSnZtQXJnczsKLSAgICAgICAgCi0gICAgICAgIGlmICh3ZWJsb2dpY0NsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBqdm1BcmdzICs9ICIgLUR3ZWJsb2dpYy5jbGFzcy5wYXRoPSIgKyB3ZWJsb2dpY0NsYXNzcGF0aDsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIGp2bUFyZ3MgKz0gIiAtRGphdmEuc2VjdXJpdHkubWFuYWdlciAtRGphdmEuc2VjdXJpdHkucG9saWN5PT0iICsgc2VjdXJpdHlQb2xpY3lGaWxlOwotICAgICAgICBqdm1BcmdzICs9ICIgLUR3ZWJsb2dpYy5zeXN0ZW0uaG9tZT0iICsgd2VibG9naWNTeXN0ZW1Ib21lOwotICAgICAgICBqdm1BcmdzICs9ICIgLUR3ZWJsb2dpYy5zeXN0ZW0ubmFtZT0iICsgd2VibG9naWNTeXN0ZW1OYW1lOwotICAgICAgICBqdm1BcmdzICs9ICIgLUR3ZWJsb2dpYy5zeXN0ZW0ucHJvcGVydGllc0ZpbGU9IiArIHdlYmxvZ2ljUHJvcGVydGllc0ZpbGU7Ci0KLSAgICAgICAgd2VibG9naWNTZXJ2ZXIuY3JlYXRlSnZtYXJnKCkuc2V0TGluZShqdm1BcmdzKTsKLSAgICAgICAgd2VibG9naWNTZXJ2ZXIuY3JlYXRlQXJnKCkuc2V0TGluZShhZGRpdGlvbmFsQXJncyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdlYmxvZ2ljU2VydmVyLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpZiAod2VibG9naWNTZXJ2ZXIuZXhlY3V0ZUphdmEoKSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGVjdXRpb24gb2Ygd2VibG9naWMgc2VydmVyIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBleGVjdXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGV4ZWN1dGluZyB0aGUgd2VibG9naWMgc2VydmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgewotICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB3ZWJsb2dpYyBjbGFzc3BhdGguCi0gICAgICoKLSAgICAgKiBUaGUgd2VibG9naWMgY2xhc3NwYXRoIGlzIHVzZWQgYnkgd2VibG9naWMgdG8gc3VwcG9ydCBkeW5hbWljIGNsYXNzIGxvYWRpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2VibG9naWNDbGFzc3BhdGggdGhlIHdlYmxvZ2ljIGNsYXNzcGF0aAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdsY2xhc3NwYXRoKFBhdGggd2VibG9naWNDbGFzc3BhdGgpIHsKLSAgICAgICAgdGhpcy53ZWJsb2dpY0NsYXNzcGF0aCA9IHdlYmxvZ2ljQ2xhc3NwYXRoOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlY3VyaXR5IHBvbGljeSBmb3IgdGhpcyBpbnZvY2F0aW9uIG9mIHdlYmxvZ2ljLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlY3VyaXR5UG9saWN5IHRoZSBzZWN1cml0eSBwb2xpY3kgdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeShTdHJpbmcgc2VjdXJpdHlQb2xpY3kpIHsKLSAgICAgICAgdGhpcy5zZWN1cml0eVBvbGljeSA9IHNlY3VyaXR5UG9saWN5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gd2hlcmUgd2VibG9naWMgbGl2ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2VibG9naWNIb21lIHRoZSBob21lIGRpcmVjdG9yeSBvZiB3ZWJsb2dpYy4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhvbWUoRmlsZSB3ZWJsb2dpY0hvbWUpIHsKLSAgICAgICAgd2VibG9naWNTeXN0ZW1Ib21lID0gd2VibG9naWNIb21lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgQkVBIEhvbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhSG9tZSB0aGUgQkVBIEhvbWUgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QkVBSG9tZShGaWxlIGJlYUhvbWUpIHsKLSAgICAgICAgdGhpcy5iZWFIb21lID0gYmVhSG9tZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIgdG8gcnVuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3lzdGVtTmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHNlcnZlck5hbWUpIHsKLSAgICAgICAgdGhpcy53ZWJsb2dpY1N5c3RlbU5hbWUgPSBzZXJ2ZXJOYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIERvbWFpbiB0byBydW4gaW4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb21haW4gdGhlIGRvbWFpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7Ci0gICAgICAgIHRoaXMud2VibG9naWNEb21haW5OYW1lID0gZG9tYWluOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHByb3BlcnRpZXMgZmlsZSB0byB1c2UuCi0gICAgICoKLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBpcyByZWxhdGl2ZSB0byB0aGUgd2VibG9naSBzeXN0ZW0gaG9tZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXNGaWxlbmFtZSB0aGUgcHJvcGVydGllcyBmaWxlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFN0cmluZyBwcm9wZXJ0aWVzRmlsZW5hbWUpIHsKLSAgICAgICAgdGhpcy53ZWJsb2dpY1Byb3BlcnRpZXNGaWxlID0gcHJvcGVydGllc0ZpbGVuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgd2VibG9naWMgSlZNCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIEpWTQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEp2bWFyZ3MoU3RyaW5nIGFyZ3MpIHsKLSAgICAgICAgdGhpcy5hZGRpdGlvbmFsSnZtQXJncyA9IGFyZ3M7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgbWFuYWdlbWVudCB1c2VybmFtZSB0byBydW4gdGhlIHNlcnZlcgotICAgICAqCi0gICAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBtYW5hZ2VtZW50IHVzZXJuYW1lIG9mIHRoZSBzZXJ2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlbWVudFVzZXJuYW1lID0gdXNlcm5hbWU7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBtYW5hZ2VtZW50IHBhc3N3b3JkIG9mIHRoZSBzZXJ2ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgbWFuYWdlbWVudCBwYXN3b3JkIG9mIHRoZSBzZXJ2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlbWVudFBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgcHJpdmF0ZSBrZXkgcGFzc3dvcmQgc28gdGhlIHNlcnZlciBjYW4gZGVjcnlwdCB0aGUgU1NMIHByaXZhdGUga2V5IGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGtwYXNzd29yZCB0aGUgcHJpdmF0ZSBrZXkgcGFzc3dvcmQsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UEtQYXNzd29yZChTdHJpbmcgcGtwYXNzd29yZCkgewotICAgICAgICB0aGlzLnBrUGFzc3dvcmQgPSBwa3Bhc3N3b3JkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBcmdzKFN0cmluZyBhcmdzKSB7Ci0gICAgICAgIGFkZGl0aW9uYWxBcmdzID0gYXJnczsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJsb2dpY01haW5DbGFzcyhTdHJpbmcgYykgewotICAgICAgICB3ZWJsb2dpY01haW5DbGFzcyA9IGM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dMU3RvcC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dMU3RvcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVmZTQwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XTFN0b3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogU2h1dGRvd24gYSBXZWJsb2dpYyBzZXJ2ZXIuCi0gCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAY29ydGV4ZWJ1c2luZXNzLmNvbS5hdSI+Q29ub3IgTWFjTmVpbGw8L2E+LCBDb3J0ZXggZWJ1c2luZXNzIFB0eSBMaW1pdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXTFN0b3AgZXh0ZW5kcyBUYXNrIHsKLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQuIEl0IG11c3QgY29udGFpbnMgdGhlIHdlYmxvZ2ljLkFkbWluIGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2VibG9naWMgdXNlcm5hbWUgdG8gdXNlIHRvIHJlcXVlc3QgdGhlIHNodXRkb3duLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBwYXNzd29yZCB0byB1c2UgdG8gc2h1dGRvd24gdGhlIHdlYmxvZ2ljIHNlcnZlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgVVJMIHdoaWNoIHRoZSB3ZWJsb2dpYyBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZlclVSTDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVsYXkgKGluIHNlY29uZHMpIHRvIHdhaXQgYmVmb3JlIHNodXR0aW5nIGRvd24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZGVsYXkgPSAwOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgQkVBIEhvbWUgdW5kZXIgd2hpY2ggdGhpcyBzZXJ2ZXIgaXMgcnVuLgotICAgICAqIFdMNiBvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGJlYUhvbWUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogRG8gdGhlIHdvcmsuCi0gICAgICoKLSAgICAgKiBUaGUgd29yayBpcyBhY3R1YWxseSBkb25lIGJ5IGNyZWF0aW5nIGEgc2VwYXJhdGUgSlZNIHRvIHJ1biB0aGUgd2VibG9naWMgYWRtaW4gdGFzawotICAgICAqIFRoaXMgYXBwcm9hY2ggYWxsb3dzIHRoZSBjbGFzc3BhdGggb2YgdGhlIGhlbHBlciB0YXNrIHRvIGJlIHNldC4gCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHVzZXJuYW1lID09IG51bGwgfHwgcGFzc3dvcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ3ZWJsb2dpYyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBib3RoIGJlIHNldCIpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKHNlcnZlclVSTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSB1cmwgb2YgdGhlIHdlYmxvZ2ljIHNlcnZlciBtdXN0IGJlIHByb3ZpZGVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBKYXZhIHdlYmxvZ2ljQWRtaW4gPSAoSmF2YSlwcm9qZWN0LmNyZWF0ZVRhc2soImphdmEiKTsKLSAgICAgICAgd2VibG9naWNBZG1pbi5zZXRGb3JrKHRydWUpOwotICAgICAgICB3ZWJsb2dpY0FkbWluLnNldENsYXNzbmFtZSgid2VibG9naWMuQWRtaW4iKTsKLSAgICAgICAgU3RyaW5nIGFyZ3M7Ci0gICAgICAgIAotICAgICAgICBpZiAoYmVhSG9tZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhcmdzID0gc2VydmVyVVJMICsgIiBTSFVURE9XTiAiICsgdXNlcm5hbWUgKyAiICIgKyBwYXNzd29yZCArICIgIiArIGRlbGF5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXJncyA9ICIgLXVybCAiICsgc2VydmVyVVJMICsgCi0gICAgICAgICAgICAgICAgICAgIiAtdXNlcm5hbWUgIiArIHVzZXJuYW1lICsKLSAgICAgICAgICAgICAgICAgICAiIC1wYXNzd29yZCAiICsgcGFzc3dvcmQgKwotICAgICAgICAgICAgICAgICAgICIgU0hVVERPV04gIiArICIgIiArIGRlbGF5OwotICAgICAgICB9ICAgICAgICAgICAgCi0KLSAgICAgICAgd2VibG9naWNBZG1pbi5zZXRBcmdzKGFyZ3MpOwotICAgICAgICB3ZWJsb2dpY0FkbWluLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgd2VibG9naWNBZG1pbi5leGVjdXRlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGV4ZWN1dGluZyB0aGUgd2VibG9naWMgYWRtaW4gdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBwYXRoKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NwYXRoID0gcGF0aDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIHRoZSBjbGFzc3BhdGggZm9yIHRoZSB1c2VyIGNsYXNzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB1c2VybmFtZSB0byB1c2UgdG8gcmVxdWVzdCBzaHV0ZG93biBvZiB0aGUgc2VydmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIHVzZXJuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgdGhpcy51c2VybmFtZSA9IHM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGFzc3dvcmQgdG8gdXNlIHRvIHJlcXVlc3Qgc2h1dGRvd24gb2YgdGhlIHNlcnZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBwYXNzd29yZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcykgewotICAgICAgICB0aGlzLnBhc3N3b3JkID0gczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmxvZ2ljIHNlcnZlciBpcyBsaXN0ZW5pbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyB0aGUgdXJsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgcykgewotICAgICAgICB0aGlzLnNlcnZlclVSTCA9IHM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlbGF5IChpbiBzZWNvbmRzKSBiZWZvcmUgc2h1dHRpbmcgZG93biB0aGUgc2VydmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIHNlbGF5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlbGF5KFN0cmluZyBzKSB7Ci0gICAgICAgIGRlbGF5ID0gSW50ZWdlci5wYXJzZUludChzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIEJFQSBIb21lLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYUhvbWUgdGhlIEJFQSBIb21lIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJFQUhvbWUoRmlsZSBiZWFIb21lKSB7Ci0gICAgICAgIHRoaXMuYmVhSG9tZSA9IGJlYUhvbWU7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dlYmxvZ2ljRGVwbG95bWVudFRvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY0RlcGxveW1lbnRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTQxODAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dlYmxvZ2ljRGVwbG95bWVudFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyOSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOwotCi1wdWJsaWMgY2xhc3MgV2VibG9naWNEZXBsb3ltZW50VG9vbCBleHRlbmRzIEdlbmVyaWNEZXBsb3ltZW50VG9vbCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDSURfRUpCMTEKLSAgICAgICAgPSAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0lEX0VKQjIwCi0gICAgICAgID0gIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNJRF9XRUJMT0dJQ19FSkI1MTAKLSAgICAgICAgPSAiLS8vQkVBIFN5c3RlbXMsIEluYy4vL0RURCBXZWJMb2dpYyA1LjEuMCBFSkIvL0VOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNJRF9XRUJMT0dJQ19FSkI2MDAKLSAgICAgICAgPSAiLS8vQkVBIFN5c3RlbXMsIEluYy4vL0RURCBXZWJMb2dpYyA2LjAuMCBFSkIvL0VOIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0w1MV9FSkIxMV9EVERfTE9DQVRJT04gCi0gICAgICAgID0gIi93ZWJsb2dpYy9lamIvZGVwbG95bWVudC94bWwvZWpiLWphci5kdGQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0w2MF9FSkIxMV9EVERfTE9DQVRJT04gCi0gICAgICAgID0gIi93ZWJsb2dpYy9lamIyMC9kZC94bWwvZWpiMTEtamFyLmR0ZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XTDYwX0VKQjIwX0RURF9MT0NBVElPTiAKLSAgICAgICAgPSAiL3dlYmxvZ2ljL2VqYjIwL2RkL3htbC9lamIyMC1qYXIuZHRkIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0w1MV9EVERfTE9DQVRJT04gCi0gICAgICAgID0gIi93ZWJsb2dpYy9lamIvZGVwbG95bWVudC94bWwvd2VibG9naWMtZWpiLWphci5kdGQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0w2MF81MV9EVERfTE9DQVRJT04gCi0gICAgICAgID0gIi93ZWJsb2dpYy9lamIyMC9kZC94bWwvd2VibG9naWM1MTAtZWpiLWphci5kdGQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0w2MF9EVERfTE9DQVRJT04gCi0gICAgICAgID0gIi93ZWJsb2dpYy9lamIyMC9kZC94bWwvd2VibG9naWM2MDAtZWpiLWphci5kdGQiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QSUxFUiA9ICJkZWZhdWx0IjsgCi0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0xfREQgPSAid2VibG9naWMtZWpiLWphci54bWwiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdMX0NNUF9ERCA9ICJ3ZWJsb2dpYy1jbXAtcmRibXMtamFyLnhtbCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9FSkIxMSA9ICJ3ZWJsb2dpYy5lamJjIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9FSkIyMCA9ICJ3ZWJsb2dpYy5lamJjMjAiOwotICAgIAotICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgc3VmZml4IGZvciB0aGUgd2VibG9naWMgamFyZmlsZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBqYXJTdWZmaXggPSAiLmphciI7Ci0KLSAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWJsb2dpYyBEVEQgZmlsZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyB3ZWJsb2dpY0RURDsKLQotICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVqYiAxLjEgRFREIGZpbGUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWpiMTFEVEQ7Ci0gICAgICAgIAotICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBnZW5lcmljIGVqYiBqYXJzIGFyZSBrZXB0LiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwZ2VuZXJhdGVkID0gZmFsc2U7Ci0KLSAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIHdlYmxvZ2ljIEVKQkMgY29tcGlsZXIgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlamJjQ2xhc3MgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYWRkaXRpb25hbEFyZ3MgPSAiIjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwR2VuZXJpYyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFsd2F5c1JlYnVpbGQgPSB0cnVlOwotCi0gICAgLyoqIGNvbnRyb2xzIHdoZXRoZXIgZWpiYyBpcyBydW4gb24gdGhlIGdlbmVyYXRlZCBqYXIgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbm9FSkJDID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSBvbGQgQ01QIGxvY2F0aW9uIGNvbnZlbnRpb24gaXMgdG8gYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbmV3Q01QID0gZmFsc2U7Ci0KLSAgICAvKiogVGhlIGNsYXNzcGF0aCB0byB0aGUgd2VibG9naWMgY2xhc3Nlcy4gKi8KLSAgICBwcml2YXRlIFBhdGggd2xDbGFzc3BhdGggPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGFzc3BhdGggdG8gdGhlIHdlYmxvZ2ljIGNsYXNzcGF0aHMKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVXTENsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKHdsQ2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHdsQ2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0VGFzaygpLmdldFByb2plY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdsQ2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0V0xDbGFzc3BhdGgoUGF0aCB3bENsYXNzcGF0aCkgewotICAgICAgICB0aGlzLndsQ2xhc3NwYXRoID0gd2xDbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbXBpbGVyIChzd2l0Y2ggPGNvZGU+LWNvbXBpbGVyPC9jb2RlPikgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyKSB7Ci0gICAgICAgIHRoaXMuY29tcGlsZXIgPSBjb21waWxlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSByZWJ1aWxkIGZsYWcgdG8gZmFsc2UgdG8gb25seSB1cGRhdGUgY2hhbmdlcyBpbiB0aGUKLSAgICAgKiBqYXIgcmF0aGVyIHRoYW4gcmVydW5uaW5nIGVqYmMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWJ1aWxkKGJvb2xlYW4gcmVidWlsZCkgewotICAgICAgICB0aGlzLmFsd2F5c1JlYnVpbGQgPSByZWJ1aWxkOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIFNldHRlciB1c2VkIHRvIHN0b3JlIHRoZSBzdWZmaXggZm9yIHRoZSBnZW5lcmF0ZWQgd2VibG9naWMgamFyIGZpbGUuCi0gICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBzdWZmaXguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBpblN0cmluZykgewotICAgICAgICB0aGlzLmphclN1ZmZpeCA9IGluU3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciB1c2VkIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiBrZWVwR2VuZXJpYwotICAgICAqIEBwYXJhbSBpblZhbHVlIGEgc3RyaW5nLCBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2VlcGdlbmVyaWMoYm9vbGVhbiBpblZhbHVlKSB7Ci0gICAgICAgIHRoaXMua2VlcEdlbmVyaWMgPSBpblZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciAta2VlcGdlbmVyYXRlZCBpcyBwYXNzZWQgdG8gZWpiYyAodGhhdCBpcywKLSAgICAgKiB0aGUgLmphdmEgc291cmNlIGZpbGVzIGFyZSBrZXB0KS4KLSAgICAgKiBAcGFyYW0gaW5WYWx1ZSBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRLZWVwZ2VuZXJhdGVkKFN0cmluZyBpblZhbHVlKSB7Ci0gICAgICAgIHRoaXMua2VlcGdlbmVyYXRlZCA9IEJvb2xlYW4udmFsdWVPZihpblZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXRzIHNvbWUgYWRkaXRpb25hbCBhcmdzIHRvIHNlbmQgdG8gZWpiYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmdzKFN0cmluZyBhcmdzKSB7Ci0gICAgICAgIHRoaXMuYWRkaXRpb25hbEFyZ3MgPSBhcmdzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzbmFtZSBvZiB0aGUgZWpiYyBjb21waWxlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVqYmNDbGFzcyhTdHJpbmcgZWpiY0NsYXNzKQotICAgIHsKLSAgICAgICAgdGhpcy5lamJjQ2xhc3MgPSBlamJjQ2xhc3M7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgZWpiYyBjb21waWxlciBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWpiY0NsYXNzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlamJjQ2xhc3M7Ci0gICAgfQotICAgICAKLSAgIAotICAgIC8qKgotICAgICAqIFNldHRlciB1c2VkIHRvIHN0b3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWpiLWphciBEVEQuIFRoaXMgY2FuIGJlIGEgZmlsZSBvbiB0aGUgc3lzdGVtIAotICAgICAqIG9yIGEgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4gCi0gICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBEVEQgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2VibG9naWNkdGQoU3RyaW5nIGluU3RyaW5nKSB7Ci0gICAgICAgIHNldEVKQmR0ZChpblN0cmluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWJsb2dpYyBEVEQuIFRoaXMgY2FuIGJlIGEgZmlsZSBvbiB0aGUgc3lzdGVtIAotICAgICAqIG9yIGEgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4gCi0gICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBEVEQgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V0xkdGQoU3RyaW5nIGluU3RyaW5nKSB7Ci0gICAgICAgIHRoaXMud2VibG9naWNEVEQgPSBpblN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgdXNlZCB0byBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIFN1bidzIEdlbmVyaWMgRUpCIERURC4gCi0gICAgICogVGhpcyBjYW4gYmUgYSBmaWxlIG9uIHRoZSBzeXN0ZW0gb3IgYSByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLiAKLSAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIERURCBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFSkJkdGQoU3RyaW5nIGluU3RyaW5nKSB7Ci0gICAgICAgIHRoaXMuZWpiMTFEVEQgPSBpblN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBvbGRDTVAgc2NoZW1lLiBUaGlzIGlzIGFuIGFudG9ueW0gZm9yCi0gICAgICogbmV3Q01QCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T2xkQ01QKGJvb2xlYW4gb2xkQ01QKSB7Ci0gICAgICAgIHRoaXMubmV3Q01QID0gIW9sZENNUDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgbmV3Q01QIHNjaGVtZS4gVGhlIG9sZCBDTVAgc2NoZW1lIGxvY2F0ZXMgdGhlIAotICAgICAqIHdlYmxvZ2ljIENNUCBkZXNjcmlwdG9yIGJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbiB3aGVyZSB0aGUgCi0gICAgICogd2VibG9naWMgQ01QIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgbmFtZWQgd2l0aCB0aGUgYmVhbiBuYW1lIGFzIHRoZSBwcmVmaXguCi0gICAgICogCi0gICAgICogVW5kZXIgdGhpcyBzY2hlbWUgdGhlIG5hbWUgb2YgdGhlIENNUCBkZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIHRoZSBuYW1lCi0gICAgICogYWN0dWFsbHkgdXNlZCBpbiB0aGUgbWFpbiB3ZWJsb2dpYyBFSkIgZGVzY3JpcHRvci4gQWxzbywgZGVzY3JpcHRvcnMgd2hpY2ggCi0gICAgICogY29udGFpbiBtdWx0aXBsZSBDTVAgcmVmZXJlbmNlcyBjb3VsZCBub3QgYmUgdXNlZC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5ld0NNUChib29sZWFuIG5ld0NNUCkgewotICAgICAgICB0aGlzLm5ld0NNUCA9IG5ld0NNUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyBub3QgRUpCQyB0aGUgamFyIGFmdGVyIGl0IGhhcyBiZWVuIHB1dCB0b2dldGhlci4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vRUpCQyhib29sZWFuIG5vRUpCQykgewotICAgICAgICB0aGlzLm5vRUpCQyA9IG5vRUpCQzsKLSAgICB9Ci0gICAKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlcktub3duRFREcyhEZXNjcmlwdG9ySGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIC8vIHJlZ2lzdGVyIGFsbCB0aGUga25vd24gRFREcwotICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX0VKQjExLCBERUZBVUxUX1dMNTFfRUpCMTFfRFREX0xPQ0FUSU9OKTsKLSAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChQVUJMSUNJRF9FSkIxMSwgREVGQVVMVF9XTDYwX0VKQjExX0RURF9MT0NBVElPTik7Ci0gICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfRUpCMTEsIGVqYjExRFREKTsKLSAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChQVUJMSUNJRF9FSkIyMCwgREVGQVVMVF9XTDYwX0VKQjIwX0RURF9MT0NBVElPTik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlc2NyaXB0b3JIYW5kbGVyIGdldFdlYmxvZ2ljRGVzY3JpcHRvckhhbmRsZXIoZmluYWwgRmlsZSBzcmNEaXIpIHsKLSAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9IAotICAgICAgICAgICAgbmV3IERlc2NyaXB0b3JIYW5kbGVyKGdldFRhc2soKSwgc3JjRGlyKSB7ICAgICAgICAKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudCgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmVxdWFscygidHlwZS1zdG9yYWdlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmlsZW5hbWUgb2YgdmVuZG9yIHNwZWNpZmljIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZVdpdGhNRVRBID0gY3VycmVudFRleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3RyaW0gdGhlIE1FVEFfSU5GXCBvZmYgb2YgdGhlIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZU5hbWVXaXRoTUVUQS5zdWJzdHJpbmcoTUVUQV9ESVIubGVuZ3RoKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVXaXRoTUVUQS5sZW5ndGgoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXNjcmlwdG9yRmlsZSA9IG5ldyBGaWxlKHNyY0RpciwgZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoZmlsZU5hbWVXaXRoTUVUQSwgZGVzY3JpcHRvckZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjUxMCwgREVGQVVMVF9XTDUxX0RURF9MT0NBVElPTik7Ci0gICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfV0VCTE9HSUNfRUpCNTEwLCBERUZBVUxUX1dMNjBfNTFfRFREX0xPQ0FUSU9OKTsKLSAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChQVUJMSUNJRF9XRUJMT0dJQ19FSkI2MDAsIERFRkFVTFRfV0w2MF9EVERfTE9DQVRJT04pOwotICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjUxMCwgd2VibG9naWNEVEQpOwotICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjYwMCwgd2VibG9naWNEVEQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb25maWcoKS5kdGRMb2NhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBFamJKYXIuRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSAoRWpiSmFyLkRURExvY2F0aW9uKWkubmV4dCgpOwotICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChkdGRMb2NhdGlvbi5nZXRQdWJsaWNJZCgpLCBkdGRMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW55IHZlbmRvciBzcGVjaWZpYyBmaWxlcyB3aGljaCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIAotICAgICAqIEVKQiBKYXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmVuZG9yRmlsZXMoSGFzaHRhYmxlIGVqYkZpbGVzLCBTdHJpbmcgZGRQcmVmaXgpIHsKLSAgICAgICAgRmlsZSB3ZWJsb2dpY0REID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyBXTF9ERCk7Ci0KLSAgICAgICAgaWYgKHdlYmxvZ2ljREQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGVqYkZpbGVzLnB1dChNRVRBX0RJUiArIFdMX0RELAotICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmxvZ2ljREQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9jYXRlIHdlYmxvZ2ljIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluICIgKyAKLSAgICAgICAgICAgICAgICB3ZWJsb2dpY0RELmdldFBhdGgoKSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW5ld0NNUCkgewotICAgICAgICAgICAgbG9nKCJUaGUgb2xkIG1ldGhvZCBmb3IgbG9jYXRpbmcgQ01QIGZpbGVzIGhhcyBiZWVuIERFUFJFQ0FURUQuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBsb2coIlBsZWFzZSBhZGp1c3QgeW91ciB3ZWJsb2dpYyBkZXNjcmlwdG9yIGFuZCBzZXQgbmV3Q01QPVwidHJ1ZVwiICIgKwotICAgICAgICAgICAgICAgICJ0byB1c2UgdGhlIG5ldyBDTVAgZGVzY3JpcHRvciBpbmNsdXNpb24gbWVjaGFuaXNtLiAiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIC8vIFRoZSB0aGUgd2VibG9naWMgY21wIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICAgICAgRmlsZSB3ZWJsb2dpY0NNUEREID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyBXTF9DTVBfREQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHdlYmxvZ2ljQ01QREQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBXTF9DTVBfREQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmxvZ2ljQ01QREQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgd2VibG9naWMgZGVzY3JpcHRvciwgd2UgcGFyc2UgdGhlIGZpbGUKLSAgICAgICAgICAgIC8vIHRvIGZpbmQgb3RoZXIgZGVzY3JpcHRvcnMgbmVlZGVkIHRvIGRlcGxveSB0aGUgYmVhbi4KLSAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgdGhlIHdlYmxvZ2ljLWNtcC1yZGJtcy54bWwgb3IgYW55IG90aGVyIE8vUgotICAgICAgICAgICAgLy8gbWFwcGluZyB0b29sIGRlc2NyaXB0b3JzLgotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBlamJEZXNjcmlwdG9yID0gKEZpbGUpZWpiRmlsZXMuZ2V0KE1FVEFfRElSICsgRUpCX0REKTsKLSAgICAgICAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgc2F4UGFyc2VyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOwotICAgICAgICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXIgPSBnZXRXZWJsb2dpY0Rlc2NyaXB0b3JIYW5kbGVyKGVqYkRlc2NyaXB0b3IuZ2V0UGFyZW50RmlsZSgpKTsKLSAgICAgICAgICAgICAgICBzYXhQYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgRmlsZUlucHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZWJsb2dpY0REKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBIYXNodGFibGUgaHQgPSBoYW5kbGVyLmdldEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGh0LmtleXMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoa2V5LCBodC5nZXQoa2V5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIHdoaWxlIGFkZGluZyBWZW5kb3Igc3BlY2lmaWMgZmlsZXM6ICIgKyBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2ZW5kb3Igc3BlY2lmaWMgbmFtZSBvZiB0aGUgSmFyIHRoYXQgd2lsbCBiZSBvdXRwdXQuIFRoZSBtb2RpZmljYXRpb24gZGF0ZQotICAgICAqIG9mIHRoaXMgamFyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBkZXBlbmRlbnQgYmVhbiBjbGFzc2VzLgotICAgICAqLwotICAgIEZpbGUgZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShTdHJpbmcgYmFzZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERlc3REaXIoKSwgYmFzZU5hbWUgKyBqYXJTdWZmaXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgaW52b2tlZCBieSBleGVjdXRlKCkgZm9yIGVhY2ggV2ViTG9naWMgamFyIHRvIGJlIGJ1aWx0LgotICAgICAqIEVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgb2YgY29uc3RydWN0aW5nIGEgamF2YSB0YXNrIGZvciBjYWxsaW5nCi0gICAgICogd2VibG9naWMuZWpiYyBhbmQgZXhlY3V0aW5nIGl0LgotICAgICAqIEBwYXJhbSBzb3VyY2VKYXIgamF2YS5pby5GaWxlIHJlcHJlc2VudGluZyB0aGUgc291cmNlIChFSkIxLjEpIGphcmZpbGUuCi0gICAgICogQHBhcmFtIGRlc3RKYXIgamF2YS5pby5GaWxlIHJlcHJlc2VudGluZyB0aGUgZGVzdGluYXRpb24sIFdlYkxvZ2ljCi0gICAgICogICAgICAgIGphcmZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkV2VibG9naWNKYXIoRmlsZSBzb3VyY2VKYXIsIEZpbGUgZGVzdEphciwgU3RyaW5nIHB1YmxpY0lkKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmEgamF2YVRhc2sgPSBudWxsOwotCi0gICAgICAgIGlmIChub0VKQkMpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2V0VGFzaygpLmdldFByb2plY3QoKS5jb3B5RmlsZShzb3VyY2VKYXIsIGRlc3RKYXIpOwotICAgICAgICAgICAgICAgIGlmICgha2VlcGdlbmVyYXRlZCkgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2VKYXIuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgRUpCIGphciIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGVqYmNDbGFzc05hbWUgPSBlamJjQ2xhc3M7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YVRhc2sgPSAoSmF2YSkgZ2V0VGFzaygpLmdldFByb2plY3QoKS5jcmVhdGVUYXNrKCJqYXZhIik7Ci0gICAgICAgICAgICBqYXZhVGFzay5zZXRUYXNrTmFtZSgiZWpiYyIpOwotICAgICAgICAgICAgaWYgKGVqYmNDbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBkZXRlcm1pbmUgaXQgZnJvbSBwdWJsaWNJZAotICAgICAgICAgICAgICAgIGlmIChQVUJMSUNJRF9FSkIxMS5lcXVhbHMocHVibGljSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVqYmNDbGFzc05hbWUgPSBDT01QSUxFUl9FSkIxMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUFVCTElDSURfRUpCMjAuZXF1YWxzKHB1YmxpY0lkKSkgewotICAgICAgICAgICAgICAgICAgICBlamJjQ2xhc3NOYW1lID0gQ09NUElMRVJfRUpCMjA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coIlVucmVjb2duaXplZCBwdWJsaWNJZCAiICsgcHVibGljSWQgKyAiIC0gdXNpbmcgRUpCIDEuMSBjb21waWxlciIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgICAgICBlamJjQ2xhc3NOYW1lID0gQ09NUElMRVJfRUpCMTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGphdmFUYXNrLnNldENsYXNzbmFtZShlamJjQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldExpbmUoYWRkaXRpb25hbEFyZ3MpOwotICAgICAgICAgICAgaWYgKGtlZXBnZW5lcmF0ZWQpIHsKLSAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWtlZXBnZW5lcmF0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb21waWxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSB0aGUgY29tcGlsZXIgc3BlY2lmaWVkIGJ5IGJ1aWxkLmNvbXBpbGVyLiBSaWdodCBub3cgd2UgYXJlIGp1c3QgZ29pbmcKLSAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyBKaWtlcwotICAgICAgICAgICAgICAgIFN0cmluZyBidWlsZENvbXBpbGVyID0gZ2V0VGFzaygpLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRDb21waWxlciAhPSBudWxsICYmIGJ1aWxkQ29tcGlsZXIuZXF1YWxzKCJqaWtlcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItY29tcGlsZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoImppa2VzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb21waWxlci5lcXVhbHMoREVGQVVMVF9DT01QSUxFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1jb21waWxlciIpOwotICAgICAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRMaW5lKGNvbXBpbGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShzb3VyY2VKYXIuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKGRlc3RKYXIuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUGF0aCBjbGFzc3BhdGggPSB3bENsYXNzcGF0aDsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsYXNzcGF0aCA9IGdldENvbWJpbmVkQ2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGphdmFUYXNrLnNldEZvcmsodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhVGFzay5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9nKCJDYWxsaW5nICIgKyBlamJjQ2xhc3NOYW1lICsgIiBmb3IgIiArIHNvdXJjZUphci50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQotICAgICAgICAgICAgaWYgKGphdmFUYXNrLmV4ZWN1dGVKYXZhKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRWpiYyByZXBvcnRlZCBhbiBlcnJvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSGF2ZSB0byBjYXRjaCB0aGlzIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiBjYWxsaW5nIG1haW4oKQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyAiICsgZWpiY0NsYXNzTmFtZSArICIuIERldGFpbHM6ICIgKyBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSB3cml0aW5nIG9mIHRoZSBKQVIgZmlsZS4gSXRlcmF0ZXMgb3ZlciB0aGUKLSAgICAgKiBmaWxlbmFtZXMvamF2YS5pby5GaWxlcyBpbiB0aGUgSGFzaHRhYmxlIHN0b3JlZCBvbiB0aGUgaW5zdGFuY2UgdmFyaWFibGUKLSAgICAgKiBlamJGaWxlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyRmlsZSwgSGFzaHRhYmxlIGZpbGVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHVibGljSWQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5lZWQgdG8gY3JlYXRlIGEgZ2VuZXJpYyBqYXIgZmlyc3QuCi0gICAgICAgIEZpbGUgZ2VuZXJpY0phckZpbGUgPSBzdXBlci5nZXRWZW5kb3JPdXRwdXRKYXJGaWxlKGJhc2VOYW1lKTsKLSAgICAgICAgc3VwZXIud3JpdGVKYXIoYmFzZU5hbWUsIGdlbmVyaWNKYXJGaWxlLCBmaWxlcywgcHVibGljSWQpOwotICAgICAgICAKLSAgICAgICAgaWYgKGFsd2F5c1JlYnVpbGQgfHwgaXNSZWJ1aWxkUmVxdWlyZWQoZ2VuZXJpY0phckZpbGUsIGphckZpbGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWlsZFdlYmxvZ2ljSmFyKGdlbmVyaWNKYXJGaWxlLCBqYXJGaWxlLCBwdWJsaWNJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFrZWVwR2VuZXJpYykgewotICAgICAgICAgICAgIGxvZygiZGVsZXRpbmcgZ2VuZXJpYyBqYXIgIiArIGdlbmVyaWNKYXJGaWxlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICBnZW5lcmljSmFyRmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSB0b29sIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyZWQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBzdXBlci52YWxpZGF0ZUNvbmZpZ3VyZWQoKTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIHRvIHNlZSBpZiBhIHdlYmxvZ2ljIEVCSjEuMSBqYXIgbmVlZHMgdG8gYmUgcmVidWlsdCB1c2luZyAKLSAgICAgKiBlamJjLiAgQ2FsbGVkIGZyb20gd3JpdGVKYXIgaXQgc2VlcyBpZiB0aGUgIkJlYW4iIGNsYXNzZXMgIGFyZSB0aGUgb25seSB0aGluZyB0aGF0IG5lZWRzCi0gICAgICogdG8gYmUgdXBkYXRlZCBhbmQgZWl0aGVyIHVwZGF0ZXMgdGhlIEphciB3aXRoIHRoZSBCZWFuIGNsYXNzZmlsZSBvciByZXR1cm5zIHRydWUsCi0gICAgICogc2F5aW5nIHRoYXQgdGhlIHdob2xlIHdlYmxvZ2ljIGphciBuZWVkcyB0byBiZSByZWdlbmVkIHdpdGggZWpiYy4gIFRoaXMgYWxsb3dzIGZhc3RlciAKLSAgICAgKiBidWlsZCB0aW1lcyBmb3Igd29ya2luZyBkZXZlbG9wZXJzLgotICAgICAqIDxwPgotICAgICAqIFRoZSB3YXkgd2VibG9naWMgZWpiYyB3b3JrcyBpcyBpdCBjcmVhdGVzIHdyYXBwZXJzIGZvciB0aGUgcHVibGljbHkgZGVmaW5lZCBtZXRob2RzIGFzIAotICAgICAqIHRoZXkgYXJlIGV4cG9zZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UuICBJZiB0aGUgYWN0dWFsIGJlYW4gY2hhbmdlcyB3aXRob3V0IGNoYW5naW5nIHRoZSAKLSAgICAgKiB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgdGhlbiBvbmx5IHRoZSBiZWFuIGNsYXNzZmlsZSBuZWVkcyB0byBiZSB1cGRhdGVkIGFuZCB0aGUgcmVzdCBvZiB0aGUgCi0gICAgICogd2VibG9naWMgamFyIGZpbGUgY2FuIHJlbWFpbiB0aGUgc2FtZS4gIElmIHRoZSBJbnRlcmZhY2VzLCBpZS4gdGhlIG1ldGhvZCBzaWduYXR1cmVzIGNoYW5nZSAKLSAgICAgKiBvciBpZiB0aGUgeG1sIGRlcGxveW1lbnQgZGljcmlwdG9ycyBjaGFuZ2VkLCB0aGUgd2hvbGUgamFyIG5lZWRzIHRvIGJlIHJlYnVpbHQgd2l0aCBlamJjLiAgCi0gICAgICogVGhpcyBpcyBub3Qgc3RyaWN0bHkgdHJ1ZSBmb3IgdGhlIHhtbCBmaWxlcy4gIElmIHRoZSBKTkRJIG5hbWUgY2hhbmdlcyB0aGVuIHRoZSBqYXIgZG9lc250Ci0gICAgICogaGF2ZSB0byBiZSByZWJ1aWxkLCBidXQgaWYgdGhlIHJlc291cmNlcyByZWZlcmVuY2VzIGNoYW5nZSB0aGVuIGl0IGRvZXMuICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAqIHdlYmxvZ2ljIGphciBnZXRzIHJlYnVpbHQgaWYgdGhlIHhtbCBmaWxlcyBjaGFuZ2UgYXQgYWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIGdlbmVyaWNKYXJGaWxlIGphdmEuaW8uRmlsZSBUaGUgZ2VuZXJpYyBqYXIgZmlsZS4KLSAgICAgKiBAcGFyYW0gd2VibG9naWNKYXJGaWxlIGphdmEuaW8uRmlsZSBUaGUgd2VibG9naWMgamFyIGZpbGUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IG5lZWRzIHRvIGJlIHJlYnVpbHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWJ1aWxkUmVxdWlyZWQoRmlsZSBnZW5lcmljSmFyRmlsZSwgRmlsZSB3ZWJsb2dpY0phckZpbGUpCi0gICAgewotICAgICAgICBib29sZWFuIHJlYnVpbGQgPSBmYWxzZTsKLQotICAgICAgICBKYXJGaWxlIGdlbmVyaWNKYXIgPSBudWxsOwotICAgICAgICBKYXJGaWxlIHdsSmFyID0gbnVsbDsKLSAgICAgICAgRmlsZSBuZXdXTEphckZpbGUgPSBudWxsOwotICAgICAgICBKYXJPdXRwdXRTdHJlYW0gbmV3SmFyU3RyZWFtID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeSAKLSAgICAgICAgewotICAgICAgICAgICAgbG9nKCJDaGVja2luZyBpZiB3ZWJsb2dpYyBKYXIgbmVlZHMgdG8gYmUgcmVidWlsdCBmb3IgamFyICIgKyB3ZWJsb2dpY0phckZpbGUuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgLy8gT25seSBnbyBmb3J3YXJkIGlmIHRoZSBnZW5lcmljIGFuZCB0aGUgd2VibG9naWMgZmlsZSBib3RoIGV4aXN0Ci0gICAgICAgICAgICBpZiAoZ2VuZXJpY0phckZpbGUuZXhpc3RzKCkgJiYgZ2VuZXJpY0phckZpbGUuaXNGaWxlKCkgCi0gICAgICAgICAgICAgICAgJiYgd2VibG9naWNKYXJGaWxlLmV4aXN0cygpICYmIHdlYmxvZ2ljSmFyRmlsZS5pc0ZpbGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL29wZW4gamFyIGZpbGVzCi0gICAgICAgICAgICAgICAgZ2VuZXJpY0phciA9IG5ldyBKYXJGaWxlKGdlbmVyaWNKYXJGaWxlKTsKLSAgICAgICAgICAgICAgICB3bEphciA9IG5ldyBKYXJGaWxlKHdlYmxvZ2ljSmFyRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICBIYXNodGFibGUgZ2VuZXJpY0VudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgSGFzaHRhYmxlIHdsRW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgICAgICBIYXNodGFibGUgcmVwbGFjZUVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9nZXQgdGhlIGxpc3Qgb2YgZ2VuZXJpYyBqYXIgZW50cmllcwotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGdlbmVyaWNKYXIuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gKEphckVudHJ5KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY0VudHJpZXMucHV0KGplLmdldE5hbWUoKS5yZXBsYWNlKCdcXCcsICcvJyksIGplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9nZXQgdGhlIGxpc3Qgb2Ygd2VibG9naWMgamFyIGVudHJpZXMKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSB3bEphci5lbnRyaWVzKCkgOyBlLmhhc01vcmVFbGVtZW50cygpOykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gKEphckVudHJ5KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgd2xFbnRyaWVzLnB1dChqZS5nZXROYW1lKCksIGplKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL0N5Y2xlIFRocm91Z2ggZ2VuZXJpYyBhbmQgbWFrZSBzdXJlIGl0cyBpbiB3ZWJsb2dpYwotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGdlbmVyaWNMb2FkZXIgPSBnZXRDbGFzc0xvYWRlckZyb21KYXIoZ2VuZXJpY0phckZpbGUpOwotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGdlbmVyaWNFbnRyaWVzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZXBhdGggPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdsRW50cmllcy5jb250YWluc0tleShmaWxlcGF0aCkpICAgIC8vIEZpbGUgbmFtZS9wYXRoIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZpbGVzIHNlZSBpZiBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSBnZW5lcmljRW50cnkgPSAoSmFyRW50cnkpZ2VuZXJpY0VudHJpZXMuZ2V0KGZpbGVwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IHdsRW50cnkgPSAoSmFyRW50cnkpd2xFbnRyaWVzLmdldChmaWxlcGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdlbmVyaWNFbnRyeS5nZXRDcmMoKSAhPSAgd2xFbnRyeS5nZXRDcmMoKSkgIHx8IC8vIENyYydzIE1hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdlbmVyaWNFbnRyeS5nZXRTaXplKCkgIT0gd2xFbnRyeS5nZXRTaXplKCkpICkgLy8gU2l6ZSBNYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmljRW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlsZSBhcmUgZGlmZmVyZW50IHNlZSBpZiBpdHMgYW4gb2JqZWN0IG9yIGFuIGludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gZ2VuZXJpY0VudHJ5LmdldE5hbWUoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwnLicpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUuc3Vic3RyaW5nKDAsY2xhc3NuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGdlbmNsYXNzID0gZ2VuZXJpY0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmNsYXNzLmlzSW50ZXJmYWNlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZXJmYWNlIGNoYW5nZWQgICByZWJ1aWxkIGphci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiSW50ZXJmYWNlICIgKyBnZW5jbGFzcy5nZXROYW1lKCkgKyAiIGhhcyBjaGFuZ2VkIixQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL09iamVjdCBjbGFzcyBDaGFuZ2VkICAgdXBkYXRlIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUVudHJpZXMucHV0KGZpbGVwYXRoLCBnZW5lcmljRW50cnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGl0IHRoZSBtYW5pZmVzdC4gSWYgc28gaWdub3JlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2VuZXJpY0VudHJ5LmdldE5hbWUoKS5lcXVhbHMoIk1FVEEtSU5GL01BTklGRVNULk1GIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlsZSBvdGhlciB0aGVuIGNsYXNzIGNoYW5nZWQgICByZWJ1aWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIk5vbiBjbGFzcyBmaWxlICIgKyBnZW5lcmljRW50cnkuZ2V0TmFtZSgpICsgIiBoYXMgY2hhbmdlZCIsUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gYSBmaWxlIGRvZXNudCBleGlzdCByZWJ1aWxkCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRmlsZSAiICsgZmlsZXBhdGggKyAiIG5vdCBwcmVzZW50IGluIHdlYmxvZ2ljIGphciIsUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIXJlYnVpbGQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2coIk5vIHJlYnVpbGQgbmVlZGVkIC0gdXBkYXRpbmcgamFyIixQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3V0xKYXJGaWxlID0gbmV3IEZpbGUod2VibG9naWNKYXJGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIi50ZW1wIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdXTEphckZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1dMSmFyRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtID0gbmV3IEphck91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShuZXdXTEphckZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLnNldExldmVsKDApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy9Db3B5IGZpbGVzIGZyb20gb2xkIHdlYmxvZ2ljIGphcgotICAgICAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSB3bEVudHJpZXMuZWxlbWVudHMoKSA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOwotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSBqZSA9IChKYXJFbnRyeSllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamUuZ2V0Q29tcHJlc3NlZFNpemUoKSA9PSAtMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZS5nZXRDb21wcmVzc2VkU2l6ZSgpID09IGplLmdldFNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5zZXRMZXZlbCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5zZXRMZXZlbCg5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGNoYW5nZWQgQmVhbiBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VFbnRyaWVzLmNvbnRhaW5zS2V5KGplLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJVcGRhdGluZyBCZWFuIGNsYXNzIGZyb20gZ2VuZXJpYyBKYXIgIiArIGplLmdldE5hbWUoKSxQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGVudHJ5IGZyb20gdGhlIGdlbmVyaWMgamFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamUgPSAoSmFyRW50cnkpcmVwbGFjZUVudHJpZXMuZ2V0KGplLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBnZW5lcmljSmFyLmdldElucHV0U3RyZWFtKGplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIC8vdXNlIGZsZSBmcm9tIG9yaWdpbmFsIHdlYmxvZ2ljIGphcgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gd2xKYXIuZ2V0SW5wdXRTdHJlYW0oamUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLnB1dE5leHRFbnRyeShuZXcgSmFyRW50cnkoamUuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gaXMucmVhZChidWZmZXIpKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0ud3JpdGUoYnVmZmVyLDAsYnl0ZXNSZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJXZWJsb2dpYyBKYXIgcmVidWlsZCBuZWVkZWQgZHVlIHRvIGNoYW5nZWQgaW50ZXJmYWNlIG9yIFhNTCIsUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjbmZtc2cgPSAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIGVqYi1qYXIgZmlsZSIKLSAgICAgICAgICAgICAgICArICIuIERldGFpbHM6ICIKLSAgICAgICAgICAgICAgICArIGNuZmUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNuZm1zZywgY25mZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIklPRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgZWpiLWphciBmaWxlICIKLSAgICAgICAgICAgICAgICArICIuIERldGFpbHM6ICIKLSAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgLy8gbmVlZCB0byBjbG9zZSBmaWxlcyBhbmQgcGVyaGFwcyByZW5hbWUgb3V0cHV0Ci0gICAgICAgICAgICBpZiAoZ2VuZXJpY0phciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY0phci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gY2xvc2VFeGNlcHRpb24pIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh3bEphciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2xKYXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXhjZXB0aW9uKSB7fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobmV3SmFyU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXhjZXB0aW9uKSB7fQotCi0gICAgICAgICAgICAgICAgd2VibG9naWNKYXJGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIG5ld1dMSmFyRmlsZS5yZW5hbWVUbyh3ZWJsb2dpY0phckZpbGUpOwotICAgICAgICAgICAgICAgIGlmICghd2VibG9naWNKYXJGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZWJ1aWxkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAqIEhlbHBlciBtZXRob2QgaW52b2tlZCBieSBpc1JlYnVpbGRSZXF1aXJlZCB0byBnZXQgYSBDbGFzc0xvYWRlciBmb3IgCi0gICAgKiBhIEphciBGaWxlIHBhc3NlZCB0byBpdC4KLSAgICAqCi0gICAgKiBAcGFyYW0gY2xhc3NqYXIgamF2YS5pby5GaWxlIHJlcHJlc2VudGluZyBqYXIgZmlsZSB0byBnZXQgY2xhc3NlcyBmcm9tLgotICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyRnJvbUphcihGaWxlIGNsYXNzamFyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBhdGggbG9va3VwUGF0aCA9IG5ldyBQYXRoKGdldFRhc2soKS5nZXRQcm9qZWN0KCkpOwotICAgICAgICBsb29rdXBQYXRoLnNldExvY2F0aW9uKGNsYXNzamFyKTsKLSAgICAgICAgCi0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gZ2V0Q29tYmluZWRDbGFzc3BhdGgoKTsKLSAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb29rdXBQYXRoLmFwcGVuZChjbGFzc3BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IEFudENsYXNzTG9hZGVyKGdldFRhc2soKS5nZXRQcm9qZWN0KCksIGxvb2t1cFBhdGgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY1RPUExpbmtEZXBsb3ltZW50VG9vbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dlYmxvZ2ljVE9QTGlua0RlcGxveW1lbnRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWU0NGEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dlYmxvZ2ljVE9QTGlua0RlcGxveW1lbnRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2wgZXh0ZW5kcyBXZWJsb2dpY0RlcGxveW1lbnRUb29sIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUTF9EVERfTE9DID0gImh0dHA6Ly93d3cub2JqZWN0cGVvcGxlLmNvbS90bHdsL2R0ZC90b3BsaW5rLWNtcF8yXzVfMS5kdGQiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9wbGlua0Rlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdG9wbGlua0RURDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgdXNlZCB0byBzdG9yZSB0aGUgbmFtZSBvZiB0aGUgdG9wbGluayBkZXNjcmlwdG9yLgotICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgZGVzY3JpcHRvciBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvcGxpbmtkZXNjcmlwdG9yKFN0cmluZyBpblN0cmluZykgewotICAgICAgICB0aGlzLnRvcGxpbmtEZXNjcmlwdG9yID0gaW5TdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSB0b3BsaW5rIERURCBmaWxlLgotICAgICAqIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gVVJMIChmaWxlIG9yIG90aGVyd2lzZSkuIElmIHJ1bm5pbmcgdGhpcyBvbiBOVCB1c2luZyBhIGZpbGUgVVJMLCB0aGUgc2FmZXN0IAotICAgICAqIHRoaW5nIHdvdWxkIGJlIHRvIG5vdCB1c2UgYSBkcml2ZSBzcGVjIGluIHRoZSBVUkwgYW5kIG1ha2Ugc3VyZSB0aGUgZmlsZSByZXNpZGVzIG9uIHRoZSBkcml2ZSB0aGF0IAotICAgICAqIEFOVCBpcyBydW5uaW5nIGZyb20uICBUaGlzIHdpbGwga2VlcCB0aGUgc2V0dGluZyBpbiB0aGUgYnVpbGQgWE1MIHBsYXRmb3JtIGluZGVwZW5kZW50LgotICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgRFREIGxvY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvcGxpbmtkdGQoU3RyaW5nIGluU3RyaW5nKSB7Ci0gICAgICAgIHRoaXMudG9wbGlua0RURCA9IGluU3RyaW5nOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEZXNjcmlwdG9ySGFuZGxlciBnZXREZXNjcmlwdG9ySGFuZGxlcihGaWxlIHNyY0RpcikgewotICAgICAgICBEZXNjcmlwdG9ySGFuZGxlciBoYW5kbGVyID0gc3VwZXIuZ2V0RGVzY3JpcHRvckhhbmRsZXIoc3JjRGlyKTsKLSAgICAgICAgaWYgKHRvcGxpbmtEVEQgIT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURCgiLS8vVGhlIE9iamVjdCBQZW9wbGUsIEluYy4vL0RURCBUT1BMaW5rIGZvciBXZWJMb2dpYyBDTVAgMi41LjEvL0VOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wbGlua0RURCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKCItLy9UaGUgT2JqZWN0IFBlb3BsZSwgSW5jLi8vRFREIFRPUExpbmsgZm9yIFdlYkxvZ2ljIENNUCAyLjUuMS8vRU4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTF9EVERfTE9DKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW55IHZlbmRvciBzcGVjaWZpYyBmaWxlcyB3aGljaCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIAotICAgICAqIEVKQiBKYXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmVuZG9yRmlsZXMoSGFzaHRhYmxlIGVqYkZpbGVzLCBTdHJpbmcgZGRQcmVmaXgpIHsKLSAgICAgICAgc3VwZXIuYWRkVmVuZG9yRmlsZXMoZWpiRmlsZXMsIGRkUHJlZml4KTsKLSAgICAgICAgLy8gVGhlbiB0aGUgdG9wbGluayBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQotICAgICAgICAvLyBTZXR1cCBhIG5hbWluZyBzdGFuZGFyZCBoZXJlPy4KLQotCi0gICAgICAgIEZpbGUgdG9wbGlua0REID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyB0b3BsaW5rRGVzY3JpcHRvcik7Ci0gICAgICAgIAotICAgICAgICBpZiAodG9wbGlua0RELmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyB0b3BsaW5rRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0b3BsaW5rREQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9jYXRlIHRvcGxpbmsgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW4gIiArIAotICAgICAgICAgICAgICAgIHRvcGxpbmtERC5nZXRQYXRoKCksIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgdG9vbCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb25maWd1cmVkKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudmFsaWRhdGVDb25maWd1cmVkKCk7Ci0gICAgICAgIGlmICh0b3BsaW5rRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJUaGUgdG9wbGlua2Rlc2NyaXB0b3IgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkIiApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaWRlL1ZBSkFudFRvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpBbnRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZGJlODMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaWRlL1ZBSkFudFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmlkZTsKLQotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLWltcG9ydCBjb20uaWJtLml2ai51dGlsLmJhc2UuUHJvamVjdDsKLWltcG9ydCBjb20uaWJtLml2ai51dGlsLmJhc2UuVG9vbERhdGE7Ci1pbXBvcnQgY29tLmlibS5pdmoudXRpbC5iYXNlLkl2akV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBlcXVpdmFsZW50IHRvIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4gZm9yIHRoZQotICogVkFKIHRvb2wgZW52aXJvbm1lbnQuIEl0J3MgbWFpbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzCi0gKiBUb29scy0+QW50IEJ1aWxkIGZyb20gdGhlIFZBSiBwcm9qZWN0IG1lbnUuCi0gKiBBZGRpdGlvbmFsbHkgdGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIHNhdmUgYnVpbGQgaW5mbyBmb3IKLSAqIGEgcHJvamVjdCBpbiB0aGUgcmVwb3NpdG9yeSBhbmQgbG9hZCBpdCBmcm9tIHRoZSByZXBvc2l0b3J5Ci0gKgotICogQGF1dGhvcjogV29sZiBTaWJlcnNraQotICovCi1wdWJsaWMgY2xhc3MgVkFKQW50VG9vbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfREFUQV9LRVkgPSAiQW50VG9vbCI7Ci0vKioKLSAqIExvYWRzIHRoZSBCdWlsZEluZm8gZm9yIHRoZSBzcGVjaWZpZWQgVkFKIHByb2plY3QgZnJvbSB0aGUKLSAqIHRvb2wgZGF0YSBmb3IgdGhpcyBwcm9qZWN0LgotICogSWYgdGhlcmUgaXMgbm8gYnVpbGQgaW5mbyBzdG9yZWQgZm9yIHRoYXQgcHJvamVjdCwgYSBuZXcKLSAqIGRlZmF1bHQgQnVpbGRJbmZvIGlzIHJldHVybmVkCi0gKiAKLSAqIEByZXR1cm4gQnVpbGRJbmZvIGJ1aWxkSW5mbyBidWlsZCBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QKLSAqIEBwYXJhbSBwcm9qZWN0TmFtZSBTdHJpbmcgcHJvamVjdCBuYW1lCi0gKi8KLXB1YmxpYyBzdGF0aWMgVkFKQnVpbGRJbmZvIGxvYWRCdWlsZERhdGEoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JVkFKQnVpbGRJbmZvIHJlc3VsdCA9IG51bGw7Ci0JdHJ5IHsKLQkJUHJvamVjdCBwcm9qZWN0ID0gVkFKVXRpbC5nZXRXb3Jrc3BhY2UoKS5sb2FkZWRQcm9qZWN0TmFtZWQoIHByb2plY3ROYW1lICk7Ci0JCWlmICggcHJvamVjdC50ZXN0VG9vbFJlcG9zaXRvcnlEYXRhKFRPT0xfREFUQV9LRVkpICkgewotCQkJVG9vbERhdGEgdGQgPSBwcm9qZWN0LmdldFRvb2xSZXBvc2l0b3J5RGF0YShUT09MX0RBVEFfS0VZKTsKLQkJCVN0cmluZyBkYXRhID0gKFN0cmluZyl0ZC5nZXREYXRhKCk7Ci0JCQlyZXN1bHQgPSBWQUpCdWlsZEluZm8ucGFyc2UoIGRhdGEgKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IG5ldyBWQUpCdWlsZEluZm8oKTsKLQkJfQotCQlyZXN1bHQuc2V0VkFKUHJvamVjdE5hbWUoIHByb2plY3ROYW1lICk7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZEluZm8gZm9yIFByb2plY3QgIiArIHByb2plY3ROYW1lICsgCi0JCQkiIGNvdWxkIG5vdCBiZSBsb2FkZWQiICsgdCk7Ci0JCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0KTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlWQUpCdWlsZEluZm8gaW5mbzsKLQlpZiAoIGFyZ3MubGVuZ3RoID49IDIgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFN0cmluZyApIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZylhcmdzWzFdOwotCQlpbmZvID0gbG9hZEJ1aWxkRGF0YSggcHJvamVjdE5hbWUgKTsKLQl9IAotCWVsc2UgewotCQlpbmZvID0gbmV3IFZBSkJ1aWxkSW5mbygpOwotCX0KLQkKLQlWQUpBbnRUb29sR1VJIG1haW5GcmFtZSA9IG5ldyBWQUpBbnRUb29sR1VJKCBpbmZvICk7Ci0JbWFpbkZyYW1lLnNob3coKTsKLX0KLS8qKgotICogU2F2ZXMgdGhlIEJ1aWxkSW5mbyBmb3IgYSBwcm9qZWN0IGluIHRoZSBWQUogcmVwb3NpdG9yeS4KLSAqIEBwYXJhbSBpbmZvIEJ1aWxkSW5mbyBidWlsZCBpbmZvIHRvIHNhdmUKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIHNhdmVCdWlsZERhdGEoVkFKQnVpbGRJbmZvIGluZm8pIHsKLQlTdHJpbmcgZGF0YSA9IGluZm8uYXNEYXRhU3RyaW5nKCk7Ci0JdHJ5IHsKLQkJVG9vbERhdGEgdGQgPSBuZXcgVG9vbERhdGEoIFRPT0xfREFUQV9LRVksIGRhdGEgKTsKLQkJVkFKVXRpbC5nZXRXb3Jrc3BhY2UoKS5sb2FkZWRQcm9qZWN0TmFtZWQoIGluZm8uZ2V0VkFKUHJvamVjdE5hbWUoKSApLnNldFRvb2xSZXBvc2l0b3J5RGF0YSggdGQgKTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkJ1aWxkSW5mbyBmb3IgUHJvamVjdCAiICsgaW5mby5nZXRWQUpQcm9qZWN0TmFtZSgpICsgCi0JCQkiIGNvdWxkIG5vdCBiZSBzYXZlZCIsIHQpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpBbnRUb29sR1VJLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvVkFKQW50VG9vbEdVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzExMmNhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpBbnRUb29sR1VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlOwotCi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5EaWFsb2c7Ci1pbXBvcnQgamF2YS5hd3QuUGFuZWw7Ci1pbXBvcnQgamF2YS5hd3QuTWVudUJhcjsKLWltcG9ydCBqYXZhLmF3dC5NZW51OwotaW1wb3J0IGphdmEuYXd0Lk1lbnVJdGVtOwotaW1wb3J0IGphdmEuYXd0LkxhYmVsOwotaW1wb3J0IGphdmEuYXd0LlRleHRGaWVsZDsKLWltcG9ydCBqYXZhLmF3dC5UZXh0QXJlYTsKLWltcG9ydCBqYXZhLmF3dC5MaXN0OwotaW1wb3J0IGphdmEuYXd0LkNob2ljZTsKLWltcG9ydCBqYXZhLmF3dC5CdXR0b247Ci1pbXBvcnQgamF2YS5hd3QuRmlsZURpYWxvZzsKLWltcG9ydCBqYXZhLmF3dC5GbG93TGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50czsKLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7Ci1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LlN5c3RlbUNvbG9yOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5UZXh0TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LlRleHRFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGdyYWZpY2FsIHVzZXIgaW50ZXJmYWNlIHRvIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBieSBBTlQgYW5kCi0gKiB0byBzdGFydCB0aGUgYnVpbGQtcHJvY2VzcyB3aXRoaW4gSUJNIFZpc3VhbEFnZSBmb3IgSmF2YS4KLSAqIDxwPgotICogSSB3YXMgdXNpbmcgQVdUIHRvIG1ha2UgaXQgaW5kZXBlbmRlbnQgZnJvbSB0aGUgSkRLLXZlcnNpb24uIFBsZWFzZSBkb24ndCBhc2sgbWUgZm9yIGEgU3dpbmctdmVyc2lvbjoKLSAqIEkgYW0gdmVyeSBmYW1pbGlhciB3aXRoIFN3aW5nIGFuZCBJIHJlYWxseSB0aGluayB0aGF0IGl0J3Mgbm90IG5lY2Vzc2FyeSBmb3Igc3VjaCBhIHNpbXBsZSBndWkhCi0gKiA8cD4KLSAqIEl0IGlzIGNvbXBsZXRlbHkgZGV2ZWxvcGVkIGluIFZBSiB1c2luZyB0aGUgdmlzdWFsIGNvbXBvc2l0aW9uIGVkaXRvci4gQWJvdXQgOTAlIG9mIHRoZSBjb2RlIGlzIGdlbmVyYXRlZCBieSBWQUosCi0gKiBidXQgaW4gZmFjdCBJIGRpZCBhIGxvdCBvZiA8aT5jb2RlLWJlYXV0aWZpY2F0aW9uPC9pPiA7LSkuCi0gKiA8cD4KLSAqIEB2ZXJzaW9uIDEuMCBoCi0gKiBAYXV0aG9yOiBDaHJpc3RvcGggV2lsaGVsbXMsIFRVSSBJbmZvdGVjIEdtYkgKLSAqLwotcHVibGljIGNsYXNzIFZBSkFudFRvb2xHVUkgZXh0ZW5kcyBGcmFtZSB7Ci0JLyoqCi0JICogTWVtYmVycyAKLQkgKi8KLQlwcml2YXRlIFZBSkJ1aWxkTG9nZ2VyIGxvZ2dlciA9IG5ldyBWQUpCdWlsZExvZ2dlcigpOwotCXByaXZhdGUgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSAiXHJcbiI7Ci0JcHJpdmF0ZSBQcml2YXRlRXZlbnRIYW5kbGVyIGlFdmVudEhhbmRsZXIgPSBuZXcgUHJpdmF0ZUV2ZW50SGFuZGxlcigpOwotCi0JLyoqCi0JICogTWVtYmVycyBvZiB0aGUgbWFpbi13aW5kb3cKLQkgKi8KLQkvLyBtYWluIG1vZGVsCi0JcHJpdmF0ZSBWQUpCdWlsZEluZm8gaUJ1aWxkSW5mbyA9IG51bGw7Ci0JLy8gTWVudWUKLQlwcml2YXRlIE1lbnVCYXIgaUFudE1ha2VNZW51QmFyID0gbnVsbDsKLQlwcml2YXRlIE1lbnUgaUZpbGVNZW51ID0gbnVsbDsKLQlwcml2YXRlIE1lbnVJdGVtIGlTYXZlTWVudUl0ZW0gPSBudWxsOwotCXByaXZhdGUgTWVudUl0ZW0gaU1lbnVTZXBhcmF0b3IgPSBudWxsOwotCXByaXZhdGUgTWVudUl0ZW0gaVNob3dMb2dNZW51SXRlbSA9IG51bGw7Ci0JcHJpdmF0ZSBNZW51IGlIZWxwTWVudSA9IG51bGw7Ci0JcHJpdmF0ZSBNZW51SXRlbSBpQWJvdXRNZW51SXRlbSA9IG51bGw7Ci0JLy8gQ29udGFpbmVyCi0JcHJpdmF0ZSBQYW5lbCBpQ29udGVudHNQYW5lID0gbnVsbDsKLQlwcml2YXRlIFBhbmVsIGlPcHRpb25lblBhbmVsID0gbnVsbDsKLQlwcml2YXRlIFBhbmVsIGlDb21tYW5kQnV0dG9uUGFuZWwgPSBudWxsOwotCXByaXZhdGUgRmxvd0xheW91dCBpQ29tbWFuZEJ1dHRvblBhbmVsRmxvd0xheW91dCA9IG51bGw7Ci0JLy8gUHJvamVjdCBuYW1lCi0JcHJpdmF0ZSBMYWJlbCBpUHJvamVjdExhYmVsID0gbnVsbDsKLQlwcml2YXRlIExhYmVsIGlQcm9qZWN0VGV4dCA9IG51bGw7Ci0JLy8gWE1MLWZpbGUgCi0JcHJpdmF0ZSBMYWJlbCBpQnVpbGRGaWxlTGFiZWwgPSBudWxsOwotCXByaXZhdGUgVGV4dEZpZWxkIGlCdWlsZEZpbGVUZXh0RmllbGQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpQ29ublB0b1AyQWxpZ25pbmcgPSBmYWxzZTsKLQlwcml2YXRlIEJ1dHRvbiBpQnJvd3NlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEZpbGVEaWFsb2cgaUZpbGVEaWFsb2cgPSBudWxsOwotCS8vIE9wdGlvbnMKLQlwcml2YXRlIENob2ljZSBpTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlID0gbnVsbDsKLQlwcml2YXRlIExhYmVsIGlNZXNzYWdlT3V0cHV0TGV2ZWxMYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBpVGFyZ2V0TGFiZWwgPSBudWxsOwotCXByaXZhdGUgTGlzdCBpVGFyZ2V0TGlzdCA9IG51bGw7Ci0JLy8gQ29tbWFuZC1idXR0b25zCi0JcHJpdmF0ZSBCdXR0b24gaUJ1aWxkQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBpUmVsb2FkQnV0dG9uID0gbnVsbDsJCi0JcHJpdmF0ZSBCdXR0b24gaUNsb3NlQnV0dG9uID0gbnVsbDsKLQkvKioKLQkgKiBsb2ctV2luZG93Ci0JICovCi0JLy8gQ29udGFpbmVyCi0JcHJpdmF0ZSBGcmFtZSBpTWVzc2FnZUZyYW1lID0gbnVsbDsKLQlwcml2YXRlIFBhbmVsIGlNZXNzYWdlQ29tbWFuZFBhbmVsID0gbnVsbDsKLQlwcml2YXRlIFBhbmVsIGlNZXNzYWdlQ29udGVudFBhbmVsID0gbnVsbDsKLQkvLyBDb21wb25lbnRzCi0JcHJpdmF0ZSBUZXh0QXJlYSBpTWVzc2FnZVRleHRBcmVhID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBpTWVzc2FnZU9rQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBpTWVzc2FnZUNsZWFyTG9nQnV0dG9uID0gbnVsbDsKLQkvKioKLQkgKiBBYm91dC1kaWFsb2cKLQkgKi8KLQkvLyBDb250YWluZXIKLQlwcml2YXRlIERpYWxvZyBpQWJvdXREaWFsb2cgPSBudWxsOwotCXByaXZhdGUgUGFuZWwgaUFib3V0RGlhbG9nQ29udGVudFBhbmVsID0gbnVsbDsKLQlwcml2YXRlIFBhbmVsIGlBYm91dEluZm9QYW5lbCA9IG51bGw7Ci0JcHJpdmF0ZSBQYW5lbCBpQWJvdXRDb21tYW5kUGFuZWwgPSBudWxsOwotCS8vIExhYmVscwotCXByaXZhdGUgTGFiZWwgaUFib3V0VGl0bGVMYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBpQWJvdXREZXZMYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBpQWJvdXRDb250YWN0TGFiZWwgPSBudWxsOwotCS8vIEJ1dHRvbnMKLQlwcml2YXRlIEJ1dHRvbiBpQWJvdXRPa0J1dHRvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIGludGVybmFsIEJ1aWxkTG9nZ2VyLCB0byBiZSBob25lc3QsIGlzIGp1c3QgYSBCdWlsZExpc3RlbmVyLiAKLQkgKiBJdCBkb2VzIG5lYXJseSB0aGUgc2FtZSBhcyB0aGUgRGVmYXVsdExvZ2dlciwgYnV0IHVzZXMgdGhlIExvZ2dpbi1XaW5kb3cgZm9yIG91dHB1dC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFZBSkJ1aWxkTG9nZ2VyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkvKioKLQkJICogVkFKQnVpbGRMb2dnZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkJICovCi0JCXB1YmxpYyBWQUpCdWlsZExvZ2dlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogIEZpcmVkIGFmdGVyIHRoZSBsYXN0IHRhcmdldCBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQKLQkJICogIHdpbGwgc3RpbGwgYmUgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZC4KLQkJICoKLQkJICogIEBzZWUgQnVpbGRFdmVudCNnZXRFeGNlcHRpb24oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCQlUaHJvd2FibGUgZXJyb3IgPSBldmVudC5nZXRFeGNlcHRpb24oKTsKLQotCQkJaWYgKGVycm9yID09IG51bGwpIHsKLQkJCQlnZXRNZXNzYWdlVGV4dEFyZWEoKS5hcHBlbmQobGluZVNlcGFyYXRvciArICJCVUlMRCBTVUNDRVNTRlVMIik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRNZXNzYWdlVGV4dEFyZWEoKS5hcHBlbmQobGluZVNlcGFyYXRvciArICJCVUlMRCBGQUlMRUQiICsgbGluZVNlcGFyYXRvcik7Ci0KLQkJCQlpZiAoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgewotCQkJCQlnZXRNZXNzYWdlVGV4dEFyZWEoKS5hcHBlbmQoZXJyb3IudG9TdHJpbmcoKSk7Ci0KLQkJCQkJVGhyb3dhYmxlIG5lc3RlZCA9ICgoQnVpbGRFeGNlcHRpb24pZXJyb3IpLmdldEV4Y2VwdGlvbigpOwotCQkJCQlpZiAobmVzdGVkICE9IG51bGwpIHsKLQkJCQkJCW5lc3RlZC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVycm9yLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWdldE1lc3NhZ2VUZXh0QXJlYSgpLmFwcGVuZChsaW5lU2VwYXJhdG9yICsgIlRvdGFsIHRpbWU6ICIgKyBmb3JtYXRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSk7Ci0JCX0KLQotCQkvKioKLQkJICogIEZpcmVkIGJlZm9yZSBhbnkgdGFyZ2V0cyBhcmUgc3RhcnRlZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWdldE1lc3NhZ2VUZXh0QXJlYSgpLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJfQotCi0JCS8qKgotCQkgKiAgRmlyZWQgd2hlbmV2ZXIgYSBtZXNzYWdlIGlzIGxvZ2dlZC4KLQkJICoKLQkJICogIEBzZWUgQnVpbGRFdmVudCNnZXRNZXNzYWdlKCkKLQkJICogIEBzZWUgQnVpbGRFdmVudCNnZXRQcmlvcml0eSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRQcmlvcml0eSgpIDw9IGdldEJ1aWxkSW5mbygpLmdldE91dHB1dE1lc3NhZ2VMZXZlbCgpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9ICIiOwotCQkJCWlmIChldmVudC5nZXRUYXNrKCkgIT0gbnVsbCkKLQkJCQkJbXNnID0gIlsiICsgZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCkgKyAiXSAiOwotCQkJCWdldE1lc3NhZ2VUZXh0QXJlYSgpLmFwcGVuZChsaW5lU2VwYXJhdG9yICsgbXNnICsgZXZlbnQuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiAgRmlyZWQgd2hlbiBhIHRhcmdldCBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQgd2lsbAotCQkgKiAgc3RpbGwgYmUgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZC4KLQkJICoKLQkJICogIEBzZWUgQnVpbGRFdmVudCNnZXRFeGNlcHRpb24oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqICBGaXJlZCB3aGVuIGEgdGFyZ2V0IGlzIHN0YXJ0ZWQuCi0JCSAqCi0JCSAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFyZ2V0KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCQkJaWYgKGdldEJ1aWxkSW5mbygpLmdldE91dHB1dE1lc3NhZ2VMZXZlbCgpIDw9IFByb2plY3QuTVNHX0lORk8pIHsKLQkJCQlnZXRNZXNzYWdlVGV4dEFyZWEoKS5hcHBlbmQobGluZVNlcGFyYXRvciArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSArICI6Iik7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogIEZpcmVkIHdoZW4gYSB0YXNrIGhhcyBmaW5pc2hlZC4gVGhpcyBldmVudCB3aWxsIHN0aWxsCi0JCSAqICBiZSB0aHJvdyBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgYnVpbGQuCi0JCSAqCi0JCSAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQotCQkvKioKLQkJICogIEZpcmVkIHdoZW4gYSB0YXNrIGlzIHN0YXJ0ZWQuCi0JCSAqCi0JCSAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFzaygpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJLyoqCi0JCSAqIENocmlzOiBIQUNLOiByZW1vdmUgd2hlbiBBbnQtUmVmYWN0b3JpbmcgaXMgZmluaXNoZWQhCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWlsZFN1Y2Nlc3NmdWwoKSB7Ci0JCQlnZXRNZXNzYWdlVGV4dEFyZWEoKS5hcHBlbmQobGluZVNlcGFyYXRvciArICJCVUlMRCBTVUNDRVNTRlVMIik7Ci0JCQlnZXRNZXNzYWdlVGV4dEFyZWEoKS5hcHBlbmQobGluZVNlcGFyYXRvciArICJUb3RhbCB0aW1lOiAiICsgZm9ybWF0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkpOwotCQl9Ci0JCS8qKgotCQkgKiBDaHJpczogSEFDSzogcmVtb3ZlIHdoZW4gQW50LVJlZmFjdG9yaW5nIGlzIGZpbmlzaGVkIQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVpbGRGYWlsZWQoVGhyb3dhYmxlIGV4YykgewotCQkJZ2V0TWVzc2FnZVRleHRBcmVhKCkuYXBwZW5kKGxpbmVTZXBhcmF0b3IgKyAiQlVJTEQgRkFJTEVEIiArIGxpbmVTZXBhcmF0b3IpOwotCi0JCQlpZiAoZXhjIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKLQkJCQlnZXRNZXNzYWdlVGV4dEFyZWEoKS5hcHBlbmQoZXhjLnRvU3RyaW5nKCkpOwotCi0JCQkJVGhyb3dhYmxlIG5lc3RlZCA9ICgoQnVpbGRFeGNlcHRpb24pZXhjKS5nZXRFeGNlcHRpb24oKTsKLQkJCQlpZiAobmVzdGVkICE9IG51bGwpIHsKLQkJCQkJbmVzdGVkLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlleGMucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkJfQotCQkJZ2V0TWVzc2FnZVRleHRBcmVhKCkuYXBwZW5kKGxpbmVTZXBhcmF0b3IgKyAiVG90YWwgdGltZTogIiArIGZvcm1hdFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFdmVudGhhbmRsZXIgdG8gaGFuZGxlIGFsbCBBV1QtZXZlbnRzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcml2YXRlRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIsIEl0ZW1MaXN0ZW5lciwgVGV4dExpc3RlbmVyLCBXaW5kb3dMaXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBBY3Rpb25MaXN0ZW5lciBtZXRob2QKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQl0cnkgewotCQkJCS8qICMjIyMgTWFpbiBBcHAtRnJhbWUgIyMjIyAqLwotCQkJCS8vIGJyb3dzZSBYTUwtRmlsZSB3aXRoIGZpbGVjaG9vc2VyCi0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldEJyb3dzZUJ1dHRvbigpKSB7Ci0JCQkJCWdldEZpbGVEaWFsb2coKS5zZXREaXJlY3RvcnkoZ2V0QnVpbGRGaWxlVGV4dEZpZWxkKCkuZ2V0VGV4dCgpLnN1YnN0cmluZygwLCBnZXRCdWlsZEZpbGVUZXh0RmllbGQoKS5nZXRUZXh0KCkubGFzdEluZGV4T2YoJ1xcJykgKyAxKSk7Ci0JCQkJCWdldEZpbGVEaWFsb2coKS5zZXRGaWxlKCIqLnhtbCIpOwotCQkJCQlnZXRGaWxlRGlhbG9nKCkuc2hvdygpOwotCQkJCQlpZiAoIWdldEZpbGVEaWFsb2coKS5nZXRGaWxlKCkuZXF1YWxzKCIiKSApIHsKLQkJCQkJCWdldEJ1aWxkRmlsZVRleHRGaWVsZCgpLnNldFRleHQoZ2V0RmlsZURpYWxvZygpLmdldERpcmVjdG9yeSgpICsgZ2V0RmlsZURpYWxvZygpLmdldEZpbGUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZGlzcG9zZSBhbmQgZXhpdCBhcHBsaWNhdGlvbiAKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBWQUpBbnRUb29sR1VJLnRoaXMuZ2V0Q2xvc2VCdXR0b24oKSkgewotCQkJCQlkaXNwb3NlKCk7Ci0JCQkJCVN5c3RlbS5leGl0KDApOwotCQkJCX0KLQkJCQkvLyBzdGFydCBidWlsZC1wcm9jZXNzCi0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldEJ1aWxkQnV0dG9uKCkpIAotCQkJCQlleGVjdXRlVGFyZ2V0KCk7Ci0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldFJlbG9hZEJ1dHRvbigpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlnZXRCdWlsZEluZm8oKS51cGRhdGVUYXJnZXRMaXN0KCk7Ci0JCQkJCQlmaWxsTGlzdCgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChUaHJvd2FibGUgZmlsZU5vdEZvdW5kKSB7Ci0JCQkJCQloYW5kbGVFeGNlcHRpb24oZmlsZU5vdEZvdW5kKTsKLQkJCQkJCWdldFRhcmdldExpc3QoKS5yZW1vdmVBbGwoKTsKLQkJCQkJCWdldEJ1aWxkQnV0dG9uKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gTWVudUl0ZW1zCi0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldFNhdmVNZW51SXRlbSgpKSAKLQkJCQkJc2F2ZUJ1aWxkSW5mbygpOwotCQkJCWlmIChlLmdldFNvdXJjZSgpID09IFZBSkFudFRvb2xHVUkudGhpcy5nZXRBYm91dE1lbnVJdGVtKCkpIAotCQkJCQlnZXRBYm91dERpYWxvZygpLnNob3coKTsKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBWQUpBbnRUb29sR1VJLnRoaXMuZ2V0U2hvd0xvZ01lbnVJdGVtKCkpIAotCQkJCQlnZXRNZXNzYWdlRnJhbWUoKS5zaG93KCk7Ci0JCQkJLyogIyMjIyBBYm91dCBkaWFsb2cgIyMjIyAqLwotCQkJCWlmIChlLmdldFNvdXJjZSgpID09IFZBSkFudFRvb2xHVUkudGhpcy5nZXRBYm91dE9rQnV0dG9uKCkpIAotCQkJCQlnZXRBYm91dERpYWxvZygpLmRpc3Bvc2UoKTsKLQkJCQkvKiAjIyMjIExvZyBmcmFtZSAjIyMjICovCi0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldE1lc3NhZ2VPa0J1dHRvbigpKQotCQkJCQlnZXRNZXNzYWdlRnJhbWUoKS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldE1lc3NhZ2VDbGVhckxvZ0J1dHRvbigpKSAKLQkJCQkJZ2V0TWVzc2FnZVRleHRBcmVhKCkuc2V0VGV4dCgiIik7Ci0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldE1lc3NhZ2VPa0J1dHRvbigpKSAKLQkJCQkJZ2V0TWVzc2FnZUZyYW1lKCkuZGlzcG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBJdGVtTGlzdGVuZXIgbWV0aG9kCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChlLmdldFNvdXJjZSgpID09IFZBSkFudFRvb2xHVUkudGhpcy5nZXRUYXJnZXRMaXN0KCkpIAotCQkJCQlnZXRCdWlsZEJ1dHRvbigpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldE1lc3NhZ2VPdXRwdXRMZXZlbENob2ljZSgpKSAKLQkJCQkJZ2V0QnVpbGRJbmZvKCkuc2V0T3V0cHV0TWVzc2FnZUxldmVsKGdldE1lc3NhZ2VPdXRwdXRMZXZlbENob2ljZSgpLmdldFNlbGVjdGVkSW5kZXgoKSk7Ci0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldFRhcmdldExpc3QoKSkgCi0JCQkJCWdldEJ1aWxkSW5mbygpLnNldFRhcmdldChnZXRUYXJnZXRMaXN0KCkuZ2V0U2VsZWN0ZWRJdGVtKCkpOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbWV0aG9kCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQlpZiAoZXZ0LmdldFNvdXJjZSgpID09IFZBSkFudFRvb2xHVUkudGhpcy5nZXRCdWlsZEluZm8oKSAmJiAoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscygicHJvamVjdE5hbWUiKSkpIAotCQkJCWNvbm5lY3RQcm9qZWN0TmFtZVRvTGFiZWwoKTsKLQkJCWlmIChldnQuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldEJ1aWxkSW5mbygpICYmIChldnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJidWlsZEZpbGVOYW1lIikpKSAKLQkJCQljb25uZWN0QnVpbGRGaWxlTmFtZVRvVGV4dEZpZWxkKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBUZXh0TGlzdGVuZXIgbWV0aG9kCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB0ZXh0VmFsdWVDaGFuZ2VkKFRleHRFdmVudCBlKSB7Ci0JCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBWQUpBbnRUb29sR1VJLnRoaXMuZ2V0QnVpbGRGaWxlVGV4dEZpZWxkKCkpIAotCQkJCWNvbm5lY3RUZXh0RmllbGRUb0J1aWxkRmlsZU5hbWUoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFdpbmRvd0xpc3RlbmVyIG1ldGhvZHMKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBWQUpBbnRUb29sR1VJLnRoaXMpIHsKLQkJCQkJZGlzcG9zZSgpOwotCQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCQl9Ci0JCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gVkFKQW50VG9vbEdVSS50aGlzLmdldEFib3V0RGlhbG9nKCkpIAotCQkJCQlnZXRBYm91dERpYWxvZygpLmRpc3Bvc2UoKTsKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBWQUpBbnRUb29sR1VJLnRoaXMuZ2V0TWVzc2FnZUZyYW1lKCkpIAotCQkJCQlnZXRNZXNzYWdlRnJhbWUoKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChXaW5kb3dFdmVudCBlKSB7fTsKLQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKFdpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChXaW5kb3dFdmVudCBlKSB7fTsKLQkJcHVibGljIHZvaWQgd2luZG93RGVpY29uaWZpZWQoV2luZG93RXZlbnQgZSkge307Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd0ljb25pZmllZChXaW5kb3dFdmVudCBlKSB7fTsKLQkJcHVibGljIHZvaWQgd2luZG93T3BlbmVkKFdpbmRvd0V2ZW50IGUpIHt9OwotCX0KLQkKLQkvKioKLQkgKiBBbnRNYWtlIGRlZmF1bHQtY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBWQUpBbnRUb29sR1VJKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCS8qKgotCSAqIEFudE1ha2UgY29uc3RydWN0b3IgY2FsbGVkIGJ5IFZBSkFudFRvb2wgaW50ZWdyYXRpb24uCi0JICogQHBhcmFtIGJ1aWxkSW5mbyBWQUpCdWlsZEluZm8KLQkgKi8KLQkgCi0JcHVibGljIFZBSkFudFRvb2xHVUkoVkFKQnVpbGRJbmZvIG5ld0J1aWxkSW5mbykgewotCQlzdXBlcigpOwotCQlzZXRCdWlsZEluZm8obmV3QnVpbGRJbmZvKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNlbnRlciBkaWFsb2dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjZW50ZXJEaWFsb2coRGlhbG9nIGRpYWxvZykgewotCQlkaWFsb2cuc2V0TG9jYXRpb24oKFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTY3JlZW5TaXplKCkud2lkdGggLyAyKSAtIChkaWFsb2cuZ2V0U2l6ZSgpLndpZHRoIC8gMiksIChqYXZhLmF3dC5Ub29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpLmhlaWdodCAvIDIpIC0gKGRpYWxvZy5nZXRTaXplKCkuaGVpZ2h0IC8gMikpOwotCX0KLQkvKioKLQkgKiBjb25uZWN0QnVpbGRGaWxlTmFtZVRvVGV4dEZpZWxkOiAgKEJ1aWxkSW5mby5idWlsZEZpbGVOYW1lIDwtLT4gQnVpbGRGaWxlVGV4dEZpZWxkLnRleHQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3RCdWlsZEZpbGVOYW1lVG9UZXh0RmllbGQoKSB7Ci0JCS8qIFNldCB0aGUgdGFyZ2V0IGZyb20gdGhlIHNvdXJjZSAqLwotCQl0cnkgewotCQkJaWYgKGlDb25uUHRvUDJBbGlnbmluZyA9PSBmYWxzZSkgewotCQkJCWlDb25uUHRvUDJBbGlnbmluZyA9IHRydWU7Ci0JCQkJaWYgKChnZXRCdWlsZEluZm8oKSAhPSBudWxsKSkgewotCQkJCQlnZXRCdWlsZEZpbGVUZXh0RmllbGQoKS5zZXRUZXh0KGdldEJ1aWxkSW5mbygpLmdldEJ1aWxkRmlsZU5hbWUoKSk7Ci0JCQkJfQotCQkJCWlDb25uUHRvUDJBbGlnbmluZyA9IGZhbHNlOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJaUNvbm5QdG9QMkFsaWduaW5nID0gZmFsc2U7Ci0JCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogY29ubmVjdFByb2plY3ROYW1lVG9MYWJlbDogIChCdWlsZEluZm8udmFqUHJvamVjdE5hbWUgPC0tPiBQcm9qZWN0VGV4dC50ZXh0KQotCSAqLwotCXByaXZhdGUgdm9pZCBjb25uZWN0UHJvamVjdE5hbWVUb0xhYmVsKCkgewotCQkvKiBTZXQgdGhlIHRhcmdldCBmcm9tIHRoZSBzb3VyY2UgKi8KLQkJdHJ5IHsKLQkJCWlmICgoZ2V0QnVpbGRJbmZvKCkgIT0gbnVsbCkpIHsKLQkJCQlnZXRQcm9qZWN0VGV4dCgpLnNldFRleHQoZ2V0QnVpbGRJbmZvKCkuZ2V0VkFKUHJvamVjdE5hbWUoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogY29ubmVjdFRleHRGaWVsZFRvQnVpbGRGaWxlTmFtZTogIChCdWlsZEluZm8uYnVpbGRGaWxlTmFtZSA8LS0+IEJ1aWxkRmlsZVRleHRGaWVsZC50ZXh0KQotCSAqLwotCXByaXZhdGUgdm9pZCBjb25uZWN0VGV4dEZpZWxkVG9CdWlsZEZpbGVOYW1lKCkgewotCQkvKiBTZXQgdGhlIHNvdXJjZSBmcm9tIHRoZSB0YXJnZXQgKi8KLQkJdHJ5IHsKLQkJCWlmIChpQ29ublB0b1AyQWxpZ25pbmcgPT0gZmFsc2UpIHsKLQkJCQlpQ29ublB0b1AyQWxpZ25pbmcgPSB0cnVlOwotCQkJCWlmICgoZ2V0QnVpbGRJbmZvKCkgIT0gbnVsbCkpIHsKLQkJCQkJZ2V0QnVpbGRJbmZvKCkuc2V0QnVpbGRGaWxlTmFtZShnZXRCdWlsZEZpbGVUZXh0RmllbGQoKS5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCQlpQ29ublB0b1AyQWxpZ25pbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCWlDb25uUHRvUDJBbGlnbmluZyA9IGZhbHNlOwotCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQl9Ci0JfQotCS8qKgotCSAqIGV4dGVybmFsIGJ1aWxkIG9mIGEgLmphci1maWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUYXJnZXQoKSB7Ci0JCXRyeQl7Ci0JCQlnZXRNZXNzYWdlRnJhbWUoKS5zaG93KCk7Ci0JCQkvLyBDaHJpczogSEFDSzogcmVtb3ZlIHdoZW4gQW50LVJlZmFjdG9yaW5nIGlzIGZpbmlzaGVkIQotCQkJbG9nZ2VyLmJ1aWxkU3RhcnRlZChudWxsKTsKLQkJCWdldEJ1aWxkSW5mbygpLmV4ZWN1dGVQcm9qZWN0KGxvZ2dlcik7Ci0JCQkvLyBDaHJpczogSEFDSzogcmVtb3ZlIHdoZW4gQW50LVJlZmFjdG9yaW5nIGlzIGZpbmlzaGVkIQotCQkJbG9nZ2VyLmJ1aWxkU3VjY2Vzc2Z1bCgpOwkJCQotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkvLyBXZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBleGNlcHRpb25zISBBbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIGxvZ2dpbmctd2luZG93IQotCQkJLy8gVW5mb3J0dW5hdGVseSBBTlQtUmVmYWN0b3JpbmcgaXNuJ3QgZG9uZSB5ZXQhCi0JCQkvLyBDaHJpczogSEFDSzogcmVtb3ZlIHdoZW4gQW50LVJlZmFjdG9yaW5nIGlzIGZpbmlzaGVkIQotCQkJbG9nZ2VyLmJ1aWxkRmFpbGVkKCBleGMgKTsJCQkKLQkJfQotCQlyZXR1cm47Ci0JfQotCS8qKgotCSAqIEZpbGxzIHRoZSB0YWdldC1saXN0IHdpdGggcHJvamVjdC10YXJnZXRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbGxMaXN0KCkgewotCQlnZXRUYXJnZXRMaXN0KCkucmVtb3ZlQWxsKCk7Ci0JCVZlY3RvciB0YXJnZXRzID0gZ2V0QnVpbGRJbmZvKCkuZ2V0UHJvamVjdFRhcmdldHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7aSA8IHRhcmdldHMuc2l6ZSgpOyBpKyspIHsKLQkJCWdldFRhcmdldExpc3QoKS5hZGQodGFyZ2V0cy5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZ2V0VGFyZ2V0TGlzdCgpLnNlbGVjdChpQnVpbGRJbmZvLmdldFByb2plY3RUYXJnZXRzKCkuaW5kZXhPZihpQnVpbGRJbmZvLmdldFRhcmdldCgpKSk7Ci0JCWlmIChnZXRUYXJnZXRMaXN0KCkuZ2V0U2VsZWN0ZWRJbmRleCgpID49IDApIHsKLQkJCWdldEJ1aWxkQnV0dG9uKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBDb3BpZWQgZnJvbSBEZWZhdWx0TG9nZ2VyIHRvIHByb3ZpZGUgdGhlIHNhbWUgdGltZS1mb3JtYXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0VGltZShsb25nIG1pbGxpcykgewotCQlsb25nIHNlY29uZHMgPSBtaWxsaXMgLyAxMDAwOwotCQlsb25nIG1pbnV0ZXMgPSBzZWNvbmRzIC8gNjA7Ci0KLQkJaWYgKG1pbnV0ZXMgPiAwKSB7Ci0JCQlyZXR1cm4gTG9uZy50b1N0cmluZyhtaW51dGVzKSArICIgbWludXRlIgotCQkJCSsgKG1pbnV0ZXMgPT0gMSA/ICIgIiA6ICJzICIpCi0JCQkJKyBMb25nLnRvU3RyaW5nKHNlY29uZHMlNjApICsgIiBzZWNvbmQiCi0JCQkJKyAoc2Vjb25kcyU2MCA9PSAxID8gIiIgOiAicyIpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIExvbmcudG9TdHJpbmcoc2Vjb25kcykgKyAiIHNlY29uZCIKLQkJCQkrIChzZWNvbmRzJTYwID09IDEgPyAiIiA6ICJzIik7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBBYm91dENvbW1hbmRQYW5lbCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LlBhbmVsCi0JICovCi0JcHJpdmF0ZSBQYW5lbCBnZXRBYm91dENvbW1hbmRQYW5lbCgpIHsKLQkJaWYgKGlBYm91dENvbW1hbmRQYW5lbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlBYm91dENvbW1hbmRQYW5lbCA9IG5ldyBQYW5lbCgpOwotCQkJCWlBYm91dENvbW1hbmRQYW5lbC5zZXROYW1lKCJBYm91dENvbW1hbmRQYW5lbCIpOwotCQkJCWlBYm91dENvbW1hbmRQYW5lbC5zZXRMYXlvdXQobmV3IGphdmEuYXd0LkZsb3dMYXlvdXQoKSk7Ci0JCQkJZ2V0QWJvdXRDb21tYW5kUGFuZWwoKS5hZGQoZ2V0QWJvdXRPa0J1dHRvbigpLCBnZXRBYm91dE9rQnV0dG9uKCkuZ2V0TmFtZSgpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpQWJvdXRDb21tYW5kUGFuZWw7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgQWJvdXRDb250YWN0TGFiZWwgcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5MYWJlbAotCSAqLwotCXByaXZhdGUgTGFiZWwgZ2V0QWJvdXRDb250YWN0TGFiZWwoKSB7Ci0JCWlmIChpQWJvdXRDb250YWN0TGFiZWwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpQWJvdXRDb250YWN0TGFiZWwgPSBuZXcgTGFiZWwoKTsKLQkJCQlpQWJvdXRDb250YWN0TGFiZWwuc2V0TmFtZSgiQWJvdXRDb250YWN0TGFiZWwiKTsKLQkJCQlpQWJvdXRDb250YWN0TGFiZWwuc2V0QWxpZ25tZW50KGphdmEuYXd0LkxhYmVsLkNFTlRFUik7Ci0JCQkJaUFib3V0Q29udGFjdExhYmVsLnNldFRleHQoImNvbnRhY3Q6IHdvbGYuc2liZXJza2lAdHVpLmRlIG9yIGNocmlzdG9waC53aWxoZWxtc0B0dWkuZGUiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpQWJvdXRDb250YWN0TGFiZWw7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgQWJvdXREZXZMYWJlbCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LkxhYmVsCi0JICovCi0JcHJpdmF0ZSBMYWJlbCBnZXRBYm91dERldkxhYmVsKCkgewotCQlpZiAoaUFib3V0RGV2TGFiZWwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpQWJvdXREZXZMYWJlbCA9IG5ldyBMYWJlbCgpOwotCQkJCWlBYm91dERldkxhYmVsLnNldE5hbWUoIkFib3V0RGV2TGFiZWwiKTsKLQkJCQlpQWJvdXREZXZMYWJlbC5zZXRBbGlnbm1lbnQoamF2YS5hd3QuTGFiZWwuQ0VOVEVSKTsKLQkJCQlpQWJvdXREZXZMYWJlbC5zZXRUZXh0KCJkZXZlbG9wZWQgYnkgV29sZiBTaWJlcnNraSAmIENocmlzdG9waCBXaWxoZWxtcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlBYm91dERldkxhYmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEFib3V0RGlhbG9nIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuRGlhbG9nCi0JICovCi0JcHJpdmF0ZSBEaWFsb2cgZ2V0QWJvdXREaWFsb2coKSB7Ci0JCWlmIChpQWJvdXREaWFsb2cgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpQWJvdXREaWFsb2cgPSBuZXcgRGlhbG9nKHRoaXMpOwotCQkJCWlBYm91dERpYWxvZy5zZXROYW1lKCJBYm91dERpYWxvZyIpOwotCQkJCWlBYm91dERpYWxvZy5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkJCWlBYm91dERpYWxvZy5zZXRMYXlvdXQobmV3IGphdmEuYXd0LkJvcmRlckxheW91dCgpKTsKLQkJCQlpQWJvdXREaWFsb2cuc2V0Qm91bmRzKDU1MCwgMTQsIDM4MywgMTQyKTsKLQkJCQlpQWJvdXREaWFsb2cuc2V0TW9kYWwodHJ1ZSk7Ci0JCQkJaUFib3V0RGlhbG9nLnNldFRpdGxlKCJBYm91dC4uLiIpOwotCQkJCWdldEFib3V0RGlhbG9nKCkuYWRkKGdldEFib3V0RGlhbG9nQ29udGVudFBhbmVsKCksICJDZW50ZXIiKTsKLQkJCQlpQWJvdXREaWFsb2cucGFjaygpOwotCQkJCWNlbnRlckRpYWxvZyhpQWJvdXREaWFsb2cpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlBYm91dERpYWxvZzsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBBYm91dERpYWxvZ0NvbnRlbnRQYW5lbCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LlBhbmVsCi0JICovCi0JcHJpdmF0ZSBQYW5lbCBnZXRBYm91dERpYWxvZ0NvbnRlbnRQYW5lbCgpIHsKLQkJaWYgKGlBYm91dERpYWxvZ0NvbnRlbnRQYW5lbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlBYm91dERpYWxvZ0NvbnRlbnRQYW5lbCA9IG5ldyBQYW5lbCgpOwotCQkJCWlBYm91dERpYWxvZ0NvbnRlbnRQYW5lbC5zZXROYW1lKCJBYm91dERpYWxvZ0NvbnRlbnRQYW5lbCIpOwotCQkJCWlBYm91dERpYWxvZ0NvbnRlbnRQYW5lbC5zZXRMYXlvdXQobmV3IGphdmEuYXd0LkJvcmRlckxheW91dCgpKTsKLQkJCQlnZXRBYm91dERpYWxvZ0NvbnRlbnRQYW5lbCgpLmFkZChnZXRBYm91dENvbW1hbmRQYW5lbCgpLCAiU291dGgiKTsKLQkJCQlnZXRBYm91dERpYWxvZ0NvbnRlbnRQYW5lbCgpLmFkZChnZXRBYm91dEluZm9QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaUFib3V0RGlhbG9nQ29udGVudFBhbmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEFib3V0SW5mb1BhbmVsIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuUGFuZWwKLQkgKi8KLQlwcml2YXRlIFBhbmVsIGdldEFib3V0SW5mb1BhbmVsKCkgewotCQlpZiAoaUFib3V0SW5mb1BhbmVsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaUFib3V0SW5mb1BhbmVsID0gbmV3IFBhbmVsKCk7Ci0JCQkJaUFib3V0SW5mb1BhbmVsLnNldE5hbWUoIkFib3V0SW5mb1BhbmVsIik7Ci0JCQkJaUFib3V0SW5mb1BhbmVsLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0Fib3V0VGl0bGVMYWJlbCA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJCQljb25zdHJhaW50c0Fib3V0VGl0bGVMYWJlbC5ncmlkeCA9IDA7IGNvbnN0cmFpbnRzQWJvdXRUaXRsZUxhYmVsLmdyaWR5ID0gMDsKLQkJCQljb25zdHJhaW50c0Fib3V0VGl0bGVMYWJlbC5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7Ci0JCQkJY29uc3RyYWludHNBYm91dFRpdGxlTGFiZWwud2VpZ2h0eCA9IDEuMDsKLQkJCQljb25zdHJhaW50c0Fib3V0VGl0bGVMYWJlbC53ZWlnaHR5ID0gMS4wOwotCQkJCWNvbnN0cmFpbnRzQWJvdXRUaXRsZUxhYmVsLmluc2V0cyA9IG5ldyBJbnNldHMoNCwgMCwgNCwgMCk7Ci0JCQkJZ2V0QWJvdXRJbmZvUGFuZWwoKS5hZGQoZ2V0QWJvdXRUaXRsZUxhYmVsKCksIGNvbnN0cmFpbnRzQWJvdXRUaXRsZUxhYmVsKTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0Fib3V0RGV2TGFiZWwgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0JCQkJY29uc3RyYWludHNBYm91dERldkxhYmVsLmdyaWR4ID0gMDsgY29uc3RyYWludHNBYm91dERldkxhYmVsLmdyaWR5ID0gMTsKLQkJCQljb25zdHJhaW50c0Fib3V0RGV2TGFiZWwuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMOwotCQkJCWNvbnN0cmFpbnRzQWJvdXREZXZMYWJlbC53ZWlnaHR4ID0gMS4wOwotCQkJCWNvbnN0cmFpbnRzQWJvdXREZXZMYWJlbC5pbnNldHMgPSBuZXcgSW5zZXRzKDQsIDAsIDAsIDApOwotCQkJCWdldEFib3V0SW5mb1BhbmVsKCkuYWRkKGdldEFib3V0RGV2TGFiZWwoKSwgY29uc3RyYWludHNBYm91dERldkxhYmVsKTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0Fib3V0Q29udGFjdExhYmVsID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQkJCWNvbnN0cmFpbnRzQWJvdXRDb250YWN0TGFiZWwuZ3JpZHggPSAwOyBjb25zdHJhaW50c0Fib3V0Q29udGFjdExhYmVsLmdyaWR5ID0gMjsKLQkJCQljb25zdHJhaW50c0Fib3V0Q29udGFjdExhYmVsLmZpbGwgPSBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTDsKLQkJCQljb25zdHJhaW50c0Fib3V0Q29udGFjdExhYmVsLndlaWdodHggPSAxLjA7Ci0JCQkJY29uc3RyYWludHNBYm91dENvbnRhY3RMYWJlbC5pbnNldHMgPSBuZXcgSW5zZXRzKDIsIDAsIDQsIDApOwotCQkJCWdldEFib3V0SW5mb1BhbmVsKCkuYWRkKGdldEFib3V0Q29udGFjdExhYmVsKCksIGNvbnN0cmFpbnRzQWJvdXRDb250YWN0TGFiZWwpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlBYm91dEluZm9QYW5lbDsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBBYm91dE1lbnVJdGVtIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuTWVudUl0ZW0KLQkgKi8KLQlwcml2YXRlIE1lbnVJdGVtIGdldEFib3V0TWVudUl0ZW0oKSB7Ci0JCWlmIChpQWJvdXRNZW51SXRlbSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlBYm91dE1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKCk7Ci0JCQkJaUFib3V0TWVudUl0ZW0uc2V0TGFiZWwoIkFib3V0Li4uIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaUFib3V0TWVudUl0ZW07Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgQWJvdXRPa0J1dHRvbiBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LkJ1dHRvbgotCSAqLwotCXByaXZhdGUgQnV0dG9uIGdldEFib3V0T2tCdXR0b24oKSB7Ci0JCWlmIChpQWJvdXRPa0J1dHRvbiA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlBYm91dE9rQnV0dG9uID0gbmV3IEJ1dHRvbigpOwotCQkJCWlBYm91dE9rQnV0dG9uLnNldE5hbWUoIkFib3V0T2tCdXR0b24iKTsKLQkJCQlpQWJvdXRPa0J1dHRvbi5zZXRMYWJlbCgiT0siKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpQWJvdXRPa0J1dHRvbjsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBBYm91dFRpdGxlTGFiZWwgcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5MYWJlbAotCSAqLwotCXByaXZhdGUgTGFiZWwgZ2V0QWJvdXRUaXRsZUxhYmVsKCkgewotCQlpZiAoaUFib3V0VGl0bGVMYWJlbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlBYm91dFRpdGxlTGFiZWwgPSBuZXcgTGFiZWwoKTsKLQkJCQlpQWJvdXRUaXRsZUxhYmVsLnNldE5hbWUoIkFib3V0VGl0bGVMYWJlbCIpOwotCQkJCWlBYm91dFRpdGxlTGFiZWwuc2V0Rm9udChuZXcgRm9udCgiQXJpYWwiLCAxLCAxMikpOwotCQkJCWlBYm91dFRpdGxlTGFiZWwuc2V0QWxpZ25tZW50KExhYmVsLkNFTlRFUik7Ci0JCQkJaUFib3V0VGl0bGVMYWJlbC5zZXRUZXh0KCJBbnQgVmlzdWFsQWdlIGZvciBKYXZhIFRvb2wtSW50ZWdyYXRpb24iKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpQWJvdXRUaXRsZUxhYmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEFudE1ha2VNZW51QmFyIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuTWVudUJhcgotCSAqLwotCXByaXZhdGUgTWVudUJhciBnZXRBbnRNYWtlTWVudUJhcigpIHsKLQkJaWYgKGlBbnRNYWtlTWVudUJhciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlBbnRNYWtlTWVudUJhciA9IG5ldyBNZW51QmFyKCk7Ci0JCQkJaUFudE1ha2VNZW51QmFyLmFkZChnZXRGaWxlTWVudSgpKTsKLQkJCQlpQW50TWFrZU1lbnVCYXIuYWRkKGdldEhlbHBNZW51KCkpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlBbnRNYWtlTWVudUJhcjsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBCcm93c2VCdXR0b24gcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBCdXR0b24KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBnZXRCcm93c2VCdXR0b24oKSB7Ci0JCWlmIChpQnJvd3NlQnV0dG9uID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaUJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oKTsKLQkJCQlpQnJvd3NlQnV0dG9uLnNldE5hbWUoIkJyb3dzZUJ1dHRvbiIpOwotCQkJCWlCcm93c2VCdXR0b24uc2V0TGFiZWwoIi4uLiIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlCcm93c2VCdXR0b247Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgQnVpbGRCdXR0b24gcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5CdXR0b24KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBnZXRCdWlsZEJ1dHRvbigpIHsKLQkJaWYgKGlCdWlsZEJ1dHRvbiA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlCdWlsZEJ1dHRvbiA9IG5ldyBCdXR0b24oKTsKLQkJCQlpQnVpbGRCdXR0b24uc2V0TmFtZSgiQnVpbGRCdXR0b24iKTsKLQkJCQlpQnVpbGRCdXR0b24uc2V0TGFiZWwoIkJ1aWxkIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaUJ1aWxkQnV0dG9uOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEJ1aWxkRmlsZUxhYmVsIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuTGFiZWwKLQkgKi8KLQlwcml2YXRlIExhYmVsIGdldEJ1aWxkRmlsZUxhYmVsKCkgewotCQlpZiAoaUJ1aWxkRmlsZUxhYmVsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaUJ1aWxkRmlsZUxhYmVsID0gbmV3IExhYmVsKCk7Ci0JCQkJaUJ1aWxkRmlsZUxhYmVsLnNldE5hbWUoIkJ1aWxkRmlsZUxhYmVsIik7Ci0JCQkJaUJ1aWxkRmlsZUxhYmVsLnNldFRleHQoIkFudC1CdWlsZGZpbGU6Iik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaUJ1aWxkRmlsZUxhYmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEJ1aWxkRmlsZVRleHRGaWVsZCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LlRleHRGaWVsZAotCSAqLwotCXByaXZhdGUgVGV4dEZpZWxkIGdldEJ1aWxkRmlsZVRleHRGaWVsZCgpIHsKLQkJaWYgKGlCdWlsZEZpbGVUZXh0RmllbGQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpQnVpbGRGaWxlVGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZCgpOwotCQkJCWlCdWlsZEZpbGVUZXh0RmllbGQuc2V0TmFtZSgiQnVpbGRGaWxlVGV4dEZpZWxkIik7Ci0JCQkJaUJ1aWxkRmlsZVRleHRGaWVsZC5zZXRCYWNrZ3JvdW5kKFN5c3RlbUNvbG9yLnRleHRIaWdobGlnaHRUZXh0KTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpQnVpbGRGaWxlVGV4dEZpZWxkOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEJ1aWxkSW5mbyBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmlkZS5WQUpCdWlsZEluZm8KLQkgKi8KLQlwcml2YXRlIFZBSkJ1aWxkSW5mbyBnZXRCdWlsZEluZm8oKSB7Ci0JCXJldHVybiBpQnVpbGRJbmZvOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENsb3NlQnV0dG9uIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuQnV0dG9uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gZ2V0Q2xvc2VCdXR0b24oKSB7Ci0JCWlmIChpQ2xvc2VCdXR0b24gPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpQ2xvc2VCdXR0b24gPSBuZXcgQnV0dG9uKCk7Ci0JCQkJaUNsb3NlQnV0dG9uLnNldE5hbWUoIkNsb3NlQnV0dG9uIik7Ci0JCQkJaUNsb3NlQnV0dG9uLnNldExhYmVsKCJDbG9zZSIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlDbG9zZUJ1dHRvbjsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBDb21tYW5kQnV0dG9uUGFuZWwgcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5QYW5lbAotCSAqLwotCXByaXZhdGUgUGFuZWwgZ2V0Q29tbWFuZEJ1dHRvblBhbmVsKCkgewotCQlpZiAoaUNvbW1hbmRCdXR0b25QYW5lbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlDb21tYW5kQnV0dG9uUGFuZWwgPSBuZXcgUGFuZWwoKTsKLQkJCQlpQ29tbWFuZEJ1dHRvblBhbmVsLnNldE5hbWUoIkNvbW1hbmRCdXR0b25QYW5lbCIpOwotCQkJCWlDb21tYW5kQnV0dG9uUGFuZWwuc2V0TGF5b3V0KGdldENvbW1hbmRCdXR0b25QYW5lbEZsb3dMYXlvdXQoKSk7Ci0JCQkJaUNvbW1hbmRCdXR0b25QYW5lbC5zZXRCYWNrZ3JvdW5kKFN5c3RlbUNvbG9yLmNvbnRyb2wpOwotCQkJCWlDb21tYW5kQnV0dG9uUGFuZWwuYWRkKGdldFJlbG9hZEJ1dHRvbigpKTsKLQkJCQlnZXRDb21tYW5kQnV0dG9uUGFuZWwoKS5hZGQoZ2V0QnVpbGRCdXR0b24oKSwgZ2V0QnVpbGRCdXR0b24oKS5nZXROYW1lKCkpOwotCQkJCWdldENvbW1hbmRCdXR0b25QYW5lbCgpLmFkZChnZXRDbG9zZUJ1dHRvbigpLCBnZXRDbG9zZUJ1dHRvbigpLmdldE5hbWUoKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaUNvbW1hbmRCdXR0b25QYW5lbDsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBDb21tYW5kQnV0dG9uUGFuZWxGbG93TGF5b3V0IHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuRmxvd0xheW91dAotCSAqLwotCXByaXZhdGUgRmxvd0xheW91dCBnZXRDb21tYW5kQnV0dG9uUGFuZWxGbG93TGF5b3V0KCkgewotCQlGbG93TGF5b3V0IGlDb21tYW5kQnV0dG9uUGFuZWxGbG93TGF5b3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8qIENyZWF0ZSBwYXJ0ICovCi0JCQlpQ29tbWFuZEJ1dHRvblBhbmVsRmxvd0xheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCQlpQ29tbWFuZEJ1dHRvblBhbmVsRmxvd0xheW91dC5zZXRBbGlnbm1lbnQoRmxvd0xheW91dC5SSUdIVCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCX07Ci0JCXJldHVybiBpQ29tbWFuZEJ1dHRvblBhbmVsRmxvd0xheW91dDsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBDb250ZW50c1BhbmUgcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5QYW5lbAotCSAqLwotCXByaXZhdGUgUGFuZWwgZ2V0Q29udGVudHNQYW5lKCkgewotCQlpZiAoaUNvbnRlbnRzUGFuZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlDb250ZW50c1BhbmUgPSBuZXcgUGFuZWwoKTsKLQkJCQlpQ29udGVudHNQYW5lLnNldE5hbWUoIkNvbnRlbnRzUGFuZSIpOwotCQkJCWlDb250ZW50c1BhbmUuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCQkJZ2V0Q29udGVudHNQYW5lKCkuYWRkKGdldENvbW1hbmRCdXR0b25QYW5lbCgpLCAiU291dGgiKTsKLQkJCQlnZXRDb250ZW50c1BhbmUoKS5hZGQoZ2V0T3B0aW9uZW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaUNvbnRlbnRzUGFuZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBGaWxlRGlhbG9nIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuRmlsZURpYWxvZwotCSAqLwotCXByaXZhdGUgRmlsZURpYWxvZyBnZXRGaWxlRGlhbG9nKCkgewotCQlpZiAoaUZpbGVEaWFsb2cgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpRmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHRoaXMpOwotCQkJCWlGaWxlRGlhbG9nLnNldE5hbWUoIkZpbGVEaWFsb2ciKTsKLQkJCQlpRmlsZURpYWxvZy5zZXRMYXlvdXQobnVsbCk7Ci0JCQkJY2VudGVyRGlhbG9nKGlGaWxlRGlhbG9nKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpRmlsZURpYWxvZzsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBGaWxlTWVudSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0Lk1lbnUKLQkgKi8KLQlwcml2YXRlIE1lbnUgZ2V0RmlsZU1lbnUoKSB7Ci0JCWlmIChpRmlsZU1lbnUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpRmlsZU1lbnUgPSBuZXcgTWVudSgpOwotCQkJCWlGaWxlTWVudS5zZXRMYWJlbCgiRmlsZSIpOwotCQkJCWlGaWxlTWVudS5hZGQoZ2V0U2F2ZU1lbnVJdGVtKCkpOwotCQkJCWlGaWxlTWVudS5hZGQoZ2V0TWVudVNlcGFyYXRvcigpKTsKLQkJCQlpRmlsZU1lbnUuYWRkKGdldFNob3dMb2dNZW51SXRlbSgpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpRmlsZU1lbnU7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgSGVscE1lbnUgcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5NZW51Ci0JICovCi0JcHJpdmF0ZSBNZW51IGdldEhlbHBNZW51KCkgewotCQlpZiAoaUhlbHBNZW51ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaUhlbHBNZW51ID0gbmV3IE1lbnUoKTsKLQkJCQlpSGVscE1lbnUuc2V0TGFiZWwoIkhlbHAiKTsKLQkJCQlpSGVscE1lbnUuYWRkKGdldEFib3V0TWVudUl0ZW0oKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaUhlbHBNZW51OwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE1lbnVTZXBhcmF0b3IxIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuTWVudUl0ZW0KLQkgKi8KLQlwcml2YXRlIE1lbnVJdGVtIGdldE1lbnVTZXBhcmF0b3IoKSB7Ci0JCWlmIChpTWVudVNlcGFyYXRvciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlNZW51U2VwYXJhdG9yID0gbmV3IE1lbnVJdGVtKCk7Ci0JCQkJaU1lbnVTZXBhcmF0b3Iuc2V0TGFiZWwoIi0iKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpTWVudVNlcGFyYXRvcjsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBNZXNzYWdlQ2xlYXJMb2dCdXR0b24gcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5CdXR0b24KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBnZXRNZXNzYWdlQ2xlYXJMb2dCdXR0b24oKSB7Ci0JCWlmIChpTWVzc2FnZUNsZWFyTG9nQnV0dG9uID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaU1lc3NhZ2VDbGVhckxvZ0J1dHRvbiA9IG5ldyBCdXR0b24oKTsKLQkJCQlpTWVzc2FnZUNsZWFyTG9nQnV0dG9uLnNldE5hbWUoIk1lc3NhZ2VDbGVhckxvZ0J1dHRvbiIpOwotCQkJCWlNZXNzYWdlQ2xlYXJMb2dCdXR0b24uc2V0TGFiZWwoIkNsZWFyIExvZyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlNZXNzYWdlQ2xlYXJMb2dCdXR0b247Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgTWVzc2FnZUNvbW1hbmRQYW5lbCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LlBhbmVsCi0JICovCi0JcHJpdmF0ZSBQYW5lbCBnZXRNZXNzYWdlQ29tbWFuZFBhbmVsKCkgewotCQlpZiAoaU1lc3NhZ2VDb21tYW5kUGFuZWwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpTWVzc2FnZUNvbW1hbmRQYW5lbCA9IG5ldyBQYW5lbCgpOwotCQkJCWlNZXNzYWdlQ29tbWFuZFBhbmVsLnNldE5hbWUoIk1lc3NhZ2VDb21tYW5kUGFuZWwiKTsKLQkJCQlpTWVzc2FnZUNvbW1hbmRQYW5lbC5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoKSk7Ci0JCQkJZ2V0TWVzc2FnZUNvbW1hbmRQYW5lbCgpLmFkZChnZXRNZXNzYWdlQ2xlYXJMb2dCdXR0b24oKSwgZ2V0TWVzc2FnZUNsZWFyTG9nQnV0dG9uKCkuZ2V0TmFtZSgpKTsKLQkJCQlnZXRNZXNzYWdlQ29tbWFuZFBhbmVsKCkuYWRkKGdldE1lc3NhZ2VPa0J1dHRvbigpLCBnZXRNZXNzYWdlT2tCdXR0b24oKS5nZXROYW1lKCkpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlNZXNzYWdlQ29tbWFuZFBhbmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE1lc3NhZ2VDb250ZW50UGFuZWwgcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5QYW5lbAotCSAqLwotCXByaXZhdGUgUGFuZWwgZ2V0TWVzc2FnZUNvbnRlbnRQYW5lbCgpIHsKLQkJaWYgKGlNZXNzYWdlQ29udGVudFBhbmVsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaU1lc3NhZ2VDb250ZW50UGFuZWwgPSBuZXcgUGFuZWwoKTsKLQkJCQlpTWVzc2FnZUNvbnRlbnRQYW5lbC5zZXROYW1lKCJNZXNzYWdlQ29udGVudFBhbmVsIik7Ci0JCQkJaU1lc3NhZ2VDb250ZW50UGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCQkJaU1lc3NhZ2VDb250ZW50UGFuZWwuc2V0QmFja2dyb3VuZChTeXN0ZW1Db2xvci5jb250cm9sKTsKLQkJCQlnZXRNZXNzYWdlQ29udGVudFBhbmVsKCkuYWRkKGdldE1lc3NhZ2VUZXh0QXJlYSgpLCAiQ2VudGVyIik7Ci0JCQkJZ2V0TWVzc2FnZUNvbnRlbnRQYW5lbCgpLmFkZChnZXRNZXNzYWdlQ29tbWFuZFBhbmVsKCksICJTb3V0aCIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlNZXNzYWdlQ29udGVudFBhbmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE1lc3NhZ2VGcmFtZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LkZyYW1lCi0JICovCi0JcHJpdmF0ZSBGcmFtZSBnZXRNZXNzYWdlRnJhbWUoKSB7Ci0JCWlmIChpTWVzc2FnZUZyYW1lID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaU1lc3NhZ2VGcmFtZSA9IG5ldyBGcmFtZSgpOwotCQkJCWlNZXNzYWdlRnJhbWUuc2V0TmFtZSgiTWVzc2FnZUZyYW1lIik7Ci0JCQkJaU1lc3NhZ2VGcmFtZS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQkJCQlpTWVzc2FnZUZyYW1lLnNldEJvdW5kcygwLCAwLCA3NTAsIDI1MCk7Ci0JCQkJaU1lc3NhZ2VGcmFtZS5zZXRUaXRsZSgiTWVzc2FnZSBMb2ciKTsKLQkJCQlpTWVzc2FnZUZyYW1lLmFkZChnZXRNZXNzYWdlQ29udGVudFBhbmVsKCksICJDZW50ZXIiKTsKLQkJCQlpTWVzc2FnZUZyYW1lLnNldExvY2F0aW9uKChUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpLndpZHRoIC8gMikgLSAoaU1lc3NhZ2VGcmFtZS5nZXRTaXplKCkud2lkdGggLyAyKSwgKGphdmEuYXd0LlRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTY3JlZW5TaXplKCkuaGVpZ2h0IC8gMikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlNZXNzYWdlRnJhbWU7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgTWVzc2FnZU9rQnV0dG9uIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuQnV0dG9uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gZ2V0TWVzc2FnZU9rQnV0dG9uKCkgewotCQlpZiAoaU1lc3NhZ2VPa0J1dHRvbiA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlNZXNzYWdlT2tCdXR0b24gPSBuZXcgQnV0dG9uKCk7Ci0JCQkJaU1lc3NhZ2VPa0J1dHRvbi5zZXROYW1lKCJNZXNzYWdlT2tCdXR0b24iKTsKLQkJCQlpTWVzc2FnZU9rQnV0dG9uLnNldExhYmVsKCJDbG9zZSIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlNZXNzYWdlT2tCdXR0b247Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuQ2hvaWNlCi0JICovCi0JcHJpdmF0ZSBDaG9pY2UgZ2V0TWVzc2FnZU91dHB1dExldmVsQ2hvaWNlKCkgewotCQlpZiAoaU1lc3NhZ2VPdXRwdXRMZXZlbENob2ljZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlNZXNzYWdlT3V0cHV0TGV2ZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCk7Ci0JCQkJaU1lc3NhZ2VPdXRwdXRMZXZlbENob2ljZS5zZXROYW1lKCJNZXNzYWdlT3V0cHV0TGV2ZWxDaG9pY2UiKTsKLQkJCQlpTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlLmFkZCgiRXJyb3IiKTsKLQkJCQlpTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlLmFkZCgiV2FybmluZyIpOwotCQkJCWlNZXNzYWdlT3V0cHV0TGV2ZWxDaG9pY2UuYWRkKCJJbmZvIik7Ci0JCQkJaU1lc3NhZ2VPdXRwdXRMZXZlbENob2ljZS5hZGQoIlZlcmJvc2UiKTsKLQkJCQlpTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlLmFkZCgiRGVidWciKTsKLQkJCQlpTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlLnNlbGVjdCgyKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuTGFiZWwKLQkgKi8KLQlwcml2YXRlIExhYmVsIGdldE1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsKCkgewotCQlpZiAoaU1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaU1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsID0gbmV3IExhYmVsKCk7Ci0JCQkJaU1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsLnNldE5hbWUoIk1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsIik7Ci0JCQkJaU1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsLnNldFRleHQoIk1lc3NhZ2UgTGV2ZWw6Iik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaU1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE1lc3NhZ2VUZXh0QXJlYSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LlRleHRBcmVhCi0JICovCi0JcHJpdmF0ZSBUZXh0QXJlYSBnZXRNZXNzYWdlVGV4dEFyZWEoKSB7Ci0JCWlmIChpTWVzc2FnZVRleHRBcmVhID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaU1lc3NhZ2VUZXh0QXJlYSA9IG5ldyBUZXh0QXJlYSgpOwotCQkJCWlNZXNzYWdlVGV4dEFyZWEuc2V0TmFtZSgiTWVzc2FnZVRleHRBcmVhIik7Ci0JCQkJaU1lc3NhZ2VUZXh0QXJlYS5zZXRGb250KG5ldyBGb250KCJtb25vc3BhY2VkIiwgMCwgMTIpKTsKLQkJCQlpTWVzc2FnZVRleHRBcmVhLnNldFRleHQoIiIpOwotCQkJCWlNZXNzYWdlVGV4dEFyZWEuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJCWlNZXNzYWdlVGV4dEFyZWEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpTWVzc2FnZVRleHRBcmVhOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFBhbmVsMSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LlBhbmVsCi0JICovCi0JcHJpdmF0ZSBQYW5lbCBnZXRPcHRpb25lblBhbmVsKCkgewotCQlpZiAoaU9wdGlvbmVuUGFuZWwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpT3B0aW9uZW5QYW5lbCA9IG5ldyBQYW5lbCgpOwotCQkJCWlPcHRpb25lblBhbmVsLnNldE5hbWUoIk9wdGlvbmVuUGFuZWwiKTsKLQkJCQlpT3B0aW9uZW5QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0JCQkJaU9wdGlvbmVuUGFuZWwuc2V0QmFja2dyb3VuZChTeXN0ZW1Db2xvci5jb250cm9sKTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c1Byb2plY3RMYWJlbCA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJCQljb25zdHJhaW50c1Byb2plY3RMYWJlbC5ncmlkeCA9IDA7IGNvbnN0cmFpbnRzUHJvamVjdExhYmVsLmdyaWR5ID0gMDsKLQkJCQljb25zdHJhaW50c1Byb2plY3RMYWJlbC5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuV0VTVDsKLQkJCQljb25zdHJhaW50c1Byb2plY3RMYWJlbC5pbnNldHMgPSBuZXcgSW5zZXRzKDQsIDQsIDQsIDQpOwotCQkJCWdldE9wdGlvbmVuUGFuZWwoKS5hZGQoZ2V0UHJvamVjdExhYmVsKCksIGNvbnN0cmFpbnRzUHJvamVjdExhYmVsKTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0J1aWxkRmlsZUxhYmVsID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQkJCWNvbnN0cmFpbnRzQnVpbGRGaWxlTGFiZWwuZ3JpZHggPSAwOyBjb25zdHJhaW50c0J1aWxkRmlsZUxhYmVsLmdyaWR5ID0gMTsKLQkJCQljb25zdHJhaW50c0J1aWxkRmlsZUxhYmVsLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5XRVNUOwotCQkJCWNvbnN0cmFpbnRzQnVpbGRGaWxlTGFiZWwuaW5zZXRzID0gbmV3IEluc2V0cyg0LCA0LCA0LCA0KTsKLQkJCQlnZXRPcHRpb25lblBhbmVsKCkuYWRkKGdldEJ1aWxkRmlsZUxhYmVsKCksIGNvbnN0cmFpbnRzQnVpbGRGaWxlTGFiZWwpOwotCi0JCQkJR3JpZEJhZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzVGFyZ2V0TGFiZWwgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0JCQkJY29uc3RyYWludHNUYXJnZXRMYWJlbC5ncmlkeCA9IDA7IGNvbnN0cmFpbnRzVGFyZ2V0TGFiZWwuZ3JpZHkgPSAyOwotCQkJCWNvbnN0cmFpbnRzVGFyZ2V0TGFiZWwuYW5jaG9yID0gR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVDsKLQkJCQljb25zdHJhaW50c1RhcmdldExhYmVsLmluc2V0cyA9IG5ldyBJbnNldHMoNCwgNCwgNCwgNCk7Ci0JCQkJZ2V0T3B0aW9uZW5QYW5lbCgpLmFkZChnZXRUYXJnZXRMYWJlbCgpLCBjb25zdHJhaW50c1RhcmdldExhYmVsKTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c1Byb2plY3RUZXh0ID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQkJCWNvbnN0cmFpbnRzUHJvamVjdFRleHQuZ3JpZHggPSAxOyBjb25zdHJhaW50c1Byb2plY3RUZXh0LmdyaWR5ID0gMDsKLQkJCQljb25zdHJhaW50c1Byb2plY3RUZXh0LmdyaWR3aWR0aCA9IDI7Ci0JCQkJY29uc3RyYWludHNQcm9qZWN0VGV4dC5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7Ci0JCQkJY29uc3RyYWludHNQcm9qZWN0VGV4dC5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuV0VTVDsKLQkJCQljb25zdHJhaW50c1Byb2plY3RUZXh0Lmluc2V0cyA9IG5ldyBJbnNldHMoNCwgNCwgNCwgNCk7Ci0JCQkJZ2V0T3B0aW9uZW5QYW5lbCgpLmFkZChnZXRQcm9qZWN0VGV4dCgpLCBjb25zdHJhaW50c1Byb2plY3RUZXh0KTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0J1aWxkRmlsZVRleHRGaWVsZCA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJCQljb25zdHJhaW50c0J1aWxkRmlsZVRleHRGaWVsZC5ncmlkeCA9IDE7IGNvbnN0cmFpbnRzQnVpbGRGaWxlVGV4dEZpZWxkLmdyaWR5ID0gMTsKLQkJCQljb25zdHJhaW50c0J1aWxkRmlsZVRleHRGaWVsZC5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7Ci0JCQkJY29uc3RyYWludHNCdWlsZEZpbGVUZXh0RmllbGQuYW5jaG9yID0gR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1Q7Ci0JCQkJY29uc3RyYWludHNCdWlsZEZpbGVUZXh0RmllbGQud2VpZ2h0eCA9IDEuMDsKLQkJCQljb25zdHJhaW50c0J1aWxkRmlsZVRleHRGaWVsZC5pbnNldHMgPSBuZXcgSW5zZXRzKDQsIDQsIDQsIDQpOwotCQkJCWdldE9wdGlvbmVuUGFuZWwoKS5hZGQoZ2V0QnVpbGRGaWxlVGV4dEZpZWxkKCksIGNvbnN0cmFpbnRzQnVpbGRGaWxlVGV4dEZpZWxkKTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0Jyb3dzZUJ1dHRvbiA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJCQljb25zdHJhaW50c0Jyb3dzZUJ1dHRvbi5ncmlkeCA9IDI7IGNvbnN0cmFpbnRzQnJvd3NlQnV0dG9uLmdyaWR5ID0gMTsKLQkJCQljb25zdHJhaW50c0Jyb3dzZUJ1dHRvbi5pbnNldHMgPSBuZXcgSW5zZXRzKDQsIDQsIDQsIDQpOwotCQkJCWdldE9wdGlvbmVuUGFuZWwoKS5hZGQoZ2V0QnJvd3NlQnV0dG9uKCksIGNvbnN0cmFpbnRzQnJvd3NlQnV0dG9uKTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c1RhcmdldExpc3QgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0JCQkJY29uc3RyYWludHNUYXJnZXRMaXN0LmdyaWR4ID0gMTsgY29uc3RyYWludHNUYXJnZXRMaXN0LmdyaWR5ID0gMjsKLQkJCQljb25zdHJhaW50c1RhcmdldExpc3QuZ3JpZGhlaWdodCA9IDI7Ci0JCQkJY29uc3RyYWludHNUYXJnZXRMaXN0LmZpbGwgPSBHcmlkQmFnQ29uc3RyYWludHMuQk9USDsKLQkJCQljb25zdHJhaW50c1RhcmdldExpc3Qud2VpZ2h0eCA9IDEuMDsKLQkJCQljb25zdHJhaW50c1RhcmdldExpc3Qud2VpZ2h0eSA9IDEuMDsKLQkJCQljb25zdHJhaW50c1RhcmdldExpc3QuaW5zZXRzID0gbmV3IEluc2V0cyg0LCA0LCA0LCA0KTsKLQkJCQlnZXRPcHRpb25lblBhbmVsKCkuYWRkKGdldFRhcmdldExpc3QoKSwgY29uc3RyYWludHNUYXJnZXRMaXN0KTsKLQotCQkJCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c01lc3NhZ2VPdXRwdXRMZXZlbExhYmVsID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQkJCWNvbnN0cmFpbnRzTWVzc2FnZU91dHB1dExldmVsTGFiZWwuZ3JpZHggPSAwOyBjb25zdHJhaW50c01lc3NhZ2VPdXRwdXRMZXZlbExhYmVsLmdyaWR5ID0gNDsKLQkJCQljb25zdHJhaW50c01lc3NhZ2VPdXRwdXRMZXZlbExhYmVsLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5XRVNUOwotCQkJCWNvbnN0cmFpbnRzTWVzc2FnZU91dHB1dExldmVsTGFiZWwuaW5zZXRzID0gbmV3IEluc2V0cyg0LCA0LCA0LCA0KTsKLQkJCQlnZXRPcHRpb25lblBhbmVsKCkuYWRkKGdldE1lc3NhZ2VPdXRwdXRMZXZlbExhYmVsKCksIGNvbnN0cmFpbnRzTWVzc2FnZU91dHB1dExldmVsTGFiZWwpOwotCi0JCQkJR3JpZEJhZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQkJCWNvbnN0cmFpbnRzTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlLmdyaWR4ID0gMTsgY29uc3RyYWludHNNZXNzYWdlT3V0cHV0TGV2ZWxDaG9pY2UuZ3JpZHkgPSA0OwotCQkJCWNvbnN0cmFpbnRzTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlLmZpbGwgPSBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTDsKLQkJCQljb25zdHJhaW50c01lc3NhZ2VPdXRwdXRMZXZlbENob2ljZS5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuV0VTVDsKLQkJCQljb25zdHJhaW50c01lc3NhZ2VPdXRwdXRMZXZlbENob2ljZS53ZWlnaHR4ID0gMS4wOwotCQkJCWNvbnN0cmFpbnRzTWVzc2FnZU91dHB1dExldmVsQ2hvaWNlLmluc2V0cyA9IG5ldyBJbnNldHMoNCwgNCwgNCwgNCk7Ci0JCQkJZ2V0T3B0aW9uZW5QYW5lbCgpLmFkZChnZXRNZXNzYWdlT3V0cHV0TGV2ZWxDaG9pY2UoKSwgY29uc3RyYWludHNNZXNzYWdlT3V0cHV0TGV2ZWxDaG9pY2UpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlPcHRpb25lblBhbmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFByb2plY3RMYWJlbCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LkxhYmVsCi0JICovCi0JcHJpdmF0ZSBMYWJlbCBnZXRQcm9qZWN0TGFiZWwoKSB7Ci0JCWlmIChpUHJvamVjdExhYmVsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaVByb2plY3RMYWJlbCA9IG5ldyBMYWJlbCgpOwotCQkJCWlQcm9qZWN0TGFiZWwuc2V0TmFtZSgiUHJvamVjdExhYmVsIik7Ci0JCQkJaVByb2plY3RMYWJlbC5zZXRUZXh0KCJQcm9qZWN0bmFtZToiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpUHJvamVjdExhYmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFByb2plY3RUZXh0IHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuTGFiZWwKLQkgKi8KLQlwcml2YXRlIExhYmVsIGdldFByb2plY3RUZXh0KCkgewotCQlpZiAoaVByb2plY3RUZXh0ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaVByb2plY3RUZXh0ID0gbmV3IExhYmVsKCk7Ci0JCQkJaVByb2plY3RUZXh0LnNldE5hbWUoIlByb2plY3RUZXh0Iik7Ci0JCQkJaVByb2plY3RUZXh0LnNldFRleHQoIiAiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpUHJvamVjdFRleHQ7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVsb2FkQnV0dG9uIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuQnV0dG9uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gZ2V0UmVsb2FkQnV0dG9uKCkgewotCQlpZiAoaVJlbG9hZEJ1dHRvbiA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlSZWxvYWRCdXR0b24gPSBuZXcgQnV0dG9uKCk7Ci0JCQkJaVJlbG9hZEJ1dHRvbi5zZXROYW1lKCJSZWxvYWRCdXR0b24iKTsKLQkJCQlpUmVsb2FkQnV0dG9uLnNldExhYmVsKCIoUmUpTG9hZCIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlSZWxvYWRCdXR0b247Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgU2F2ZU1lbnVJdGVtIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuTWVudUl0ZW0KLQkgKi8KLQlwcml2YXRlIE1lbnVJdGVtIGdldFNhdmVNZW51SXRlbSgpIHsKLQkJaWYgKGlTYXZlTWVudUl0ZW0gPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpU2F2ZU1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKCk7Ci0JCQkJaVNhdmVNZW51SXRlbS5zZXRMYWJlbCgiU2F2ZSBCdWlsZEluZm8gVG8gUmVwb3NpdG9yeSIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oaUV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlTYXZlTWVudUl0ZW07Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgU2hvd0xvZ01lbnVJdGVtIHByb3BlcnR5IHZhbHVlLgotCSAqIEByZXR1cm4gamF2YS5hd3QuTWVudUl0ZW0KLQkgKi8KLQlwcml2YXRlIE1lbnVJdGVtIGdldFNob3dMb2dNZW51SXRlbSgpIHsKLQkJaWYgKGlTaG93TG9nTWVudUl0ZW0gPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpU2hvd0xvZ01lbnVJdGVtID0gbmV3IE1lbnVJdGVtKCk7Ci0JCQkJaVNob3dMb2dNZW51SXRlbS5zZXRMYWJlbCgiTG9nIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaVNob3dMb2dNZW51SXRlbTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBUYXJnZXRMYWJlbCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEuYXd0LkxhYmVsCi0JICovCi0JcHJpdmF0ZSBMYWJlbCBnZXRUYXJnZXRMYWJlbCgpIHsKLQkJaWYgKGlUYXJnZXRMYWJlbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlUYXJnZXRMYWJlbCA9IG5ldyBMYWJlbCgpOwotCQkJCWlUYXJnZXRMYWJlbC5zZXROYW1lKCJUYXJnZXRMYWJlbCIpOwotCQkJCWlUYXJnZXRMYWJlbC5zZXRUZXh0KCJUYXJnZXQ6Iik7Ci0JCQkJaVRhcmdldExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaVRhcmdldExhYmVsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFRhcmdldExpc3QgcHJvcGVydHkgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmF3dC5MaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFRhcmdldExpc3QoKSB7Ci0JCWlmIChpVGFyZ2V0TGlzdCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlUYXJnZXRMaXN0ID0gbmV3IExpc3QoKTsKLQkJCQlpVGFyZ2V0TGlzdC5zZXROYW1lKCJUYXJnZXRMaXN0Iik7Ci0JCQkJaVRhcmdldExpc3Quc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBpRXhjKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKGlFeGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpVGFyZ2V0TGlzdDsKLQl9Ci0JLyoqCi0JICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBwYXJ0IHRocm93cyBhbiBleGNlcHRpb24uCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBUaHJvd2FibGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJLy8gV3JpdGUgZXhjZXB0aW9ucyB0byB0aGUgbG9nLXdpbmRvdwotCQlnZXRNZXNzYWdlVGV4dEFyZWEoKS5hcHBlbmQobGluZVNlcGFyYXRvciArIGxpbmVTZXBhcmF0b3IgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJZ2V0TWVzc2FnZUZyYW1lKCkuc2hvdygpOwotCQkKLQl9Ci0JLyoqCi0JICogSW5pdGlhbGl6ZXMgY29ubmVjdGlvbnMKLQkgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0Q29ubmVjdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5hZGRXaW5kb3dMaXN0ZW5lcihpRXZlbnRIYW5kbGVyKTsKLQkJZ2V0QnJvd3NlQnV0dG9uKCkuYWRkQWN0aW9uTGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCWdldENsb3NlQnV0dG9uKCkuYWRkQWN0aW9uTGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCWdldEJ1aWxkQnV0dG9uKCkuYWRkQWN0aW9uTGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCWdldFNhdmVNZW51SXRlbSgpLmFkZEFjdGlvbkxpc3RlbmVyKGlFdmVudEhhbmRsZXIpOwotCQlnZXRBYm91dE9rQnV0dG9uKCkuYWRkQWN0aW9uTGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCWdldEFib3V0TWVudUl0ZW0oKS5hZGRBY3Rpb25MaXN0ZW5lcihpRXZlbnRIYW5kbGVyKTsKLQkJZ2V0TWVzc2FnZU9rQnV0dG9uKCkuYWRkQWN0aW9uTGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCWdldE1lc3NhZ2VDbGVhckxvZ0J1dHRvbigpLmFkZEFjdGlvbkxpc3RlbmVyKGlFdmVudEhhbmRsZXIpOwotCQlnZXRNZXNzYWdlT2tCdXR0b24oKS5hZGRBY3Rpb25MaXN0ZW5lcihpRXZlbnRIYW5kbGVyKTsKLQkJZ2V0U2hvd0xvZ01lbnVJdGVtKCkuYWRkQWN0aW9uTGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCWdldEFib3V0RGlhbG9nKCkuYWRkV2luZG93TGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCWdldE1lc3NhZ2VGcmFtZSgpLmFkZFdpbmRvd0xpc3RlbmVyKGlFdmVudEhhbmRsZXIpOwotCQlnZXRSZWxvYWRCdXR0b24oKS5hZGRBY3Rpb25MaXN0ZW5lcihpRXZlbnRIYW5kbGVyKTsKLQkJZ2V0VGFyZ2V0TGlzdCgpLmFkZEl0ZW1MaXN0ZW5lcihpRXZlbnRIYW5kbGVyKTsKLQkJZ2V0TWVzc2FnZU91dHB1dExldmVsQ2hvaWNlKCkuYWRkSXRlbUxpc3RlbmVyKGlFdmVudEhhbmRsZXIpOwotCQlnZXRCdWlsZEZpbGVUZXh0RmllbGQoKS5hZGRUZXh0TGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCWNvbm5lY3RQcm9qZWN0TmFtZVRvTGFiZWwoKTsKLQkJY29ubmVjdEJ1aWxkRmlsZU5hbWVUb1RleHRGaWVsZCgpOwotCX0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdHJ5IHsKLQkJCXNldE5hbWUoIkFudE1ha2UiKTsKLQkJCXNldE1lbnVCYXIoZ2V0QW50TWFrZU1lbnVCYXIoKSk7Ci0JCQlzZXRMYXlvdXQobmV3IGphdmEuYXd0LkJvcmRlckxheW91dCgpKTsKLQkJCXNldFNpemUoMzg5LCAyMjIpOwotCQkJc2V0VGl0bGUoIkFudCBWaXN1YWxBZ2UgZm9yIEphdmEgVG9vbC1JbnRlZ3JhdGlvbiIpOwotCQkJYWRkKGdldENvbnRlbnRzUGFuZSgpLCAiQ2VudGVyIik7Ci0JCQlpbml0Q29ubmVjdGlvbnMoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGlFeGMpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJfQotCQlzZXRMb2NhdGlvbigoVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFNjcmVlblNpemUoKS53aWR0aCAvIDIpIC0gKGdldFNpemUoKS53aWR0aCAvIDIpLCAoamF2YS5hd3QuVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFNjcmVlblNpemUoKS5oZWlnaHQgLyAyKSAtIChnZXRTaXplKCkuaGVpZ2h0KSk7Ci0JCWlmICgoZ2V0VGFyZ2V0TGlzdCgpLmdldEl0ZW1Db3VudCgpID09IDApIHx8IChnZXRUYXJnZXRMaXN0KCkuZ2V0U2VsZWN0ZWRJbmRleCgpIDwgMCkpIHsKLQkJCWdldEJ1aWxkQnV0dG9uKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2F2ZXMgdGhlIGJ1aWxkLWluZm9ybWF0aW9ucyB0byByZXBvc2l0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVCdWlsZEluZm8oKSB7Ci0JCXRyeSB7Ci0JCQlWQUpBbnRUb29sLnNhdmVCdWlsZERhdGEoZ2V0QnVpbGRJbmZvKCkpOwotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkvLyBUaGlzIEV4Y2VwdGlvbiBvY2N1cnMgd2hlbiB5b3UgdHJ5IHRvIHdyaXRlIGludG8gYSB2ZXJzaW9uZWQgcHJvamVjdAotCQkJaGFuZGxlRXhjZXB0aW9uKCBleGMgKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgQnVpbGRJbmZvIHRvIGEgbmV3IHZhbHVlLgotCSAqIEBwYXJhbSBuZXdWYWx1ZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52YWouVkFKQnVpbGRJbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJ1aWxkSW5mbyhWQUpCdWlsZEluZm8gbmV3VmFsdWUpIHsKLQkJaWYgKGlCdWlsZEluZm8gIT0gbmV3VmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJLyogU3RvcCBsaXN0ZW5pbmcgZm9yIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG9iamVjdCAqLwotCQkJCWlmIChpQnVpbGRJbmZvICE9IG51bGwpIHsKLQkJCQkJaUJ1aWxkSW5mby5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGlFdmVudEhhbmRsZXIpOwotCQkJCX0KLQkJCQlpQnVpbGRJbmZvID0gbmV3VmFsdWU7Ci0KLQkJCQkvKiBMaXN0ZW4gZm9yIGV2ZW50cyBmcm9tIHRoZSBuZXcgb2JqZWN0ICovCi0JCQkJaWYgKGlCdWlsZEluZm8gIT0gbnVsbCkgewotCQkJCQlpQnVpbGRJbmZvLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaUV2ZW50SGFuZGxlcik7Ci0JCQkJfQotCQkJCWNvbm5lY3RQcm9qZWN0TmFtZVRvTGFiZWwoKTsKLQkJCQljb25uZWN0QnVpbGRGaWxlTmFtZVRvVGV4dEZpZWxkKCk7Ci0KLQkJCQkvLyBTZWxlY3QgdGhlIGxvZy1sZXZlbCBnaXZlbiBieSBCdWlsZEluZm8KLQkJCQlnZXRNZXNzYWdlT3V0cHV0TGV2ZWxDaG9pY2UoKS5zZWxlY3QoaUJ1aWxkSW5mby5nZXRPdXRwdXRNZXNzYWdlTGV2ZWwoKSk7Ci0JCQkJZmlsbExpc3QoKTsKLQkJCQkvLyBCdWlsZEluZm8gY2FuIGNvbmx5IGJlIHNhdmVkIHRvIGEgVkFKIHByb2plY3QgaWYgdG9vbCBBUEkgaXMgY2FsbGVkIHZpYSB0aGUgcHJvamVjdHMgY29udGV4dC1tZW51Ci0JCQkJaWYgKChpQnVpbGRJbmZvLmdldFZBSlByb2plY3ROYW1lKCkgPT0gbnVsbCkgfHwgKGlCdWlsZEluZm8uZ2V0VkFKUHJvamVjdE5hbWUoKS5lcXVhbHMoIiIpKSkgewotCQkJCQlnZXRTYXZlTWVudUl0ZW0oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgaUV4YykgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihpRXhjKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpCdWlsZEluZm8uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpCdWlsZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZTEwOC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvVkFKQnVpbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pZGU7Ci0KLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIlRvbWNhdCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdyYXBzIHRoZSBBbnQgcHJvamVjdCBpbmZvcm1hdGlvbiBuZWVkZWQgdG8KLSAqIHN0YXJ0IEFudCBmcm9tIFZpc3VhbCBBZ2UuCi0gKiBJdCBzZXJ2ZXMgdGhlIGZvbGxvd2luZyBwdXJwb3NlczoKLSAqIC0gYWN0cyBhcyBtb2RlbCBmb3IgQW50TWFrZUZyYW1lCi0gKiAtIGNvbnZlcnRzIGl0c2VsZiB0by9mcm9tIFN0cmluZyAodG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uCi0gKiAgIGFzIFRvb2xEYXRhIGluIHRoZSBWQSByZXBvc2l0b3J5KQotICogLSB3cmFwcyBQcm9qZWN0IGZ1bmN0aW9ucyBmb3IgdGhlIEdVSSAoZ2V0IHRhcmdldCBsaXN0LAotICogICBleGVjdXRlIHRhcmdldCkKLSAqICAgIAotICogQGF1dGhvciBXb2xmIFNpYmVyc2tpLCBUVUkgSW5mb3RlYyBHbWJICi0gKi8KLQotcHVibGljIGNsYXNzIFZBSkJ1aWxkSW5mbyB7Ci0JLy8gbmFtZSBvZiB0aGUgVkEgcHJvamVjdCB0aGlzIEJ1aWxkSW5mbyBiZWxvbmdzIHRvCi0JcHJpdmF0ZSBTdHJpbmcgdmFqUHJvamVjdE5hbWUgPSAiIjsKLQkKLQkJLy8gbmFtZSBvZiB0aGUgQW50IGJ1aWxkIGZpbGUKLQlwcml2YXRlIFN0cmluZyBidWlsZEZpbGVOYW1lID0gIiI7Ci0KLQkJLy8gbWFpbiB0YXJnZXRzIGZvdW5kIGluIHRoZSBidWlsZCBmaWxlCi0JcHJpdmF0ZSBWZWN0b3IgcHJvamVjdFRhcmdldHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJLy8gdGFyZ2V0IHNlbGVjdGVkIGZvciBleGVjdXRpb24KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdGFyZ2V0ID0gIiI7Ci0KLQkJLy8gbG9nIGxldmVsCi0JcHJpdmF0ZSBpbnQgb3V0cHV0TWVzc2FnZUxldmVsID0gUHJvamVjdC5NU0dfSU5GTzsKLQotCQkvLyBBbnQgUHJvamVjdCBjcmVhdGVkIGZyb20gYnVpbGQgZmlsZQotCXByaXZhdGUgdHJhbnNpZW50IFByb2plY3QgcHJvamVjdDsKLQotCQkvLyBpcyB0cnVlIGlmIFByb2plY3QgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwKLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIHByb2plY3RJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JCS8vIFN1cHBvcnQgZm9yIGJvdW5kIHByb3BlcnRpZXMKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHByb3BlcnR5Q2hhbmdlOwotLyoqCi0gKiBUaGUgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBtZXRob2Qgd2FzIGdlbmVyYXRlZCB0byBzdXBwb3J0IHRoZSBwcm9wZXJ0eUNoYW5nZSBmaWVsZC4KLSAqLwotcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JZ2V0UHJvcGVydHlDaGFuZ2UoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgQnVpbGRJbmZvIGluZm9ybWF0aW9uIGFzIFN0cmluZy4gVGhlIEJ1aWxkSW5mbyBjYW4KLSAqIGJlIHJlYnVpbHQgZnJvbSB0aGF0IFN0cmluZyBieSBjYWxsaW5nIHBhcnNlKCkuCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIFN0cmluZyBhc0RhdGFTdHJpbmcoKSB7Ci0JU3RyaW5nIHJlc3VsdCA9IGdldE91dHB1dE1lc3NhZ2VMZXZlbCgpICsgInwiICsgZ2V0QnVpbGRGaWxlTmFtZSgpICsgInwiICsgZ2V0VGFyZ2V0KCk7Ci0JZm9yICggRW51bWVyYXRpb24gZSA9IGdldFByb2plY3RUYXJnZXRzKCkuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCXJlc3VsdCA9IHJlc3VsdCArICJ8IiArIGUubmV4dEVsZW1lbnQoKTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBFeGVjdXRlcyB0aGUgdGFyZ2V0IHNldCBieSBzZXRUYXJnZXQoKS4KLSAqIEBwYXJhbSBsaXN0ZW5lciAgQnVpbGRMaXN0ZW5lciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgYnVpbGQKLSAqLwotcHVibGljIHZvaWQgZXhlY3V0ZVByb2plY3QoIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgKSB7Ci0JVGhyb3dhYmxlIGVycm9yID0gbnVsbDsKLQl0cnkgewotCQlpZiAoIWlzUHJvamVjdEluaXRpYWxpemVkKCkpIHsKLQkJCXByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotCQl9Ci0JCXByb2plY3QuYWRkQnVpbGRMaXN0ZW5lciggbGlzdGVuZXIgKTsKLQkJLy8gQ2hyaXM6IEhBQ0s6IHJlcGxhY2Ugd2hlbiBBbnQtUmVmYWN0b3JpbmcgaXMgZmluaXNoZWQhCi0vLwkJcHJvamVjdC5maXJlQnVpbGRTdGFydGVkKCk7Ci0JCWlmICghaXNQcm9qZWN0SW5pdGlhbGl6ZWQoKSkgewotCQkJaW5pdFByb2plY3QoKTsKLQkJfQotCQlwcm9qZWN0LmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKLQkJCi0JfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGMpIHsKLQkJZXJyb3IgPSBleGM7Ci0JCXRocm93IGV4YzsKLQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLQkJZXJyb3IgPSBlcnI7Ci0JCXRocm93IGVycjsKLQl9IGZpbmFsbHkgewotCQkvLyBDaHJpczogSEFDSzogcmVwbGFjZSB3aGVuIEFudC1SZWZhY3RvcmluZyBpcyBmaW5pc2hlZCEKLS8vCQlwcm9qZWN0LmZpcmVCdWlsZEZpbmlzaGVkKGVycm9yKTsKLQkJcHJvamVjdC5yZW1vdmVCdWlsZExpc3RlbmVyKCBsaXN0ZW5lciApOwotCX0KLX0KLQkvKioKLQkgKiBTZWFyY2ggZm9yIHRoZSBpbnNlcnQgcG9zaXRpb24gdG8ga2VlcCBuYW1lcyBhIHNvcnRlZCBsaXN0IG9mIFN0cmluZ3MKLQkgKiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRUYXJnZXRQb3NpdGlvbihWZWN0b3IgbmFtZXMsIFN0cmluZyBuYW1lKSB7Ci0JCWludCByZXMgPSBuYW1lcy5zaXplKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxuYW1lcy5zaXplKCkgJiYgcmVzID09IG5hbWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAobmFtZS5jb21wYXJlVG8oKFN0cmluZyluYW1lcy5lbGVtZW50QXQoaSkpIDwgMCkgewotCQkJCXJlcyA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0vKioKLSAqIFRoZSBmaXJlUHJvcGVydHlDaGFuZ2UgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgdG8gc3VwcG9ydCB0aGUgcHJvcGVydHlDaGFuZ2UgZmllbGQuCi0gKi8KLXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShqYXZhLmxhbmcuU3RyaW5nIHByb3BlcnR5TmFtZSwgamF2YS5sYW5nLk9iamVjdCBvbGRWYWx1ZSwgamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgewotCWdldFByb3BlcnR5Q2hhbmdlKCkuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgYnVpbGQgZmlsZSBuYW1lLgotICogQHJldHVybiBidWlsZCBmaWxlIG5hbWUuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QnVpbGRGaWxlTmFtZSgpIHsKLQlyZXR1cm4gYnVpbGRGaWxlTmFtZTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbG9nIGxldmVsCi0gKiBAcmV0dXJuIGxvZyBsZXZlbC4KLSAqLwotcHVibGljIGludCBnZXRPdXRwdXRNZXNzYWdlTGV2ZWwoKSB7Ci0JcmV0dXJuIG91dHB1dE1lc3NhZ2VMZXZlbDsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgQW50IHByb2plY3QKLSAqIEByZXR1cm4gb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdAotICovCi1wcml2YXRlIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQlyZXR1cm4gcHJvamVjdDsKLX0KLS8qKgotICogcmV0dXJuIGEgbGlzdCBvZiBhbGwgdGFyZ2V0cyBpbiB0aGUgY3VycmVudCBidWlsZGZpbGUKLSAqLwotcHVibGljIFZlY3RvciBnZXRQcm9qZWN0VGFyZ2V0cygpIHsKLQlyZXR1cm4gcHJvamVjdFRhcmdldHM7Ci19Ci0vKioKLSAqIEFjY2Vzc29yIGZvciB0aGUgcHJvcGVydHlDaGFuZ2UgZmllbGQuCi0gKi8KLXByb3RlY3RlZCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydCBnZXRQcm9wZXJ0eUNoYW5nZSgpIHsKLQlpZiAocHJvcGVydHlDaGFuZ2UgPT0gbnVsbCkgewotCQlwcm9wZXJ0eUNoYW5nZSA9IG5ldyBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9OwotCXJldHVybiBwcm9wZXJ0eUNoYW5nZTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDA3LjExLjIwMDAgMTA6MzQ6MTgpCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGFyZ2V0KCkgewotCXJldHVybiB0YXJnZXQ7Ci19Ci0vKioKLSAqIHJldHVybnMgdGhlIFZBIHByb2plY3QgbmFtZQotICogQHJldHVybiBUaGUgcHJvamVjdE5hbWUgcHJvcGVydHkgdmFsdWUuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VkFKUHJvamVjdE5hbWUoKSB7Ci0JcmV0dXJuIHZhalByb2plY3ROYW1lOwotfQotLyoqCi0gKiBJbml0aWFsaXplcyB0aGUgQW50IHByb2plY3QuIEFzc3VtZXMgdGhhdCB0aGUKLSAqIHByb2plY3QgYXR0cmlidXRlIGlzIGFscmVhZHkgc2V0LgotICovCi1wcml2YXRlIHZvaWQgaW5pdFByb2plY3QoKSB7Ci0JdHJ5IHsKLQkJcHJvamVjdC5pbml0KCk7Ci0JCUZpbGUgYnVpbGRGaWxlID0gbmV3IEZpbGUoZ2V0QnVpbGRGaWxlTmFtZSgpKTsKLQkJcHJvamVjdC5zZXRVc2VyUHJvcGVydHkoImFudC5maWxlIiwgYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJUHJvamVjdEhlbHBlci5jb25maWd1cmVQcm9qZWN0KHByb2plY3QsIGJ1aWxkRmlsZSk7Ci0JCXNldFByb2plY3RJbml0aWFsaXplZCh0cnVlKTsKLQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4YykgewotCQlzZXRQcm9qZWN0SW5pdGlhbGl6ZWQoZmFsc2UpOwotCQl0aHJvdyBleGM7Ci0JfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0JCXNldFByb2plY3RJbml0aWFsaXplZChmYWxzZSk7Ci0JCXRocm93IGVycjsKLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIEFudCBwcm9qZWN0IGlzIGluaXRpYWxpemVkCi0gKiAoaS5lLiBidWlsZGZpbGUgbG9hZGVkKQotICovCi1wdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RJbml0aWFsaXplZCgpIHsKLQlyZXR1cm4gcHJvamVjdEluaXRpYWxpemVkOwotfQotLyoqCi0gKiBDcmVhdGVzIGEgQnVpbGRJbmZvIG9iamVjdCBmcm9tIGEgU3RyaW5nCi0gKiBUaGUgU3RyaW5nIG11c3QgYmUgaW4gdGhlIGZvcm1hdAotICogb3V0cHV0TWVzc2FnZUxldmVsJ3wnYnVpbGRGaWxlTmFtZSd8J2RlZmF1bHRUYXJnZXQnfCcocHJvamVjdCB0YXJnZXQnfCcpKgotICoKLSAqIEByZXR1cm4gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudmFqLkJ1aWxkSW5mbwotICogQHBhcmFtIGRhdGEgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgc3RhdGljIFZBSkJ1aWxkSW5mbyBwYXJzZShTdHJpbmcgZGF0YSkgewotCVZBSkJ1aWxkSW5mbyByZXN1bHQgPSBuZXcgVkFKQnVpbGRJbmZvKCk7Ci0KLQl0cnkgewotCQlqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKCBkYXRhLCAifCIgKTsKLQkJcmVzdWx0LnNldE91dHB1dE1lc3NhZ2VMZXZlbCggdG9rLm5leHRUb2tlbigpICk7Ci0JCXJlc3VsdC5zZXRCdWlsZEZpbGVOYW1lKCB0b2submV4dFRva2VuKCkgKTsKLQkJcmVzdWx0LnNldFRhcmdldCggdG9rLm5leHRUb2tlbigpICk7Ci0JCXdoaWxlKCB0b2suaGFzTW9yZVRva2VucygpICkgewotCQkJcmVzdWx0LnByb2plY3RUYXJnZXRzLmFkZEVsZW1lbnQoIHRvay5uZXh0VG9rZW4oKSApOwotCQl9Ci0JfSBjYXRjaCAoIFRocm93YWJsZSB0ICkgewotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBUaGUgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBtZXRob2Qgd2FzIGdlbmVyYXRlZCB0byBzdXBwb3J0IHRoZSBwcm9wZXJ0eUNoYW5nZSBmaWVsZC4KLSAqLwotcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JZ2V0UHJvcGVydHlDaGFuZ2UoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLS8qKgotICogU2V0cyB0aGUgYnVpbGQgZmlsZSBuYW1lCi0gKiBAcGFyYW0gYnVpbGRGaWxlTmFtZSBidWlsZCBmaWxlIG5hbWUKLSAqLwotcHVibGljIHZvaWQgc2V0QnVpbGRGaWxlTmFtZShTdHJpbmcgbmV3QnVpbGRGaWxlTmFtZSkgewotCVN0cmluZyBvbGRWYWx1ZSA9IGJ1aWxkRmlsZU5hbWU7Ci0JYnVpbGRGaWxlTmFtZSA9IG5ld0J1aWxkRmlsZU5hbWU7Ci0Jc2V0UHJvamVjdEluaXRpYWxpemVkKGZhbHNlKTsKLQlmaXJlUHJvcGVydHlDaGFuZ2UoImJ1aWxkRmlsZU5hbWUiLCBvbGRWYWx1ZSwgYnVpbGRGaWxlTmFtZSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGxvZyBsZXZlbCAodmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyBpbiBQcm9qZWN0KQotICogQHBhcmFtIG91dHB1dE1lc3NhZ2VMZXZlbCBsb2cgbGV2ZWwuCi0gKi8KLXB1YmxpYyB2b2lkIHNldE91dHB1dE1lc3NhZ2VMZXZlbChpbnQgbmV3T3V0cHV0TWVzc2FnZUxldmVsKSB7Ci0JaW50IG9sZFZhbHVlID0gb3V0cHV0TWVzc2FnZUxldmVsOwotCW91dHB1dE1lc3NhZ2VMZXZlbCA9IG5ld091dHB1dE1lc3NhZ2VMZXZlbDsKLQlmaXJlUHJvcGVydHlDaGFuZ2UoIm91dHB1dE1lc3NhZ2VMZXZlbCIsIG5ldyBJbnRlZ2VyKG9sZFZhbHVlKSwgbmV3IEludGVnZXIob3V0cHV0TWVzc2FnZUxldmVsKSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGxvZyBsZXZlbCAodmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyBpbiBQcm9qZWN0KQotICogQHBhcmFtIG91dHB1dE1lc3NhZ2VMZXZlbCBsb2cgbGV2ZWwgYXMgU3RyaW5nLgotICovCi1wcml2YXRlIHZvaWQgc2V0T3V0cHV0TWVzc2FnZUxldmVsKFN0cmluZyBvdXRwdXRNZXNzYWdlTGV2ZWwpIHsKLQlpbnQgbGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KCBvdXRwdXRNZXNzYWdlTGV2ZWwgKTsKLQlzZXRPdXRwdXRNZXNzYWdlTGV2ZWwoIGxldmVsICk7Ci19Ci0vKioKLSAgKi8KLXByaXZhdGUgdm9pZCBzZXRQcm9qZWN0SW5pdGlhbGl6ZWQoYm9vbGVhbiBpbml0aWFsaXplZCkgewotCUJvb2xlYW4gb2xkVmFsdWUgPSBuZXcgQm9vbGVhbihwcm9qZWN0SW5pdGlhbGl6ZWQpOwotCXByb2plY3RJbml0aWFsaXplZCA9IGluaXRpYWxpemVkOwotCWZpcmVQcm9wZXJ0eUNoYW5nZSgicHJvamVjdEluaXRpYWxpemVkIiwgb2xkVmFsdWUsIG5ldyBCb29sZWFuKHByb2plY3RJbml0aWFsaXplZCkpOwotfQotLyoqCi0gKiBTZXRzIHRoZSB0YXJnZXQgdG8gZXhlY3V0ZSB3aGVuIGV4ZWN1dGVCdWlsZCBpcyBjYWxsZWQKLSAqIEBwYXJhbSBuZXdUYXJnZXQgYnVpbGQgdGFyZ2V0Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgbmV3VGFyZ2V0KSB7Ci0JU3RyaW5nIG9sZFZhbHVlID0gdGFyZ2V0OwotCXRhcmdldCA9IG5ld1RhcmdldDsKLQlmaXJlUHJvcGVydHlDaGFuZ2UoInRhcmdldCIsIG9sZFZhbHVlLCB0YXJnZXQpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBWaXN1YWwgQWdlIGZvciBKYXZhIHByb2plY3Qgd2hlcmUKLSAqIHRoaXMgQnVpbGRJbmZvIGJlbG9uZ3MgdG8KLSAqIEBwYXJhbSBuZXdQcm9qZWN0TmFtZSBWQUogcHJvamVjdAotICovCi1wdWJsaWMgdm9pZCBzZXRWQUpQcm9qZWN0TmFtZShTdHJpbmcgbmV3VkFKUHJvamVjdE5hbWUpIHsKLQlTdHJpbmcgb2xkVmFsdWUgPSB2YWpQcm9qZWN0TmFtZTsKLQl2YWpQcm9qZWN0TmFtZSA9IG5ld1ZBSlByb2plY3ROYW1lOwotCWZpcmVQcm9wZXJ0eUNoYW5nZSgiVkFKUHJvamVjdE5hbWUiLCBvbGRWYWx1ZSwgdmFqUHJvamVjdE5hbWUpOwotfQotLyoqCi0gKiByZWxvYWRzIHRoZSBidWlsZCBmaWxlIGFuZCB1cGRhdGVzIHRoZSB0YXJnZXQgbGlzdAotICovCi1wdWJsaWMgdm9pZCB1cGRhdGVUYXJnZXRMaXN0KCkgewotCXByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotCWluaXRQcm9qZWN0KCk7Ci0JcHJvamVjdFRhcmdldHMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQlFbnVtZXJhdGlvbiBwdGFyZ2V0cyA9IHByb2plY3QuZ2V0VGFyZ2V0cygpLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKHB0YXJnZXRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCVRhcmdldCBjdXJyZW50VGFyZ2V0ID0gKFRhcmdldCkgcHRhcmdldHMubmV4dEVsZW1lbnQoKTsKLQkJaWYgKCBjdXJyZW50VGFyZ2V0LmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCApIHsKLQkJCVN0cmluZyB0YXJnZXROYW1lID0gY3VycmVudFRhcmdldC5nZXROYW1lKCk7Ci0JCQlpbnQgcG9zID0gZmluZFRhcmdldFBvc2l0aW9uKCBwcm9qZWN0VGFyZ2V0cywgdGFyZ2V0TmFtZSApOwotCQkJcHJvamVjdFRhcmdldHMuaW5zZXJ0RWxlbWVudEF0KHRhcmdldE5hbWUsIHBvcyk7Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvVkFKRXhwb3J0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvVkFKRXhwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmU2YmYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaWRlL1ZBSkV4cG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0gCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmlkZTsKLQotCi0KLQotaW1wb3J0IGNvbS5pYm0uaXZqLnV0aWwuYmFzZS5FeHBvcnRDb2RlU3BlYzsKLWltcG9ydCBjb20uaWJtLml2ai51dGlsLmJhc2UuSXZqRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5pYm0uaXZqLnV0aWwuYmFzZS5QYWNrYWdlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldDsKLQotLyoqCi0gKiBFeHBvcnQgcGFja2FnZXMgZnJvbSB0aGUgVmlzdWFsIEFnZSBmb3IgSmF2YSB3b3Jrc3BhY2UuIAotICogVGhlIHBhY2thZ2VzIGFyZSBzcGVjaWZpZWQgc2ltaWxhciB0byBhbGwgb3RoZXIgTWF0Y2hpbmdUYXNrcy4gCi0gKiBTaW5jZSB0aGUgVkEgV29ya3NwYWNlIGlzIG5vdCBmaWxlIGJhc2VkLCB0aGlzIHRhc2sgaXMgc2ltdWxhdGluZyAKLSAqIGEgZGlyZWN0b3J5IGhpZXJhcmNoeSBmb3IgdGhlIHdvcmtzcGFjZToKLSAqIFRoZSAncm9vdCcgY29udGFpbnMgYWxsIHByb2plY3QgJ2RpcidzLCBhbmQgdGhlIHByb2plY3RzIGNvbnRhaW4gCi0gKiB0aGVpciByZXNwZWN0aXZlIHBhY2thZ2UgJ2RpcidzLgotICogRXhhbXBsZTogIAotICogPGJsb2NrcXVvdGU+IAotICogJmx0O3ZhamV4cG9ydCBkZXN0ZGlyPSJDOi9idWlsZGRpci9zb3VyY2UiPgotICogJm5ic3A7Jmx0O2luY2x1ZGUgbmFtZT0iL015VkFQcm9qZWN0L29yZy9mb28vc3Vic3lzdGVtMS8qKiIgLz4KLSAqICZuYnNwOyZsdDtleGNsdWRlIG5hbWU9Ii9NeVZBUHJvamVjdC9vcmcvZm9vL3N1YnN5c3RlbTEvdGVzdC8qKiIvPgotICogJmx0Oy92YWpleHBvcnQ+Ci0gKiA8L2Jsb2NrcXVvdGU+Ci0gKiBleHBvcnRzIGFsbCBwYWNrYWdlcyBpbiB0aGUgcHJvamVjdCBNeVZBUHJvamVjdCB3aGljaCBzdGFydCB3aXRoCi0gKiAnb3JnLmZvby5zdWJzeXN0ZW0xJyBleGNlcHQgb2YgdGhlc2Ugc3RhcnRpbmcgd2l0aCAKLSAqICdvcmcuZm9vLnN1YnN5c3RlbTEudGVzdCcuCi0gKgotICogVGhlcmUgYXJlIGZsYWdzIHRvIGNob29zZSB3aGljaCBpdGVtcyB0byBleHBvcnQ6Ci0gKiBleHBvcnRTb3VyY2VzOiAgIGV4cG9ydCBKYXZhIHNvdXJjZXMKLSAqIGV4cG9ydFJlc291cmNlczogZXhwb3J0IHByb2plY3QgcmVzb3VyY2VzCi0gKiBleHBvcnRDbGFzc2VzOiAgIGV4cG9ydCBjbGFzcyBmaWxlcwotICogZXhwb3J0RGVidWdJbmZvOiBleHBvcnQgY2xhc3MgZmlsZXMgd2l0aCBkZWJ1ZyBpbmZvICh1c2Ugd2l0aCBleHBvcnRDbGFzc2VzKQotICogZGVmYXVsdCBpcyBleHBvcnRpbmcgSmF2YSBmaWxlcyBhbmQgcmVzb3VyY2VzLgotICoKLSAqIEBhdXRob3IgV29sZiBTaWJlcnNraSwgVFVJIEluZm90ZWMgR21iSAotICovCi0KLXB1YmxpYyBjbGFzcyBWQUpFeHBvcnQgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RGlyOwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4cG9ydFNvdXJjZXMgPSB0cnVlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4cG9ydFJlc291cmNlcyA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhwb3J0Q2xhc3NlcyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4cG9ydERlYnVnSW5mbyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlcyA9IHRydWU7Ci0KLSAgICBwcm90ZWN0ZWQgUGF0dGVyblNldCBwYXR0ZXJuU2V0ID0gbmV3IFBhdHRlcm5TZXQoKTsKLQotICAgIC8qKgotICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgewotICAgICAgICByZXR1cm4gcGF0dGVyblNldC5jcmVhdGVFeGNsdWRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGUoKSB7Ci0gICAgICAgIHJldHVybiBwYXR0ZXJuU2V0LmNyZWF0ZUluY2x1ZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkbyB0aGUgZXhwb3J0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgZGVzdGRpcgotICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3RkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVkFKV29ya3NwYWNlU2Nhbm5lciBkcyA9IHRoaXMuZ2V0V29ya3NwYWNlU2Nhbm5lcigpOwotCi0gICAgICAgIFBhY2thZ2VbXSBwYWNrYWdlcyA9IGRzLmdldEluY2x1ZGVkUGFja2FnZXMoKTsKLQotICAgICAgICBleHBvcnQocGFja2FnZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGV4cG9ydCB0aGUgYXJyYXkgb2YgUGFja2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleHBvcnQoUGFja2FnZVtdIHBhY2thZ2VzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzdCA9IGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgICAgIGxvZygiRXhwb3J0aW5nICIgKyBwYWNrYWdlcy5sZW5ndGggKyAiIHBhY2thZ2UocykgdG8gIiArIGRlc3QpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGxvZygiICAgICIgKyBwYWNrYWdlc1tpXS5nZXROYW1lKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFeHBvcnRDb2RlU3BlYyBleHBvcnRTcGVjID0gbmV3IEV4cG9ydENvZGVTcGVjKCk7Ci0KLSAgICAgICAgICAgIGV4cG9ydFNwZWMuc2V0UGFja2FnZXMocGFja2FnZXMpOwotICAgICAgICAgICAgZXhwb3J0U3BlYy5pbmNsdWRlSmF2YShleHBvcnRTb3VyY2VzKTsKLSAgICAgICAgICAgIGV4cG9ydFNwZWMuaW5jbHVkZUNsYXNzKGV4cG9ydENsYXNzZXMpOwotICAgICAgICAgICAgZXhwb3J0U3BlYy5pbmNsdWRlUmVzb3VyY2VzKGV4cG9ydFJlc291cmNlcyk7Ci0gICAgICAgICAgICBleHBvcnRTcGVjLmluY2x1ZGVDbGFzc0RlYnVnSW5mbyhleHBvcnREZWJ1Z0luZm8pOwotICAgICAgICAgICAgZXhwb3J0U3BlYy51c2VTdWJkaXJlY3Rvcmllcyh0cnVlKTsKLSAgICAgICAgICAgIGV4cG9ydFNwZWMub3ZlcndyaXRlRmlsZXModHJ1ZSk7Ci0gICAgICAgICAgICBleHBvcnRTcGVjLnNldEV4cG9ydERpcmVjdG9yeShkZXN0KTsKLSAgICAgICAgICAgIFZBSlV0aWwuZ2V0V29ya3NwYWNlKCkuZXhwb3J0RGF0YShleHBvcnRTcGVjKTsKLSAgICAgICAgfSBjYXRjaCAoSXZqRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBWQUpVdGlsLmNyZWF0ZUJ1aWxkRXhjZXB0aW9uKCJFeHBvcnRpbmcgZmFpbGVkISIsIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBzY2FubmVyIG5lZWRlZCB0byBhY2Nlc3MgdGhlIGZpbGVzIHRvIHByb2Nlc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZBSldvcmtzcGFjZVNjYW5uZXIgZ2V0V29ya3NwYWNlU2Nhbm5lcigpIHsKLSAgICAgICAgVkFKV29ya3NwYWNlU2Nhbm5lciBzY2FubmVyID0gbmV3IFZBSldvcmtzcGFjZVNjYW5uZXIoKTsKLSAgICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyhwYXR0ZXJuU2V0LmdldEluY2x1ZGVQYXR0ZXJucyhnZXRQcm9qZWN0KCkpKTsKLSAgICAgICAgc2Nhbm5lci5zZXRFeGNsdWRlcyhwYXR0ZXJuU2V0LmdldEV4Y2x1ZGVQYXR0ZXJucyhnZXRQcm9qZWN0KCkpKTsKLSAgICAgICAgaWYgKHVzZURlZmF1bHRFeGNsdWRlcykKLSAgICAgICAgICAgIHNjYW5uZXIuYWRkRGVmYXVsdEV4Y2x1ZGVzKCk7Ci0gICAgICAgIHNjYW5uZXIuc2NhbigpOwotICAgICAgICByZXR1cm4gc2Nhbm5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VEZWZhdWx0RXhjbHVkZXMgInRydWUifCJvbiJ8InllcyIgd2hlbiBkZWZhdWx0IGV4Y2x1c2lvbnMgCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCwgImZhbHNlInwib2ZmInwibm8iIHdoZW4gdGhleQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkbid0IGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdGV4Y2x1ZGVzKGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzKSB7Ci0gICAgICAgIHRoaXMudXNlRGVmYXVsdEV4Y2x1ZGVzID0gdXNlRGVmYXVsdEV4Y2x1ZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIEphdmEgc291cmNlCi0gICAgICogZmlsZXMgc2hvdWxkIGJlIGNvbXBpbGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3RkaXIoRmlsZSBkZXN0RGlyKSB7Ci0gICAgICAgIHRoaXMuZGVzdERpciA9IGRlc3REaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKSB7Ci0gICAgICAgIHBhdHRlcm5TZXQuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cG9ydENsYXNzZXMoYm9vbGVhbiBkb0V4cG9ydCkgewotICAgICAgICBleHBvcnRDbGFzc2VzID0gZG9FeHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwb3J0RGVidWdJbmZvKGJvb2xlYW4gZG9FeHBvcnQpIHsKLSAgICAgICAgZXhwb3J0RGVidWdJbmZvID0gZG9FeHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwb3J0UmVzb3VyY2VzKGJvb2xlYW4gZG9FeHBvcnQpIHsKLSAgICAgICAgZXhwb3J0UmVzb3VyY2VzID0gZG9FeHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwb3J0U291cmNlcyhib29sZWFuIGRvRXhwb3J0KSB7Ci0gICAgICAgIGV4cG9ydFNvdXJjZXMgPSBkb0V4cG9ydDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB7Ci0gICAgICAgIHBhdHRlcm5TZXQuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpJbXBvcnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmMjZkYS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvVkFKSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlOwotCi1pbXBvcnQgY29tLmlibS5pdmoudXRpbC5iYXNlLkltcG9ydENvZGVTcGVjOwotaW1wb3J0IGNvbS5pYm0uaXZqLnV0aWwuYmFzZS5JdmpFeGNlcHRpb247Ci1pbXBvcnQgY29tLmlibS5pdmoudXRpbC5iYXNlLlByb2plY3Q7Ci1pbXBvcnQgY29tLmlibS5pdmoudXRpbC5iYXNlLlByb2plY3RFZGl0aW9uOwotaW1wb3J0IGNvbS5pYm0uaXZqLnV0aWwuYmFzZS5UeXBlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLQotLyoqCi0gKiBJbXBvcnQgc291cmNlLCBjbGFzcyBmaWxlcywgYW5kIHJlc291cmNlcyB0byB0aGUgVmlzdWFsIEFnZSBmb3IgSmF2YSAKLSAqIHdvcmtzcGFjZSB1c2luZyBGaWxlU2V0cy4KLSAqIDxwPgotICogRXhhbXBsZTogIAotICogPHByZT4gCi0gKiAmbHQ7dmFqaW1wb3J0IHByb2plY3Q9Ik15VkFQcm9qZWN0IiZndDsKLSAqICAgJmx0O2ZpbGVzZXQgZGlyPSJzcmMiJmd0OwotICogICAgICZsdDtpbmNsdWRlIG5hbWU9Im9yZy9mb28vc3Vic3lzdGVtMS8qKiIgLyZndDsKLSAqICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIvb3JnL2Zvby9zdWJzeXN0ZW0xL3Rlc3QvKioiIC8mZ3Q7Ci0gKiAgJmx0Oy9maWxlc2V0Jmd0OwotICogJmx0Oy92YWpleHBvcnQmZ3Q7Ci0gKiA8L3ByZT4KLSAqIGltcG9ydCBhbGwgc291cmNlIGFuZCByZXNvdXJjZSBmaWxlcyBmcm9tIHRoZSAic3JjIiBkaXJlY3RvcnkKLSAqIHdoaWNoIHN0YXJ0IHdpdGggJ29yZy5mb28uc3Vic3lzdGVtMScsIGV4Y2VwdCBvZiB0aGVzZSBzdGFydGluZyB3aXRoIAotICogJ29yZy5mb28uc3Vic3lzdGVtMS50ZXN0JyBpbnRvIHRoZSBwcm9qZWN0IE15VkFQcm9qZWN0LgotICogPC9wPgotICogPHA+SWYgTXlWQVByb2plY3QgaXNuJ3QgbG9hZGVkIGludG8gdGhlIFdvcmtzcGFjZSwgYSBuZXcgZWRpdGlvbiBpcwotICogY3JlYXRlZCBpbiB0aGUgcmVwb3NpdG9yeSBhbmQgYXV0b21hdGljYWxseSBsb2FkZWQgaW50byB0aGUgV29ya3NwYWNlLgotICogVGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSBuZXN0ZWQgRmlsZVNldCBlbGVtZW50LgotICogPC9wPgotICogPHA+VGhlcmUgYXJlIGF0dHJpYnV0ZXMgdG8gY2hvb3NlIHdoaWNoIGl0ZW1zIHRvIGV4cG9ydDoKLSAqIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gKiA8dHI+Ci0gKiAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gKiAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAqICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqICAgPHRkIHZhbGlnbj0idG9wIj52YWpwcm9qZWN0PC90ZD4KLSAqICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgUHJvamVjdCB0byBpbXBvcnQgdG88L3RkPgotICogICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogICA8dGQgdmFsaWduPSJ0b3AiPmltcG9ydFNvdXJjZXM8L3RkPgotICogICA8dGQgdmFsaWduPSJ0b3AiPmltcG9ydCBKYXZhIHNvdXJjZXMsIGRlZmF1bHRzIHRvICJ5ZXMiPC90ZD4KLSAqICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogICA8dGQgdmFsaWduPSJ0b3AiPmltcG9ydFJlc291cmNlczwvdGQ+Ci0gKiAgIDx0ZCB2YWxpZ249InRvcCI+aW1wb3J0IHJlc291cmNlIGZpbGVzIChhbnl0aGluZyB0aGF0IGRvZXNuJ3QKLSAqICAgICAgICAgICAgICAgICAgICBlbmQgd2l0aCAuamF2YSBvciAuY2xhc3MpLCBkZWZhdWx0cyB0byAieWVzIjwvdGQ+Ci0gKiAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqICAgPHRkIHZhbGlnbj0idG9wIj5pbXBvcnRDbGFzc2VzPC90ZD4KLSAqICAgPHRkIHZhbGlnbj0idG9wIj5pbXBvcnQgY2xhc3MgZmlsZXMsIGRlZmF1bHRzIHRvICJubyI8L3RkPgotICogICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAqIDwvdHI+Ci0gKiA8L3RhYmxlPgotICoKLSAqIEBhdXRob3I6IEdsZW5uIE1jQWxsaXN0ZXIsIGluc3BpcmVkIGJ5IGEgc2ltaWxhciB0YXNrIHdyaXR0ZW4gYnkgUGV0ZXIgS2VsbGV5Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQUpJbXBvcnQgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOwotICAgIHByb3RlY3RlZCBib29sZWFuIGltcG9ydFNvdXJjZXMgPSB0cnVlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGltcG9ydFJlc291cmNlcyA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0Q2xhc3NlcyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgaW1wb3J0UHJvamVjdCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFByb2plY3QgdmFqcHJvamVjdCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVmlzdWFsQWdlIGZvciBKYXZhIFByb2plY3QgbmFtZSB0byBpbXBvcnQgaW50by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWpwcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICB0aGlzLmltcG9ydFByb2plY3QgPSBwcm9qZWN0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKLSAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcG9ydCAuY2xhc3MgZmlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1wb3J0Q2xhc3Nlcyhib29sZWFuIGltcG9ydENsYXNzZXMpIHsKLSAgICAgICAgdGhpcy5pbXBvcnRDbGFzc2VzID0gaW1wb3J0Q2xhc3NlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBvcnQgcmVzb3VyY2UgZmlsZXMgKGFueXRoaW5nIHRoYXQgZG9lc24ndCBlbmQgaW4KLSAgICAgKiAuY2xhc3Mgb3IgLmphdmEpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1wb3J0UmVzb3VyY2VzKGJvb2xlYW4gaW1wb3J0UmVzb3VyY2VzKSB7Ci0gICAgICAgIHRoaXMuaW1wb3J0UmVzb3VyY2VzID0gaW1wb3J0UmVzb3VyY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcG9ydCAuamF2YSBmaWxlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEltcG9ydFNvdXJjZXMoYm9vbGVhbiBpbXBvcnRTb3VyY2VzKSB7Ci0gICAgICAgIHRoaXMuaW1wb3J0U291cmNlcyA9IGltcG9ydFNvdXJjZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gdGhlIGltcG9ydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGVzZXRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBmaWxlc2V0IGlzIHJlcXVpcmVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGltcG9ydFByb2plY3QgPT0gbnVsbCB8fCAiIi5lcXVhbHMoaW1wb3J0UHJvamVjdCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIFZpc3VhbEFnZSBmb3IgSmF2YSBQcm9qZWN0IG5hbWUgaXMgcmVxdWlyZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWpwcm9qZWN0ID0gZ2V0VkFKUHJvamVjdCgpOwotICAgICAgICBpZiAodmFqcHJvamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHZhanByb2plY3QgPSBWQUpVdGlsLmdldFdvcmtzcGFjZSgpLmNyZWF0ZVByb2plY3QodGhpcy5pbXBvcnRQcm9qZWN0LCB0cnVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEl2akV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgVkFKVXRpbC5jcmVhdGVCdWlsZEV4Y2VwdGlvbiggIkVycm9yIHdoaWxlIGNyZWF0aW5nIFByb2plY3QgIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFByb2plY3QgKyAiOiAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICk7IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZmlsZXNldHMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIGltcG9ydEZpbGVzZXQoKEZpbGVTZXQpIGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnkgdG8gZ2V0IHRoZSBwcm9qZWN0IHdlIHdhbnQgZnJvbSB0aGUgV29ya3NwYWNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBQcm9qZWN0IGdldFZBSlByb2plY3QoKSB7Ci0gICAgICAgIFByb2plY3QgZm91bmQgPSBudWxsOwotICAgICAgICBQcm9qZWN0W10gY3VycmVudFByb2plY3RzID0gVkFKVXRpbC5nZXRXb3Jrc3BhY2UoKS5nZXRQcm9qZWN0cygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9qZWN0IHAgPSBjdXJyZW50UHJvamVjdHNbaV07Ci0gICAgICAgICAgICBpZiAocC5nZXROYW1lKCkuZXF1YWxzKHRoaXMuaW1wb3J0UHJvamVjdCkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wb3J0IGFsbCBmaWxlcyBmcm9tIHRoZSBmaWxlc2V0IGludG8gdGhlIFByb2plY3QgaW4gdGhlCi0gICAgICogV29ya3NwYWNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGltcG9ydEZpbGVzZXQoRmlsZVNldCBmaWxlc2V0KSB7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmaWxlc2V0LmdldERpcmVjdG9yeVNjYW5uZXIodGhpcy5wcm9qZWN0KTsKLSAgICAgICAgaWYgKGRzLmdldEluY2x1ZGVkRmlsZXMoKS5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVjdG9yIGNsYXNzZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFZlY3RvciBzb3VyY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBWZWN0b3IgcmVzb3VyY2VzID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgIFN0cmluZ1tdIGNsYXNzZXNBcnIgPSBudWxsOwotICAgICAgICBTdHJpbmdbXSBzb3VyY2VzQXJyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nW10gcmVzb3VyY2VzQXJyID0gbnVsbDsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBtc2cuYXBwZW5kKCJJbXBvcnRpbmcgIik7Ci0gICAgICAgIFN0cmluZyBjb25uZWN0b3IgPSAiIjsKLQotICAgICAgICBJbXBvcnRDb2RlU3BlYyBpbXBvcnRTcGVjID0gbmV3IEltcG9ydENvZGVTcGVjKCk7Ci0gICAgICAgIGltcG9ydFNwZWMuc2V0RGVmYXVsdFByb2plY3QodmFqcHJvamVjdCk7Ci0KLSAgICAgICAgc2NhbigKLSAgICAgICAgICAgICBmaWxlc2V0LmdldERpcih0aGlzLnByb2plY3QpLCAKLSAgICAgICAgICAgICBkcy5nZXRJbmNsdWRlZEZpbGVzKCksIAotICAgICAgICAgICAgIGNsYXNzZXMsIAotICAgICAgICAgICAgIHNvdXJjZXMsIAotICAgICAgICAgICAgIHJlc291cmNlcyk7IAotCi0gICAgICAgIGlmIChpbXBvcnRDbGFzc2VzKSB7Ci0gICAgICAgICAgICBjbGFzc2VzQXJyID0gbmV3IFN0cmluZ1tjbGFzc2VzLnNpemUoKV07Ci0gICAgICAgICAgICBjbGFzc2VzLmNvcHlJbnRvKGNsYXNzZXNBcnIpOwotICAgICAgICAgICAgaW1wb3J0U3BlYy5zZXRDbGFzc0ZpbGVzKGNsYXNzZXNBcnIpOwotICAgICAgICAgICAgaWYgKGNsYXNzZXNBcnIubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGxvZ0ZpbGVzKGNsYXNzZXMsICJjbGFzcyIpOwotICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIGNsYXNzZXNBcnIubGVuZ3RoICk7Ci0gICAgICAgICAgICAgICAgbXNnLmFwcGVuZCggIiBjbGFzcyAiICk7Ci0gICAgICAgICAgICAgICAgbXNnLmFwcGVuZCggY2xhc3Nlc0Fyci5sZW5ndGggPiAxID8gImZpbGVzIiA6ICJmaWxlIiApOwotICAgICAgICAgICAgICAgIGNvbm5lY3RvciA9ICIsICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW1wb3J0U291cmNlcykgewotICAgICAgICAgICAgc291cmNlc0FyciA9IG5ldyBTdHJpbmdbc291cmNlcy5zaXplKCldOwotICAgICAgICAgICAgc291cmNlcy5jb3B5SW50byhzb3VyY2VzQXJyKTsKLSAgICAgICAgICAgIGltcG9ydFNwZWMuc2V0SmF2YUZpbGVzKHNvdXJjZXNBcnIpOwotICAgICAgICAgICAgaWYgKHNvdXJjZXNBcnIubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGxvZ0ZpbGVzKHNvdXJjZXMsICJzb3VyY2UiKTsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCBjb25uZWN0b3IgKTsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCBzb3VyY2VzQXJyLmxlbmd0aCApOwotICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoICIgc291cmNlICIgKTsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCBzb3VyY2VzQXJyLmxlbmd0aCA+IDEgPyAiZmlsZXMiIDogImZpbGUiICk7Ci0gICAgICAgICAgICAgICAgY29ubmVjdG9yID0gIiwgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbXBvcnRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSBmaWxlc2V0LmdldERpcih0aGlzLnByb2plY3QpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgcmVzb3VyY2VzQXJyID0gbmV3IFN0cmluZ1tyZXNvdXJjZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgIHJlc291cmNlcy5jb3B5SW50byhyZXNvdXJjZXNBcnIpOwotICAgICAgICAgICAgaW1wb3J0U3BlYy5zZXRSZXNvdXJjZVBhdGgocmVzb3VyY2VQYXRoKTsKLSAgICAgICAgICAgIGltcG9ydFNwZWMuc2V0UmVzb3VyY2VGaWxlcyhyZXNvdXJjZXNBcnIpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlc0Fyci5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgbG9nRmlsZXMocmVzb3VyY2VzLCAicmVzb3VyY2UiKTsKLSAgICAgICAgICAgICAgICBsb2coICIgIChyZWxhdGl2ZSB0byByZXNvdXJjZSBwYXRoICciICsgcmVzb3VyY2VQYXRoICsgIicpIiwgCi0gICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Lk1TR19WRVJCT1NFICk7Ci0KLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCBjb25uZWN0b3IgKTsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCByZXNvdXJjZXNBcnIubGVuZ3RoICk7Ci0gICAgICAgICAgICAgICAgbXNnLmFwcGVuZCggIiByZXNvdXJjZSAiICk7Ci0gICAgICAgICAgICAgICAgbXNnLmFwcGVuZCggcmVzb3VyY2VzQXJyLmxlbmd0aCA+IDEgPyAiZmlsZXMiIDogImZpbGUiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtc2cuYXBwZW5kKCAiIGludG8gdGhlICIgKTsKLSAgICAgICAgbXNnLmFwcGVuZCggaW1wb3J0UHJvamVjdCApOwotICAgICAgICBtc2cuYXBwZW5kKCAiIHByb2plY3QuIiApOwotCi0gICAgICAgIGxvZyhtc2cudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlW10gaW1wb3J0ZWRUeXBlcyA9IFZBSlV0aWwuZ2V0V29ya3NwYWNlKCkuaW1wb3J0RGF0YShpbXBvcnRTcGVjKTsKLSAgICAgICAgICAgIGlmIChpbXBvcnRlZFR5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBpbXBvcnQgaW50byBXb3Jrc3BhY2UhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEl2akV4Y2VwdGlvbiBpdmplKSB7Ci0gICAgICAgICAgICB0aHJvdyBWQUpVdGlsLmNyZWF0ZUJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBpbXBvcnRpbmcgaW50byBXb3Jrc3BhY2U6ICIsIGl2amUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU29ydCB0aGUgZmlsZXMgaW50byBjbGFzc2VzLCBzb3VyY2VzLCBhbmQgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNjYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciwgCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IgY2xhc3NlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3Igc291cmNlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IgcmVzb3VyY2VzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlID0gKG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCIuamF2YSIpIHx8IGZpbGUuZW5kc1dpdGgoIi5KQVZBIikpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VzLmFkZEVsZW1lbnQoZmlsZSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgiLmNsYXNzIikgfHwgZmlsZS5lbmRzV2l0aCgiLkNMQVNTIikpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGRFbGVtZW50KGZpbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZvciByZXNvdXJjZXMgVkEgZXhwZWN0cyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcmVzb3VyY2UgcGF0aAotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkRWxlbWVudChmaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICAgICAgICAgICAgIAotICAgIC8qKgotICAgICAqIExvZ3MgYSBsaXN0IG9mIGZpbGUgbmFtZXMgdG8gdGhlIG1lc3NhZ2UgbG9nCi0gICAgICogQHBhcmFtIGZpbGVOYW1lcyBqYXZhLnV0aWwuVmVjdG9yIGZpbGUgbmFtZXMgdG8gYmUgbG9nZ2VkCi0gICAgICogQHBhcmFtIHR5cGUgamF2YS5sYW5nLlN0cmluZyBmaWxlIHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dGaWxlcyhWZWN0b3IgZmlsZU5hbWVzLCBTdHJpbmcgZmlsZVR5cGUpIHsKLSAgICAgICAgbG9nKCAgZmlsZVR5cGUgKyAiIGZpbGVzIGZvdW5kIGZvciBpbXBvcnQ6Iiwgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIGZvciAoIEVudW1lcmF0aW9uIGUgPSBmaWxlTmFtZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICBsb2coICIgICAgIiArIGUubmV4dEVsZW1lbnQoKSwgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5NU0dfVkVSQk9TRSApOwotICAgICAgICB9Ci0gICAgfSAKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpMb2FkUHJvamVjdHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpMb2FkUHJvamVjdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwZmMzNy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvVkFKTG9hZFByb2plY3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlOwotCi0KLWltcG9ydCBjb20uaWJtLml2ai51dGlsLmJhc2UuSXZqRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5pYm0uaXZqLnV0aWwuYmFzZS5Qcm9qZWN0RWRpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci0KLS8qKgotICogTG9hZCBzcGVjaWZpYyBwcm9qZWN0IHZlcnNpb25zIGludG8gdGhlIFZpc3VhbCBBZ2UgZm9yIEphdmEgd29ya3NwYWNlLgotICogRWFjaCBwcm9qZWN0IGFuZCB2ZXJzaW9uIG5hbWUgaGFzIHRvIGJlIHNwZWNpZmllZCBjb21wbGV0ZWx5LgotICogRXhhbXBsZTogIAotICogPGJsb2NrcXVvdGU+IAotICogJmx0O3ZhamxvYWQ+Ci0gKiAmbmJzcDsmbHQ7cHJvamVjdCBuYW1lPSJNeVZBUHJvamVjdCIgdmVyc2lvbj0iMi4xIi8+Ci0gKiAmbmJzcDsmbHQ7cHJvamVjdCBuYW1lPSJBcGFjaGUgWGVyY2VzIiB2ZXJzaW9uPSIxLjIuMCIvPgotICogJmx0Oy92YWpsb2FkPgotICogPC9ibG9ja3F1b3RlPgotICoKLSAqIEBhdXRob3IgV29sZiBTaWJlcnNraSwgVFVJIEluZm90ZWMgR21iSAotICovCi0KLXB1YmxpYyBjbGFzcyBWQUpMb2FkUHJvamVjdHMgZXh0ZW5kcyBUYXNrIHsKLSAgICBWZWN0b3IgcHJvamVjdERlc2NyaXB0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICBWZWN0b3IgZXhwYW5kZWRQcm9qZWN0RGVzY3JpcHRpb25zID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyoqCi0gICAgICogQ2xhc3MgdG8gbWFpbnRhaW4gVmlzdWFsQWdlIGZvciBKYXZhIFdvcmtzcGFjZSBQcm9qZWN0IGRlc2NyaXB0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgVkFKUHJvamVjdERlc2NyaXB0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByb2plY3RGb3VuZDsKLQotICAgICAgICBwdWJsaWMgVkFKUHJvamVjdERlc2NyaXB0aW9uKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZBSlByb2plY3REZXNjcmlwdGlvbihTdHJpbmcgbiwgU3RyaW5nIHYpIHsKLSAgICAgICAgICAgIG5hbWUgPSBuOwotICAgICAgICAgICAgdmVyc2lvbiA9IHY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvamVjdEZvdW5kKCkgewotICAgICAgICAgICAgcmV0dXJuIHByb2plY3RGb3VuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLSAgICAgICAgICAgIGlmIChuZXdOYW1lID09IG51bGwgfHwgbmV3TmFtZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICBpZiAobmV3VmVyc2lvbiA9PSBudWxsIHx8IG5ld1ZlcnNpb24uZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidmVyc2lvbiBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZlcnNpb24gPSBuZXdWZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdEZvdW5kKCkgewotICAgICAgICAgICAgcHJvamVjdEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSBwcm9qZWN0IGRlc2NyaXB0aW9uIGVudHJ5IG9uIHRoZSBwcm9qZWN0IGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIFZBSlByb2plY3REZXNjcmlwdGlvbiBjcmVhdGVWQUpQcm9qZWN0KCkgewotICAgICAgICBWQUpQcm9qZWN0RGVzY3JpcHRpb24gZCA9IG5ldyBWQUpQcm9qZWN0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgcHJvamVjdERlc2NyaXB0aW9ucy5hZGRFbGVtZW50KGQpOwotICAgICAgICByZXR1cm4gZDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogTG9hZCBzcGVjaWZpZWQgcHJvamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgZXhwYW5kRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGxvZygKLSAgICAgICAgICAgICJMb2FkaW5nICIgKyBleHBhbmRlZFByb2plY3REZXNjcmlwdGlvbnMuc2l6ZSgpICsgIiBwcm9qZWN0KHMpIGludG8gd29ya3NwYWNlIik7IAotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBleHBhbmRlZFByb2plY3REZXNjcmlwdGlvbnMuZWxlbWVudHMoKTsgCi0gICAgICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTsgCi0gICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICBWQUpQcm9qZWN0RGVzY3JpcHRpb24gZCA9IChWQUpQcm9qZWN0RGVzY3JpcHRpb24pIGUubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgUHJvamVjdEVkaXRpb24gcGUgPSBmaW5kUHJvamVjdEVkaXRpb24oZC5nZXROYW1lKCksIGQuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nKCAiTG9hZGluZyAiICsgZC5nZXROYW1lKCkgKyAiLCBWZXJzaW9uICIgKyBkLmdldFZlcnNpb24oKSArIAotICAgICAgICAgICAgICAgICAgICAgIiwgaW50byBXb3Jrc3BhY2UiLCAKLSAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UgKTsgCi0gICAgICAgICAgICAgICAgcGUubG9hZEludG9Xb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEl2akV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IFZBSlV0aWwuY3JlYXRlQnVpbGRFeGNlcHRpb24oICJQcm9qZWN0ICIgKyBkLmdldE5hbWUoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY291bGQgbm90IGJlIGxvYWRlZC4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCApOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4cGFuZERlc2NyaXB0aW9ucygpIHsKLSAgICAgICAgU3RyaW5nW10gcHJvamVjdE5hbWVzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdE5hbWVzID0gVkFKVXRpbC5nZXRXb3Jrc3BhY2UoKS5nZXRSZXBvc2l0b3J5KCkuZ2V0UHJvamVjdE5hbWVzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEl2akV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBWQUpVdGlsLmNyZWF0ZUJ1aWxkRXhjZXB0aW9uKCJWQSBFeGNlcHRpb24gb2NjdXJlZDogIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcHJvamVjdERlc2NyaXB0aW9ucy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIFZBSlByb2plY3REZXNjcmlwdGlvbiBkID0gKFZBSlByb2plY3REZXNjcmlwdGlvbikgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKFZBSldvcmtzcGFjZVNjYW5uZXIubWF0Y2gocGF0dGVybiwgcHJvamVjdE5hbWVzW2ldKSkgewotICAgICAgICAgICAgICAgICAgICBkLnNldFByb2plY3RGb3VuZCgpOwotICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFByb2plY3REZXNjcmlwdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KG5ldyBWQUpQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdE5hbWVzW2ldLCBkLmdldFZlcnNpb24oKSkpOyAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcHJvamVjdERlc2NyaXB0aW9ucy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgVkFKUHJvamVjdERlc2NyaXB0aW9uIGQgPSAoVkFKUHJvamVjdERlc2NyaXB0aW9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoIWQucHJvamVjdEZvdW5kKCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIk5vIFByb2plY3RzIG1hdGNoIHRoZSBuYW1lICIgKyBkLmdldE5hbWUoKSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFZlY3RvciBmaW5kTWF0Y2hpbmdQcm9qZWN0cyhTdHJpbmcgcGF0dGVybikgewotICAgICAgICBTdHJpbmdbXSBwcm9qZWN0TmFtZXM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9qZWN0TmFtZXMgPSBWQUpVdGlsLmdldFdvcmtzcGFjZSgpLmdldFJlcG9zaXRvcnkoKS5nZXRQcm9qZWN0TmFtZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoSXZqRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IFZBSlV0aWwuY3JlYXRlQnVpbGRFeGNlcHRpb24oIlZBIEV4Y2VwdGlvbiBvY2N1cmVkOiAiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZlY3RvciBtYXRjaGluZ1Byb2plY3RzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKFZBSldvcmtzcGFjZVNjYW5uZXIubWF0Y2gocGF0dGVybiwgcHJvamVjdE5hbWVzW2ldKSkgewotICAgICAgICAgICAgICAgIG1hdGNoaW5nUHJvamVjdHMuYWRkRWxlbWVudChwcm9qZWN0TmFtZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hdGNoaW5nUHJvamVjdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYSBzcGVjaWZpYyBwcm9qZWN0IGVkaXRpb24gaW4gdGhlIHJlcG9zaXRvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBwcm9qZWN0IG5hbWUKLSAgICAgKiBAcGFyYW0gdmVyc2lvbk5hbWUgcHJvamVjdCB2ZXJzaW9uIG5hbWUKLSAgICAgKiBAcmV0dXJuIGNvbS5pYm0uaXZqLnV0aWwuYmFzZS5Qcm9qZWN0RWRpdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdEVkaXRpb24gZmluZFByb2plY3RFZGl0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbk5hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb2plY3RFZGl0aW9uW10gZWRpdGlvbnMgPSBudWxsOwotICAgICAgICAgICAgZWRpdGlvbnMgPSBWQUpVdGlsLmdldFdvcmtzcGFjZSgpLmdldFJlcG9zaXRvcnkoKS5nZXRQcm9qZWN0RWRpdGlvbnMobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChlZGl0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9qZWN0ICIgKyBuYW1lICsgIiBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFByb2plY3RFZGl0aW9uIHBlID0gbnVsbDsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0aW9ucy5sZW5ndGggJiYgcGUgPT0gbnVsbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb25OYW1lLmVxdWFscyhlZGl0aW9uc1tpXS5nZXRWZXJzaW9uTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBwZSA9IGVkaXRpb25zW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiVmVyc2lvbiAiICsgdmVyc2lvbk5hbWUgKyAiIG9mIFByb2plY3QgIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArICIgZG9lc24ndCBleGlzdCIgKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGU7Ci0KLSAgICAgICAgfSBjYXRjaCAoSXZqRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IFZBSlV0aWwuY3JlYXRlQnVpbGRFeGNlcHRpb24oIlZBIEV4Y2VwdGlvbiBvY2N1cmVkOiAiLCBlKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaWRlL1ZBSlV0aWwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4M2QwYzIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaWRlL1ZBSlV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pZGU7Ci0KLQotaW1wb3J0IGNvbS5pYm0uaXZqLnV0aWwuYmFzZS5JdmpFeGNlcHRpb247Ci1pbXBvcnQgY29tLmlibS5pdmoudXRpbC5iYXNlLlRvb2xFbnY7Ci1pbXBvcnQgY29tLmlibS5pdmoudXRpbC5iYXNlLldvcmtzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIFZBSiB0YXNrcy4gSG9sZHMgV29ya3NwYWNlIHNpbmdsZXRvbiBhbmQKLSAqIHdyYXBzIEl2akV4Y2VwdGlvbnMgaW50byBCdWlsZEV4Y2VwdGlvbnMKLSAqCi0gKiBAYXV0aG9yIFdvbGYgU2liZXJza2ksIFRVSSBJbmZvdGVjIEdtYkgKLSAqLwotY2xhc3MgVkFKVXRpbCB7Ci0gICAgc3RhdGljIHByaXZhdGUgV29ya3NwYWNlIHdvcmtzcGFjZTsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogV3JhcHMgSXZqRXhjZXB0aW9uIGludG8gYSBCdWlsZEV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbgotICAgICAqIEBwYXJhbSBlcnJNc2cgQWRkaXRpb25hbCBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGUgSXZqRXhjZXB0aW9uIHdoaWNoIGlzIHdyYXBwZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1aWxkRXhjZXB0aW9uIGNyZWF0ZUJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVyck1zZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdmpFeGNlcHRpb24gZSkgewotICAgICAgICBlcnJNc2cgPSBlcnJNc2cgKyAiXG4iICsgZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZ1tdIGVycm9ycyA9IGUuZ2V0RXJyb3JzKCk7Ci0gICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBlcnJNc2cgPSBlcnJNc2cgKyAiXG4iICsgZXJyb3JzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24oZXJyTXNnKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAgICAgKiBDcmVhdGlvbiBkYXRlOiAoMTkuMDkuMjAwMCAxMzo0MToyMSkKLSAgICAgKiBAcmV0dXJuIGNvbS5pYm0uaXZqLnV0aWwuYmFzZS5Xb3Jrc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0gICAgICAgIGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgd29ya3NwYWNlID0gVG9vbEVudi5jb25uZWN0VG9Xb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjb25uZWN0IHRvIFdvcmtzcGFjZSEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNYWtlIHN1cmUgeW91IGFyZSBydW5uaW5nIGluIFZpc3VhbEFnZSBmb3IgSmF2YS4iKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd29ya3NwYWNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpXb3Jrc3BhY2VTY2FubmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvVkFKV29ya3NwYWNlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ4MTQ1Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2lkZS9WQUpXb3Jrc3BhY2VTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlOwotCi1pbXBvcnQgY29tLmlibS5pdmoudXRpbC5iYXNlLkl2akV4Y2VwdGlvbjsKLWltcG9ydCBjb20uaWJtLml2ai51dGlsLmJhc2UuUGFja2FnZTsKLWltcG9ydCBjb20uaWJtLml2ai51dGlsLmJhc2UuUHJvamVjdDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotCi0vKioKLSAqIENsYXNzIGZvciBzY2FubmluZyBhIFZpc3VhbCBBZ2UgZm9yIEphdmEgd29ya3NwYWNlIGZvciBwYWNrYWdlcyBtYXRjaGluZwotICogYSBjZXJ0YWluIGNyaXRlcmlhLgotICogPHA+Ci0gKiBUaGVzZSBjcml0ZXJpYSBjb25zaXN0IG9mIGEgc2V0IG9mIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnMuIFdpdGggdGhlc2UKLSAqIHBhdHRlcm5zLCB5b3UgY2FuIHNlbGVjdCB3aGljaCBwYWNrYWdlcyB5b3Ugd2FudCB0byBoYXZlIGluY2x1ZGVkLCBhbmQgd2hpY2gKLSAqIHBhY2thZ2VzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuICBZb3UgY2FuIGFkZCBwYXR0ZXJucyB0byBiZSBleGNsdWRlZCBieQotICogZGVmYXVsdCB3aXRoIHRoZSBhZGREZWZhdWx0RXhjbHVkZXMgbWV0aG9kLiAgVGhlIHBhdHRlcnMgdGhhdCBhcmUgZXhjbHVkZWQKLSAqIGJ5IGRlZmF1bHQgaW5jbHVkZQotICogPHVsPgotICogICA8bGk+SUJNKlwqKjwvbGk+Ci0gKiAgIDxsaT5KYXZhIGNsYXNzIGxpYnJhcmllc1wqKjwvbGk+Ci0gKiAgIDxsaT5TdW4gY2xhc3MgbGlicmFyaWVzKlwqKjwvbGk+Ci0gKiAgIDxsaT5KU1AgUGFnZSBDb21waWxlIEdlbmVyYXRlZCBDb2RlXCoqPC9saT4KLSAqICAgPGxpPlZpc3VhbEFnZSpcKio8L2xpPgotICogPC91bD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3b3JrcyBsaWtlIERpcmVjdG9yeVNjYW5uZXIuIAotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcgotICoKLSAqIEBhdXRob3IgV29sZiBTaWJlcnNraSwgVFVJIEluZm90ZWMgKGJhc2VkIG9uIEFybm91dCBKLiBLdWlwZXJzIERpcmVjdG9yeVNjYW5uZXIpCi0gKi8KLXB1YmxpYyBjbGFzcyBWQUpXb3Jrc3BhY2VTY2FubmVyIGV4dGVuZHMgRGlyZWN0b3J5U2Nhbm5lciB7Ci0KLSAgICAvKioKLSAgICAgKiBQYXR0ZXJucyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBieSBkZWZhdWx0LgotICAgICAqCi0gICAgICogQHNlZSAjYWRkRGVmYXVsdEV4Y2x1ZGVzKCkKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBERUZBVUxURVhDTFVERVMgPSAKLSAgICB7Ci0gICAgICAgICJJQk0qLyoqIiwgCi0gICAgICAgICJKYXZhIGNsYXNzIGxpYnJhcmllcy8qKiIsIAotICAgICAgICAiU3VuIGNsYXNzIGxpYnJhcmllcyovKioiLCAKLSAgICAgICAgIkpTUCBQYWdlIENvbXBpbGUgR2VuZXJhdGVkIENvZGUvKioiLCAKLSAgICAgICAgIlZpc3VhbEFnZSovKioiLCAKLSAgICB9OyAKLQotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlcyB0aGF0IHdoZXJlIGZvdW5kIGFuZCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBpbmNsdWRlcywgYW5kCi0gICAgICogbWF0Y2hlZCBubyBleGNsdWRlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciBwYWNrYWdlc0luY2x1ZGVkID0gbmV3IFZlY3RvcigpOwotICAgCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgYXJyYXkgd2l0aCBkZWZhdWx0IGV4Y2x1c2lvbnMgdG8gdGhlIGN1cnJlbnQgZXhjbHVzaW9ucyBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGVmYXVsdEV4Y2x1ZGVzKCkgewotICAgICAgICBpbnQgZXhjbHVkZXNMZW5ndGggPSBleGNsdWRlcyA9PSBudWxsID8gMCA6IGV4Y2x1ZGVzLmxlbmd0aDsKLSAgICAgICAgU3RyaW5nW10gbmV3RXhjbHVkZXM7Ci0gICAgICAgIG5ld0V4Y2x1ZGVzID0gbmV3IFN0cmluZ1tleGNsdWRlc0xlbmd0aCArIERFRkFVTFRFWENMVURFUy5sZW5ndGhdOwotICAgICAgICBpZiAoZXhjbHVkZXNMZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVzLCAwLCBuZXdFeGNsdWRlcywgMCwgZXhjbHVkZXNMZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREVGQVVMVEVYQ0xVREVTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBuZXdFeGNsdWRlc1tpICsgZXhjbHVkZXNMZW5ndGhdID0gREVGQVVMVEVYQ0xVREVTW2ldLgotICAgICAgICAgICAgICAgIHJlcGxhY2UoICcvJywgRmlsZS5zZXBhcmF0b3JDaGFyICkucmVwbGFjZSggJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyICk7IAotICAgICAgICB9Ci0gICAgICAgIGV4Y2x1ZGVzID0gbmV3RXhjbHVkZXM7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBGaW5kcyBhbGwgUHJvamVjdHMgc3BlY2lmaWVkIGluIGluY2x1ZGUgcGF0dGVybnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZmluZE1hdGNoaW5nUHJvamVjdHMoKSB7Ci0gICAgICAgIFByb2plY3RbXSBwcm9qZWN0cyA9IFZBSlV0aWwuZ2V0V29ya3NwYWNlKCkuZ2V0UHJvamVjdHMoKTsKLQotICAgICAgICBWZWN0b3IgbWF0Y2hpbmdQcm9qZWN0cyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBib29sZWFuIGFsbFByb2plY3RzTWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGluY2x1ZGVzLmxlbmd0aCAmJiAhYWxsUHJvamVjdHNNYXRjaDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5jbHVkZXNbal0sIEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWVQYXR0ZXJuID0gdG9rLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZVBhdHRlcm4uZXF1YWxzKCIqKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIGluY2x1ZGUgcGF0dGVybiBzdGFydHMgd2l0aCAnKionLCAKLSAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHByb2plY3RzIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgIGFsbFByb2plY3RzTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gocHJvamVjdE5hbWVQYXR0ZXJuLCBwcm9qZWN0LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nUHJvamVjdHMuYWRkRWxlbWVudChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWxsUHJvamVjdHNNYXRjaCkgewotICAgICAgICAgICAgbWF0Y2hpbmdQcm9qZWN0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtYXRjaGluZ1Byb2plY3RzLmFkZEVsZW1lbnQocHJvamVjdHNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hdGNoaW5nUHJvamVjdHM7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBwYWNrYWdlcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCi0gICAgICogcGF0dGVybnMsIGFuZCBkaWRuJ3QgbWF0Y2ggb25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGFja2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFja2FnZVtdIGdldEluY2x1ZGVkUGFja2FnZXMoKSB7Ci0gICAgICAgIGludCBjb3VudCA9IHBhY2thZ2VzSW5jbHVkZWQuc2l6ZSgpOwotICAgICAgICBQYWNrYWdlW10gcGFja2FnZXMgPSBuZXcgUGFja2FnZVtjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgcGFja2FnZXNbaV0gPSAoUGFja2FnZSkgcGFja2FnZXNJbmNsdWRlZC5lbGVtZW50QXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhY2thZ2VzOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogTWF0Y2hlcyBhIHN0cmluZyBhZ2FpbnN0IGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gY29udGFpbnMgdHdvIHNwZWNpYWwKLSAgICAgKiBjaGFyYWN0ZXJzOgotICAgICAqICcqJyB3aGljaCBtZWFucyB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycywKLSAgICAgKiAnPycgd2hpY2ggbWVhbnMgb25lIGFuZCBvbmx5IG9uZSBjaGFyYWN0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgKG5vbi1udWxsKSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gc3RyICAgICB0aGUgKG5vbi1udWxsKSBzdHJpbmcgdGhhdCBtdXN0IGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICBwYXR0ZXJuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIHN0cmluZyBtYXRjaGVzIGFnYWluc3QgdGhlIHBhdHRlcm4sCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0cikgewotICAgICAgICByZXR1cm4gRGlyZWN0b3J5U2Nhbm5lci5tYXRjaChwYXR0ZXJuLCBzdHIpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTY2FucyB0aGUgd29ya3NwYWNlIGZvciBwYWNrYWdlcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbmNsdWRlCi0gICAgICogcGF0dGVybiwgYW5kIGRvbid0IG1hdGNoIGFueSBleGNsdWRlIHBhdHRlcm5zLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NhbigpIHsKLSAgICAgICAgaWYgKGluY2x1ZGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE5vIGluY2x1ZGVzIHN1cHBsaWVkLCBzbyBzZXQgaXQgdG8gJ21hdGNoZXMgYWxsJwotICAgICAgICAgICAgaW5jbHVkZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICAgICAgaW5jbHVkZXNbMF0gPSAiKioiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleGNsdWRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBleGNsdWRlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvbmx5IHNjYW4gcHJvamVjdHMgd2hpY2ggYXJlIGluY2x1ZGVkIGluIGF0IGxlYXN0IG9uZSBpbmNsdWRlIHBhdHRlcm4KLSAgICAgICAgVmVjdG9yIG1hdGNoaW5nUHJvamVjdHMgPSBmaW5kTWF0Y2hpbmdQcm9qZWN0cygpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBtYXRjaGluZ1Byb2plY3RzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBQcm9qZWN0IHByb2plY3QgPSAoUHJvamVjdCkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgc2NhblByb2plY3QocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFNjYW5zIGEgcHJvamVjdCBmb3IgcGFja2FnZXMgdGhhdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5jbHVkZQotICAgICAqIHBhdHRlcm4sIGFuZCBkb24ndCBtYXRjaCBhbnkgZXhjbHVkZSBwYXR0ZXJucy4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjYW5Qcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGFja2FnZVtdIHBhY2thZ2VzID0gcHJvamVjdC5nZXRQYWNrYWdlcygpOwotICAgICAgICAgICAgaWYgKHBhY2thZ2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgaXRlbSA9IHBhY2thZ2VzW2ldOwotICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlICcuJyBieSBmaWxlIHNlcGVyYXRvciBiZWNhdXNlIHRoZSBwYXR0ZXJucyBhcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdXNpbmcgZmlsZSBzZXBlcmF0b3Igc3ludGF4IChhbmQgd2UgY2FuIHVzZSB0aGUgbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kcyB0aGlzIHdheSkuCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgKyBpdGVtLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsgCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKG5hbWUpICYmICFpc0V4Y2x1ZGVkKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlc0luY2x1ZGVkLmFkZEVsZW1lbnQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEl2akV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBWQUpVdGlsLmNyZWF0ZUJ1aWxkRXhjZXB0aW9uKCJWQSBFeGNlcHRpb24gb2NjdXJlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvZGVmYXVsdC5pbmkgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pZGUvZGVmYXVsdC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjY2I4OTQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaWRlL2RlZmF1bHQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1OYW1lPUFudAotVmVyc2lvbj0wLjEKLUhlbHAtSXRlbT1BbnQgSGVscCxkb2MvVkFKQW50VG9vbC5odG1sCi1NZW51LUl0ZW1zPUFudCBCdWlsZCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pZGUuVkFKQW50VG9vbCwtUDsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KSlRyZWUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KSlRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNjQyMS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSkpUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dTdHJlYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLS8qKgotICogVGFza2RlZiBmb3IgdGhlIEpKVHJlZSBjb21waWxlciBjb21waWxlci4KLSAqCi0gKiBAYXV0aG9yIHRob21hcy5oYWFzQHNvZnR3aXJlZC1pbmMuY29tCi0gKiBAYXV0aG9yIE1pY2hhZWwgU2F1bmRlcnMgPGEgaHJlZj0ibWFpbHRvOm1pY2hhZWxAYW10ZWMuY29tIj5taWNoYWVsQGFtdGVjLmNvbTwvYT4KLSAqLwotcHVibGljIGNsYXNzIEpKVHJlZSBleHRlbmRzIFRhc2sgewotCi0gICAgLy8ga2V5cyB0byBvcHRpb25hbCBhdHRyaWJ1dGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX05PREVfRklMRVMgID0gIkJVSUxEX05PREVfRklMRVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSSAgICAgICAgICAgICA9ICJNVUxUSSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfREVGQVVMVF9WT0lEID0gIk5PREVfREVGQVVMVF9WT0lEIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9GQUNUT1JZICAgICAgPSAiTk9ERV9GQUNUT1JZIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9TQ09QRV9IT09LICAgPSAiTk9ERV9TQ09QRV9IT09LIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9VU0VTX1BBUlNFUiAgPSAiTk9ERV9VU0VTX1BBUlNFUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQyAgICAgICAgICAgID0gIlNUQVRJQyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lUT1IgICAgICAgICAgID0gIlZJU0lUT1IiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUEFDS0FHRSAgICAgID0gIk5PREVfUEFDS0FHRSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lUT1JfRVhDRVBUSU9OID0gIlZJU0lUT1JfRVhDRVBUSU9OIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9QUkVGSVggICAgICAgPSAiTk9ERV9QUkVGSVgiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGUgb3B0aW9uYWxBdHRycyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIC8vIHJlcXVpcmVkIGF0dHJpYnV0ZXMKLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgdGFyZ2V0ICAgICAgICAgID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgamF2YWNjSG9tZSAgICAgID0gbnVsbDsKLQotICAgIHByaXZhdGUgQ29tbWFuZGxpbmVKYXZhIGNtZGwgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkbm9kZWZpbGVzKGJvb2xlYW4gYnVpbGROb2RlRmlsZXMpIHsKLSAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoQlVJTERfTk9ERV9GSUxFUywgbmV3IEJvb2xlYW4oYnVpbGROb2RlRmlsZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aShib29sZWFuIG11bHRpKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE1VTFRJLCBuZXcgQm9vbGVhbihtdWx0aSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVkZWZhdWx0dm9pZChib29sZWFuIG5vZGVEZWZhdWx0Vm9pZCkgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChOT0RFX0RFRkFVTFRfVk9JRCwgbmV3IEJvb2xlYW4obm9kZURlZmF1bHRWb2lkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZWZhY3RvcnkoYm9vbGVhbiBub2RlRmFjdG9yeSkgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChOT0RFX0ZBQ1RPUlksIG5ldyBCb29sZWFuKG5vZGVGYWN0b3J5KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZXNjb3BlaG9vayhib29sZWFuIG5vZGVTY29wZUhvb2spIHsKLSAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTk9ERV9TQ09QRV9IT09LLCBuZXcgQm9vbGVhbihub2RlU2NvcGVIb29rKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZXVzZXNwYXJzZXIoYm9vbGVhbiBub2RlVXNlc1BhcnNlcikgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChOT0RFX1VTRVNfUEFSU0VSLCBuZXcgQm9vbGVhbihub2RlVXNlc1BhcnNlcikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRpYyhib29sZWFuIHN0YXRpY1BhcnNlcikgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChTVEFUSUMsIG5ldyBCb29sZWFuKHN0YXRpY1BhcnNlcikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoYm9vbGVhbiB2aXNpdG9yKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KFZJU0lUT1IsIG5ldyBCb29sZWFuKHZpc2l0b3IpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROb2RlcGFja2FnZShTdHJpbmcgbm9kZVBhY2thZ2UpIHsKLSAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTk9ERV9QQUNLQUdFLCBuZXcgU3RyaW5nKG5vZGVQYWNrYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaXRvckV4Y2VwdGlvbihTdHJpbmcgdmlzaXRvckV4Y2VwdGlvbikgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChWSVNJVE9SX0VYQ0VQVElPTiwgbmV3IFN0cmluZyh2aXNpdG9yRXhjZXB0aW9uKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZXByZWZpeChTdHJpbmcgbm9kZVByZWZpeCkgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChOT0RFX1BSRUZJWCwgbmV3IFN0cmluZyhub2RlUHJlZml4KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0ZGlyZWN0b3J5KEZpbGUgb3V0cHV0RGlyZWN0b3J5KSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChGaWxlIHRhcmdldCkgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhY2Nob21lKEZpbGUgamF2YWNjSG9tZSkgewotICAgICAgICB0aGlzLmphdmFjY0hvbWUgPSBqYXZhY2NIb21lOwotICAgIH0KLQotICAgIHB1YmxpYyBKSlRyZWUoKSB7Ci0gICAgICAgIGNtZGwuc2V0Vm0oImphdmEiKTsKLSAgICAgICAgY21kbC5zZXRDbGFzc25hbWUoIkNPTS5zdW4ubGFicy5qanRyZWUuTWFpbiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGxvYWQgY29tbWFuZCBsaW5lIHdpdGggb3B0aW9uYWwgYXR0cmlidXRlcwotICAgICAgICBFbnVtZXJhdGlvbiBpdGVyID0gb3B0aW9uYWxBdHRycy5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSAgPSAoU3RyaW5nKWl0ZXIubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9wdGlvbmFsQXR0cnMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItIituYW1lKyI6Iit2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCAhdGFyZ2V0LmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgdGFyZ2V0OiAiICsgdGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gdXNlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGFyZ2V0IGFzIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUodGFyZ2V0LmdldFBhcmVudCgpKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIGlmICghb3V0cHV0RGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIidvdXRwdXRkaXJlY3RvcnknICIgKyBvdXRwdXREaXJlY3RvcnkgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeS4iKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjb252ZXJ0IGJhY2tzbGFzaGVzIHRvIHNsYXNoZXMsIG90aGVyd2lzZSBqanRyZWUgd2lsbCBwdXQgdGhpcyBhcwotICAgICAgICAvLyBjb21tZW50cyBhbmQgdGhpcyBzZWVtcyB0byBjb25mdXNlIGphdmFjYwotICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoCi0gICAgICAgICAgICAiLU9VVFBVVF9ESVJFQ1RPUlk6IitvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gdGFyZ2V0LmdldE5hbWUoKTsKLSAgICAgICAgZmluYWwgRmlsZSBqYXZhRmlsZSA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSwKLSAgICAgICAgICAgIHRhcmdldE5hbWUuc3Vic3RyaW5nKDAsIHRhcmdldE5hbWUuaW5kZXhPZigiLmpqdCIpKSArICIuamoiKTsKLSAgICAgICAgaWYgKGphdmFGaWxlLmV4aXN0cygpICYmIHRhcmdldC5sYXN0TW9kaWZpZWQoKSA8IGphdmFGaWxlLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZygiVGFyZ2V0IGlzIGFscmVhZHkgYnVpbHQgLSBza2lwcGluZyAoIiArIHRhcmdldCArICIpIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgaWYgKGphdmFjY0hvbWUgPT0gbnVsbCB8fCAhamF2YWNjSG9tZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkphdmFjY2hvbWUgbm90IHNldC4iKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBQYXRoIGNsYXNzcGF0aCA9IGNtZGwuY3JlYXRlQ2xhc3NwYXRoKHByb2plY3QpOwotICAgICAgICBjbGFzc3BhdGguY3JlYXRlUGF0aEVsZW1lbnQoKS5zZXRQYXRoKGphdmFjY0hvbWUuZ2V0QWJzb2x1dGVQYXRoKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL0phdmFDQy56aXAiKTsKLQotICAgICAgICBmaW5hbCBDb21tYW5kbGluZS5Bcmd1bWVudCBhcmcgPSBjbWRsLmNyZWF0ZVZtQXJndW1lbnQoKTsKLSAgICAgICAgYXJnLnNldFZhbHVlKCItbXgxNDBNIik7Ci0gICAgICAgIGFyZy5zZXRWYWx1ZSgiLURpbnN0YWxsLnJvb3Q9IitqYXZhY2NIb21lLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBmaW5hbCBFeGVjdXRlIHByb2Nlc3MgPQotICAgICAgICAgICAgbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICBsb2coY21kbC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgcHJvY2Vzcy5zZXRDb21tYW5kbGluZShjbWRsLmdldENvbW1hbmRsaW5lKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocHJvY2Vzcy5leGVjdXRlKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSkpUcmVlIGZhaWxlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gbGF1bmNoIEpKVHJlZTogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWNjL0phdmFDQy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWNjL0phdmFDQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJkMjlkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KYXZhQ0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFjYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmVKYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBUYXNrZGVmIGZvciB0aGUgSmF2YUNDIGNvbXBpbGVyIGNvbXBpbGVyLgotICoKLSAqIEBhdXRob3IgdGhvbWFzLmhhYXNAc29mdHdpcmVkLWluYy5jb20KLSAqIEBhdXRob3IgTWljaGFlbCBTYXVuZGVycyA8YSBocmVmPSJtYWlsdG86bWljaGFlbEBhbXRlYy5jb20iPm1pY2hhZWxAYW10ZWMuY29tPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNDIGV4dGVuZHMgVGFzayB7Ci0KLSAgICAvLyBrZXlzIHRvIG9wdGlvbmFsIGF0dHJpYnV0ZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9PS0FIRUFEICAgICAgICAgICAgICA9ICJMT09LQUhFQUQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSE9JQ0VfQU1CSUdVSVRZX0NIRUNLID0gIkNIT0lDRV9BTUJJR1VJVFlfQ0hFQ0siOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVEhFUl9BTUJJR1VJVFlfQ0hFQ0sgID0gIk9USEVSX0FNQklHVUlUWV9DSEVDSyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDICAgICAgICAgICAgICAgICA9ICJTVEFUSUMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19QQVJTRVIgICAgICAgICAgID0gIkRFQlVHX1BBUlNFUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0xPT0tBSEVBRCAgICAgICAgPSAiREVCVUdfTE9PS0FIRUFEIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfVE9LRU5fTUFOQUdFUiAgICA9ICJERUJVR19UT0tFTl9NQU5BR0VSIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiA9ICJPUFRJTUlaRV9UT0tFTl9NQU5BR0VSIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfUkVQT1JUSU5HICAgICAgICA9ICJFUlJPUl9SRVBPUlRJTkciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1VOSUNPREVfRVNDQVBFICAgID0gIkpBVkFfVU5JQ09ERV9FU0NBUEUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTklDT0RFX0lOUFVUICAgICAgICAgID0gIlVOSUNPREVfSU5QVVQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfQ0FTRSAgICAgICAgICAgID0gIklHTk9SRV9DQVNFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTU9OX1RPS0VOX0FDVElPTiAgICA9ICJDT01NT05fVE9LRU5fQUNUSU9OIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9UT0tFTl9NQU5BR0VSICAgICA9ICJVU0VSX1RPS0VOX01BTkFHRVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0NIQVJfU1RSRUFNICAgICAgID0gIlVTRVJfQ0hBUl9TVFJFQU0iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9QQVJTRVIgICAgICAgICAgID0gIkJVSUxEX1BBUlNFUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1RPS0VOX01BTkFHRVIgICAgPSAiQlVJTERfVE9LRU5fTUFOQUdFUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTklUWV9DSEVDSyAgICAgICAgICAgPSAiU0FOSVRZX0NIRUNLIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SQ0VfTEFfQ0hFQ0sgICAgICAgICA9ICJGT1JDRV9MQV9DSEVDSyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RPS0VOUyAgICAgICAgICAgPSAiQ0FDSEVfVE9LRU5TIjsKLQotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlIG9wdGlvbmFsQXR0cnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAvLyByZXF1aXJlZCBhdHRyaWJ1dGVzCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBGaWxlIHRhcmdldCAgICAgICAgICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBGaWxlIGphdmFjY0hvbWUgICAgICA9IG51bGw7Ci0KLSAgICBwcml2YXRlIENvbW1hbmRsaW5lSmF2YSBjbWRsID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOwotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb29rYWhlYWQoaW50IGxvb2thaGVhZCkgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChMT09LQUhFQUQsIG5ldyBJbnRlZ2VyKGxvb2thaGVhZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZWFtYmlndWl0eWNoZWNrKGludCBjaG9pY2VBbWJpZ3VpdHlDaGVjaykgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChDSE9JQ0VfQU1CSUdVSVRZX0NIRUNLLCBuZXcgSW50ZWdlcihjaG9pY2VBbWJpZ3VpdHlDaGVjaykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE90aGVyYW1iaWd1aXR5Q2hlY2soaW50IG90aGVyQW1iaWd1aXR5Q2hlY2spIHsKLSAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoT1RIRVJfQU1CSUdVSVRZX0NIRUNLLCBuZXcgSW50ZWdlcihvdGhlckFtYmlndWl0eUNoZWNrKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gc3RhdGljUGFyc2VyKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KFNUQVRJQywgbmV3IEJvb2xlYW4oc3RhdGljUGFyc2VyKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWdwYXJzZXIoYm9vbGVhbiBkZWJ1Z1BhcnNlcikgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChERUJVR19QQVJTRVIsIG5ldyBCb29sZWFuKGRlYnVnUGFyc2VyKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWdsb29rYWhlYWQoYm9vbGVhbiBkZWJ1Z0xvb2thaGVhZCkgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChERUJVR19MT09LQUhFQUQsIG5ldyBCb29sZWFuKGRlYnVnTG9va2FoZWFkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWd0b2tlbm1hbmFnZXIoYm9vbGVhbiBkZWJ1Z1Rva2VuTWFuYWdlcikgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChERUJVR19UT0tFTl9NQU5BR0VSLCBuZXcgQm9vbGVhbihkZWJ1Z1Rva2VuTWFuYWdlcikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wdGltaXpldG9rZW5tYW5hZ2VyKGJvb2xlYW4gb3B0aW1pemVUb2tlbk1hbmFnZXIpIHsKLSAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiwgbmV3IEJvb2xlYW4ob3B0aW1pemVUb2tlbk1hbmFnZXIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvcnJlcG9ydGluZyhib29sZWFuIGVycm9yUmVwb3J0aW5nKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEVSUk9SX1JFUE9SVElORywgbmV3IEJvb2xlYW4oZXJyb3JSZXBvcnRpbmcpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhdW5pY29kZWVzY2FwZShib29sZWFuIGphdmFVbmljb2RlRXNjYXBlKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEpBVkFfVU5JQ09ERV9FU0NBUEUsIG5ldyBCb29sZWFuKGphdmFVbmljb2RlRXNjYXBlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW5pY29kZWlucHV0KGJvb2xlYW4gdW5pY29kZUlucHV0KSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KFVOSUNPREVfSU5QVVQsIG5ldyBCb29sZWFuKHVuaWNvZGVJbnB1dCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZWNhc2UoYm9vbGVhbiBpZ25vcmVDYXNlKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KElHTk9SRV9DQVNFLCBuZXcgQm9vbGVhbihpZ25vcmVDYXNlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbW9udG9rZW5hY3Rpb24oYm9vbGVhbiBjb21tb25Ub2tlbkFjdGlvbikgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChDT01NT05fVE9LRU5fQUNUSU9OLCBuZXcgQm9vbGVhbihjb21tb25Ub2tlbkFjdGlvbikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJ0b2tlbm1hbmFnZXIoYm9vbGVhbiB1c2VyVG9rZW5NYW5hZ2VyKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KFVTRVJfVE9LRU5fTUFOQUdFUiwgbmV3IEJvb2xlYW4odXNlclRva2VuTWFuYWdlcikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJjaGFyc3RyZWFtKGJvb2xlYW4gdXNlckNoYXJTdHJlYW0pIHsKLSAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoVVNFUl9DSEFSX1NUUkVBTSwgbmV3IEJvb2xlYW4odXNlckNoYXJTdHJlYW0pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZHBhcnNlcihib29sZWFuIGJ1aWxkUGFyc2VyKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEJVSUxEX1BBUlNFUiwgbmV3IEJvb2xlYW4oYnVpbGRQYXJzZXIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZHRva2VubWFuYWdlcihib29sZWFuIGJ1aWxkVG9rZW5NYW5hZ2VyKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEJVSUxEX1RPS0VOX01BTkFHRVIsIG5ldyBCb29sZWFuKGJ1aWxkVG9rZW5NYW5hZ2VyKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2FuaXR5Y2hlY2soYm9vbGVhbiBzYW5pdHlDaGVjaykgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChTQU5JVFlfQ0hFQ0ssIG5ldyBCb29sZWFuKHNhbml0eUNoZWNrKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yY2VsYWNoZWNrKGJvb2xlYW4gZm9yY2VMQUNoZWNrKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEZPUkNFX0xBX0NIRUNLLCBuZXcgQm9vbGVhbihmb3JjZUxBQ2hlY2spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZXRva2Vucyhib29sZWFuIGNhY2hlVG9rZW5zKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KENBQ0hFX1RPS0VOUywgbmV3IEJvb2xlYW4oY2FjaGVUb2tlbnMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRkaXJlY3RvcnkoRmlsZSBvdXRwdXREaXJlY3RvcnkpIHsKLSAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KEZpbGUgdGFyZ2V0KSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFjY2hvbWUoRmlsZSBqYXZhY2NIb21lKSB7Ci0gICAgICAgIHRoaXMuamF2YWNjSG9tZSA9IGphdmFjY0hvbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEphdmFDQygpIHsKLSAgICAgICAgY21kbC5zZXRWbSgiamF2YSIpOwotICAgICAgICBjbWRsLnNldENsYXNzbmFtZSgiQ09NLnN1bi5sYWJzLmphdmFjYy5NYWluIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gbG9hZCBjb21tYW5kIGxpbmUgd2l0aCBvcHRpb25hbCBhdHRyaWJ1dGVzCi0gICAgICAgIEVudW1lcmF0aW9uIGl0ZXIgPSBvcHRpb25hbEF0dHJzLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lICA9IChTdHJpbmcpaXRlci5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb3B0aW9uYWxBdHRycy5nZXQobmFtZSk7Ci0gICAgICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0iK25hbWUrIjoiK3ZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhlIHRhcmdldCBpcyBhIGZpbGUKLSAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8ICF0YXJnZXQuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCB0YXJnZXQ6ICIgKyB0YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXNlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGFyZ2V0IGFzIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUodGFyZ2V0LmdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghb3V0cHV0RGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT3V0cHV0ZGlyIG5vdCBhIGRpcmVjdG9yeS4iKTsKLSAgICAgICAgfQotICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoCi0gICAgICAgICAgICAiLU9VVFBVVF9ESVJFQ1RPUlk6IitvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgIC8vIGRldGVybWluZSBpZiB0aGUgZ2VuZXJhdGVkIGphdmEgZmlsZSBpcyB1cC10by1kYXRlCi0gICAgICAgIGZpbmFsIEZpbGUgamF2YUZpbGUgPSBnZXRPdXRwdXRKYXZhRmlsZShvdXRwdXREaXJlY3RvcnksIHRhcmdldCk7Ci0gICAgICAgIGlmIChqYXZhRmlsZS5leGlzdHMoKSAmJiB0YXJnZXQubGFzdE1vZGlmaWVkKCkgPCBqYXZhRmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgbG9nKCJUYXJnZXQgaXMgYWxyZWFkeSBidWlsdCAtIHNraXBwaW5nICgiICsgdGFyZ2V0ICsgIikiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGFyZ2V0LmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBpZiAoamF2YWNjSG9tZSA9PSBudWxsIHx8ICFqYXZhY2NIb21lLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSmF2YWNjaG9tZSBub3Qgc2V0LiIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFBhdGggY2xhc3NwYXRoID0gY21kbC5jcmVhdGVDbGFzc3BhdGgocHJvamVjdCk7Ci0gICAgICAgIGNsYXNzcGF0aC5jcmVhdGVQYXRoRWxlbWVudCgpLnNldFBhdGgoamF2YWNjSG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvSmF2YUNDLnppcCIpOwotCi0gICAgICAgIGZpbmFsIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZyA9IGNtZGwuY3JlYXRlVm1Bcmd1bWVudCgpOwotICAgICAgICBhcmcuc2V0VmFsdWUoIi1teDE0ME0iKTsKLSAgICAgICAgYXJnLnNldFZhbHVlKCItRGluc3RhbGwucm9vdD0iK2phdmFjY0hvbWUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgIEV4ZWN1dGUucnVuQ29tbWFuZCh0aGlzLCBjbWRsLmdldENvbW1hbmRsaW5lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgdGhlIG91dHB1dCBKYXZhIGZpbGUgdG8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBnaXZlbiBncmFtbWFyCi0gICAgICogZmlsZS4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2V0T3V0cHV0SmF2YUZpbGUoRmlsZSBvdXRwdXRkaXIsIEZpbGUgc3JjZmlsZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gc3JjZmlsZS5nZXRQYXRoKCk7Ci0KLSAgICAgICAgLy8gRXh0cmFjdCBmaWxlJ3MgYmFzZS1uYW1lCi0gICAgICAgIGludCBzdGFydEJhc2VuYW1lID0gcGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgIGlmICggc3RhcnRCYXNlbmFtZSAhPSAtMSApIHsKLSAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhzdGFydEJhc2VuYW1lKzEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVwbGFjZSB0aGUgZmlsZSdzIGV4dGVuc2lvbiB3aXRoICcuamF2YScKLSAgICAgICAgaW50IHN0YXJ0RXh0biA9IHBhdGgubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgaWYgKHN0YXJ0RXh0biAhPSAtMSkgewotICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHN0YXJ0RXh0bikgKyAiLmphdmEiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcGF0aCArPSAiLmphdmEiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hhbmdlIHRoZSBkaXJlY3RvcnkKLSAgICAgICAgaWYgKG91dHB1dGRpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXRoID0gb3V0cHV0ZGlyICsgRmlsZS5zZXBhcmF0b3IgKyBwYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvSkRlcGVuZFRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvSkRlcGVuZFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyZTM5Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qZGVwZW5kL0pEZXBlbmRUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qZGVwZW5kOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUGF0aFRva2VuaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlV2F0Y2hkb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nU3RyZWFtSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci0KLS8qKgotICogQW50IHRhc2sgdG8gcnVuIEpEZXBlbmQgdGVzdHMuCi0gKgotICogPHA+SkRlcGVuZCBpcyBhIHRvb2wgdG8gZ2VuZXJhdGUgZGVzaWduIHF1YWxpdHkgbWV0cmljcyBmb3IgZWFjaCBKYXZhIHBhY2thZ2UuCi0gKiBJdCBoYXMgYmVlbiBpbml0aWFsbHkgY3JlYXRlZCBieSBNaWtlIENsYXJrLiBKRGVwZW5kIGNhbiBiZSBmb3VuZCBhdCA8YQotICogaHJlZj0iaHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbCI+aHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbDwvYT4uCi0gKgotICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gc3Bhd24gYSBuZXcgSmF2YSBWTS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpKZXJvbWVAamVyb21lbGFjb3N0ZS5jb20iPkplcm9tZSBMYWNvc3RlPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSkRlcGVuZFRhc2sgZXh0ZW5kcyBUYXNrIHsKLSAgICBwcml2YXRlIENvbW1hbmRsaW5lSmF2YSBjb21tYW5kbGluZSA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsgICAgICAgCi0gICAgICAgIAotICAgIC8vIHJlcXVpcmVkIGF0dHJpYnV0ZXMKLSAgICBwcml2YXRlIFBhdGggX3NvdXJjZXNQYXRoOwotCi0gICAgLy8gb3B0aW9uYWwgYXR0cmlidXRlcwotICAgIHByaXZhdGUgRmlsZSBfb3V0cHV0RmlsZTsKLSAgICBwcml2YXRlIEZpbGUgX2RpcjsKLSAgICBwcml2YXRlIFBhdGggX2NvbXBpbGVDbGFzc3BhdGg7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9oYWx0b25lcnJvciA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBfZm9yayA9IGZhbHNlOyAgICAKLSAgICAvL3ByaXZhdGUgSW50ZWdlciBfdGltZW91dCA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIEpEZXBlbmRUYXNrKCkgewotICAgICAgICBjb21tYW5kbGluZS5zZXRDbGFzc25hbWUoImpkZXBlbmQudGV4dHVpLkpEZXBlbmQiKTsKLSAgICB9Ci0KLS8qCi0gICAgcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIF90aW1lb3V0ID0gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFRpbWVvdXQoKSB7Ci0gICAgICAgIHJldHVybiBfdGltZW91dDsKLSAgICB9Ci0qLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGUoRmlsZSBvdXRwdXRGaWxlKSB7Ci0gICAgICAgIF9vdXRwdXRGaWxlID0gb3V0cHV0RmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRPdXRwdXRGaWxlKCkgewotICAgICAgICByZXR1cm4gX291dHB1dEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFsdCBvbiBGYWlsdXJlPyBkZWZhdWx0OiBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYWx0b25lcnJvcihib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIF9oYWx0b25lcnJvciA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEhhbHRvbmVycm9yKCkgewotICAgICAgICByZXR1cm4gX2hhbHRvbmVycm9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlbGxzIHdoZXRoZXIgYSBKVk0gc2hvdWxkIGJlIGZvcmtlZCBmb3IgdGhlIHRhc2suIERlZmF1bHQ6IGZhbHNlLgotICAgICAqIEBwYXJhbSAgIHZhbHVlICAgPHR0PnRydWU8L3R0PiBpZiBhIEpWTSBzaG91bGQgYmUgZm9ya2VkLCBvdGhlcndpc2UgPHR0PmZhbHNlPHR0PgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiB2YWx1ZSkgeyAgICAKLSAgICAgICAgX2ZvcmsgPSB2YWx1ZTsgICAgICAgICAgICAKLSAgICB9ICAgIAotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yaygpIHsKLSAgICAgICAgcmV0dXJuIF9mb3JrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhIG5ldyBWTSB0byBleGVjdXRlIHRoZSB0YXNrLiBEZWZhdWx0IGlzIDx0dD5qYXZhPC90dD4uIElnbm9yZWQgaWYgbm8gSlZNIGlzIGZvcmtlZC4KLSAgICAgKiBAcGFyYW0gICB2YWx1ZSAgIHRoZSBuZXcgVk0gdG8gdXNlIGluc3RlYWQgb2YgPHR0PmphdmE8L3R0PgotICAgICAqIEBzZWUgI3NldEZvcmsoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKdm0oU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGNvbW1hbmRsaW5lLnNldFZtKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWF5YmUgY3JlYXRlcyBhIG5lc3RlZCBjbGFzc3BhdGggZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVTb3VyY2VzcGF0aCgpIHsKLSAgICAgICAgaWYgKF9zb3VyY2VzUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfc291cmNlc1BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3NvdXJjZXNQYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0cyB0aGUgc291cmNlcGF0aC4gKi8KLSAgICBwdWJsaWMgUGF0aCBnZXRTb3VyY2VzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIF9zb3VyY2VzUGF0aDsKLSAgICB9Ci0gCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLiBJZ25vcmVkIGlmIG5vIEpWTSBpcyBmb3JrZWQuCi0gICAgICogQHBhcmFtICAgZGlyICAgICB0aGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgSlZNIGZyb20uCi0gICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgewotICAgICAgICBfZGlyID0gZGlyOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldERpcigpIHsKLSAgICAgICAgcmV0dXJuIF9kaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKLSAgICAgICAgaWYgKF9jb21waWxlQ2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIF9jb21waWxlQ2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2NvbXBpbGVDbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogR2V0cyB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uICovCi0gICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgewotICAgICAgICByZXR1cm4gX2NvbXBpbGVDbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWF5YmUgY3JlYXRlcyBhIG5lc3RlZCBjbGFzc3BhdGggZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChfY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfY29tcGlsZUNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfY29tcGlsZUNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEpWTSBhcmd1bWVudC4gSWdub3JlZCBpZiBubyBKVk0gaXMgZm9ya2VkLgotICAgICAqIEByZXR1cm4gIGNyZWF0ZSBhIG5ldyBKVk0gYXJndW1lbnQgc28gdGhhdCBhbnkgYXJndW1lbnQgY2FuIGJlIHBhc3NlZCB0byB0aGUgSlZNLgotICAgICAqIEBzZWUgI3NldEZvcmsoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWFuZGxpbmUuQXJndW1lbnQgY3JlYXRlSnZtYXJnKCkgewotICAgICAgICByZXR1cm4gY29tbWFuZGxpbmUuY3JlYXRlVm1Bcmd1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBDTEFTU1BBVEggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vIHByb2JsZW1zIHdpdGggdGhpcyB0ZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVUNDRVNTID0gMDsgICAgCi0gICAgLyoqCi0gICAgICogQW4gZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SUyA9IDE7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRTb3VyY2VzcGF0aCgpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgU291cmNlcGF0aCByZXF1aXJlZCBhcmd1bWVudCIpOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlc3QgYW5kIGdldCB0aGUgcmV0dXJuIGNvZGUKLSAgICAgICAgaW50IGV4aXRWYWx1ZSA9IEpEZXBlbmRUYXNrLkVSUk9SUzsKLSAgICAgICAgYm9vbGVhbiB3YXNLaWxsZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCEgZ2V0Rm9yaygpKSB7Ci0gICAgICAgICAgICBleGl0VmFsdWUgPSBleGVjdXRlSW5WTSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRXhlY3V0ZVdhdGNoZG9nIHdhdGNoZG9nID0gY3JlYXRlV2F0Y2hkb2coKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBleGl0VmFsdWUgPSBleGVjdXRlQXNGb3JrZWQod2F0Y2hkb2cpOwotICAgICAgICAgICAgLy8gbnVsbCB3YXRjaGRvZyBtZWFucyBubyB0aW1lb3V0LCB5b3UnZCBiZXR0ZXIgbm90IGNoZWNrIHdpdGggbnVsbAotICAgICAgICAgICAgaWYgKHdhdGNoZG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL2luZm8gd2lsbCBiZSB1c2VkIGluIGxhdGVyIHZlcnNpb24gZG8gbm90aGluZyBmb3Igbm93Ci0gICAgICAgICAgICAgICAgLy93YXNLaWxsZWQgPSB3YXRjaGRvZy5raWxsZWRQcm9jZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvci9mYWlsdXJlIGFuZCB0aGF0IGl0IHNob3VsZCBoYWx0LCBzdG9wIGV2ZXJ5dGhpbmcgb3RoZXJ3aXNlCi0gICAgICAgIC8vIGp1c3QgbG9nIGEgc3RhdGVtZW50Ci0gICAgICAgIGJvb2xlYW4gZXJyb3JPY2N1cnJlZCA9IGV4aXRWYWx1ZSA9PSBKRGVwZW5kVGFzay5FUlJPUlM7Ci0KLSAgICAgICAgaWYgKGVycm9yT2NjdXJyZWQpIHsKLSAgICAgICAgICAgIGlmICAoZ2V0SGFsdG9uZXJyb3IoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkpEZXBlbmQgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvZygiSkRlcGVuZCBGQUlMRUQiLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICB9Ci0gICAgfSAgICAgICAgCi0KLQotICAgICAgICAgICAgCi0gICAgLy8gdGhpcyBjb21tZW50IGV4dHJhY3QgZnJvbSBKVW5pdCBUYXNrIG1heSBhbHNvIGFwcGx5IGhlcmUKLSAgICAvLyAiaW4gVk0gaXMgbm90IHZlcnkgbmljZSBzaW5jZSBpdCBjb3VsZCBwcm9iYWJseSBoYW5nIHRoZQotICAgIC8vIHdob2xlIGJ1aWxkLiBJTUhPIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhdm9pZGVkIGFuZCBpdCB3b3VsZCBiZSBiZXN0Ci0gICAgLy8gdG8gcmVtb3ZlIGl0IGluIGZ1dHVyZSB2ZXJzaW9ucy4gVEJELiAoU0JhKSIgICAgCi0gICAgICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgaW5zaWRlIFZNLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZXhlY3V0ZUluVk0oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBqZGVwZW5kLnRleHR1aS5KRGVwZW5kIGpkZXBlbmQgPSBuZXcgamRlcGVuZC50ZXh0dWkuSkRlcGVuZCgpOwotICAgICAgIAotICAgICAgICBpZiAoZ2V0T3V0cHV0RmlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGVXcml0ZXIgZnc7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZ3ID0gbmV3IEZpbGVXcml0ZXIoZ2V0T3V0cHV0RmlsZSgpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSkRlcGVuZCBGYWlsZWQgd2hlbiBjcmVhdGluZyB0aGUgb3V0cHV0IGZpbGU6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBsb2cobXNnKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGpkZXBlbmQuc2V0V3JpdGVyKG5ldyBQcmludFdyaXRlcihmdykpOwotICAgICAgICAgICAgbG9nKCJPdXB0dXQgdG8gYmUgc3RvcmVkIGluICIgKyBnZXRPdXRwdXRGaWxlKCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhdGhUb2tlbml6ZXIgc291cmNlc1BhdGggPSBuZXcgUGF0aFRva2VuaXplcihnZXRTb3VyY2VzcGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB3aGlsZSAoc291cmNlc1BhdGguaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzb3VyY2VzUGF0aC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG5vdCBuZWNlc3NhcnkgYXMgSkRlcGVuZCB3b3VsZCBmYWlsLCBidXQgd2h5IGxvb3NlIHNvbWUgdGltZT8gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCEgZi5leGlzdHMoKSB8fCAhZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJcIiIrIGYuZ2V0UGF0aCgpICsgIlwiIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGRpcmVjdG9yeS4gSkRlcGVuZCB3b3VsZCBmYWlsLiI7Ci0gICAgICAgICAgICAgICAgbG9nKG1zZyk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGpkZXBlbmQuYWRkRGlyZWN0b3J5KGYuZ2V0UGF0aCgpKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJKRGVwZW5kIEZhaWxlZCB3aGVuIGFkZGluZyBhIHNvdXJjZSBkaXJlY3Rvcnk6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBsb2cobXNnKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBqZGVwZW5kLmFuYWx5emUoKTsKLSAgICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgdGFzayBieSBmb3JraW5nIGEgbmV3IEpWTS4gVGhlIGNvbW1hbmQgd2lsbCBibG9jayB1bnRpbAotICAgICAqIGl0IGZpbmlzaGVzLiBUbyBrbm93IGlmIHRoZSBwcm9jZXNzIHdhcyBkZXN0cm95ZWQgb3Igbm90LCB1c2UgdGhlCi0gICAgICogPHR0PmtpbGxlZFByb2Nlc3MoKTwvdHQ+IG1ldGhvZCBvZiB0aGUgd2F0Y2hkb2cgY2xhc3MuCi0gICAgICogQHBhcmFtICB3YXRjaGRvZyAgIHRoZSB3YXRjaGRvZyBpbiBjaGFyZ2Ugb2YgY2FuY2VsbGluZyB0aGUgdGVzdCBpZiBpdAotICAgICAqIGV4Y2VlZHMgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLiBDYW4gYmUgPHR0Pm51bGw8L3R0PiwgaW4gdGhpcyBjYXNlCi0gICAgICogdGhlIHRlc3QgY291bGQgcHJvYmFibHkgaGFuZyBmb3JldmVyLgotICAgICAqLwotICAgIC8vIEpMOiBjb21tZW50IGV4dHJhY3RlZCBmcm9tIEpVbml0VGFzayAoYW5kIHNsaWdodGx5IG1vZGlmaWVkKQotICAgIHB1YmxpYyBpbnQgZXhlY3V0ZUFzRm9ya2VkKEV4ZWN1dGVXYXRjaGRvZyB3YXRjaGRvZykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsgICAgICAKLSAgICAgICAgLy8gaWYgbm90IHNldCwgYXV0by1jcmVhdGUgdGhlIENsYXNzUGF0aCBmcm9tIHRoZSBwcm9qZWN0Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpOwotCi0gICAgICAgIC8vIG5vdCBzdXJlIHdoZXRoZXIgdGhpcyB0ZXN0IGlzIG5lZWRlZCBidXQgY29zdCBub3RoaW5nIHRvIHB1dC4KLSAgICAgICAgLy8gaG9wZSBpdCB3aWxsIGJlIHJldmlld2VkIGJ5IGFueWJvZHkgY29tcGV0ZW50Ci0gICAgICAgIGlmIChnZXRDbGFzc3BhdGgoKS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIGNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKGdldENsYXNzcGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldE91dHB1dEZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBoYXZpbmcgYSBzcGFjZSBiZXR3ZWVuIHRoZSBmaWxlIGFuZCBpdHMgcGF0aCBjYXVzZXMgY29tbWFuZGxpbmUgdG8gYWRkIHF1b3RlcyAiCi0gICAgICAgICAgICAvLyBhcm91bmQgdGhlIGFyZ3VtZW50IHRodXMgbWFraW5nIEpEZXBlbmQgbm90IHRha2luZyBpdCBpbnRvIGFjY291bnQuIFRodXMgd2Ugc3BsaXQgaXQgaW4gdHdvCi0gICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZmlsZSIpOwotICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShfb3V0cHV0RmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBmaW5kIGEgY2xlYW5lciB3YXkgdG8gcHV0IHRoaXMgb3V0cHV0Ci0gICAgICAgIH0KLQotICAgICAgICBQYXRoVG9rZW5pemVyIHNvdXJjZXNQYXRoID0gbmV3IFBhdGhUb2tlbml6ZXIoZ2V0U291cmNlc3BhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgd2hpbGUgKHNvdXJjZXNQYXRoLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoc291cmNlc1BhdGgubmV4dFRva2VuKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IGFzIEpEZXBlbmQgd291bGQgZmFpbCwgYnV0IHdoeSBsb29zZSBzb21lIHRpbWU/Ci0gICAgICAgICAgICBpZiAoISBmLmV4aXN0cygpIHx8ICFmLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJcIiIrIGYuZ2V0UGF0aCgpICsgIlwiIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGRpcmVjdG9yeS4gSkRlcGVuZCB3b3VsZCBmYWlsLiIpOwotICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShmLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEV4ZWN1dGUgZXhlY3V0ZSA9IG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX1dBUk4pLCB3YXRjaGRvZyk7ICAgICAgICAKLSAgICAgICAgZXhlY3V0ZS5zZXRDb21tYW5kbGluZShjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKLSAgICAgICAgaWYgKGdldERpcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWN1dGUuc2V0V29ya2luZ0RpcmVjdG9yeShnZXREaXIoKSk7Ci0gICAgICAgICAgICBleGVjdXRlLnNldEFudFJ1bihwcm9qZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRPdXRwdXRGaWxlKCkgIT0gbnVsbCkgCi0gICAgICAgICAgICBsb2coIk91cHR1dCB0byBiZSBzdG9yZWQgaW4gIiArIGdldE91dHB1dEZpbGUoKS5nZXRQYXRoKCkpOwotICAgICAgICBsb2coIkV4ZWN1dGluZzogIitjb21tYW5kbGluZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBleGVjdXRlLmV4ZWN1dGUoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9jZXNzIGZvcmsgZmFpbGVkLiIsIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSBpcyBhIHRpbWVvdXQgdmFsdWUsIG90aGVyd2lzZSB0aGUKLSAgICAgKiB3YXRjaGRvZyBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRXhlY3V0ZVdhdGNoZG9nIGNyZWF0ZVdhdGNoZG9nKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgLyoKLSAgICAgICAgICBpZiAoZ2V0VGltZW91dCgpID09IG51bGwpewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbmV3IEV4ZWN1dGVXYXRjaGRvZyhnZXRUaW1lb3V0KCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICovCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamxpbmsvQ2xhc3NOYW1lUmVhZGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9DbGFzc05hbWVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4YzdkMC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9DbGFzc05hbWVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qbGluazsKLQotaW1wb3J0IGphdmEuaW8gLio7Ci0KLS8qKgotICogUmVhZHMganVzdCBlbm91Z2ggb2YgYSBjbGFzcyBmaWxlIHRvIGRldGVybWluZSB0aGUgY2xhc3MnIGZ1bGwgbmFtZS4KLSAqCi0gKiA8cD5FeHRyZW1lbHkgbWluaW1hbCBjb25zdGFudCBwb29sIGltcGxlbWVudGF0aW9uLCBtYWlubHkgdG8gc3VwcG9ydCBleHRyYWN0aW5nCi0gKiBzdHJpbmdzIGZyb20gYSBjbGFzcyBmaWxlLgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YmVhcmRAbmV0c2NhcGUuY29tIj5QYXRyaWNrIEMuIEJlYXJkPC9hPi4KLSAqLwotY2xhc3MgQ29uc3RhbnRQb29sIGV4dGVuZHMgT2JqZWN0ewotCi0gICAgc3RhdGljIGZpbmFsIAotICAgICAgICBieXRlIFVURjggPSAxLCBVTlVTRUQgPSAyLCBJTlRFR0VSID0gMywgRkxPQVQgPSA0LCBMT05HID0gNSwgRE9VQkxFID0gNiwKLSAgICAgICAgQ0xBU1MgPSA3LCBTVFJJTkcgPSA4LCBGSUVMRFJFRiA9IDksIE1FVEhPRFJFRiA9IDEwLAotICAgICAgICBJTlRFUkZBQ0VNRVRIT0RSRUYgPSAxMSwgTkFNRUFORFRZUEUgPSAxMjsKLQotICAgIGJ5dGVbXSB0eXBlczsKLQotICAgIE9iamVjdFtdIHZhbHVlczsKLQotICAgIENvbnN0YW50UG9vbCggRGF0YUlucHV0IGRhdGEgKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotCi0gICAgICAgIGludCBjb3VudCA9IGRhdGEgLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgIHR5cGVzID0gbmV3IGJ5dGUgWyBjb3VudCBdOwotICAgICAgICB2YWx1ZXMgPSBuZXcgT2JqZWN0IFsgY291bnQgXTsKLSAgICAgICAgLy8gcmVhZCBpbiBhbGwgY29uc3RhbnQgcG9vbCBlbnRyaWVzLgotICAgICAgICBmb3IgKCBpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrICkgewotICAgICAgICAgICAgYnl0ZSB0eXBlID0gZGF0YSAucmVhZEJ5dGUoKTsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gdHlwZTsKLSAgICAgICAgICAgIHN3aXRjaCAodHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgVVRGOCA6Ci0gICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gZGF0YSAucmVhZFVURigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgVU5VU0VEIDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIElOVEVHRVIgOgotICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBJbnRlZ2VyKCBkYXRhIC5yZWFkSW50KCkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIEZMT0FUIDoKLSAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgRmxvYXQoIGRhdGEgLnJlYWRGbG9hdCgpICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBMT05HIDoKLSAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgTG9uZyggZGF0YSAucmVhZExvbmcoKSApOwotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIERPVUJMRSA6Ci0gICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gbmV3IERvdWJsZSggZGF0YSAucmVhZERvdWJsZSgpICk7Ci0gICAgICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgQ0xBU1MgOgotICAgICAgICAgICAgY2FzZSBTVFJJTkcgOgotICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBJbnRlZ2VyKCBkYXRhIC5yZWFkVW5zaWduZWRTaG9ydCgpICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBGSUVMRFJFRiA6Ci0gICAgICAgICAgICBjYXNlIE1FVEhPRFJFRiA6Ci0gICAgICAgICAgICBjYXNlIElOVEVSRkFDRU1FVEhPRFJFRiA6Ci0gICAgICAgICAgICBjYXNlIE5BTUVBTkRUWVBFIDoKLSAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgSW50ZWdlciggZGF0YSAucmVhZEludCgpICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQotLyoqCi0gKiBQcm92aWRlcyBhIHF1aWNrIGFuZCBkaXJ0eSB3YXkgdG8gZGV0ZXJtaW5lIHRoZSB0cnVlIG5hbWUgb2YgYSBjbGFzcwotICogZ2l2ZW4ganVzdCBhbiBJbnB1dFN0cmVhbS4gUmVhZHMgaW4ganVzdCBlbm91Z2ggdG8gcGVyZm9ybSB0aGlzCi0gKiBtaW5pbWFsIHRhc2sgb25seS4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzTmFtZVJlYWRlciBleHRlbmRzIE9iamVjdHsKLQotICAgIHB1YmxpYyBzdGF0aWMgCi0gICAgICAgIFN0cmluZyBnZXRDbGFzc05hbWUoIElucHV0U3RyZWFtIGlucHV0ICkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YUlucHV0U3RyZWFtIGRhdGEgPSBuZXcgRGF0YUlucHV0U3RyZWFtKCBpbnB1dCApOwotICAgICAgICAvLyB2ZXJpZnkgdGhpcyBpcyBhIHZhbGlkIGNsYXNzIGZpbGUuCi0gICAgICAgIGludCBjb29raWUgPSBkYXRhIC5yZWFkSW50KCk7Ci0gICAgICAgIGlmICggY29va2llICE9IDB4Q0FGRUJBQkUgKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpbnQgdmVyc2lvbiA9IGRhdGEgLnJlYWRJbnQoKTsKLSAgICAgICAgLy8gcmVhZCB0aGUgY29uc3RhbnQgcG9vbC4KLSAgICAgICAgQ29uc3RhbnRQb29sIGNvbnN0YW50cyA9IG5ldyBDb25zdGFudFBvb2woIGRhdGEgKTsKLSAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gY29uc3RhbnRzIC52YWx1ZXM7Ci0gICAgICAgIC8vIHJlYWQgYWNjZXNzIGZsYWdzIGFuZCBjbGFzcyBpbmRleC4KLSAgICAgICAgaW50IGFjY2Vzc0ZsYWdzID0gZGF0YSAucmVhZFVuc2lnbmVkU2hvcnQoKTsKLSAgICAgICAgaW50IGNsYXNzSW5kZXggPSBkYXRhIC5yZWFkVW5zaWduZWRTaG9ydCgpOwotICAgICAgICBJbnRlZ2VyIHN0cmluZ0luZGV4ID0gKEludGVnZXIpIHZhbHVlc1tjbGFzc0luZGV4XTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIHZhbHVlc1tzdHJpbmdJbmRleCAuaW50VmFsdWUoKV07Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotCi0KLX0KLQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9KbGlua1Rhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL0psaW5rVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjE3MjMyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL0psaW5rVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQgLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzIC4qOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgb2JqZWN0cyB0aGF0IGNhbiBsaW5rIHRvZ2V0aGVyIHZhcmlvdXMgamFyIGFuZAotICogemlwIGZpbGVzLiAKLSAqCi0gKiA8cD5JdCBpcyBiYXNpY2FsbHkgYSB3cmFwcGVyIGZvciB0aGUgamxpbmsgY29kZSB3cml0dGVuIG9yaWdpbmFsbHkKLSAqIGJ5IDxhIGhyZWY9Im1haWx0bzpiZWFyZEBuZXRzY2FwZS5jb20iPlBhdHJpY2sgQmVhcmQ8L2E+LiAgVGhlCi0gKiBjbGFzc2VzIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rLkpsaW5rIGFuZAotICogb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamxpbmsuQ2xhc3NOYW1lUmVhZGVyCi0gKiBzdXBwb3J0IHRoaXMgY2xhc3MuPC9wPgotICoKLSAqIDxwPkZvciBleGFtcGxlOgotICogPGNvZGU+Ci0gKiA8cHJlPgotICogJmx0O2psaW5rIGNvbXByZXNzPSZxdW90O2ZhbHNlJnF1b3Q7IG91dGZpbGU9JnF1b3Q7b3V0LmphciZxdW90Oy8mZ3Q7Ci0gKiAgICZsdDttZXJnZWZpbGVzJmd0OwotICogICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7YnVpbGQuZGlyfS9tZXJnZWZvby5qYXImcXVvdDsvJmd0OwotICogICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7YnVpbGQuZGlyfS9tZXJnZWJhci5qYXImcXVvdDsvJmd0OwotICogICAmbHQ7L21lcmdlZmlsZXMmZ3Q7Ci0gKiAgICZsdDthZGRmaWxlcyZndDsKLSAqICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2J1aWxkLmRpcn0vbWFjLmphciZxdW90Oy8mZ3Q7Ci0gKiAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtidWlsZC5kaXJ9L3BjLnppcCZxdW90Oy8mZ3Q7Ci0gKiAgICZsdDsvYWRkZmlsZXMmZ3Q7Ci0gKiAmbHQ7L2psaW5rJmd0OwotICogPC9wcmU+Ci0gKiA8L2NvZGU+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bWF0dGhldy5rLmhldW5AZ2Flcm9zcGFjZS5jb20iPk1hdHRoZXcgS3VwZXJ1cyBIZXVuPC9hPiAqLwotcHVibGljIGNsYXNzIEpsaW5rVGFzayBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb3V0cHV0IGZpbGUgZm9yIHRoaXMgcnVuIG9mIGpsaW5rLiBVc3VhbGx5IGEgamFyIG9yIHppcCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyAgdm9pZCBzZXRPdXRmaWxlKCBGaWxlIG91dGZpbGUgKSB7Ci0gICAgICAgIHRoaXMub3V0ZmlsZSA9IG91dGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXN0YWJsaXNoZXMgdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBmaWxlcyB0bwotICAgICAqIGJlIG1lcmdlZCBpbnRvIHRoZSBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljICBQYXRoIGNyZWF0ZU1lcmdlZmlsZXMoKSB7Ci0gICAgICAgIGlmICggdGhpcyAubWVyZ2VmaWxlcyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhpcyAubWVyZ2VmaWxlcyA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMgLm1lcmdlZmlsZXMuY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGVzIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljICB2b2lkIHNldE1lcmdlZmlsZXMoIFBhdGggbWVyZ2VmaWxlcyApIHsKLSAgICAgICAgaWYgKCB0aGlzIC5tZXJnZWZpbGVzID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aGlzIC5tZXJnZWZpbGVzID0gbWVyZ2VmaWxlczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMgLm1lcmdlZmlsZXMgLmFwcGVuZCggbWVyZ2VmaWxlcyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXN0YWJsaXNoZXMgdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBmaWxlcyB0bwotICAgICAqIGJlIGFkZGVkIHRvIHRoZSBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljICBQYXRoIGNyZWF0ZUFkZGZpbGVzKCkgewotICAgICAgICBpZiAoIHRoaXMgLmFkZGZpbGVzID09IG51bGwgKSB7Ci0gICAgICAgICAgICB0aGlzIC5hZGRmaWxlcyA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMgLmFkZGZpbGVzIC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZXMgdG8gYmUgYWRkZWQgaW50byB0aGUgb3V0cHV0LgotICAgICAqLwotICAgIHB1YmxpYyAgdm9pZCBzZXRBZGRmaWxlcyggUGF0aCBhZGRmaWxlcyApIHsKLSAgICAgICAgaWYgKCB0aGlzIC5hZGRmaWxlcyA9PSBudWxsICkgewotICAgICAgICAgICAgdGhpcyAuYWRkZmlsZXMgPSBhZGRmaWxlczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMgLmFkZGZpbGVzIC5hcHBlbmQoIGFkZGZpbGVzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBvdXRwdXQgc2hvdWxkIGJlIGNvbXBhY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgIHZvaWQgc2V0Q29tcHJlc3MoIGJvb2xlYW4gY29tcHJlc3MgKSB7Ci0gICAgICAgIHRoaXMgLmNvbXByZXNzID0gY29tcHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgYWRkaW5nIGFuZCBtZXJnaW5nLgotICAgICAqLwotICAgIHB1YmxpYyAgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgLy9CZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gc2V0LgotICAgICAgICBpZiAoIG91dGZpbGUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIm91dGZpbGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkISBQbGVhc2Ugc2V0LiIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWhhdmVBZGRGaWxlcygpICYmICFoYXZlTWVyZ2VGaWxlcygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJhZGRmaWxlcyBvciBtZXJnZWZpbGVzIHJlcXVpcmVkISBQbGVhc2Ugc2V0LiIgKTsKLSAgICAgICAgfQotICAgICAgICBsb2coICJsaW5raW5nOiAgICAgIiArIG91dGZpbGUuZ2V0UGF0aCgpICk7Ci0gICAgICAgIGxvZyggImNvbXByZXNzaW9uOiAiICsgY29tcHJlc3MsIFByb2plY3QuTVNHX1ZFUkJPU0UgKTsKLSAgICAgICAgamxpbmsgbGlua2VyID0gbmV3IGpsaW5rKCk7Ci0gICAgICAgIGxpbmtlciAuc2V0T3V0ZmlsZSggb3V0ZmlsZS5nZXRQYXRoKCkgKTsKLSAgICAgICAgbGlua2VyIC5zZXRDb21wcmVzc2lvbiggY29tcHJlc3MgKTsKLSAgICAgICAgaWYgKGhhdmVNZXJnZUZpbGVzKCkpewotICAgICAgICAgICAgbG9nKCAibWVyZ2UgZmlsZXM6ICIgKyBtZXJnZWZpbGVzIC50b1N0cmluZygpLCBQcm9qZWN0IC5NU0dfVkVSQk9TRSApOwotICAgICAgICAgICAgbGlua2VyIC5hZGRNZXJnZUZpbGVzKCBtZXJnZWZpbGVzIC5saXN0KCkgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGF2ZUFkZEZpbGVzKCkpewotICAgICAgICAgICAgbG9nKCAiYWRkIGZpbGVzOiAiICsgYWRkZmlsZXMgLnRvU3RyaW5nKCksIFByb2plY3QgLk1TR19WRVJCT1NFICk7Ci0gICAgICAgICAgICBsaW5rZXIgLmFkZEFkZEZpbGVzKCBhZGRmaWxlcyAubGlzdCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5ICB7Ci0gICAgICAgICAgICBsaW5rZXIgLmxpbmsoKTsKLSAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCBleCwgbG9jYXRpb24gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlQWRkRmlsZXMoKXsKLSAgICAgICAgcmV0dXJuIGhhdmVFbnRyaWVzKGFkZGZpbGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZU1lcmdlRmlsZXMoKXsKLSAgICAgICAgcmV0dXJuIGhhdmVFbnRyaWVzKG1lcmdlZmlsZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlRW50cmllcyhQYXRoIHApewotICAgICAgICBpZiAocCA9PSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocC5zaXplKCkgPiAwKXsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlICBGaWxlIG91dGZpbGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSAgUGF0aCBtZXJnZWZpbGVzID0gbnVsbDsKLQotICAgIHByaXZhdGUgIFBhdGggYWRkZmlsZXMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSAgYm9vbGVhbiBjb21wcmVzcyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSAgU3RyaW5nIHBzID0gU3lzdGVtIC5nZXRQcm9wZXJ0eSggInBhdGguc2VwYXJhdG9yIiApOwotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamxpbmsvamxpbmsuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL2psaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzM2NzkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamxpbmsvamxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vKioKLSAqIGpsaW5rLmphdmEKLSAqIGxpbmtzIHRvZ2V0aGVyIG11bHRpcGxlIC5qYXIgZmlsZXMKLSAqIAotICogT3JpZ2luYWwgY29kZSBieSBQYXRyaWNrIEJlYXJkLiBNb2RpZmljYXRpb25zIHRvIHdvcmsKLSAqIHdpdGggQU5UIGJ5IE1hdHRoZXcgS3VwZXJ1cyBIZXVuLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJlYXJkQG5ldHNjYXBlLmNvbT5QYXRyaWNrIEMuIEJlYXJkPC9hPi4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1hdHRoZXcuay5oZXVuQGdhZXJvc3BhY2UuY29tPk1hdHRoZXcgS3VwZXJ1cyBIZXVuPC9hPgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rOwotCi1pbXBvcnQgamF2YS5pbyAuKjsKLWltcG9ydCBqYXZhLnV0aWwgLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbCAuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC56aXAgLio7Ci0KLXB1YmxpYyBjbGFzcyBqbGluayBleHRlbmRzIE9iamVjdHsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaWxlIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgamxpbmsuCi0gICAgICovCi0gICAgcHVibGljICB2b2lkIHNldE91dGZpbGUoIFN0cmluZyBvdXRmaWxlICkgewotICAgICAgICBpZiAoIG91dGZpbGUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcyAub3V0ZmlsZSA9IG91dGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGZpbGUgdG8gYmUgbWVyZ2VkIGludG8gdGhlIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgIHZvaWQgYWRkTWVyZ2VGaWxlKCBTdHJpbmcgbWVyZ2VmaWxlICkgewotICAgICAgICBpZiAoIG1lcmdlZmlsZSA9PSBudWxsICkgewotICAgICAgICAgICAgcmV0dXJuIDsKLSAgICAgICAgfQotICAgICAgICBtZXJnZWZpbGVzIC5hZGRFbGVtZW50KCBtZXJnZWZpbGUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZmlsZSB0byBiZSBhZGRlZCBpbnRvIHRoZSBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljICB2b2lkIGFkZEFkZEZpbGUoIFN0cmluZyBhZGRmaWxlICkgewotICAgICAgICBpZiAoIGFkZGZpbGUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkZmlsZXMgLmFkZEVsZW1lbnQoIGFkZGZpbGUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHNldmVyYWwgZmlsZXMgdG8gYmUgbWVyZ2VkIGludG8gdGhlIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgIHZvaWQgYWRkTWVyZ2VGaWxlcyggU3RyaW5nW10gbWVyZ2VmaWxlcyApIHsKLSAgICAgICAgaWYgKCBtZXJnZWZpbGVzID09IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG1lcmdlZmlsZXMgLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgYWRkTWVyZ2VGaWxlKCBtZXJnZWZpbGVzW2ldICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHNldmVyYWwgZmlsZSB0byBiZSBhZGRlZCBpbnRvIHRoZSBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljICB2b2lkIGFkZEFkZEZpbGVzKCBTdHJpbmdbXSBhZGRmaWxlcyApIHsKLSAgICAgICAgaWYgKCBhZGRmaWxlcyA9PSBudWxsICkgewotICAgICAgICAgICAgcmV0dXJuIDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhZGRmaWxlcyAubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICBhZGRBZGRGaWxlKCBhZGRmaWxlc1tpXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG91dHB1dCB3aWxsIGJlIGNvbXByZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljICB2b2lkIHNldENvbXByZXNzaW9uKCBib29sZWFuIGNvbXByZXNzICkgewotICAgICAgICB0aGlzIC5jb21wcmVzc2lvbiA9IGNvbXByZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBsaW5raW5nIG9mIGZpbGVzLgotICAgICAqIEFkZGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgb3V0cHV0IGFzLWlzLiBGb3IgZXhhbXBsZSwgYSAKLSAgICAgKiBqYXIgZmlsZSBpcyBhZGRlZCB0byB0aGUgb3V0cHV0IGFzIGEgamFyIGZpbGUuCi0gICAgICogSG93ZXZlciwgbWVyZ2VmaWxlcyBhcmUgZmlyc3QgZXhhbWluZWQgZm9yIHRoZWlyIHR5cGUuCi0gICAgICogSWYgaXQgaXMgYSBqYXIgb3IgemlwIGZpbGUsIHRoZSBjb250ZW50cyB3aWxsIGJlIGV4dHJhY3RlZAotICAgICAqIGZyb20gdGhlIG1lcmdlZmlsZSBhbmQgZW50ZXJlZCBpbnRvIHRoZSBvdXRwdXQuCi0gICAgICogSWYgYSB6aXAgb3IgamFyIGZpbGUgaXMgZW5jb3VudGVyZWQgaW4gYSBzdWJkaXJlY3RvcnkKLSAgICAgKiBpdCB3aWxsIGJlIGFkZGVkLCBub3QgbWVyZ2VkLgotICAgICAqIElmIGEgZGlyZWN0b3J5IGlzIGVuY291bnRlcmVkLCBpdCBiZWNvbWVzIHRoZSByb290Ci0gICAgICogZW50cnkgb2YgYWxsIHRoZSBmaWxlcyBiZWxvdyBpdC4gIFRodXMsIHlvdSBjYW4KLSAgICAgKiBwcm92aWRlIG11bHRpcGxlLCBkaXNqb2ludCBkaXJlY3RvcmllcywgYXMKLSAgICAgKiBhZGRmaWxlczogdGhleSB3aWxsIGFsbCBiZSBhZGRlZCBpbiBhIHJhdGlvbmFsIAotICAgICAqIG1hbm5lciB0byBvdXRmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyAgdm9pZCBsaW5rKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFppcE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKCBuZXcgRmlsZU91dHB1dFN0cmVhbSggb3V0ZmlsZSApICk7Ci0gICAgICAgIGlmICggY29tcHJlc3Npb24gKSB7Ci0gICAgICAgICAgICBvdXRwdXQgLnNldE1ldGhvZCggWmlwT3V0cHV0U3RyZWFtIC5ERUZMQVRFRCApOwotICAgICAgICAgICAgb3V0cHV0IC5zZXRMZXZlbCggRGVmbGF0ZXIgLkRFRkFVTFRfQ09NUFJFU1NJT04gKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dHB1dCAuc2V0TWV0aG9kKCBaaXBPdXRwdXRTdHJlYW0gLlNUT1JFRCApOwotICAgICAgICB9Ci0gICAgICAgIEVudW1lcmF0aW9uIG1lcmdlcyA9IG1lcmdlZmlsZXMgLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlICggbWVyZ2VzIC5oYXNNb3JlRWxlbWVudHMoKSApIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKFN0cmluZykgbWVyZ2VzIC5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIHBhdGggKTsKLSAgICAgICAgICAgIGlmICggZi5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApIHx8IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCAiLnppcCIgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EbyB0aGUgbWVyZ2UKLSAgICAgICAgICAgICAgICBtZXJnZVppcEphckNvbnRlbnRzKCBvdXRwdXQsIGYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vQWRkIHRoaXMgZmlsZSB0byB0aGUgYWRkZmlsZXMgVmVjdG9yIGFuZCBhZGQgaXQgCi0gICAgICAgICAgICAgICAgLy9sYXRlciBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgICAgICAgICAgICBhZGRBZGRGaWxlKCBwYXRoICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRW51bWVyYXRpb24gYWRkcyA9IGFkZGZpbGVzIC5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoIGFkZHMgLmhhc01vcmVFbGVtZW50cygpICkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBhZGRzIC5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIG5hbWUgKTsKLSAgICAgICAgICAgIGlmICggZiAuaXNEaXJlY3RvcnkoKSApIHsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiaW4gamxpbms6IGFkZGluZyBkaXJlY3RvcnkgY29udGVudHMgb2YgIiArIGYuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICBhZGREaXJDb250ZW50cyggb3V0cHV0LCBmLCBmLmdldE5hbWUoKSArICcvJywgY29tcHJlc3Npb24gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEZpbGUoIG91dHB1dCwgZiwgIiIsIGNvbXByZXNzaW9uICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBvdXRwdXQgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHRyeSAgewotICAgICAgICAgICAgICAgIG91dHB1dCAuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2goIElPRXhjZXB0aW9uIGlvZSApIHt9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljICB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB7Ci0gICAgICAgIC8vIGpsaW5rIG91dHB1dCBpbnB1dDEgLi4uIGlucHV0TgotICAgICAgICBpZiAoIGFyZ3MgLmxlbmd0aCA8IDIgKSB7Ci0gICAgICAgICAgICBTeXN0ZW0gLm91dCAucHJpbnRsbiggInVzYWdlOiBqbGluayBvdXRwdXQgaW5wdXQxIC4uLiBpbnB1dE4iICk7Ci0gICAgICAgICAgICBTeXN0ZW0gLmV4aXQoIDEgKTsKLSAgICAgICAgfQotICAgICAgICBqbGluayBsaW5rZXIgPSBuZXcgamxpbmsoKTsKLSAgICAgICAgbGlua2VyIC5zZXRPdXRmaWxlKCBhcmdzWzBdICk7Ci0gICAgICAgIC8vVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBjb21tYW5kLWxpbmUgdmVyc2lvbiwgd2Ugd2lsbCBvbmx5IGFkZCBmaWxlcyB0byBiZSBtZXJnZWQuCi0gICAgICAgIGZvciAoIGludCBpID0gMTsgaSA8IGFyZ3MgLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgbGlua2VyIC5hZGRNZXJnZUZpbGUoIGFyZ3NbaV0gKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgIHsKLSAgICAgICAgICAgIGxpbmtlciAubGluaygpOwotICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7Ci0gICAgICAgICAgICBTeXN0ZW0gLmVyciAucHJpbnQoIGV4IC5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQWN0dWFsbHkgcGVyZm9ybXMgdGhlIG1lcmdpbmcgb2YgZiBpbnRvIHRoZSBvdXRwdXQuCi0gICAgICogZiBzaG91bGQgYmUgYSB6aXAgb3IgamFyIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlWmlwSmFyQ29udGVudHMoIFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgZiApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGZpbGUgd2l0aCBuYW1lICJuYW1lIiBleGlzdHMuCi0gICAgICAgIGlmICggISBmIC5leGlzdHMoKSApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgWmlwRmlsZSB6aXBmID0gbmV3IFppcEZpbGUoIGYgKTsKLSAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IHppcGYuZW50cmllcygpOwotICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgICBaaXBFbnRyeSBpbnB1dEVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAvL0lnbm9yZSBtYW5pZmVzdCBlbnRyaWVzLiAgVGhleSdyZSBib3VuZCB0byBjYXVzZSBjb25mbGljdHMgYmV0d2VlbgotICAgICAgICAgICAgLy9maWxlcyB0aGF0IGFyZSBiZWluZyBtZXJnZWQuICBVc2VyIHNob3VsZCBzdXBwbHkgdGhlaXIgb3duCi0gICAgICAgICAgICAvL21hbmlmZXN0IGZpbGUgd2hlbiBkb2luZyB0aGUgbWVyZ2UuCi0gICAgICAgICAgICBTdHJpbmcgaW5wdXRFbnRyeU5hbWUgPSBpbnB1dEVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGlucHV0RW50cnlOYW1lLmluZGV4T2YoIk1FVEEtSU5GIik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKXsKLSAgICAgICAgICAgICAgICAvL01FVEEtSU5GIG5vdCBmb3VuZCBpbiB0aGUgbmFtZSBvZiB0aGUgZW50cnkuIEdvIGFoZWFkIGFuZCBwcm9jZXNzIGl0LgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXROZXh0RW50cnkocHJvY2Vzc0VudHJ5KHppcGYsIGlucHV0RW50cnkpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChaaXBFeGNlcHRpb24gZXgpewotICAgICAgICAgICAgICAgICAgICAvL0lmIHdlIGdldCBoZXJlLCBpdCBjb3VsZCBiZSBiZWNhdXNlIHdlIGFyZSB0cnlpbmcgdG8gcHV0IGEKLSAgICAgICAgICAgICAgICAgICAgLy9kaXJlY3RvcnkgZW50cnkgdGhhdCBhbHJlYWR5IGV4aXN0cy4KLSAgICAgICAgICAgICAgICAgICAgLy9Gb3IgZXhhbXBsZSwgd2UncmUgdHJ5aW5nIHRvIHdyaXRlICJjb20iLCBidXQgYSBwcmV2aW91cwotICAgICAgICAgICAgICAgICAgICAvL2VudHJ5IGZyb20gYW5vdGhlciBtZXJnZWZpbGUgd2FzIGNhbGxlZCAiY29tIi4KLSAgICAgICAgICAgICAgICAgICAgLy9JbiB0aGF0IGNhc2UsIGp1c3QgaWdub3JlIHRoZSBlcnJvciBhbmQgZ28gb24gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vbmV4dCBlbnRyeS4KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3MgPSBleC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzLmluZGV4T2YoImR1cGxpY2F0ZSIpID49IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0l0IHdhcyB0aGUgZHVwbGljYXRlIGVudHJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSSBoYXRlIHRvIGFkbWl0IGl0LCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IGhhcHBlbmVkIGhlcmUuICBUaHJvdyB0aGUgRXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSB6aXBmLmdldElucHV0U3RyZWFtKGlucHV0RW50cnkpOwotICAgICAgICAgICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOwotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IC0xOwotICAgICAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgbGVuKSkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZUVudHJ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgemlwZiAuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFkZHMgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgdG8gdGhlIG91dHB1dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkRGlyQ29udGVudHMoIFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgZGlyLCBTdHJpbmcgcHJlZml4LCBib29sZWFuIGNvbXByZXNzICkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gY29udGVudHMgPSBkaXIgLmxpc3QoKTsKLSAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgY29udGVudHMgLmxlbmd0aDsgKytpICkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjb250ZW50c1tpXTsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCBkaXIsIG5hbWUgKTsKLSAgICAgICAgICAgIGlmICggZmlsZSAuaXNEaXJlY3RvcnkoKSApIHsKLSAgICAgICAgICAgICAgICBhZGREaXJDb250ZW50cyggb3V0cHV0LCBmaWxlLCBwcmVmaXggKyBuYW1lICsgJy8nLCBjb21wcmVzcyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkRmlsZSggb3V0cHV0LCBmaWxlLCBwcmVmaXgsIGNvbXByZXNzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYW4gZW50cnkgaW4gdGhlIGZpbGUuICBUaGlzIGlzIHRoZSByZWFsIG5hbWUKLSAgICAgKiB3aGljaCBmb3IgYSBjbGFzcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBjbGFzcwotICAgICAqIG5hbWUgYXBwZW5kZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RW50cnlOYW1lKCBGaWxlIGZpbGUsIFN0cmluZyBwcmVmaXggKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZmlsZSAuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoICEgbmFtZSAuZW5kc1dpdGgoICIuY2xhc3MiICkgKSB7Ci0gICAgICAgICAgICAvLyBzZWUgaWYgdGhlIGZpbGUgaXMgaW4gZmFjdCBhIC5jbGFzcyBmaWxlLCBhbmQgZGV0ZXJtaW5lIGl0cyBhY3R1YWwgbmFtZS4KLSAgICAgICAgICAgIHRyeSAgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZmlsZSApOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBDbGFzc05hbWVSZWFkZXIgLmdldENsYXNzTmFtZSggaW5wdXQgKTsKLSAgICAgICAgICAgICAgICBpbnB1dCAuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoIGNsYXNzTmFtZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lIC5yZXBsYWNlKCAnLicsICcvJyApICsgIi5jbGFzcyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCggSU9FeGNlcHRpb24gaW9lICkge30KLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZyb20gIiArIGZpbGUuZ2V0UGF0aCgpICsgIiBhbmQgcHJlZml4ICIgKyBwcmVmaXggKyAiLCBjcmVhdGluZyBlbnRyeSAiICsgcHJlZml4K25hbWUpOwotICAgICAgICByZXR1cm4gKHByZWZpeCArIG5hbWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQWRkcyBhIGZpbGUgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEZpbGUoIFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgZmlsZSwgU3RyaW5nIHByZWZpeCwgYm9vbGVhbiBjb21wcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy9NYWtlIHN1cmUgZmlsZSBleGlzdHMKLSAgICAgICAgbG9uZyBjaGVja3N1bSA9IDA7Ci0gICAgICAgIGlmICggISBmaWxlIC5leGlzdHMoKSApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoIGdldEVudHJ5TmFtZSggZmlsZSwgcHJlZml4ICkgKTsKLSAgICAgICAgZW50cnkgLnNldFRpbWUoIGZpbGUgLmxhc3RNb2RpZmllZCgpICk7Ci0gICAgICAgIGVudHJ5IC5zZXRTaXplKCBmaWxlIC5sZW5ndGgoKSApOwotICAgICAgICBpZiAoISBjb21wcmVzcyl7Ci0gICAgICAgICAgICBlbnRyeS5zZXRDcmMoY2FsY0NoZWNrc3VtKGZpbGUpKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlICk7Ci0gICAgICAgIGFkZFRvT3V0cHV0U3RyZWFtKG91dHB1dCwgaW5wdXQsIGVudHJ5KTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qCi0gICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBzZXZlcmFsIG90aGVyIG1ldGhvZHMgbWlnaHQgY2FsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9PdXRwdXRTdHJlYW0oWmlwT3V0cHV0U3RyZWFtIG91dHB1dCwgSW5wdXRTdHJlYW0gaW5wdXQsIFppcEVudHJ5IHplKSB0aHJvd3MgSU9FeGNlcHRpb257Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQucHV0TmV4dEVudHJ5KHplKTsgICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoWmlwRXhjZXB0aW9uIHppcEV4KSB7Ci0gICAgICAgICAgICAvL1RoaXMgZW50cnkgYWxyZWFkeSBleGlzdHMuIFNvLCBnbyB3aXRoIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBudW1CeXRlcyA9IC0xOwotICAgICAgICB3aGlsZSgobnVtQnl0ZXMgPSBpbnB1dC5yZWFkKGJ1ZmZlcikpID4gMCl7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBudW1CeXRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0cHV0LmNsb3NlRW50cnkoKTsKLSAgICAgICAgaW5wdXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEEgbWV0aG9kIHRoYXQgZG9lcyB0aGUgd29yayBvbiBhIGdpdmVuIGVudHJ5IGluIGEgbWVyZ2VmaWxlLgotICAgICAqIFRoZSBiaWcgZGVhbCBpcyB0byBzZXQgdGhlIHJpZ2h0IHBhcmFtZXRlcnMgaW4gdGhlIFppcEVudHJ5IAotICAgICAqIG9uIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIHByaXZhdGUgWmlwRW50cnkgcHJvY2Vzc0VudHJ5KCBaaXBGaWxlIHppcCwgWmlwRW50cnkgaW5wdXRFbnRyeSApIHRocm93cyBJT0V4Y2VwdGlvbnsKLSAgICAgICAgLyoKLSAgICAgICAgICBGaXJzdCwgc29tZSBub3Rlcy4KLSAgICAgICAgICBPbiBNUkogMi4yLjIsIGdldHRpbmcgdGhlIHNpemUsIGNvbXByZXNzZWQgc2l6ZSwgYW5kIENSQzMyIGZyb20gdGhlCi0gICAgICAgICAgWmlwSW5wdXRTdHJlYW0gZG9lcyBub3Qgd29yayBmb3IgY29tcHJlc3NlZCAoZGVmbGF0ZWQpIGZpbGVzLiAgVGhvc2UgY2FsbHMgcmV0dXJuIC0xLgotICAgICAgICAgIEZvciB1bmNvbXByZXNzZWQgKHN0b3JlZCkgZmlsZXMsIHRob3NlIGNhbGxzIGRvIHdvcmsuCi0gICAgICAgICAgSG93ZXZlciwgdXNpbmcgWmlwRmlsZS5nZXRFbnRyaWVzKCkgd29ya3MgZm9yIGJvdGggY29tcHJlc3NlZCBhbmQgCi0gICAgICAgICAgdW5jb21wcmVzc2VkIGZpbGVzLgotICAgICAgICAgICAgCi0gICAgICAgICAgTm93LCBmcm9tIHNvbWUgc2ltcGxlIHRlc3RpbmcgSSBkaWQsIGl0IHNlZW1zIHRoYXQgdGhlIHZhbHVlIG9mIENSQy0zMiBpcwotICAgICAgICAgIGluZGVwZW5kZW50IG9mIHRoZSBjb21wcmVzc2lvbiBzZXR0aW5nLiBTbywgaXQgc2hvdWxkIGJlIGVhc3kgdG8gcGFzcyB0aGlzIAotICAgICAgICAgIGluZm9ybWF0aW9uIG9uIHRvIHRoZSBvdXRwdXQgZW50cnkuCi0gICAgICAgICovCi0gICAgICAgIFN0cmluZyBuYW1lID0gaW5wdXRFbnRyeSAuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoICEgKGlucHV0RW50cnkgLmlzRGlyZWN0b3J5KCkgfHwgbmFtZSAuZW5kc1dpdGgoICIuY2xhc3MiICkpICkgewotICAgICAgICAgICAgdHJ5ICB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSB6aXAuZ2V0SW5wdXRTdHJlYW0oIHppcCAuZ2V0RW50cnkoIG5hbWUgKSApOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBDbGFzc05hbWVSZWFkZXIgLmdldENsYXNzTmFtZSggaW5wdXQgKTsKLSAgICAgICAgICAgICAgICBpbnB1dCAuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoIGNsYXNzTmFtZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gY2xhc3NOYW1lIC5yZXBsYWNlKCAnLicsICcvJyApICsgIi5jbGFzcyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCggSU9FeGNlcHRpb24gaW9lICkge30KLSAgICAgICAgfQotICAgICAgICBaaXBFbnRyeSBvdXRwdXRFbnRyeSA9IG5ldyBaaXBFbnRyeSggbmFtZSApOwotICAgICAgICBvdXRwdXRFbnRyeS5zZXRUaW1lKGlucHV0RW50cnkgLmdldFRpbWUoKSApOwotICAgICAgICBvdXRwdXRFbnRyeS5zZXRFeHRyYShpbnB1dEVudHJ5LmdldEV4dHJhKCkpOwotICAgICAgICBvdXRwdXRFbnRyeS5zZXRDb21tZW50KGlucHV0RW50cnkuZ2V0Q29tbWVudCgpKTsKLSAgICAgICAgb3V0cHV0RW50cnkuc2V0VGltZShpbnB1dEVudHJ5LmdldFRpbWUoKSk7Ci0gICAgICAgIGlmIChjb21wcmVzc2lvbil7Ci0gICAgICAgICAgICBvdXRwdXRFbnRyeS5zZXRNZXRob2QoWmlwRW50cnkuREVGTEFURUQpOwotICAgICAgICAgICAgLy9Ob3RlLCBkb24ndCBuZWVkIHRvIHNwZWNpZnkgc2l6ZSBvciBjcmMgZm9yIGNvbXByZXNzZWQgZmlsZXMuCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRwdXRFbnRyeS5zZXRNZXRob2QoWmlwRW50cnkuU1RPUkVEKTsKLSAgICAgICAgICAgIG91dHB1dEVudHJ5LnNldENyYyhpbnB1dEVudHJ5LmdldENyYygpKTsKLSAgICAgICAgICAgIG91dHB1dEVudHJ5LnNldFNpemUoaW5wdXRFbnRyeS5nZXRTaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXRwdXRFbnRyeTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qCi0gICAgICogTmVjZXNzYXJ5IGluIHRoZSBjYXNlIHdoZXJlIHlvdSBhZGQgYSBlbnRyeSB0aGF0Ci0gICAgICogaXMgbm90IGNvbXByZXNzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIGNhbGNDaGVja3N1bShGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKLSAgICAgICAgcmV0dXJuIGNhbGNDaGVja3N1bShpbiwgZi5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOZWNlc3NhcnkgaW4gdGhlIGNhc2Ugd2hlcmUgeW91IGFkZCBhIGVudHJ5IHRoYXQKLSAgICAgKiBpcyBub3QgY29tcHJlc3NlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgY2FsY0NoZWNrc3VtKElucHV0U3RyZWFtIGluLCBsb25nIHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbnsKLSAgICAgICAgQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7Ci0gICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOwotICAgICAgICBpbnQgY291bnQgPSAtMTsKLSAgICAgICAgaW50IGhhdmVSZWFkID0gMDsgCi0gICAgICAgIHdoaWxlKChjb3VudD1pbi5yZWFkKGJ1ZmZlciwgMCwgbGVuKSkgPiAwKXsKLSAgICAgICAgICAgIGhhdmVSZWFkICs9IGNvdW50OwotICAgICAgICAgICAgY3JjLnVwZGF0ZShidWZmZXIsIDAsIGNvdW50KTsKLSAgICAgICAgfQotICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICByZXR1cm4gY3JjLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSAgU3RyaW5nIG91dGZpbGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSAgVmVjdG9yIG1lcmdlZmlsZXMgPSBuZXcgVmVjdG9yKCAxMCApOwotCi0gICAgcHJpdmF0ZSAgVmVjdG9yIGFkZGZpbGVzID0gbmV3IFZlY3RvciggMTAgKTsKLQotICAgIHByaXZhdGUgIGJvb2xlYW4gY29tcHJlc3Npb24gPSBmYWxzZTsKLSAgICAgICAgCi0gICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL1dMSnNwYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL1dMSnNwYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWQ0NWI0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9XTEpzcGMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3A7Ci0KLS8vYXBhY2hlL2FudCBpbXBvcnRzCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci0KLQotLy9qYXZhIGltcG9ydHMKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIENsYXNzIHRvIHByZWNvbXBpbGUgSlNQJ3MgdXNpbmcgd2VibG9naWMncyBqc3AgY29tcGlsZXIgKHdlYmxvZ2ljLmpzcGMpCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmF2aWtAYXZpa3Nlbmd1cHRhLmNvbSI+QXZpayBTZW5ndXB0YTwvYT4gaHR0cDovL3d3dy53ZWJ0ZWtzb2Z0d2FyZS5jb20KLSAqIAotICogVGVzdGVkIG9ubHkgb24gV2VibG9naWMgNC41LjEgLSBOVDQuMCBhbmQgU29sYXJpcyA1LjcKLSAqIAotICogcmVxdWlyZWQgYXR0cmlidXRlcwotICogICAgICBzcmMgOiByb290IG9mIHNvdXJjZSB0cmVlIGZvciBKU1AsIGllLCB0aGUgZG9jdW1lbnQgcm9vdCBmb3IgeW91ciB3ZWJsb2dpYyBzZXJ2ZXIKLSAqICAgICAgZGVzdCA6IHJvb3Qgb2YgZGVzdGluYXRpb24gZGlyZWN0b3J5LCB3aGF0IHlvdSBoYXZlIHNldCBhcyBXb3JraW5nRGlyIGluIHRoZSB3ZWJsb2dpYyBwcm9wZXJ0aWVzCi0gKiAgICAgIHBhY2thZ2UgOiBzdGFydCBwYWNrYWdlIG5hbWUgdW5kZXIgd2hpY2ggeW91ciBKU1AncyB3b3VsZCBiZSBjb21waWxlZAotICogCi0gKiBvdGhlciBhdHRyaWJ1dGVzCi0gKiAgICAgY2xhc3NwYXRoCi0gKiAKLSAqIEEgY2xhc3NwYXRoIHNob3VsZCBiZSBzZXQgd2hpY2ggY29udGFpbnMgdGhlIHdlYmxvZ2ljIGNsYXNzZXMgYXMgd2VsbCBhcyBhbGwgYXBwbGljYXRpb24gY2xhc3NlcwotICogcmVmZXJlbmNlZCBieSB0aGUgSlNQLiBUaGUgc3lzdGVtIGNsYXNzcGF0aCBpcyBhbHNvIGFwcGVuZGVkIHdoZW4gdGhlIGpzcGMgaXMgY2FsbGVkLCBzbyB5b3UgbWF5IAotICogY2hvb3NlIHRvIHB1dCBldmVyeXRoaW5nIGluIHRoZSBjbGFzc3BhdGggd2hpbGUgY2FsbGluZyBBbnQuIEhvd2V2ZXIsIHNpbmNlIHByZXN1bWFibHkgdGhlIEpTUCdzIHdpbGwgcmVmZXJlbmNlCi0gKiBjbGFzc2VzIGJlaW5nIGJ1aWxkIGJ5IEFudCwgaXQgd291bGQgYmUgYmV0dGVyIHRvIGV4cGxpY2l0bHkgYWRkIHRoZSBjbGFzc3BhdGggaW4gdGhlIHRhc2sKLSAqIAotICogVGhlIHRhc2sgY2hlY2tzIHRpbWVzdGFtcHMgb24gdGhlIEpTUCdzIGFuZCB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMsIGFuZCBjb21waWxlcwotICogb25seSB0aG9zZSBmaWxlcyB0aGF0IGhhdmUgY2hhbmdlZC4gCi0gKiAKLSAqIEl0IGZvbGxvd3MgdGhlIHdlYmxvZ2ljIG5hbWluZyBjb252ZW50aW9uIG9mIHB1dHRpbmcgY2xhc3NlcyBpbiAKLSAqICA8Yj4gX2Rpck5hbWUvX2ZpbGVOYW1lLmNsYXNzIGZvciBkaXJuYW1lL2ZpbGVOYW1lLmpzcCAgIDwvYj4KLSAqIAotICogTGltaXRhdGlvbjogSXQgY29tcGlsZXMgdGhlIGZpbGVzIHRocnUgdGhlIENsYXNzaWMgY29tcGlsZXIgb25seS4gCi0gKiBMaW1pdGF0aW9uOiBTaW5jZSBpdCBpcyBteSBleHBlcmllbmNlIHRoYXQgd2VibG9naWMganNwYyB0aHJvd3Mgb3V0IG9mIG1lbW9yeSBlcnJvciBvbiBiZWluZyBnaXZlbiB0b28KLSAqICAgICAgICAgICAgIG1hbnkgZmlsZXMgYXQgb25lIGdvLCBpdCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBvbmUganNwIGZpbGUgZWFjaC4gCi0gKiAKLSAqIDxwcmU+Ci0gKiBleGFtcGxlCi0gKiA8dGFyZ2V0IG5hbWU9ImpzcGNvbXBpbGUiIGRlcGVuZHM9ImNvbXBpbGUiPgotICogICA8d2xqc3BjIHNyYz0iYzpcXHdlYmxvZ2ljXFxteXNlcnZlclxccHVibGljX2h0bWwiIGRlc3Q9ImM6XFx3ZWJsb2dpY1xcbXlzZXJ2ZXJcXHNlcnZlcmNsYXNzZXMiIHBhY2thZ2U9Im15YXBwLmpzcCIgPgotICogICA8Y2xhc3NwYXRoPgotICogICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dlYmxvZ2ljLmNsYXNzcGF0aH0iIC8+Ci0gKiAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y29tcGlsZS5kZXN0fSIgLz4KLSAqICAgICAgPC9jbGFzc3BhdGg+Ci0gKiAKLSAqICAgPC93bGpzcGM+Ci0gKiA8L3RhcmdldD4KLSAqIDwvcHJlPgotICogCi0gKi8KLQotcHVibGljIGNsYXNzIFdMSnNwYyBleHRlbmRzIE1hdGNoaW5nVGFzawotewotICAgIC8vVE9ETyBUZXN0IG9uIG90aGVyIHZlcnNpb25zIG9mIHdlYmxvZ2ljCi0gICAgLy9UT0RPIGFkZCBtb3JlIGF0dHJpYnV0ZXMgdG8gdGhlIHRhc2ssIHRvIHRha2UgY2FyZSBvZiBhbGwganNwYyBvcHRpb25zCi0gICAgLy9UT0RPIFRlc3Qgb24gVW5peAotICAgIAotICAgIHByaXZhdGUgRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeTsgLy9yb290IG9mIGNvbXBpbGVkIGZpbGVzIHRyZWUKLSAgICBwcml2YXRlIEZpbGUgc291cmNlRGlyZWN0b3J5OyAvLyByb290IG9mIHNvdXJjZSBmaWxlcyB0cmVlCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb25QYWNrYWdlOyAvL3BhY2thZ2UgdW5kZXIgd2hpY2ggcmVzdWx0YW50IGNsYXNzZXMgd2lsbCByZXNpZGUKLSAgICBwcml2YXRlIFBhdGggY29tcGlsZUNsYXNzcGF0aDsgLy9jbGFzc3BhdGggdXNlZCB0byBjb21waWxlIHRoZSBqc3AgZmlsZXMuIAotICAgIC8vcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXJQYXRoOyAvL2Z1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgY29tcGlsZXIgZXhlY3V0YWJsZQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHBhdGhUb1BhY2thZ2UgPSAiIjsKLSAgICBwcml2YXRlIFZlY3RvciBmaWxlc1RvRG8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZGVzdGluYXRpb25EaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0aW5hdGlvbiBkaXJlY3RvcnkgIiArIGRlc3RpbmF0aW9uRGlyZWN0b3J5LmdldFBhdGgoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IHZhbGlkIik7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKCFzb3VyY2VEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgZGlyZWN0b3J5ICIgKyBzb3VyY2VEaXJlY3RvcnkuZ2V0UGF0aCgpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3QgdmFsaWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0aW5hdGlvblBhY2thZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYWNrYWdlIGF0dHJpYnV0ZSBtdXN0IGJlIHByZXNlbnQuIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHN5c3RlbUNsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0gICAgICAgIAotICAgICAgICBwYXRoVG9QYWNrYWdlID0gdGhpcy5kZXN0aW5hdGlvblBhY2thZ2UucmVwbGFjZSgnLicsRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgLy8gZ2V0IGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZURpcmVjdG9yeQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzb3VyY2VEaXJlY3RvcnkpOwotCi0gICAgICAgIC8vdXNlIHRoZSBzeXN0ZW1jbGFzc3BhdGggYXMgd2VsbCwgdG8gaW5jbHVkZSB0aGUgYW50IGphcgotICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNvbXBpbGVDbGFzc3BhdGguYXBwZW5kKFBhdGguc3lzdGVtQ2xhc3NwYXRoKTsKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgIAotICAgICAgICAvL1dlYmxvZ2ljLmpzcGMgY2FsbHMgU3lzdGVtLmV4aXQoKSAuLi4gaGF2ZSB0byBmb3JrCi0gICAgICAgIC8vIFRoZXJlZm9yZSwgdGFrZXMgbG9hZHMgb2YgdGltZSAKLSAgICAgICAgLy8gQ2FuIHBhc3MgZGlyZWN0b3JpZXMgYXQgYSB0aW1lICgqLmpzcCkgYnV0IGVhc2lseSBydW5zIG91dCBvZiBtZW1vcnkgb24gaGVmdHkgZGlycyAKLSAgICAgICAgLy8gKGV2ZW4gb24gIGEgU3VuKQotICAgICAgICBKYXZhIGhlbHBlclRhc2sgPSAoSmF2YSlwcm9qZWN0LmNyZWF0ZVRhc2soImphdmEiKTsKLSAgICAgICAgaGVscGVyVGFzay5zZXRGb3JrKHRydWUpOwotICAgICAgICBoZWxwZXJUYXNrLnNldENsYXNzbmFtZSgid2VibG9naWMuanNwYyIpOwotICAgICAgICBoZWxwZXJUYXNrLnNldFRhc2tOYW1lKGdldFRhc2tOYW1lKCkpOwotICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1sxMl07Ci0gICAgICAgIAotICAgICAgICBGaWxlIGpzcEZpbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgcGFyZW50cyA9ICIiOwotICAgICAgICBTdHJpbmcgYXJnID0gIiI7Ci0gICAgICAgIGludCBqPTA7Ci0gICAgICAgIC8vWFhYICB0aGlzIGFycmF5IHN0dWZmIGlzIGEgcmVtbmFudCBvZiBwcmV2IHRyaWFscy4uIGdvdHRhIHJlbW92ZS4gCi0gICAgICAgIGFyZ3NbaisrXSA9ICItZCI7Ci0gICAgICAgIGFyZ3NbaisrXSA9IGRlc3RpbmF0aW9uRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpLnRyaW0oKTsgCi0gICAgICAgIGFyZ3NbaisrXSA9ICItZG9jcm9vdCI7Ci0gICAgICAgIGFyZ3NbaisrXSA9IHNvdXJjZURpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKS50cmltKCk7Ci0gICAgICAgIGFyZ3NbaisrXSA9ICIta2VlcGdlbmVyYXRlZCI7ICAvL1RPRE86IFBhcmFtZXRlcmlzZSA/PwotICAgICAgICAvL0NhbGwgY29tcGlsZXIgYXMgY2xhc3MuLi4gZG9udCB3YW50IHRvIGZvcmsgYWdhaW4gCi0gICAgICAgIC8vVXNlIGNsYXNzaWMgY29tcGlsZXIgLS0gY2FuIGJlIHBhcmFtZXRlcmlzZWQ/Ci0gICAgICAgIGFyZ3NbaisrXSA9ICAiLWNvbXBpbGVyY2xhc3MiOwotICAgICAgICBhcmdzW2orK10gPSAic3VuLnRvb2xzLmphdmFjLk1haW4iOwotICAgICAgICAvL1dlYmxvZ2ljIGpzcGMgZG9lcyBub3Qgc2VlbSB0byB3b3JrIHVubGVzcyB1IGV4cGxpY2l0bHkgc2V0IHRoaXMuLi4KLSAgICAgICAgLy8gRG9lcyBub3QgdGFrZSB0aGUgY2xhc3NwYXRoIGZyb20gdGhlIGVudi4uLi4KLSAgICAgICAgLy8gQW0gaSBtaXNzaW5nIHNvbWV0aGluZyBhYm91dCB0aGUgSmF2YSB0YXNrPz8KLSAgICAgICAgYXJnc1tqKytdID0gIi1jbGFzc3BhdGgiOwotICAgICAgICBhcmdzW2orK10gPSBjb21waWxlQ2xhc3NwYXRoLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgdGhpcy5zY2FuRGlyKGZpbGVzKTsKLSAgICAgICAgbG9nKCJDb21waWxpbmcgIitmaWxlc1RvRG8uc2l6ZSgpICsgIiBKU1AgZmlsZXMiKTsKLSAgICAgICAgICAgIAotICAgICAgICBmb3IgKGludCBpPTA7aTxmaWxlc1RvRG8uc2l6ZSgpO2krKykgewotICAgICAgICAgICAgLy9YWFgKLSAgICAgICAgICAgIC8vIEFsbCB0aGlzIHRvIGdldCBwYWNrYWdlIGFjY29yZGluZyB0byB3ZWJsb2dpYyBzdGFuZGFyZHMKLSAgICAgICAgICAgIC8vIENhbiBiZSB3cml0dGVuIGJldHRlci4uLiB0aGlzIGlzIHRvbyBoYWNreSEgCi0gICAgICAgICAgICAvLyBDYXJlZnVsLi4gc2ltaWxhciBjb2RlIGluIHNjYW5EaXIgLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50ISEKLSAgICAgICAgICAgIGpzcEZpbGUgPSBuZXcgRmlsZSgoU3RyaW5nKSBmaWxlc1RvRG8uZWxlbWVudEF0KGkpKTsKLSAgICAgICAgICAgIGFyZ3Nbal0gPSAiLXBhY2thZ2UiOwotICAgICAgICAgICAgcGFyZW50cyA9IGpzcEZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoKHBhcmVudHMgIT0gbnVsbCkgICYmICghKCIiKS5lcXVhbHMocGFyZW50cykpKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50cyA9ICB0aGlzLnJlcGxhY2VTdHJpbmcocGFyZW50cyxGaWxlLnNlcGFyYXRvciwiXy4iKTsKLSAgICAgICAgICAgICAgICBhcmdzW2orMV0gPSBkZXN0aW5hdGlvblBhY2thZ2UgKyIuIisgIl8iK3BhcmVudHM7ICAgCi0gICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXJnc1tqKzFdID0gZGVzdGluYXRpb25QYWNrYWdlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFyZ3NbaisyXSA9ICBzb3VyY2VEaXJlY3RvcnkrRmlsZS5zZXBhcmF0b3IrKFN0cmluZykgZmlsZXNUb0RvLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGFyZz0iIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgeD0wO3g8MTI7eCsrKSB7Ci0gICAgICAgICAgICAgICAgYXJnICs9ICIgIisgYXJnc1t4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhcmcgPSAiICsgYXJnKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaGVscGVyVGFzay5jbGVhckFyZ3MoKTsKLSAgICAgICAgICAgIGhlbHBlclRhc2suc2V0QXJncyhhcmcpOwotICAgICAgICAgICAgaGVscGVyVGFzay5zZXRDbGFzc3BhdGgoY29tcGlsZUNsYXNzcGF0aCk7Ci0gICAgICAgICAgICBpZiAoaGVscGVyVGFzay5leGVjdXRlSmF2YSgpICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbG9nKGZpbGVzW2ldICsgIiBmYWlsZWQgdG8gY29tcGlsZSIsUHJvamVjdC5NU0dfV0FSTikgOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKLSAgICAgICAgaWYgKGNvbXBpbGVDbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXliZSBjcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGNvbXBpbGVDbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21waWxlQ2xhc3NwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBqc3AncwotICAgICAqIAotICAgICAqCi0gICAgICogQHBhcmFtIGRpck5hbWUgdGhlIGRpcmVjdG9yeSBjb250YWluZyB0aGUgc291cmNlIGpzcCdzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgZGlyTmFtZSkgewotICAgICAgICAKLSAgICAgICAgc291cmNlRGlyZWN0b3J5ID0gZGlyTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgIC8qKgotICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBqc3AncwotICAgICAqIAotICAgICAqCi0gICAgICogQHBhcmFtIGRpck5hbWUgdGhlIGRpcmVjdG9yeSBjb250YWluZyB0aGUgc291cmNlIGpzcCdzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRpck5hbWUpIHsKLSAgICAgICAgCi0gICAgICAgIGRlc3RpbmF0aW9uRGlyZWN0b3J5ID0gZGlyTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwYWNrYWdlIHVuZGVyIHdoaWNoIHRoZSBjb21waWxlZCBjbGFzc2VzIGdvCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBwYWNrYWdlIG5hbWUgZm9yIHRoZSBjbGFzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAKLSAgICAgICAgZGVzdGluYXRpb25QYWNrYWdlPXBhY2thZ2VOYW1lOyAKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NhbkRpcihTdHJpbmcgZmlsZXNbXSkgewotCi0gICAgICAgIGxvbmcgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKLSAgICAgICAgRmlsZSBqc3BGaWxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHBhcmVudHMgPSBudWxsOwotICAgICAgICBTdHJpbmcgcGFjayA9ICIiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZSh0aGlzLnNvdXJjZURpcmVjdG9yeSwgZmlsZXNbaV0pOwotICAgICAgICAgICAgLy9YWFgKLSAgICAgICAgICAgIC8vIEFsbCB0aGlzIHRvIGNvbnZlcnQgc291cmNlIHRvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhY2NvcmRpbmcgdG8gd2VibG9naWMgc3RhbmRhcmRzCi0gICAgICAgICAgICAvLyBDYW4gYmUgd3JpdHRlbiBiZXR0ZXIuLi4gdGhpcyBpcyB0b28gaGFja3khCi0gICAgICAgICAgICBqc3BGaWxlID0gbmV3IEZpbGUoZmlsZXNbaV0pOwotICAgICAgICAgICAgcGFyZW50cyA9IGpzcEZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpbnQgbG9jPTA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICgocGFyZW50cyAhPSBudWxsKSAgJiYgKCEoIiIpLmVxdWFscyhwYXJlbnRzKSkpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRzID0gIHRoaXMucmVwbGFjZVN0cmluZyhwYXJlbnRzLEZpbGUuc2VwYXJhdG9yLCJfLyIpOwotICAgICAgICAgICAgICAgIHBhY2sgPSBwYXRoVG9QYWNrYWdlICtGaWxlLnNlcGFyYXRvcisgIl8iK3BhcmVudHM7ICAKLSAgICAgICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgICAgICBwYWNrID0gcGF0aFRvUGFja2FnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gcGFjayArIEZpbGUuc2VwYXJhdG9yICsgIl8iOwotICAgICAgICAgICAgaW50IHN0YXJ0aW5nSW5kZXggCi0gICAgICAgICAgICAgICAgPSBmaWxlc1tpXS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikgIT0gLTEgPyBmaWxlc1tpXS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikgKyAxIDogMDsKLSAgICAgICAgICAgIGludCBlbmRpbmdJbmRleCA9IGZpbGVzW2ldLmluZGV4T2YoIi5qc3AiKTsKLSAgICAgICAgICAgIGlmIChlbmRpbmdJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaWxlUGF0aCArPSBmaWxlc1tpXS5zdWJzdHJpbmcoc3RhcnRpbmdJbmRleCwgZW5kaW5nSW5kZXgpOwotICAgICAgICAgICAgZmlsZVBhdGggKz0gIi5jbGFzcyI7Ci0gICAgICAgICAgICBGaWxlIGNsYXNzRmlsZSA9IG5ldyBGaWxlKHRoaXMuZGVzdGluYXRpb25EaXJlY3RvcnksIGZpbGVQYXRoKTsKLQotICAgICAgICAgICAgaWYgKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPiBub3cpIHsKLSAgICAgICAgICAgICAgICBsb2coIldhcm5pbmc6IGZpbGUgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZTogIiArCi0gICAgICAgICAgICAgICAgICAgIGZpbGVzW2ldLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNGaWxlLmxhc3RNb2RpZmllZCgpID4gY2xhc3NGaWxlLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAvL2xvZygiRmlsZXMgYXJlIiArIHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkrIiAiICtjbGFzc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIGZpbGVzVG9Eby5hZGRFbGVtZW50KGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICBsb2coIlJlY29tcGlsaW5nIEZpbGUgIitmaWxlc1tpXSxQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlcGxhY2VTdHJpbmcoU3RyaW5nIGlucFN0cmluZyxTdHJpbmcgZXNjYXBlQ2hhcnMsU3RyaW5nIHJlcGxhY2VDaGFycykgewotICAgICAgICBTdHJpbmcgbG9jYWxTdHJpbmc9IiI7Ci0gICAgICAgIGludCBudW1Ub2tlbnM9MDsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0PW5ldyBTdHJpbmdUb2tlbml6ZXIoaW5wU3RyaW5nLGVzY2FwZUNoYXJzLHRydWUpOwotICAgICAgICBudW1Ub2tlbnM9c3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgZm9yKGludCBpPTA7aTxudW1Ub2tlbnM7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdGVzdD1zdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIHRlc3Q9KHRlc3QuZXF1YWxzKGVzY2FwZUNoYXJzKT9yZXBsYWNlQ2hhcnM6dGVzdCk7Ci0gICAgICAgICAgICBsb2NhbFN0cmluZys9dGVzdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbG9jYWxTdHJpbmc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQWdncmVnYXRlVHJhbnNmb3JtZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0FnZ3JlZ2F0ZVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODFiZDkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQWdncmVnYXRlVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIFRyYW5zZm9ybSBhIEpVbml0IHhtbCByZXBvcnQuCi0gKiBUaGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbiBnZW5lcmF0ZXMgYW4gaHRtbCByZXBvcnQgaW4gZWl0aGVyIGZyYW1lZCBvciBub24tZnJhbWVkCi0gKiBzdHlsZS4gVGhlIG5vbi1mcmFtZWQgc3R5bGUgaXMgY29udmVuaWVudCB0byBoYXZlIGEgY29uY2lzZSByZXBvcnQgdmlhIG1haWwsIHRoZQotICogZnJhbWVkIHJlcG9ydCBpcyBtdWNoIG1vcmUgY29udmVuaWVudCBpZiB5b3Ugd2FudCB0byBicm93c2UgaW50byBkaWZmZXJlbnQKLSAqIHBhY2thZ2VzIG9yIHRlc3RjYXNlcyBzaW5jZSBpdCBpcyBhIEphdmFkb2MgbGlrZSByZXBvcnQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGFwYWNoZS5vcmciPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgQWdncmVnYXRlVHJhbnNmb3JtZXIgewotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVTID0gImZyYW1lcyI7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT0ZSQU1FUyA9ICJub2ZyYW1lcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1hdCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCl7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0ZSQU1FUywgTk9GUkFNRVN9OwotCQl9Ci0JfQotCi0gICAgLyoqIFRhc2sgKi8KLSAgICBwcm90ZWN0ZWQgVGFzayB0YXNrOwotCi0gICAgLyoqIHRoZSB4bWwgZG9jdW1lbnQgdG8gcHJvY2VzcyAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQotICAgIC8qKiB0aGUgc3R5bGUgZGlyZWN0b3J5LiBYU0xzIHNob3VsZCBiZSByZWFkIGZyb20gaGVyZSBpZiBuZWNlc3NhcnkgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBzdHlsZURpcjsKLQotICAgIC8qKiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCB0aGlzIGlzIHRoZSByb290IGZyb20gd2hlcmUgaHRtbCBzaG91bGQgYmUgZ2VuZXJhdGVkICovCi0gICAgcHJvdGVjdGVkIEZpbGUgdG9EaXI7Ci0KLSAgICAvKiogdGhlIGZvcm1hdCB0byB1c2UgZm9yIHRoZSByZXBvcnQuIE11c3QgYmUgPHR0PkZSQU1FUzwvdHQ+IG9yIDx0dD5OT0ZSQU1FUzwvdHQ+ICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXQ7Ci0KLSAgICAvKiogWE1MIFBhcnNlciBmYWN0b3J5ICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIHB1YmxpYyBBZ2dyZWdhdGVUcmFuc2Zvcm1lcihUYXNrIHRhc2spewotICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChGb3JtYXQgZm9ybWF0KXsKLSAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYbWxEb2N1bWVudChEb2N1bWVudCBkb2MpewotICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgeG1sIGZpbGUgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGlzIGEgaGVscGVyIGlmIHlvdSB3YW50Ci0gICAgICogdG8gc2V0IHRoZSBmaWxlIGRpcmVjdGx5LiBNdWNoIG1vcmUgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0gICAgICogQHBhcmFtIHhtbGZpbGUgeG1sIGZpbGUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0WG1sZmlsZShGaWxlIHhtbGZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGRiZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh4bWxmaWxlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShpbik7Ci0gICAgICAgICAgICAgICAgc2V0WG1sRG9jdW1lbnQoZG9jKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBwYXJzaW5nIGRvY3VtZW50OiAiICsgeG1sZmlsZSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgdGhlIHN0eWxlIGRpcmVjdG9yeS4gSXQgaXMgb3B0aW9uYWwgYW5kIHdpbGwgb3ZlcnJpZGUgdGhlCi0gICAgICogZGVmYXVsdCB4c2wgdXNlZC4KLSAgICAgKiBAcGFyYW0gc3R5bGVkaXIgIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgeHNsIGZpbGVzIGlmIHRoZSB1c2VyCi0gICAgICogd291bGQgbGlrZSB0byBvdmVycmlkZSB3aXRoIGl0cyBvd24gc3R5bGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGVkaXIoRmlsZSBzdHlsZWRpcil7Ci0gICAgICAgIHRoaXMuc3R5bGVEaXIgPSBzdHlsZWRpcjsKLSAgICB9Ci0KLSAgICAvKiogc2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb2RpcihGaWxlIHRvZGlyKXsKLSAgICAgICAgdGhpcy50b0RpciA9IHRvZGlyOwotICAgIH0KLQotICAgIC8qKiBzZXQgdGhlIGV4dGVuc2lvbiBvZiB0aGUgb3V0cHV0IGZpbGVzICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uKFN0cmluZyBleHQpewotICAgICAgICB0YXNrLmxvZygiZXh0ZW5zaW9uIGlzIG5vdCB1c2VkIGFueW1vcmUiLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBjaGVja09wdGlvbnMoKTsKLSAgICAgICAgZmluYWwgbG9uZyB0MCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBYYWxhbkV4ZWN1dG9yIGV4ZWN1dG9yID0gWGFsYW5FeGVjdXRvci5uZXdJbnN0YW5jZSh0aGlzKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvcnMgd2hpbGUgYXBwbHlpbmcgdHJhbnNmb3JtYXRpb25zIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgbG9uZyBkdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDA7Ci0gICAgICAgIHRhc2subG9nKCJUcmFuc2Zvcm0gdGltZTogIiArIGR0ICsgIm1zIik7Ci0gICAgfQotCi0gICAgLyoqIGNoZWNrIGZvciBpbnZhbGlkIG9wdGlvbnMgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja09wdGlvbnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAvLyBzZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSByZWxhdGl2ZSBmcm9tIHRoZSBwcm9qZWN0IGlmIG5lZWRlZC4KLSAgICAgICAgaWYgKHRvRGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRvRGlyID0gdGFzay5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIi4iKTsKLSAgICAgICAgfSBlbHNlIGlmICggIXRvRGlyLmlzQWJzb2x1dGUoKSApIHsKLSAgICAgICAgICAgIHRvRGlyID0gdGFzay5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUodG9EaXIuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3lzdGVtaWQgb2YgdGhlIGFwcHJvcHJpYXRlIHN0eWxlc2hlZXQgYmFzZWQgb24gaXRzCi0gICAgICogbmFtZSBhbmQgc3R5bGVkaXIuIElmIG5vIHN0eWxlZGlyIGlzIGRlZmluZWQgaXQgd2lsbCBsb2FkCi0gICAgICogaXQgYXMgYSBqYXZhIHJlc291cmNlIGluIHRoZSB4c2wgY2hpbGQgcGFja2FnZSwgb3RoZXJ3aXNlIGl0Ci0gICAgICogd2lsbCBnZXQgaXQgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdGhyb3duIGlmIHRoZSByZXF1ZXN0ZWQgc3R5bGVzaGVldCBkb2VzCi0gICAgICogbm90IGV4aXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3R5bGVzaGVldFN5c3RlbUlkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhzbG5hbWUgPSAianVuaXQtZnJhbWVzLnhzbCI7Ci0gICAgICAgIGlmIChOT0ZSQU1FUy5lcXVhbHMoZm9ybWF0KSl7Ci0gICAgICAgICAgICB4c2xuYW1lID0gImp1bml0LW5vZnJhbWVzLnhzbCI7Ci0gICAgICAgIH0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIGlmIChzdHlsZURpciA9PSBudWxsKXsKLSAgICAgICAgICAgIHVybCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoInhzbC8iICsgeHNsbmFtZSk7Ci0gICAgICAgICAgICBpZiAodXJsID09IG51bGwpewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGphciByZXNvdXJjZSAiICsgeHNsbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShzdHlsZURpciwgeHNsbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGZpbGUgJyIgKyBmaWxlICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVybC50b0V4dGVybmFsRm9ybSgpOwotICAgIH0KLQotfQotCi0vKioKLSAqIENvbW1hbmQgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZSBzcGVjaWZpYyBiZWhhdmlvciBmb3IgZWFjaAotICogWGFsYW4gdmVyc2lvbi4gVGhlIHJpZ2h0IGV4ZWN1dG9yIHdpbGwgYmUgaW5zdGFudGlhdGVkIGF0Ci0gKiBydW50aW1lIHZpYSBjbGFzcyBsb29rdXAuIEZvciBpbnN0YW5jZSwgaXQgd2lsbCBjaGVjayBmaXJzdAotICogZm9yIFhhbGFuMiwgdGhlbiBmb3IgWGFsYW4xLgotICovCi1hYnN0cmFjdCBjbGFzcyBYYWxhbkV4ZWN1dG9yIHsKLSAgICAvKiogdGhlIHRyYW5zZm9ybWVyIGNhbGxlciAqLwotICAgIHByb3RlY3RlZCBBZ2dyZWdhdGVUcmFuc2Zvcm1lciBjYWxsZXI7Ci0KLSAgICAvKiogc2V0IHRoZSBjYWxsZXIgZm9yIHRoaXMgb2JqZWN0LiAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBzZXRDYWxsZXIoQWdncmVnYXRlVHJhbnNmb3JtZXIgY2FsbGVyKXsKLSAgICAgICAgdGhpcy5jYWxsZXIgPSBjYWxsZXI7Ci0gICAgfQotCi0gICAgLyoqIGdldCB0aGUgYXBwcm9wcmlhdGUgc3RyZWFtIGJhc2VkIG9uIHRoZSBmb3JtYXQgKGZyYW1lcy9ub2ZyYW1lcykgKi8KLSAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjYWxsZXIuRlJBTUVTLmVxdWFscyhjYWxsZXIuZm9ybWF0KSl7Ci0gICAgICAgICAgICAvLyBkdW1teSBvdXRwdXQgZm9yIHRoZSBmcmFtZWQgcmVwb3J0Ci0gICAgICAgICAgICAvLyBpdCdzIGFsbCBkb25lIGJ5IGV4dGVuc2lvbi4uLgotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShjYWxsZXIudG9EaXIsICJqdW5pdC1ub2ZyYW1lcy5odG1sIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIG92ZXJyaWRlIHRvIHBlcmZvcm0gdHJhbnNmb3JtYXRpb24gKi8KLSAgICBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdmFsaWQgWGFsYW4gZXhlY3V0b3IuIEl0IGNoZWNrcyBmaXJzdCBpZiBYYWxhbjIgaXMKLSAgICAgKiBwcmVzZW50LCBpZiBub3QgaXQgY2hlY2tzIGZvciB4YWxhbjEuIElmIG5vbmUgaXMgYXZhaWxhYmxlLCBpdAotICAgICAqIGZhaWxzLgotICAgICAqIEBwYXJhbSBjYWxsZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRyYW5zZm9ybWF0aW9uIGluZm9ybWF0aW9uLgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdGhyb3duIGlmIGl0IGNvdWxkIG5vdCBmaW5kIGEgdmFsaWQgeGFsYW4KLSAgICAgKiBleGVjdXRvci4KLSAgICAgKi8KLSAgICBzdGF0aWMgWGFsYW5FeGVjdXRvciBuZXdJbnN0YW5jZShBZ2dyZWdhdGVUcmFuc2Zvcm1lciBjYWxsZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIHByb2NWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgWGFsYW5FeGVjdXRvciBleGVjdXRvciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9jVmVyc2lvbiA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFByb2Nlc3NvclZlcnNpb24iKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yID0gbmV3IFhhbGFuMkV4ZWN1dG9yKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4YWxhbjJtaXNzaW5nKXsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvY1ZlcnNpb24gPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMUHJvY2Vzc29yVmVyc2lvbiIpOwotICAgICAgICAgICAgICAgIGV4ZWN1dG9yID0gbmV3IFhhbGFuMUV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geGFsYW4xbWlzc2luZyl7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCB4YWxhbjIgbm9yIHhhbGFuMSBpbiB0aGUgY2xhc3NwYXRoLiBDaGVjayBodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4taiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gZ2V0WGFsYW5WZXJzaW9uKHByb2NWZXJzaW9uKTsKLSAgICAgICAgY2FsbGVyLnRhc2subG9nKCJVc2luZyBYYWxhbiB2ZXJzaW9uOiAiICsgdmVyc2lvbik7Ci0gICAgICAgIGV4ZWN1dG9yLnNldENhbGxlcihjYWxsZXIpOwotICAgICAgICByZXR1cm4gZXhlY3V0b3I7Ci0gICAgfQotCi0gICAgLyoqIHByZXR0eSB1c2VmdWwgZGF0YSAoWGFsYW4gdmVyc2lvbiBpbmZvcm1hdGlvbikgdG8gZGlzcGxheS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0WGFsYW5WZXJzaW9uKENsYXNzIHByb2NWZXJzaW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWVsZCBmID0gcHJvY1ZlcnNpb24uZ2V0RmllbGQoIlNfVkVSU0lPTiIpOwotICAgICAgICAgICAgcmV0dXJuIGYuZ2V0KG51bGwpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHJldHVybiAiPyI7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogWGFsYW4gZXhlY3V0b3IgdmlhIEpBWFAuIE5vdGhpbmcgc3BlY2lhbCBtdXN0IGV4aXN0cyBpbiB0aGUgY2xhc3NwYXRoCi0gKiBiZXNpZGVzIG9mIGNvdXJzZSwgYSBwYXJzZXIsIGpheHAgYW5kIHhhbGFuLgotICovCi1jbGFzcyBYYWxhbjJFeGVjdXRvciBleHRlbmRzIFhhbGFuRXhlY3V0b3IgewotICAgIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHN5c3RlbV9pZCA9IGNhbGxlci5nZXRTdHlsZXNoZWV0U3lzdGVtSWQoKTsKLSAgICAgICAgU291cmNlIHhzbF9zcmMgPSBuZXcgU3RyZWFtU291cmNlKHN5c3RlbV9pZCk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHRmb3JtZXIgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcih4c2xfc3JjKTsKLSAgICAgICAgU291cmNlIHhtbF9zcmMgPSBuZXcgRE9NU291cmNlKGNhbGxlci5kb2N1bWVudCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IGdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICB0Zm9ybWVyLnNldFBhcmFtZXRlcigib3V0cHV0LmRpciIsIGNhbGxlci50b0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLSAgICAgICAgdGZvcm1lci50cmFuc2Zvcm0oeG1sX3NyYywgcmVzdWx0KTsKLSAgICB9Ci19Ci0KLS8qKgotICogWGFsYW4gMSBleGVjdXRvci4gSXQgd2lsbCBuZWVkIGEgbG90IG9mIHRoaW5ncyBpbiB0aGUgY2xhc3NwYXRoOgotICogeGVyY2VzIGZvciB0aGUgc2VyaWFsaXphdGlvbiwgeGFsYW4gYW5kIGJzZiBmb3IgdGhlIGV4dGVuc2lvbi4KLSAqIEB0b2RvIGRvIGV2ZXJ5dGhpbmcgdmlhIHJlZmxlY3Rpb24gdG8gYXZvaWQgY29tcGlsZSBwcm9ibGVtcyA/Ci0gKi8KLWNsYXNzIFhhbGFuMUV4ZWN1dG9yIGV4dGVuZHMgWGFsYW5FeGVjdXRvciB7Ci0gICAgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFhTTFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gWFNMVFByb2Nlc3NvckZhY3RvcnkuZ2V0UHJvY2Vzc29yKCk7Ci0gICAgICAgIC8vIG5lZWQgdG8gcXVvdGUgb3RoZXJ3aXNlIGl0IGJyZWFrcyBiZWNhdXNlIG9mICJleHRyYSBpbGxlZ2FsIHRva2VucyIKLSAgICAgICAgcHJvY2Vzc29yLnNldFN0eWxlc2hlZXRQYXJhbSgib3V0cHV0LmRpciIsICInIiArIGNhbGxlci50b0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSArICInIik7Ci0gICAgICAgIFhTTFRJbnB1dFNvdXJjZSB4bWxfc3JjID0gbmV3IFhTTFRJbnB1dFNvdXJjZShjYWxsZXIuZG9jdW1lbnQpOwotICAgICAgICBTdHJpbmcgc3lzdGVtX2lkID0gY2FsbGVyLmdldFN0eWxlc2hlZXRTeXN0ZW1JZCgpOwotICAgICAgICBYU0xUSW5wdXRTb3VyY2UgeHNsX3NyYyA9IG5ldyBYU0xUSW5wdXRTb3VyY2Uoc3lzdGVtX2lkKTsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFhTTFRSZXN1bHRUYXJnZXQgdGFyZ2V0ID0gbmV3IFhTTFRSZXN1bHRUYXJnZXQob3MpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyggeG1sX3NyYywgeHNsX3NyYywgdGFyZ2V0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXNlVGVzdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQmFzZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4OTU1ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBCYXNlY2xhc3MgZm9yIEJhdGNoVGVzdCBhbmQgSlVuaXRUZXN0LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVRlc3QgewotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbHRPbkVycm9yID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFsdE9uRmFpbCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGZvcmsgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGlmUHJvcGVydHkgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdW5sZXNzUHJvcGVydHkgPSBudWxsOwotICAgIHByb3RlY3RlZCBWZWN0b3IgZm9ybWF0dGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAvKiogZGVzdGluYXRpb24gZGlyZWN0b3J5ICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZGVzdERpciA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZhaWx1cmVQcm9wZXJ0eTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yUHJvcGVydHk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JrKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgZm9yayA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmsoKSB7Ci0gICAgICAgIHJldHVybiBmb3JrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhhbHRvbmVycm9yKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaGFsdE9uRXJyb3IgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYWx0b25mYWlsdXJlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaGFsdE9uRmFpbCA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEhhbHRvbmVycm9yKCkgewotICAgICAgICByZXR1cm4gaGFsdE9uRXJyb3I7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SGFsdG9uZmFpbHVyZSgpIHsKLSAgICAgICAgcmV0dXJuIGhhbHRPbkZhaWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWYoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZlByb3BlcnR5ID0gcHJvcGVydHlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVubGVzcyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIHVubGVzc1Byb3BlcnR5ID0gcHJvcGVydHlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZvcm1hdHRlcihGb3JtYXR0ZXJFbGVtZW50IGVsZW0pIHsKLSAgICAgICAgZm9ybWF0dGVycy5hZGRFbGVtZW50KGVsZW0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb2RpcihGaWxlIGRlc3REaXIpIHsKLSAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFzIGFuIGFic29sdXRlIHBhdGggaWYgaXQgZXhpc3RzCi0gICAgICoJCQlvdGhlcndpc2UgcmV0dXJuIDx0dD5udWxsPC90dD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvZGlyKCl7Ci0gICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpewotICAgICAgICAgICAgcmV0dXJuIGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmFpbHVyZVByb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gZmFpbHVyZVByb3BlcnR5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlUHJvcGVydHkoU3RyaW5nIGZhaWx1cmVQcm9wZXJ0eSkgewotICAgICAgICB0aGlzLmZhaWx1cmVQcm9wZXJ0eSA9IGZhaWx1cmVQcm9wZXJ0eTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXJyb3JQcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yUHJvcGVydHk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJvcGVydHkoU3RyaW5nIGVycm9yUHJvcGVydHkpIHsKLSAgICAgICAgdGhpcy5lcnJvclByb3BlcnR5ID0gZXJyb3JQcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXRjaFRlc3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0JhdGNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjdjM2RkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0JhdGNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogPHA+IENyZWF0ZSB0aGVuIHJ1biA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+J3MgYmFzZWQgb24gdGhlIGxpc3Qgb2YgZmlsZXMgZ2l2ZW4gYnkgdGhlIGZpbGVzZXQgYXR0cmlidXRlLgotICoKLSAqIDxwPiBFdmVyeSA8Y29kZT4uamF2YTwvY29kZT4gb3IgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlIGluIHRoZSBmaWxlc2V0IGlzIAotICogYXNzdW1lZCB0byBiZSBhIHRlc3RjYXNlLiAKLSAqIEEgPGNvZGU+SlVuaXRUZXN0PC9jb2RlPiBpcyBjcmVhdGVkIGZvciBlYWNoIG9mIHRoZXNlIG5hbWVkIGNsYXNzZXMgd2l0aCBiYXNpYyBzZXR1cAotICogaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCA8Y29kZT5CYXRjaFRlc3Q8L2NvZGU+LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplZmYubWFydGluQHN5bmFtaWMuY28udWsiPkplZmYgTWFydGluPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqCi0gKiBAc2VlIEpVbml0VGVzdAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmF0Y2hUZXN0IGV4dGVuZHMgQmFzZVRlc3QgewotCi0gICAgLyoqIHRoZSByZWZlcmVuY2UgdG8gdGhlIHByb2plY3QgKi8KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKiB0aGUgbGlzdCBvZiBmaWxlc2V0cyBjb250YWluaW5nIHRoZSB0ZXN0Y2FzZSBmaWxlbmFtZSBydWxlcyAqLwotICAgIHByaXZhdGUgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyoqCi0gICAgICogY3JlYXRlIGEgbmV3IGJhdGNodGVzdCBpbnN0YW5jZQotICAgICAqIEBwYXJhbSBwcm9qZWN0ICAgICB0aGUgcHJvamVjdCBpdCBkZXBlbmRzIG9uLgotICAgICAqLwotICAgIHB1YmxpYyBCYXRjaFRlc3QoUHJvamVjdCBwcm9qZWN0KXsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXcgZmlsZXNldCBpbnN0YW5jZSB0byB0aGlzIGJhdGNodGVzdC4gV2hhdGV2ZXIgdGhlIGZpbGVzZXQgaXMsCi0gICAgICogb25seSBmaWxlbmFtZSB0aGF0IGFyZSA8dHQ+LmphdmE8L3R0PiBvciA8dHQ+LmNsYXNzPC90dD4gd2lsbCBiZQotICAgICAqIGNvbnNpZGVyZWQgYXMgJ2NhbmRpZGF0ZXMnLgotICAgICAqIEBwYXJhbSAgICAgZnMgdGhlIG5ldyBmaWxlc2V0IGNvbnRhaW5pbmcgdGhlIHJ1bGVzIHRvIGdldCB0aGUgdGVzdGNhc2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVTZXQoRmlsZVNldCBmcykgewotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KGZzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYWxsIDx0dD5KVW5pdFRlc3Q8L3R0PiBpbnN0YW5jZXMgb2J0YWluIGJ5IGFwcGx5aW5nIHRoZSBmaWxlc2V0IHJ1bGVzLgotICAgICAqIEByZXR1cm4gIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzIGJhdGNodGVzdCB0aGF0IGFyZQotICAgICAqIGEgPHR0PkpVbml0VGVzdDwvdHQ+IGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBFbnVtZXJhdGlvbiBlbGVtZW50cygpewotICAgICAgICBKVW5pdFRlc3RbXSB0ZXN0cyA9IGNyZWF0ZUFsbEpVbml0VGVzdCgpOwotICAgICAgICByZXR1cm4gRW51bWVyYXRpb25zLmZyb21BcnJheSh0ZXN0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVudCBtZXRob2QgdG8gbWVyZ2UgdGhlIDx0dD5KVW5pdFRlc3Q8L3R0PnMgb2YgdGhpcyBiYXRjaHRlc3QKLSAgICAgKiB0byBhIDx0dD5WZWN0b3I8L3R0Pi4KLSAgICAgKiBAcGFyYW0gdiB0aGUgdmVjdG9yIHRvIHdoaWNoIHNob3VsZCBiZSBhZGRlZCBhbGwgaW5kaXZpZHVhbCB0ZXN0cyBvZiB0aGlzCi0gICAgICogYmF0Y2ggdGVzdC4KLSAgICAgKi8KLSAgICBmaW5hbCB2b2lkIGFkZFRlc3RzVG8oVmVjdG9yIHYpewotICAgICAgICBKVW5pdFRlc3RbXSB0ZXN0cyA9IGNyZWF0ZUFsbEpVbml0VGVzdCgpOwotICAgICAgICB2LmVuc3VyZUNhcGFjaXR5KCB2LnNpemUoKSArIHRlc3RzLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHYuYWRkRWxlbWVudCh0ZXN0c1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYWxsIDx0dD5KVW5pdFRlc3Q8L3R0PnMgYmFzZWQgb24gdGhlIGZpbGVzZXRzLiBFYWNoIGluc3RhbmNlCi0gICAgICogaXMgY29uZmlndXJlZCB0byBtYXRjaCB0aGlzIGluc3RhbmNlIHByb3BlcnRpZXMuCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYWxsIDx0dD5KVW5pdFRlc3Q8L3R0PnMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgYmF0Y2guCi0gICAgICovCi0gICAgcHJpdmF0ZSBKVW5pdFRlc3RbXSBjcmVhdGVBbGxKVW5pdFRlc3QoKXsKLSAgICAgICAgU3RyaW5nW10gZmlsZW5hbWVzID0gZ2V0RmlsZW5hbWVzKCk7Ci0gICAgICAgIEpVbml0VGVzdFtdIHRlc3RzID0gbmV3IEpVbml0VGVzdFtmaWxlbmFtZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGphdmFUb0NsYXNzKGZpbGVuYW1lc1tpXSk7Ci0gICAgICAgICAgICB0ZXN0c1tpXSA9IGNyZWF0ZUpVbml0VGVzdChjbGFzc25hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXN0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJdGVyYXRlIG92ZXIgYWxsIGZpbGVzZXRzIGFuZCByZXR1cm4gdGhlIGZpbGVuYW1lIG9mIGFsbCBmaWxlcwotICAgICAqIHRoYXQgZW5kIHdpdGggPHR0Pi5qYXZhPC90dD4gb3IgPHR0Pi5jbGFzczwvdHQ+LiBUaGlzIGlzIHRvIGF2b2lkCi0gICAgICogd3JhcHBpbmcgYSA8dHQ+SlVuaXRUZXN0PC90dD4gb3ZlciBhbiB4bWwgZmlsZSBmb3IgZXhhbXBsZS4gQSBUZXN0Y2FzZQotICAgICAqIGlzIG9idmlvdXNseSBhIGphdmEgZmlsZSAoY29tcGlsZWQgb3Igbm90KS4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVuYW1lcyB3aXRob3V0IHRoZWlyIGV4dGVuc2lvbi4gQXMgdGhleSBzaG91bGQKLSAgICAgKiBub3JtYWxseSBiZSB0YWtlbiBmcm9tIHRoZWlyIHJvb3QsIGZpbGVuYW1lcyBzaG91bGQgbWF0Y2ggdGhlaXIgZnVsbHkKLSAgICAgKiBxdWFsaWZpZWQgY2xhc3MgbmFtZSAoSWYgaXQgaXMgbm90IHRoZSBjYXNlIGl0IHdpbGwgZmFpbCB3aGVuIHJ1bm5pbmcgdGhlIHRlc3QpLgotICAgICAqIEZvciB0aGUgY2xhc3MgPHR0Pm9yZy9hcGFjaGUvV2hhdGV2ZXIuY2xhc3M8L3R0PiBpdCB3aWxsIHJldHVybiA8dHQ+b3JnL2FwYWNoZS9XaGF0ZXZlcjwvdHQ+LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0RmlsZW5hbWVzKCl7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHRoaXMuZmlsZXNldHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBqPTA7IGo8c2l6ZTsgaisrKSB7Ci0gICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChqKTsKLSAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgZHMuc2NhbigpOwotICAgICAgICAgICAgU3RyaW5nW10gZiA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZi5sZW5ndGg7IGsrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRobmFtZSA9IGZba107Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGhuYW1lLmVuZHNXaXRoKCIuamF2YSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudChwYXRobmFtZS5zdWJzdHJpbmcoMCwgcGF0aG5hbWUubGVuZ3RoKCktIi5qYXZhIi5sZW5ndGgoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudChwYXRobmFtZS5zdWJzdHJpbmcoMCwgcGF0aG5hbWUubGVuZ3RoKCktIi5jbGFzcyIubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOwotICAgICAgICB2LmNvcHlJbnRvKGZpbGVzKTsKLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNvbnZlcnQgYSBwYXRobmFtZSB3aXRob3V0IGV4dGVuc2lvbiB0byBhCi0gICAgICogZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZS4gRm9yIGV4YW1wbGUgPHR0Pm9yZy9hcGFjaGUvV2hhdGV2ZXI8L3R0PiB3aWxsCi0gICAgICogYmUgY29udmVydGVkIHRvIDx0dD5vcmcuYXBhY2hlLldoYXRldmVyPC90dD4KLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvICJjb252ZXJ0IiB0byBhIGNsYXNzbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc25hbWUgbWF0Y2hpbmcgdGhlIGZpbGVuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGphdmFUb0NsYXNzKFN0cmluZyBmaWxlbmFtZSl7Ci0gICAgICAgIHJldHVybiBmaWxlbmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSA8dHQ+SlVuaXRUZXN0PC90dD4gdGhhdCBoYXMgdGhlIHNhbWUgcHJvcGVydHkgYXMgdGhpcwotICAgICAqIDx0dD5CYXRjaFRlc3Q8L3R0PiBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IHNob3VsZCBiZSBydW4gYXMgYQotICAgICAqIDx0dD5KVW5pdFRlc3Q8L3R0Pi4gSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIDx0dD5KVW5pdFRlc3Q8L3R0PiBvdmVyIHRoZSBnaXZlbiBjbGFzc25hbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBKVW5pdFRlc3QgY3JlYXRlSlVuaXRUZXN0KFN0cmluZyBjbGFzc25hbWUpewotICAgICAgICBKVW5pdFRlc3QgdGVzdCA9IG5ldyBKVW5pdFRlc3QoKTsKLSAgICAgICAgdGVzdC5zZXROYW1lKGNsYXNzbmFtZSk7Ci0gICAgICAgIHRlc3Quc2V0SGFsdG9uZXJyb3IodGhpcy5oYWx0T25FcnJvcik7Ci0gICAgICAgIHRlc3Quc2V0SGFsdG9uZmFpbHVyZSh0aGlzLmhhbHRPbkZhaWwpOwotICAgICAgICB0ZXN0LnNldEZvcmsodGhpcy5mb3JrKTsKLSAgICAgICAgdGVzdC5zZXRJZih0aGlzLmlmUHJvcGVydHkpOwotICAgICAgICB0ZXN0LnNldFVubGVzcyh0aGlzLnVubGVzc1Byb3BlcnR5KTsKLSAgICAgICAgdGVzdC5zZXRUb2Rpcih0aGlzLmRlc3REaXIpOwotICAgICAgICB0ZXN0LnNldEZhaWx1cmVQcm9wZXJ0eShmYWlsdXJlUHJvcGVydHkpOwotICAgICAgICB0ZXN0LnNldEVycm9yUHJvcGVydHkoZXJyb3JQcm9wZXJ0eSk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGxpc3QgPSB0aGlzLmZvcm1hdHRlcnMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGxpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIHRlc3QuYWRkRm9ybWF0dGVyKChGb3JtYXR0ZXJFbGVtZW50KWxpc3QubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjM0MTUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFByaW50cyBwbGFpbiB0ZXh0IG91dHB1dCBvZiB0aGUgdGVzdCB0byBhIHNwZWNpZmllZCBXcml0ZXIuCi0gKiBJbnNwaXJlZCBieSB0aGUgUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyb2JlcnRkd0BiaWdwb25kLm5ldC5hdSI+Um9iZXJ0IFdhdGtpbnM8L2E+Ci0gKgotICogQHNlZSBGb3JtYXR0ZXJFbGVtZW50Ci0gKiBAc2VlIFBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIKLSAqLwotcHVibGljIGNsYXNzIEJyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIgaW1wbGVtZW50cyBKVW5pdFJlc3VsdEZvcm1hdHRlciB7Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFdoZXJlIHRvIHdyaXRlIHRoZSBsb2cgdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBqYXZhLmlvLk91dHB1dFN0cmVhbSBtX291dDsKLQotICAgIC8qKgotICAgICAqIFVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlc3VsdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBqYXZhLmlvLlByaW50V3JpdGVyIG1fb3V0cHV0OwotICAgIAotICAgIC8qKgotICAgICAqIFVzZWQgYXMgcGFydCBvZiBmb3JtYXR0aW5nIHRoZSByZXN1bHRzLgotICAgICAqLwotICAgIHByaXZhdGUgamF2YS5pby5TdHJpbmdXcml0ZXIgbV9yZXN1bHRzOwotCi0gICAgLyoqCi0gICAgICogVXNlZCBmb3Igd3JpdGluZyBmb3JtYXR0ZWQgcmVzdWx0cyB0by4KLSAgICAgKi8KLSAgICBwcml2YXRlIGphdmEuaW8uUHJpbnRXcml0ZXIgbV9yZXN1bHRXcml0ZXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRm9ybWF0dGVyIGZvciB0aW1pbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgamF2YS50ZXh0Lk51bWJlckZvcm1hdCBtX251bWJlckZvcm1hdCA9IGphdmEudGV4dC5OdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBPdXRwdXQgc3VpdGUgaGFzIHdyaXR0ZW4gdG8gU3lzdGVtLm91dAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHN5c3RlbU91dHB1dCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgc3VpdGUgaGFzIHdyaXR0ZW4gdG8gU3lzdGVtLmVycgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHN5c3RlbUVycm9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBCcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgewotICAgICAgICBtX3Jlc3VsdHMgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgbV9yZXN1bHRXcml0ZXIgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihtX3Jlc3VsdHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdHJlYW0gdGhlIGZvcm1hdHRlciBpcyBzdXBwb3NlZCB0byB3cml0ZSBpdHMgcmVzdWx0cyB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0KSB7IAotICAgICAgICBtX291dCA9IG91dDsgCi0gICAgICAgIG1fb3V0cHV0ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIob3V0KTsgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbU91dHB1dChTdHJpbmcgb3V0KSB7Ci0gICAgICAgIHN5c3RlbU91dHB1dCA9IG91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1FcnJvcihTdHJpbmcgZXJyKSB7Ci0gICAgICAgIHN5c3RlbUVycm9yID0gZXJyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBqYXZhLmlvLlByaW50V3JpdGVyIG91dHB1dCgpIHsgcmV0dXJuIG1fb3V0cHV0OyB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGphdmEuaW8uUHJpbnRXcml0ZXIgcmVzdWx0V3JpdGVyKCkgeyByZXR1cm4gbV9yZXN1bHRXcml0ZXI7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgd2hvbGUgdGVzdHN1aXRlIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB3aG9sZSB0ZXN0c3VpdGUgZW5kZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kVGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlRlc3RzdWl0ZTogIik7Ci0gICAgICAgIHNiLmFwcGVuZChzdWl0ZS5nZXROYW1lKCkpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiVGVzdHMgcnVuOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKHN1aXRlLnJ1bkNvdW50KCkpOwotICAgICAgICBzYi5hcHBlbmQoIiwgRmFpbHVyZXM6ICIpOwotICAgICAgICBzYi5hcHBlbmQoc3VpdGUuZmFpbHVyZUNvdW50KCkpOwotICAgICAgICBzYi5hcHBlbmQoIiwgRXJyb3JzOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmVycm9yQ291bnQoKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBUaW1lIGVsYXBzZWQ6ICIpOwotICAgICAgICBzYi5hcHBlbmQobV9udW1iZXJGb3JtYXQuZm9ybWF0KHN1aXRlLmdldFJ1blRpbWUoKS8xMDAwLjApKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgc2VjIik7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotCi0gICAgICAgIC8vIGFwcGVuZCB0aGUgZXJyIGFuZCBvdXRwdXQgc3RyZWFtcyB0byB0aGUgbG9nCi0gICAgICAgIGlmIChzeXN0ZW1PdXRwdXQgIT0gbnVsbCAmJiBzeXN0ZW1PdXRwdXQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLSIgKQotICAgICAgICAgICAgICAgIC5hcHBlbmQobmV3TGluZSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKHN5c3RlbU91dHB1dCkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIiApCi0gICAgICAgICAgICAgICAgLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHN5c3RlbUVycm9yICE9IG51bGwgJiYgc3lzdGVtRXJyb3IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgRXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0iICkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKG5ld0xpbmUpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChzeXN0ZW1FcnJvcikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIiApCi0gICAgICAgICAgICAgICAgLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggb3V0cHV0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRwdXQoKS53cml0ZShzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXN1bHRXcml0ZXIoKS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG91dHB1dCgpLndyaXRlKG1fcmVzdWx0cy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQoKS5mbHVzaCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAobV9vdXQgIT0gKE9iamVjdClTeXN0ZW0ub3V0ICYmCi0gICAgICAgICAgICAgICAgICAgIG1fb3V0ICE9IChPYmplY3QpU3lzdGVtLmVycikgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHRlc3Qgc3RhcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEEgdGVzdCBlbmRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZsdDs9IDMuNC4KLSAgICAgKgotICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGZvcm1hdEVycm9yKCJcdEZBSUxFRCIsIHRlc3QsIHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZndDsgMy40LgotICAgICAqCi0gICAgICogPHA+QSBUZXN0IGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgewotICAgICAgICBhZGRGYWlsdXJlKHRlc3QsIChUaHJvd2FibGUpIHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdGVzdCBjYXVzZWQgYW4gZXJyb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgZXJyb3IpIHsKLSAgICAgICAgZm9ybWF0RXJyb3IoIlx0Q2F1c2VkIGFuIEVSUk9SIiwgdGVzdCwgZXJyb3IpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGb3JtYXQgdGhlIHRlc3QgZm9yIHByaW50aW5nLi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGlmICh0ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiTnVsbCBUZXN0OiAiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICJUZXN0Y2FzZTogIiArIHRlc3QudG9TdHJpbmcoKSArICI6IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdCBhbiBlcnJvciBhbmQgcHJpbnQgaXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0RXJyb3IoU3RyaW5nIHR5cGUsIFRlc3QgdGVzdCwgVGhyb3dhYmxlIGVycm9yKSB7Ci0gICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuZFRlc3QodGVzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHRXcml0ZXIoKS5wcmludGxuKGZvcm1hdFRlc3QodGVzdCkgKyAiOiIgKyB0eXBlKTsKLSAgICAgICAgcmVzdWx0V3JpdGVyKCkucHJpbnRsbihlcnJvci5nZXRNZXNzYWdlKCkpOwotICAgICAgICBlcnJvci5wcmludFN0YWNrVHJhY2UocmVzdWx0V3JpdGVyKCkpOwotICAgICAgICByZXN1bHRXcml0ZXIoKS5wcmludGxuKCIiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9ET01VdGlsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9ET01VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzdiMzYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRE9NVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFNvbWUgdXRpbGl0aWVzIHRoYXQgbWlnaHQgYmUgdXNlZnVsIHdoZW4gbWFuaXB1bGF0aW5nIERPTSB0cmVlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9ImJhaWxsaWV6QG5vb3MuZnIiPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRE9NVXRpbCB7Ci0KLSAgICAvKiogdW51c2VkIGNvbnN0cnVjdG9yICovCi0gICAgcHJpdmF0ZSBET01VdGlsKCl7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsdGVyIGludGVyZmFjZSB0byBiZSBhcHBsaWVkIHdoZW4gaXRlcmF0aW5nIG92ZXIgYSBET00gdHJlZS4KLSAgICAgKiBKdXN0IHRoaW5rIG9mIGl0IGxpa2UgYSA8dHQ+RmlsZUZpbHRlcjwvdHQ+IGNsb25lLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgTm9kZUZpbHRlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gICAgICAgbm9kZSAgICB0aGUgbm9kZSB0byBjaGVjayBmb3IgYWNjZXB0YW5jZS4KLSAgICAgICAgICogQHJldHVybiAgICAgIDx0dD50cnVlPC90dD4gaWYgdGhlIG5vZGUgaXMgYWNjZXB0ZWQgYnkgdGhpcyBmaWx0ZXIsCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSA8dHQ+ZmFsc2U8L3R0PgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KE5vZGUgbm9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbGlzdCBhIHNldCBvZiBub2RlIHRoYXQgbWF0Y2ggYSBzcGVjaWZpYyBmaWx0ZXIuIFRoZSBsaXN0IGNhbiBiZSBtYWRlCi0gICAgICogcmVjdXJzaXZlbHkgb3Igbm90LgotICAgICAqIEBwYXJhbSAgIHBhcmVudCAgdGhlIHBhcmVudCBub2RlIHRvIHNlYXJjaCBmcm9tCi0gICAgICogQHBhcmFtICAgZmlsdGVyICB0aGUgZmlsdGVyIHRoYXQgY2hpbGRyZW4gc2hvdWxkIG1hdGNoLgotICAgICAqIEBwYXJhbSAgIHJlY3Vyc2UgPHR0PnRydWU8L3R0PiBpZiB5b3Ugd2FudCB0aGUgbGlzdCB0byBiZSBtYWRlIHJlY3Vyc2l2ZWx5Ci0gICAgICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOb2RlTGlzdCBsaXN0Q2hpbGROb2RlcyhOb2RlIHBhcmVudCwgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gcmVjdXJzZSl7Ci0gICAgICAgIE5vZGVMaXN0SW1wbCBtYXRjaGVzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkRWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWN1cnNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IHJlY21hdGNoZXMgPSBsaXN0Q2hpbGROb2RlcyhjaGlsZCwgZmlsdGVyLCByZWN1cnNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlY2xlbmd0aCA9IG1hdGNoZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVjbGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkRWxlbWVudCggcmVjbWF0Y2hlcy5pdGVtKGkpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hdGNoZXM7Ci0gICAgfQotCi0gICAgLyoqIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBhIG5vZGVsaXN0ICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb2RlTGlzdEltcGwgZXh0ZW5kcyBWZWN0b3IgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCl7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGkpewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKE5vZGUpZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBjb25mb3JtaW5nIHRvIE5vZGVMaXN0IGludGVyZmFjZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYW4gZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBnZXQgdGhlIGF0dHJpYnV0ZSBmcm9tLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZQotICAgICAqICAgICAgICAgYXR0cmlidXRlIHdhcyBub3QgZm91bmQgb3IgaWYgPHR0Pm5vZGU8L3R0PiBpcyBub3QgYW4gPHR0PkVsZW1lbnQ8L3R0Pi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlQXR0cmlidXRlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClub2RlOwotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSXRlcmF0ZSBvdmVyIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgYW5kIHJldHVybiB0aGUgZmlyc3Qgbm9kZQotICAgICAqIHRoYXQgaGFzIGEgc3BlY2lmaWMgbmFtZS4KLSAgICAgKiBAcGFyYW0gICBwYXJlbnQgIHRoZSBub2RlIHRvIHNlYXJjaCBjaGlsZCBmcm9tLiBDYW4gYmUgPHR0Pm51bGw8L3R0Pi4KLSAgICAgKiBAcGFyYW0gICB0YWduYW1lIHRoZSBjaGlsZCBuYW1lIHdlIGFyZSBsb29raW5nIGZvci4gQ2Fubm90IGJlIDx0dD5udWxsPC90dD4uCi0gICAgICogQHJldHVybiAgdGhlIGZpcnN0IGNoaWxkIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSBvciA8dHQ+bnVsbDwvdHQ+IGlmCi0gICAgICogICAgICAgICAgICAgICAgICB0aGUgcGFyZW50IGlzIDx0dD5udWxsPC90dD4gb3IgaWYgYSBjaGlsZCBkb2VzIG5vdCBtYXRjaCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgIGdpdmVuIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldENoaWxkQnlUYWdOYW1lIChOb2RlIHBhcmVudCwgU3RyaW5nIHRhZ25hbWUpIHsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW4gPSBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZExpc3QuaXRlbShpKTsKLSAgICAgICAgICAgIGlmICggY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmCi0gICAgICAgICAgICAgICAgIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFbGVtZW50KWNoaWxkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSB0cmVlIHdhbGtlciB0aGF0IHdpbGwgY2xvbmUgcmVjdXJzaXZlbHkgYSBub2RlLiBUaGlzIGlzIHRvCi0gICAgICogYXZvaWQgdXNpbmcgcGFyc2VyLXNwZWNpZmljIEFQSSBzdWNoIGFzIFN1bidzIDx0dD5jaGFuZ2VOb2RlT3duZXI8L3R0PgotICAgICAqIHdoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aCBET00gTDEgaW1wbGVtZW50YXRpb25zIHNpbmNlIDx0dD5jbG9uZU5vZGUoYm9vbGVhbik8L3R0PgotICAgICAqIHdpbGwgbm90IGNoYW5nZSB0aGUgb3duZXIgZG9jdW1lbnQuCi0gICAgICogPHR0PmNoYW5nZU5vZGVPd25lcjwvdHQ+IGlzIG11Y2ggZmFzdGVyIGFuZCBhdm9pZCB0aGUgY29zdGx5IGNsb25pbmcgcHJvY2Vzcy4KLSAgICAgKiA8dHQ+aW1wb3J0Tm9kZTwvdHQ+IGlzIGluIHRoZSBET00gTDIgaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSAgIHBhcmVudCAgdGhlIG5vZGUgcGFyZW50IHRvIHdoaWNoIHdlIHNob3VsZCBkbyB0aGUgaW1wb3J0IHRvLgotICAgICAqIEBwYXJhbSAgIGNoaWxkICAgdGhlIG5vZGUgdG8gY2xvbmUgcmVjdXJzaXZlbHkuIEl0cyBjbG9uZSB3aWxsIGJlCi0gICAgICogICAgICAgICAgICAgIGFwcGVuZGVkIHRvIDx0dD5wYXJlbnQ8L3R0Pi4KLSAgICAgKiBAcmV0dXJuICB0aGUgY2xvbmVkIG5vZGUgdGhhdCBpcyBhcHBlbmRlZCB0byA8dHQ+cGFyZW50PC90dD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5vZGUgaW1wb3J0Tm9kZShOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCl7Ci0gICAgICAgIE5vZGUgY29weSA9IG51bGw7Ci0gICAgICAgIGZpbmFsIERvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICAgICAgc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgICAgICBjb3B5ID0gZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbigoKENEQVRBU2VjdGlvbikgY2hpbGQpLmdldERhdGEoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERToKLSAgICAgICAgICAgIGNvcHkgPSBkb2MuY3JlYXRlQ29tbWVudCgoKENvbW1lbnQpIGNoaWxkKS5nZXREYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAgICAgICAgY29weSA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KCgoRWxlbWVudCljaGlsZCkuZ2V0VGFnTmFtZSgpKTsKLSAgICAgICAgICAgIGNvcHkgPSBlbGVtOwotICAgICAgICAgICAgZmluYWwgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBpZiAoIGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZShhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICAgICAgICAgIGNvcHkgPSBkb2MuY3JlYXRlRW50aXR5UmVmZXJlbmNlKGNoaWxkLmdldE5vZGVOYW1lKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgICAgICBmaW5hbCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKWNoaWxkOwotICAgICAgICAgICAgY29weSA9IGRvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocGkuZ2V0VGFyZ2V0KCksIHBpLmdldERhdGEoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKLSAgICAgICAgICAgIGNvcHkgPSBkb2MuY3JlYXRlVGV4dE5vZGUoKChUZXh0KSBjaGlsZCkuZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIG5vZGUgdHlwZTogIiArIGNoaWxkLmdldE5vZGVUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb2theSB3ZSBoYXZlIGEgY29weSBvZiB0aGUgY2hpbGQsIG5vdyB0aGUgY2hpbGQgYmVjb21lcyB0aGUgcGFyZW50Ci0gICAgICAgIC8vIGFuZCB3ZSBhcmUgaXRlcmF0aW5nIHJlY3Vyc2l2ZWx5IG92ZXIgaXRzIGNoaWxkcmVuLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTm9kZSBuZXdDaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdDaGlsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnROb2RlKGNvcHksIG5ld0NoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJpbmdvIGFwcGVuZCBpdC4gKHRoaXMgc2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBkb25lIGhlcmUpCi0gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjb3B5KTsKLSAgICAgICAgcmV0dXJuIGNvcHk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9FbnVtZXJhdGlvbnMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0VudW1lcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDBkN2FlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0VudW1lcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY291cGxlIG9mIG1ldGhvZHMgcmVsYXRlZCB0byBlbnVtZXJhdGlvbnMgdGhhdCBtaWdodCBiZSB1c2VmdWwuCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBwcm9iYWJseSBkaXNhcHBlYXIgb25jZSB0aGUgcmVxdWlyZWQgSkRLIGlzIHNldCB0byAxLjIKLSAqIGluc3RlYWQgb2YgMS4xLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnVtZXJhdGlvbnMgewotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBFbnVtZXJhdGlvbnMoKXsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBjcmVhdGVzIGFuIGVudW1lcmF0aW9uIGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAgICAgICAgICogQHBhcmFtICAgICAgIGFycmF5ICAgdGhlIGFycmF5IG9mIG9iamVjdCB0byBlbnVtZXJhdGUuCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIG92ZXIgdGhlIGFycmF5IG9mIG9iamVjdHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGZyb21BcnJheShPYmplY3RbXSBhcnJheSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUVudW1lcmF0aW9uKGFycmF5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIGNyZWF0ZXMgYW4gZW51bWVyYXRpb24gZnJvbSBhbiBhcnJheSBvZiBlbnVtZXJhdGlvbi4gVGhlIGNyZWF0ZWQgZW51bWVyYXRpb24KLSAgICAgICAgKiB3aWxsIHNlcXVlbnRpYWxseSBlbnVtZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgZWFjaCBlbnVtZXJhdGlvbiBhbmQgc2tpcAotICAgICAgICAqIDx0dD5udWxsPC90dD4gZW51bWVyYXRpb24gZWxlbWVudHMgaW4gdGhlIGFycmF5LgotICAgICAgICAqIEBwYXJhbSAgICAgICAgZW51bXMgICB0aGUgYXJyYXkgb2YgZW51bWVyYXRpb25zLgotICAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIG92ZXIgdGhlIGFycmF5IG9mIGVudW1lcmF0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZnJvbUNvbXBvdW5kKEVudW1lcmF0aW9uW10gZW51bXMpewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG91bmRFbnVtZXJhdGlvbihlbnVtcyk7Ci0gICAgICAgIH0KLQotfQotCi0KLS8qKgotICogQ29udmVuaWVudCBlbnVtZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIG9iamVjdHMuCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1jbGFzcyBBcnJheUVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24gewotICAgICAgICAKLSAgICAgICAgLyoqIG9iamVjdCBhcnJheSAqLwotICAgICAgICBwcml2YXRlIE9iamVjdFtdIGFycmF5OwotICAgICAgICAKLSAgICAgICAgLyoqIGN1cnJlbnQgaW5kZXggKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgcG9zOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluaXRpYWxpemUgYSBuZXcgZW51bWVyYXRpb24gdGhhdCB3cmFwcyBhbiBhcnJheS4KLSAgICAgICAgICogQHBhcmFtICAgICAgIGFycmF5ICAgdGhlIGFycmF5IG9mIG9iamVjdCB0byBlbnVtZXJhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQXJyYXlFbnVtZXJhdGlvbihPYmplY3RbXSBhcnJheSl7Ci0gICAgICAgICAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OwotICAgICAgICAgICAgICAgIHRoaXMucG9zID0gMDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogVGVzdHMgaWYgdGhpcyBlbnVtZXJhdGlvbiBjb250YWlucyBtb3JlIGVsZW1lbnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGlzIGVudW1lcmF0aW9uIG9iamVjdAotICAgICAgICAgKiAgICAgICAgICAgY29udGFpbnMgYXQgbGVhc3Qgb25lIG1vcmUgZWxlbWVudCB0byBwcm92aWRlOwotICAgICAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAocG9zIDwgYXJyYXkubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBlbnVtZXJhdGlvbiBpZiB0aGlzIGVudW1lcmF0aW9uCi0gICAgICAgICAqIG9iamVjdCBoYXMgYXQgbGVhc3Qgb25lIG1vcmUgZWxlbWVudCB0byBwcm92aWRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuICAgICB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgZW51bWVyYXRpb24uCi0gICAgICAgICAqIEB0aHJvd3MgIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gIGlmIG5vIG1vcmUgZWxlbWVudHMgZXhpc3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGlmIChoYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBhcnJheVtwb3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotfQotLyoqCi0gKiBDb252ZW5pZW50IGVudW1lcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgZW51bWVyYXRpb24uIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIEVudW1lcmF0aW9uIGUxID0gdjEuZWxlbWVudHMoKTsKLSAqIHdoaWxlIChlMS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gKiAgICAvLyBkbyBzb21ldGhpbmcKLSAqIH0KLSAqIEVudW1lcmF0aW9uIGUyID0gdjIuZWxlbWVudHMoKTsKLSAqIHdoaWxlIChlMi5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gKiAgICAvLyBkbyB0aGUgc2FtZSB0aGluZwotICogfQotICogPC9wcmU+Ci0gKiBjYW4gYmUgd3JpdHRlbiBhczoKLSAqIDxwcmU+Ci0gKiBFbnVtZXJhdGlvbltdIGVudW1zID0geyB2MS5lbGVtZW50cygpLCB2Mi5lbGVtZW50cygpIH07Ci0gKiBFbnVtZXJhdGlvbiBlID0gRW51bWVyYXRpb25zLmZyb21Db21wb3VuZChlbnVtcyk7Ci0gKiB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gKiAgICAvLyBkbyBzb21ldGhpbmcKLSAqIH0KLSAqIDwvcHJlPgotICogTm90ZSB0aGF0IHRoZSBlbnVtZXJhdGlvbiB3aWxsIHNraXAgbnVsbCBlbGVtZW50cyBpbiB0aGUgYXJyYXkuIFRoZSBmb2xsb3dpbmcgaXMKLSAqIHRodXMgcG9zc2libGU6Ci0gKiA8cHJlPgotICogRW51bWVyYXRpb25bXSBlbnVtcyA9IHsgdjEuZWxlbWVudHMoKSwgbnVsbCwgdjIuZWxlbWVudHMoKSB9OyAvLyBhIG51bGwgZW51bWVyYXRpb24gaW4gdGhlIGFycmF5Ci0gKiBFbnVtZXJhdGlvbiBlID0gRW51bWVyYXRpb25zLmZyb21Db21wb3VuZChlbnVtcyk7Ci0gKiB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gKiAgICAvLyBkbyBzb21ldGhpbmcKLSAqIH0KLSAqIDwvcHJlPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotIGNsYXNzIENvbXBvdW5kRW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvKiogZW51bWVyYXRpb24gYXJyYXkgKi8KLSAgICAgICAgcHJpdmF0ZSBFbnVtZXJhdGlvbltdIGVudW1BcnJheTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBpbmRleCBpbiB0aGUgZW51bXMgYXJyYXkgKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAwOwotCi0gICAgcHVibGljIENvbXBvdW5kRW51bWVyYXRpb24oRW51bWVyYXRpb25bXSBlbnVtYXJyYXkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmVudW1BcnJheSA9IGVudW1hcnJheTsKLSAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRlc3RzIGlmIHRoaXMgZW51bWVyYXRpb24gY29udGFpbnMgbW9yZSBlbGVtZW50cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhpcyBlbnVtZXJhdGlvbiBvYmplY3QKLSAgICAgICAgICogICAgICAgICAgIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgdG8gcHJvdmlkZTsKLSAgICAgICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVudW1BcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtQXJyYXlbaW5kZXhdICE9IG51bGwgJiYgZW51bUFycmF5W2luZGV4XS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGlzIGVudW1lcmF0aW9uIGlmIHRoaXMgZW51bWVyYXRpb24KLSAgICAgICAgICogb2JqZWN0IGhhcyBhdCBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IHRvIHByb3ZpZGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gICAgIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBlbnVtZXJhdGlvbi4KLSAgICAgICAgICogQHRocm93cyAgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiAgaWYgbm8gbW9yZSBlbGVtZW50cyBleGlzdC4KLSAgICAgICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpZiAoIGhhc01vcmVFbGVtZW50cygpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudW1BcnJheVtpbmRleF0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRm9ybWF0dGVyRWxlbWVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRm9ybWF0dGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTg1YTY5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0Zvcm1hdHRlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogPHA+IEEgd3JhcHBlciBmb3IgdGhlIGltcGxlbWVudGF0aW9ucyBvZiA8Y29kZT5KVW5pdFJlc3VsdEZvcm1hdHRlcjwvY29kZT4uCi0gKiBJbiBwYXJ0aWN1bGFyLCB1c2VkIGFzIGEgbmVzdGVkIDxjb2RlPiZsdDtmb3JtYXR0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGluIGEgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gdGFzay4KLSAqIDxwPiBGb3IgZXhhbXBsZSwgCi0gKiA8Y29kZT48cHJlPgotICogICAgICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ibm8iIGhhbHRvbmZhaWx1cmU9InllcyIgZm9yaz0iZmFsc2UiJmd0OwotICogICAgICAgICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIiAvJmd0OwotICogICAgICAgICAgICZsdDt0ZXN0IG5hbWU9Im9yZy5hcGFjaGUuZWNzLkludGVybmF0aW9uYWxDaGFyVGVzdCIgLyZndDsKLSAqICAgICAgICZsdDsvanVuaXQmZ3Q7PC9wcmU+PC9jb2RlPgotICogYWRkcyBhIDxjb2RlPnBsYWluPC9jb2RlPiB0eXBlIGltcGxlbWVudGF0aW9uICg8Y29kZT5QbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPikgdG8gZGlzcGxheSB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdC4KLSAqCi0gKiA8cD4gRWl0aGVyIHRoZSA8Y29kZT50eXBlPC9jb2RlPiBvciB0aGUgPGNvZGU+Y2xhc3NuYW1lPC9jb2RlPiBhdHRyaWJ1dGUKLSAqIG11c3QgYmUgc2V0LiAKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKgotICogQHNlZSBKVW5pdFRhc2sKLSAqIEBzZWUgWE1MSlVuaXRSZXN1bHRGb3JtYXR0ZXIKLSAqIEBzZWUgQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlcgotICogQHNlZSBQbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyCi0gKiBAc2VlIEpVbml0UmVzdWx0Rm9ybWF0dGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtYXR0ZXJFbGVtZW50IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBleHRlbnNpb247Ci0gICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0ID0gU3lzdGVtLm91dDsKLSAgICBwcml2YXRlIEZpbGUgb3V0RmlsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmlsZSA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4gUXVpY2sgd2F5IHRvIHVzZSBhIHN0YW5kYXJkIGZvcm1hdHRlci4KLSAgICAgKgotICAgICAqIDxwPiBBdCB0aGUgbW9tZW50LCB0aGVyZSBhcmUgdGhyZWUgc3VwcG9ydGVkIHN0YW5kYXJkIGZvcm1hdHRlcnMuCi0gICAgICogPHVsPgotICAgICAqIDxsaT4gVGhlIDxjb2RlPnhtbDwvY29kZT4gdHlwZSB1c2VzIGEgPGNvZGU+WE1MSlVuaXRSZXN1bHRGb3JtYXR0ZXI8L2NvZGU+LgotICAgICAqIDxsaT4gVGhlIDxjb2RlPmJyaWVmPC9jb2RlPiB0eXBlIHVzZXMgYSA8Y29kZT5CcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPi4KLSAgICAgKiA8bGk+IFRoZSA8Y29kZT5wbGFpbjwvY29kZT4gdHlwZSAodGhlIGRlZmF1bHQpIHVzZXMgYSA8Y29kZT5QbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPHA+IFNldHMgPGNvZGU+Y2xhc3NuYW1lPC9jb2RlPiBhdHRyaWJ1dGUgLSBzbyB5b3UgY2FuJ3QgdXNlIHRoYXQgYXR0cmlidXRlIGlmIHlvdSB1c2UgdGhpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlQXR0cmlidXRlIHR5cGUpIHsKLSAgICAgICAgaWYgKCJ4bWwiLmVxdWFscyh0eXBlLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICBzZXRDbGFzc25hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyIik7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb24oIi54bWwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgiYnJpZWYiLmVxdWFscyh0eXBlLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgc2V0Q2xhc3NuYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5CcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyIik7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBtdXN0IGJlIHBsYWluLCBlbnN1cmVkIGJ5IFR5cGVBdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICBzZXRDbGFzc25hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvbigiLnR4dCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+IFNldCBuYW1lIG9mIGNsYXNzIHRvIGJlIHVzZWQgYXMgdGhlIGZvcm1hdHRlci4KLSAgICAgKgotICAgICAqIDxwPiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IDxjb2RlPkpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBuYW1lIG9mIGNsYXNzIHRvIGJlIHVzZWQgYXMgdGhlIGZvcm1hdHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dCkgewotICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4gU2V0IHRoZSBmaWxlIHdoaWNoIHRoZSBmb3JtYXR0ZSBzaG91bGQgbG9nIHRvLgotICAgICAqCi0gICAgICogPHA+IE5vdGUgdGhhdCBsb2dnaW5nIHRvIGZpbGUgbXVzdCBiZSBlbmFibGVkIC4KLSAgICAgKi8KLSAgICB2b2lkIHNldE91dGZpbGUoRmlsZSBvdXQpIHsKLSAgICAgICAgdGhpcy5vdXRGaWxlID0gb3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPiBTZXQgb3V0cHV0IHN0cmVhbSBmb3IgZm9ybWF0dGVyIHRvIHVzZS4KLSAgICAgKgotICAgICAqIDxwPiBEZWZhdWx0cyB0byBzdGFuZGFyZCBvdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhlIGZvcm1hdHRlciBzaG91bGQgbG9nIHRvIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlRmlsZShib29sZWFuIHVzZUZpbGUpIHsKLSAgICAgICAgdGhpcy51c2VGaWxlID0gdXNlRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgd2hldGhlciB0aGUgZm9ybWF0dGVyIHNob3VsZCBsb2cgdG8gZmlsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGdldFVzZUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiB1c2VGaWxlOwotICAgIH0KLQotICAgIEpVbml0UmVzdWx0Rm9ybWF0dGVyIGNyZWF0ZUZvcm1hdHRlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ5b3UgbXVzdCBzcGVjaWZ5IHR5cGUgb3IgY2xhc3NuYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENsYXNzIGYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZiA9IENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvID0gZi5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSlVuaXRSZXN1bHRGb3JtYXR0ZXIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY2xhc3NuYW1lKyIgaXMgbm90IGEgSlVuaXRSZXN1bHRGb3JtYXR0ZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEpVbml0UmVzdWx0Rm9ybWF0dGVyIHIgPSAoSlVuaXRSZXN1bHRGb3JtYXR0ZXIpIG87Ci0KLSAgICAgICAgaWYgKHVzZUZpbGUgJiYgb3V0RmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHIuc2V0T3V0cHV0KG91dCk7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgInBsYWluIiwgInhtbCIgYW5kICJicmllZiIuCi0gICAgICogCi0gICAgICogPHA+IFVzZSB0byBlbnVtZXJhdGUgb3B0aW9ucyBmb3IgPGNvZGU+dHlwZTwvY29kZT4gYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZUF0dHJpYnV0ZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7InBsYWluIiwgInhtbCIsICJicmllZiJ9OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzBhZWQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgSW50ZXJmYWNlIGRlc2NyaWJlcyBjbGFzc2VzIHRoYXQgZm9ybWF0IHRoZSByZXN1bHRzIG9mIGEgSlVuaXQKLSAqIHRlc3RydW4uCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGludGVyZmFjZSBKVW5pdFJlc3VsdEZvcm1hdHRlciBleHRlbmRzIFRlc3RMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogVGhlIHdob2xlIHRlc3RzdWl0ZSBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIHdob2xlIHRlc3RzdWl0ZSBlbmRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdHJlYW0gdGhlIGZvcm1hdHRlciBpcyBzdXBwb3NlZCB0byB3cml0ZSBpdHMgcmVzdWx0cyB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0KTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgd2hhdCB0aGUgdGVzdCBoYXMgd3JpdHRlbiB0byBTeXN0ZW0ub3V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtT3V0cHV0KCBTdHJpbmcgb3V0ICk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHdoYXQgdGhlIHRlc3QgaGFzIHdyaXR0ZW4gdG8gU3lzdGVtLmVycgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVycm9yKCBTdHJpbmcgZXJyICk7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGNjZjUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVdhdGNoZG9nOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEFudCB0YXNrIHRvIHJ1biBKVW5pdCB0ZXN0cy4KLSAqCi0gKiA8cD4gSlVuaXQgaXMgYSBmcmFtZXdvcmsgdG8gY3JlYXRlIHVuaXQgdGVzdC4gSXQgaGFzIGJlZW4gaW5pdGlhbGx5Ci0gKiBjcmVhdGVkIGJ5IEVyaWNoIEdhbW1hIGFuZCBLZW50IEJlY2suICBKVW5pdCBjYW4gYmUgZm91bmQgYXQgPGEKLSAqIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnIj5odHRwOi8vd3d3Lmp1bml0Lm9yZzwvYT4uCi0gKgotICogPHA+IDxjb2RlPkpVbml0VGFzazwvY29kZT4gY2FuIHJ1biBhIHNpbmdsZSBzcGVjaWZpYyA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+IHVzaW5nIHRoZSA8Y29kZT50ZXN0PC9jb2RlPiBlbGVtZW50LiAKLSAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRhcmdldCA8Y29kZT48cHJlPgotICogICAmbHQ7dGFyZ2V0IG5hbWU9InRlc3QtaW50LWNoYXJzIiBkZXBlbmRzPSJqYXItdGVzdCImZ3Q7Ci0gKiAgICAgICAmbHQ7ZWNobyBtZXNzYWdlPSJ0ZXN0aW5nIGludGVybmF0aW9uYWwgY2hhcmFjdGVycyIvJmd0OwotICogICAgICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ibm8iIGhhbHRvbmZhaWx1cmU9InllcyIgZm9yaz0iZmFsc2UiJmd0OwotICogICAgICAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aCIvJmd0OwotICogICAgICAgICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIiAvJmd0OwotICogICAgICAgICAgICZsdDt0ZXN0IG5hbWU9Im9yZy5hcGFjaGUuZWNzLkludGVybmF0aW9uYWxDaGFyVGVzdCIgLyZndDsKLSAqICAgICAgICZsdDsvanVuaXQmZ3Q7Ci0gKiAgICZsdDsvdGFyZ2V0Jmd0OwotICogPC9wcmU+PC9jb2RlPiBydW5zIGEgc2luZ2xlIGp1bml0IHRlc3QgKDxjb2RlPm9yZy5hcGFjaGUuZWNzLkludGVybmF0aW9uYWxDaGFyVGVzdDwvY29kZT4pIAotICogaW4gdGhlIGN1cnJlbnQgVk0gdXNpbmcgdGhlIHBhdGggd2l0aCBpZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGFzIGNsYXNzcGF0aCAKLSAqIGFuZCBwcmVzZW50cyB0aGUgcmVzdWx0cyBmb3JtYXR0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIDxjb2RlPnBsYWluPC9jb2RlPiBmb3JtYXR0ZXIgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAqCi0gKiA8cD4gVGhpcyB0YXNrIGNhbiBhbHNvIHJ1biBiYXRjaGVzIG9mIHRlc3RzLiAKLSAqIFRoZSA8Y29kZT5iYXRjaHRlc3Q8L2NvZGU+IGVsZW1lbnQgY3JlYXRlcyBhIDxjb2RlPkJhdGNoVGVzdDwvY29kZT4gYmFzZWQgb24gYSBmaWxlc2V0LiAKLSAqIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgYWxsIGNsYXNzZXMgZm91bmQgaW4gZGlyZWN0b3J5IHRvIGJlIHJ1biBhcyB0ZXN0Y2FzZXMuIAotICogRm9yIGV4YW1wbGUsIDxjb2RlPjxwcmU+Ci0gKiAmbHQ7dGFyZ2V0IG5hbWU9InJ1bi10ZXN0cyIgZGVwZW5kcz0iZHVtcC1pbmZvLGNvbXBpbGUtdGVzdHMiIGlmPSJqdW5pdC5wcmVzZW50IiZndDsKLSAqICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ibm8iIGhhbHRvbmZhaWx1cmU9InllcyIgZm9yaz0iJHtqdW5pdC5mb3JrfSImZ3Q7Ci0gKiAgICAgJmx0O2p2bWFyZyB2YWx1ZT0iLWNsYXNzaWMiLyZndDsKLSAqICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0cy1jbGFzc3BhdGgiLyZndDsKLSAqICAgICAmbHQ7c3lzcHJvcGVydHkga2V5PSJidWlsZC50ZXN0cyIgdmFsdWU9IiR7YnVpbGQudGVzdHN9Ii8mZ3Q7Ci0gKiAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJicmllZiIgdXNlZmlsZT0iZmFsc2UiIC8mZ3Q7Ci0gKiAgICAgJmx0O2JhdGNodGVzdCZndDsKLSAqICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHt0ZXN0cy5kaXJ9IiZndDsKLSAqICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiomIzA0NzsqVGVzdCoiIC8mZ3Q7Ci0gKiAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gKiAgICAgJmx0Oy9iYXRjaHRlc3QmZ3Q7Ci0gKiAgICZsdDsvanVuaXQmZ3Q7Ci0gKiAmbHQ7L3RhcmdldCZndDsKLSAqIDwvcHJlPjwvY29kZT4gdGhpcyB0YXJnZXQgZmluZHMgYW55IGNsYXNzZXMgd2l0aCBhIDxjb2RlPnRlc3Q8L2NvZGU+IGRpcmVjdG9yeSBhbnl3aGVyZSBpbiB0aGVpciBwYXRoCi0gKiAodW5kZXIgdGhlIHRvcCA8Y29kZT4ke3Rlc3RzLmRpcn08L2NvZGU+LCBvZiBjb3Vyc2UpIGFuZCBjcmVhdGVzIDxjb2RlPkpVbml0VGVzdDwvY29kZT4ncyBmb3IgZWFjaCBvbmUuCi0gKgotICogPHA+IE9mIGNvdXJzZSwgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtiYXRjaCZndDs8L2NvZGU+IGVsZW1lbnRzIGNhbiBiZSBjb21iaW5lZAotICogZm9yIG1vcmUgY29tcGxleCB0ZXN0cy4gRm9yIGFuIGV4YW1wbGUsIHNlZSB0aGUgYW50IDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gdGFyZ2V0IDxjb2RlPnJ1bi10ZXN0czwvY29kZT4gCi0gKiAodGhlIHNlY29uZCBleGFtcGxlIGlzIGFuIGVkaXRlZCB2ZXJzaW9uKS4KLSAqIAotICogPHA+IFRvIHNwYXduIGEgbmV3IEphdmEgVk0gdG8gcHJldmVudCBpbnRlcmZlcmVuY2VzIGJldHdlZW4KLSAqIGRpZmZlcmVudCB0ZXN0Y2FzZXMsIHlvdSBuZWVkIHRvIGVuYWJsZSA8Y29kZT5mb3JrPC9jb2RlPi4gCi0gKiBBIG51bWJlciBvZiBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cyBhbGxvdyB5b3UgdG8gc2V0IHVwIGhvdyB0aGlzIEpWTSBydW5zLgotICogPHVsPgotICogPGxpPntAbGluayAjc2V0VGltZW91dH0gcHJvcGVydHkgc2V0cyB0aGUgbWF4aW11bSB0aW1lIGFsbG93ZWQgYmVmb3JlIGEgdGVzdCBpcyAndGltZWQgb3V0JwotICogPGxpPntAbGluayAjc2V0TWF4bWVtb3J5fSBwcm9wZXJ0eSBzZXRzIG1lbW9yeSBhc3NpZ25tZW50IGZvciB0aGUgZm9ya2VkIGp2bQotICogPGxpPntAbGluayAjc2V0SnZtfSBwcm9wZXJ0eSBhbGxvd3MgdGhlIGp2bSB0byBiZSBzcGVjaWZpZWQKLSAqIDxsaT5UaGUgPGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGVsZW1lbnQgc2V0cyBhcmd1ZW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZm9ya2VkIGp2bSAKLSAqIDwvdWw+Ci0gKiBAYXV0aG9yIFRob21hcyBIYWFzCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86R2Vycml0LlJpZXNzZW5Ad2ViLmRlIj5HZXJyaXQgUmllc3NlbjwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmVyaWtAaGF0Y2hlci5uZXQiPkVyaWsgSGF0Y2hlcjwvYT4KLSAqCi0gKiBAc2VlIEpVbml0VGVzdAotICogQHNlZSBCYXRjaFRlc3QKLSAqLwotcHVibGljIGNsYXNzIEpVbml0VGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBDb21tYW5kbGluZUphdmEgY29tbWFuZGxpbmUgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgdGVzdHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgYmF0Y2hUZXN0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcml2YXRlIFZlY3RvciBmb3JtYXR0ZXJzID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgRmlsZSBkaXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIHRpbWVvdXQgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBzdW1tYXJ5ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3VtbWFyeVZhbHVlID0gIiI7Ci0gICAgcHJpdmF0ZSBKVW5pdFRlc3RSdW5uZXIgcnVubmVyID0gbnVsbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZWxscyB0aGlzIHRhc2sgdG8gaGFsdCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIGEgdGVzdC4KLSAgICAgKiB0aGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdCAoYmF0Y2h0ZXN0KSBhbmQgSlVuaXRUZXN0ICh0ZXN0KQotICAgICAqIGhvd2V2ZXIgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlaXIgb3duIHByb3BlcnRpZXMuCi0gICAgICogQHBhcmFtICAgdmFsdWUgICA8dHQ+dHJ1ZTwvdHQ+IGlmIGl0IHNob3VsZCBoYWx0LCBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYWx0b25lcnJvcihib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBhbGxUZXN0cygpOwotICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgQmFzZVRlc3QgdGVzdCA9IChCYXNlVGVzdCkgZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgdGVzdC5zZXRIYWx0b25lcnJvcih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyB0aGlzIHRhc2sgdG8gc2V0IHRoZSBuYW1lZCBwcm9wZXJ0eSB0byAidHJ1ZSIgd2hlbiB0aGVyZSBpcyBhIGVycm9yIGluIGEgdGVzdC4KLSAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdCAoYmF0Y2h0ZXN0KSBhbmQgSlVuaXRUZXN0ICh0ZXN0KSwKLSAgICAgKiBob3dldmVyLCBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGVuIGJ5IHRoZWlyIG93biBwcm9wZXJ0aWVzLgotICAgICAqIEBwYXJhbSAgdmFsdWUgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gYWxsVGVzdHMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIEJhc2VUZXN0IHRlc3QgPSAoQmFzZVRlc3QpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHRlc3Quc2V0RXJyb3JQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyB0YXNrIHRvIGhhbHQgd2hlbiB0aGVyZSBpcyBhIGZhaWx1cmUgaW4gYSB0ZXN0LgotICAgICAqIHRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZCBKVW5pdFRlc3QgKHRlc3QpCi0gICAgICogaG93ZXZlciBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGRlbiBieSB0aGVpciBvd24gcHJvcGVydGllcy4KLSAgICAgKiBAcGFyYW0gICB2YWx1ZSAgIDx0dD50cnVlPC90dD4gaWYgaXQgc2hvdWxkIGhhbHQsIG90aGVyd2lzZSA8dHQ+ZmFsc2U8L3R0PgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhbHRvbmZhaWx1cmUoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gYWxsVGVzdHMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIEJhc2VUZXN0IHRlc3QgPSAoQmFzZVRlc3QpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHRlc3Quc2V0SGFsdG9uZmFpbHVyZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyB0aGlzIHRhc2sgdG8gc2V0IHRoZSBuYW1lZCBwcm9wZXJ0eSB0byAidHJ1ZSIgd2hlbiB0aGVyZSBpcyBhIGZhaWx1cmUgaW4gYSB0ZXN0LgotICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZCBKVW5pdFRlc3QgKHRlc3QpLAotICAgICAqIGhvd2V2ZXIsIGl0IGNhbiBwb3NzaWJseSBiZSBvdmVycmlkZW4gYnkgdGhlaXIgb3duIHByb3BlcnRpZXMuCi0gICAgICogQHBhcmFtICB2YWx1ZSAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYW4gZmFpbHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gYWxsVGVzdHMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIEJhc2VUZXN0IHRlc3QgPSAoQmFzZVRlc3QpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHRlc3Quc2V0RmFpbHVyZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyB3aGV0aGVyIGEgSlZNIHNob3VsZCBiZSBmb3JrZWQgZm9yIGVhY2ggdGVzdGNhc2UuIEl0IGF2b2lkcyBpbnRlcmZlcmVuY2UKLSAgICAgKiBiZXR3ZWVuIHRlc3RjYXNlcyBhbmQgcG9zc2libHkgYXZvaWRzIGhhbmdpbmcgdGhlIGJ1aWxkLgotICAgICAqIHRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZCBKVW5pdFRlc3QgKHRlc3QpCi0gICAgICogaG93ZXZlciBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGRlbiBieSB0aGVpciBvd24gcHJvcGVydGllcy4KLSAgICAgKiBAcGFyYW0gICB2YWx1ZSAgIDx0dD50cnVlPC90dD4gaWYgYSBKVk0gc2hvdWxkIGJlIGZvcmtlZCwgb3RoZXJ3aXNlIDx0dD5mYWxzZTwvdHQ+Ci0gICAgICogQHNlZSAjc2V0VGltZW91dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gYWxsVGVzdHMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIEJhc2VUZXN0IHRlc3QgPSAoQmFzZVRlc3QpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHRlc3Quc2V0Rm9yayh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSB0YXNrIHNob3VsZCBwcmludCBhIHNob3J0IHN1bW1hcnkgb2YgdGhlIHRhc2suCi0gICAgICogQHBhcmFtIHZhbHVlIDx0dD50cnVlPC90dD4gdG8gcHJpbnQgYSBzdW1tYXJ5LAotICAgICAqICAgPHR0PndpdGhPdXRBbmRFcnI8L3R0PiB0byBpbmNsdWRlIHRoZSB0ZXN0JmFwb3M7cyBvdXRwdXQgYXMKLSAgICAgKiAgIHdlbGwsIDx0dD5mYWxzZTwvdHQ+IG90aGVyd2lzZS4KLSAgICAgKiBAc2VlIFN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByaW50c3VtbWFyeShTdW1tYXJ5QXR0cmlidXRlIHZhbHVlKSB7Ci0gICAgICAgIHN1bW1hcnlWYWx1ZSA9IHZhbHVlLmdldFZhbHVlKCk7Ci0gICAgICAgIHN1bW1hcnkgPSB2YWx1ZS5hc0Jvb2xlYW4oKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogUHJpbnQgc3VtbWFyeSBlbnVtZXJhdGlvbiB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdW1tYXJ5QXR0cmlidXRlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsidHJ1ZSIsICJ5ZXMiLCAiZmFsc2UiLCAibm8iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbiIsICJvZmYiLCAid2l0aE91dEFuZEVyciJ9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYXNCb29sZWFuKCkgewotICAgICAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHModmFsdWUpCi0gICAgICAgICAgICAgICAgfHwgIm9uIi5lcXVhbHModmFsdWUpCi0gICAgICAgICAgICAgICAgfHwgInllcyIuZXF1YWxzKHZhbHVlKQotICAgICAgICAgICAgICAgIHx8ICJ3aXRoT3V0QW5kRXJyIi5lcXVhbHModmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB0aW1lb3V0IHZhbHVlIChpbiBtaWxsaXNlY29uZHMpLiBJZiB0aGUgdGVzdCBpcyBydW5uaW5nIGZvciBtb3JlIHRoYW4gdGhpcwotICAgICAqIHZhbHVlLCB0aGUgdGVzdCB3aWxsIGJlIGNhbmNlbGVkLiAod29ya3Mgb25seSB3aGVuIGluICdmb3JrJyBtb2RlKS4KLSAgICAgKiBAcGFyYW0gICB2YWx1ZSAgIHRoZSBtYXhpbXVtIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgYWxsb3dlZCBiZWZvcmUgZGVjbGFyaW5nIHRoZSB0ZXN0Ci0gICAgICogICAgICAgICAgICAgICAgICBhcyAndGltZWQtb3V0JwotICAgICAqIEBzZWUgI3NldEZvcmsoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgdGltZW91dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbWF4aW11bSBtZW1vcnkgdG8gYmUgdXNlZCBieSBhbGwgZm9ya2VkIEpWTXMuCi0gICAgICogQHBhcmFtICAgbWF4ICAgICB0aGUgdmFsdWUgYXMgZGVmaW5lZCBieSA8dHQ+LW14PC90dD4gb3IgPHR0Pi1YbXg8L3R0PgotICAgICAqICAgICAgICAgICAgICAgICAgaW4gdGhlIGphdmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWF4bWVtb3J5KFN0cmluZyBtYXgpIHsKLSAgICAgICAgaWYgKFByb2plY3QuZ2V0SmF2YVZlcnNpb24oKS5zdGFydHNXaXRoKCIxLjEiKSkgewotICAgICAgICAgICAgY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1teCIrbWF4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItWG14IittYXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbmV3IFZNIHRvIGV4ZWN1dGUgdGhlIHRlc3RjYXNlLiBEZWZhdWx0IGlzIDx0dD5qYXZhPC90dD4uIElnbm9yZWQgaWYgbm8gSlZNIGlzIGZvcmtlZC4KLSAgICAgKiBAcGFyYW0gICB2YWx1ZSAgIHRoZSBuZXcgVk0gdG8gdXNlIGluc3RlYWQgb2YgPHR0PmphdmE8L3R0PgotICAgICAqIEBzZWUgI3NldEZvcmsoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKdm0oU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGNvbW1hbmRsaW5lLnNldFZtKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgSlZNIGFyZ3VtZW50LiBJZ25vcmVkIGlmIG5vIEpWTSBpcyBmb3JrZWQuCi0gICAgICogQHJldHVybiAgY3JlYXRlIGEgbmV3IEpWTSBhcmd1bWVudCBzbyB0aGF0IGFueSBhcmd1bWVudCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBKVk0uCi0gICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBDb21tYW5kbGluZS5Bcmd1bWVudCBjcmVhdGVKdm1hcmcoKSB7Ci0gICAgICAgIHJldHVybiBjb21tYW5kbGluZS5jcmVhdGVWbUFyZ3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLiBJZ25vcmVkIGlmIG5vIEpWTSBpcyBmb3JrZWQuCi0gICAgICogQHBhcmFtICAgZGlyICAgICB0aGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgSlZNIGZyb20uCi0gICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgewotICAgICAgICB0aGlzLmRpciA9IGRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXN0ZWQgc3lzcHJvcGVydHkgZWxlbWVudC4gVGhpcyBtaWdodCBiZSB1c2VmdWwgdG8gdHJhbmZlcgotICAgICAqIEFudCBwcm9wZXJ0aWVzIHRvIHRoZSB0ZXN0Y2FzZXMgd2hlbiBKVk0gZm9ya2luZyBpcyBub3QgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTeXNwcm9wZXJ0eShFbnZpcm9ubWVudC5WYXJpYWJsZSBzeXNwKSB7Ci0gICAgICAgIGNvbW1hbmRsaW5lLmFkZFN5c3Byb3BlcnR5KHN5c3ApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gYWxsb3dzIGNsYXNzcGF0aCB0byBiZSBzZXQgZm9yIHRlc3RzLgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbW1hbmRsaW5lLmNyZWF0ZUNsYXNzcGF0aChwcm9qZWN0KS5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbmV3IHNpbmdsZSB0ZXN0Y2FzZS4KLSAgICAgKiBAcGFyYW0gICB0ZXN0ICAgIGEgbmV3IHNpbmdsZSB0ZXN0Y2FzZQotICAgICAqIEBzZWUgSlVuaXRUZXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGVzdChKVW5pdFRlc3QgdGVzdCkgewotICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KHRlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBzZXQgb2YgdGVzdGNhc2VzIChhbHNvIGNhbGxlZCAuLmJhdGNodGVzdCkgYW5kIGFkZCBpdCB0byB0aGUgbGlzdC4KLSAgICAgKiBAcmV0dXJuICBhIG5ldyBpbnN0YW5jZSBvZiBhIGJhdGNoIHRlc3QuCi0gICAgICogQHNlZSBCYXRjaFRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgQmF0Y2hUZXN0IGNyZWF0ZUJhdGNoVGVzdCgpIHsKLSAgICAgICAgQmF0Y2hUZXN0IHRlc3QgPSBuZXcgQmF0Y2hUZXN0KHByb2plY3QpOwotICAgICAgICBiYXRjaFRlc3RzLmFkZEVsZW1lbnQodGVzdCk7Ci0gICAgICAgIHJldHVybiB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIG5ldyBmb3JtYXR0ZXIgdG8gYWxsIHRlc3RzIG9mIHRoaXMgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGb3JtYXR0ZXIoRm9ybWF0dGVyRWxlbWVudCBmZSkgewotICAgICAgICBmb3JtYXR0ZXJzLmFkZEVsZW1lbnQoZmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgSlVuaXRSdW5uZXIgYW5kIGVuYWJsZXMgZm9yayBvZiBhIG5ldyBKYXZhIFZNLgotICAgICAqLwotICAgIHB1YmxpYyBKVW5pdFRhc2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY29tbWFuZGxpbmUuc2V0Q2xhc3NuYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBqYXJzIG9yIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQW50LCB0aGlzIHRhc2sgYW5kCi0gICAgICogSlVuaXQgdG8gdGhlIGNsYXNzcGF0aCAtIHRoaXMgc2hvdWxkIG1ha2UgdGhlIGZvcmtlZCBKVk0gd29yawotICAgICAqIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGx5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGFkZENsYXNzcGF0aEVudHJ5KCIvanVuaXQvZnJhbWV3b3JrL1Rlc3RDYXNlLmNsYXNzIik7Ci0gICAgICAgIGFkZENsYXNzcGF0aEVudHJ5KCIvb3JnL2FwYWNoZS90b29scy9hbnQvVGFzay5jbGFzcyIpOwotICAgICAgICBhZGRDbGFzc3BhdGhFbnRyeSgiL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdFJ1bm5lci5jbGFzcyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHRlc3RjYXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBFbnVtZXJhdGlvbiBsaXN0ID0gZ2V0SW5kaXZpZHVhbFRlc3RzKCk7Ci0gICAgICAgIHdoaWxlIChsaXN0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBKVW5pdFRlc3QgdGVzdCA9IChKVW5pdFRlc3QpbGlzdC5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKCB0ZXN0LnNob3VsZFJ1bihwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgIGV4ZWN1dGUodGVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW4gdGhlIHRlc3RzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSlVuaXRUZXN0IHRlc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgbm90IHNwZWNpZmllZAotICAgICAgICAvL0B0b2RvIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgdGVzdCBjbGFzcyBpbnN0ZWFkLgotICAgICAgICBpZiAodGVzdC5nZXRUb2RpcigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRlc3Quc2V0VG9kaXIocHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0ZXN0LmdldE91dGZpbGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXN0LnNldE91dGZpbGUoICJURVNULSIgKyB0ZXN0LmdldE5hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZXhlY3V0ZSB0aGUgdGVzdCBhbmQgZ2V0IHRoZSByZXR1cm4gY29kZQotICAgICAgICBpbnQgZXhpdFZhbHVlID0gSlVuaXRUZXN0UnVubmVyLkVSUk9SUzsKLSAgICAgICAgYm9vbGVhbiB3YXNLaWxsZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCF0ZXN0LmdldEZvcmsoKSkgewotICAgICAgICAgICAgZXhpdFZhbHVlID0gZXhlY3V0ZUluVk0odGVzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBFeGVjdXRlV2F0Y2hkb2cgd2F0Y2hkb2cgPSBjcmVhdGVXYXRjaGRvZygpOwotICAgICAgICAgICAgZXhpdFZhbHVlID0gZXhlY3V0ZUFzRm9ya2VkKHRlc3QsIHdhdGNoZG9nKTsKLSAgICAgICAgICAgIC8vIG51bGwgd2F0Y2hkb2cgbWVhbnMgbm8gdGltZW91dCwgeW91J2QgYmV0dGVyIG5vdCBjaGVjayB3aXRoIG51bGwKLSAgICAgICAgICAgIGlmICh3YXRjaGRvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2FzS2lsbGVkID0gd2F0Y2hkb2cua2lsbGVkUHJvY2VzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IvZmFpbHVyZSBhbmQgdGhhdCBpdCBzaG91bGQgaGFsdCwgc3RvcCBldmVyeXRoaW5nIG90aGVyd2lzZQotICAgICAgICAvLyBqdXN0IGxvZyBhIHN0YXRlbWVudAotICAgICAgICBib29sZWFuIGVycm9yT2NjdXJyZWRIZXJlID0gZXhpdFZhbHVlID09IEpVbml0VGVzdFJ1bm5lci5FUlJPUlM7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZU9jY3VycmVkSGVyZSA9IGV4aXRWYWx1ZSAhPSBKVW5pdFRlc3RSdW5uZXIuU1VDQ0VTUzsKLSAgICAgICAgaWYgKGVycm9yT2NjdXJyZWRIZXJlIHx8IGZhaWx1cmVPY2N1cnJlZEhlcmUpIHsKLSAgICAgICAgICAgIGlmIChlcnJvck9jY3VycmVkSGVyZSAmJiB0ZXN0LmdldEhhbHRvbmVycm9yKCkKLSAgICAgICAgICAgICAgICB8fCBmYWlsdXJlT2NjdXJyZWRIZXJlICYmIHRlc3QuZ2V0SGFsdG9uZmFpbHVyZSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUZXN0ICIrdGVzdC5nZXROYW1lKCkrIiBmYWlsZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsod2FzS2lsbGVkID8gIiAodGltZW91dCkiIDogIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygiVEVTVCAiK3Rlc3QuZ2V0TmFtZSgpKyIgRkFJTEVEIiAKLSAgICAgICAgICAgICAgICAgICAgKyAod2FzS2lsbGVkID8gIiAodGltZW91dCkiIDogIiIpLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgICAgIGlmIChlcnJvck9jY3VycmVkSGVyZSAmJiB0ZXN0LmdldEVycm9yUHJvcGVydHkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkodGVzdC5nZXRFcnJvclByb3BlcnR5KCksICJ0cnVlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmYWlsdXJlT2NjdXJyZWRIZXJlICYmIHRlc3QuZ2V0RmFpbHVyZVByb3BlcnR5KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KHRlc3QuZ2V0RmFpbHVyZVByb3BlcnR5KCksICJ0cnVlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIHRlc3RjYXNlIGJ5IGZvcmtpbmcgYSBuZXcgSlZNLiBUaGUgY29tbWFuZCB3aWxsIGJsb2NrIHVudGlsCi0gICAgICogaXQgZmluaXNoZXMuIFRvIGtub3cgaWYgdGhlIHByb2Nlc3Mgd2FzIGRlc3Ryb3llZCBvciBub3QsIHVzZSB0aGUKLSAgICAgKiA8dHQ+a2lsbGVkUHJvY2VzcygpPC90dD4gbWV0aG9kIG9mIHRoZSB3YXRjaGRvZyBjbGFzcy4KLSAgICAgKiBAcGFyYW0gIHRlc3QgICAgICAgdGhlIHRlc3RjYXNlIHRvIGV4ZWN1dGUuCi0gICAgICogQHBhcmFtICB3YXRjaGRvZyAgIHRoZSB3YXRjaGRvZyBpbiBjaGFyZ2Ugb2YgY2FuY2VsbGluZyB0aGUgdGVzdCBpZiBpdAotICAgICAqIGV4Y2VlZHMgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLiBDYW4gYmUgPHR0Pm51bGw8L3R0PiwgaW4gdGhpcyBjYXNlCi0gICAgICogdGhlIHRlc3QgY291bGQgcHJvYmFibHkgaGFuZyBmb3JldmVyLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGV4ZWN1dGVBc0ZvcmtlZChKVW5pdFRlc3QgdGVzdCwgRXhlY3V0ZVdhdGNoZG9nIHdhdGNoZG9nKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBDb21tYW5kbGluZUphdmEgY21kID0gKENvbW1hbmRsaW5lSmF2YSkgY29tbWFuZGxpbmUuY2xvbmUoKTsKLQotICAgICAgICBjbWQuc2V0Q2xhc3NuYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIiKTsKLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGVzdC5nZXROYW1lKCkpOwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiaGFsdE9uRXJyb3I9IiArIHRlc3QuZ2V0SGFsdG9uZXJyb3IoKSk7Ci0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJoYWx0T25GYWlsdXJlPSIgKyB0ZXN0LmdldEhhbHRvbmZhaWx1cmUoKSk7Ci0gICAgICAgIGlmIChzdW1tYXJ5KSB7Ci0gICAgICAgICAgICBsb2coIlJ1bm5pbmcgIiArIHRlc3QuZ2V0TmFtZSgpLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJmb3JtYXR0ZXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWZmZXIgZm9ybWF0dGVyQXJnID0gbmV3IFN0cmluZ0J1ZmZlcigxMjgpOwotICAgICAgICBmaW5hbCBGb3JtYXR0ZXJFbGVtZW50W10gZmVBcnJheSA9IG1lcmdlRm9ybWF0dGVycyh0ZXN0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGb3JtYXR0ZXJFbGVtZW50IGZlID0gZmVBcnJheVtpXTsKLSAgICAgICAgICAgIGZvcm1hdHRlckFyZy5hcHBlbmQoImZvcm1hdHRlcj0iKTsKLSAgICAgICAgICAgIGZvcm1hdHRlckFyZy5hcHBlbmQoZmUuZ2V0Q2xhc3NuYW1lKCkpOwotICAgICAgICAgICAgRmlsZSBvdXRGaWxlID0gZ2V0T3V0cHV0KGZlLHRlc3QpOwotICAgICAgICAgICAgaWYgKG91dEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvcm1hdHRlckFyZy5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZXJBcmcuYXBwZW5kKCBvdXRGaWxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShmb3JtYXR0ZXJBcmcudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBmb3JtYXR0ZXJBcmcuc2V0TGVuZ3RoKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gcGFzcyB0aGUgQW50IHByb3BlcnRpZXMgdG8gdGhlIGZvcmtlZCB0ZXN0Ci0gICAgICAgIEZpbGUgcHJvcHNGaWxlID0gbmV3IEZpbGUoImp1bml0IiArIChuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkubmV4dExvbmcoKSArICIucHJvcGVydGllcyIpOwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgicHJvcHNmaWxlPSIgKyBwcm9wc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBIYXNodGFibGUgcCA9IHByb2plY3QuZ2V0UHJvcGVydGllcygpOyAKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZW51bSA9IHAua2V5cygpOyBlbnVtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwcm9wcy5wdXQoa2V5LCBwLmdldChrZXkpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9wc0ZpbGUpOwotICAgICAgICAgICAgcHJvcHMuc2F2ZShvdXRzdHJlYW0sIkFudCBKVW5pdFRhc2sgZ2VuZXJhdGVkIHByb3BlcnRpZXMgZmlsZSIpOwotICAgICAgICAgICAgb3V0c3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyB0ZW1wb3JhcnkgcHJvcGVydGllcyBmaWxlLiIsIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEV4ZWN1dGUgZXhlY3V0ZSA9IG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX1dBUk4pLCB3YXRjaGRvZyk7Ci0gICAgICAgIGV4ZWN1dGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICBleGVjdXRlLnNldEFudFJ1bihwcm9qZWN0KTsKLSAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBleGVjdXRlLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZygiRXhlY3V0aW5nOiAiK2NtZC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgaW50IHJldFZhbDsgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXRWYWwgPSBleGVjdXRlLmV4ZWN1dGUoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9jZXNzIGZvcmsgZmFpbGVkLiIsIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoISBwcm9wc0ZpbGUuZGVsZXRlKCkpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZSB0ZW1wb3JhcnkgcHJvcGVydGllcyBmaWxlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICB9Ci0KLSAgICAvLyBpbiBWTSBpcyBub3QgdmVyeSBuaWNlIHNpbmNlIGl0IGNvdWxkIHByb2JhYmx5IGhhbmcgdGhlCi0gICAgLy8gd2hvbGUgYnVpbGQuIElNSE8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGF2b2lkZWQgYW5kIGl0IHdvdWxkIGJlIGJlc3QKLSAgICAvLyB0byByZW1vdmUgaXQgaW4gZnV0dXJlIHZlcnNpb25zLiBUQkQuIChTQmEpCi0gICAgICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmIChydW5uZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcnVubmVyLmhhbmRsZU91dHB1dChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZU91dHB1dChsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgbGluZSkgewotICAgICAgICBpZiAocnVubmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJ1bm5lci5oYW5kbGVFcnJvck91dHB1dChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZUVycm9yT3V0cHV0KGxpbmUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgaW5zaWRlIFZNLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGV4ZWN1dGVJblZNKEpVbml0VGVzdCB0ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0ZXN0LnNldFByb3BlcnRpZXMocHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZygiZGlyIGF0dHJpYnV0ZSBpZ25vcmVkIGlmIHJ1bm5pbmcgaW4gdGhlIHNhbWUgVk0iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbW1hbmRsaW5lSmF2YS5TeXNQcm9wZXJ0aWVzIHN5c1Byb3BlcnRpZXMgPSBjb21tYW5kbGluZS5nZXRTeXN0ZW1Qcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmIChzeXNQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN5c1Byb3BlcnRpZXMuc2V0U3lzdGVtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvZygiVXNpbmcgU3lzdGVtIHByb3BlcnRpZXMgIiArIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgY2wgPSBudWxsOwotICAgICAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBjb21tYW5kbGluZS5nZXRDbGFzc3BhdGgoKTsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZygiVXNpbmcgQ0xBU1NQQVRIICIgKyBjbGFzc3BhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCi0gICAgICAgICAgICAgICAgY2wgPSBuZXcgQW50Q2xhc3NMb2FkZXIobnVsbCwgcHJvamVjdCwgY2xhc3NwYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB0ZXN0IHdpbGwgYmUgYWNjZXB0ZWQgYXMgYSBUZXN0Q2FzZQotICAgICAgICAgICAgICAgIGNsLmFkZFN5c3RlbVBhY2thZ2VSb290KCJqdW5pdCIpOwotICAgICAgICAgICAgICAgIC8vIHdpbGwgY2F1c2UgdHJvdWJsZSBpbiBKREsgMS4xIGlmIG9taXR0ZWQKLSAgICAgICAgICAgICAgICBjbC5hZGRTeXN0ZW1QYWNrYWdlUm9vdCgib3JnLmFwYWNoZS50b29scy5hbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bm5lciA9IG5ldyBKVW5pdFRlc3RSdW5uZXIodGVzdCwgdGVzdC5nZXRIYWx0b25lcnJvcigpLCB0ZXN0LmdldEhhbHRvbmZhaWx1cmUoKSwgY2wpOwotCi0gICAgICAgICAgICBpZiAoc3VtbWFyeSkgewotICAgICAgICAgICAgICAgIGxvZygiUnVubmluZyAiICsgdGVzdC5nZXROYW1lKCksIFByb2plY3QuTVNHX0lORk8pOwotCi0gICAgICAgICAgICAgICAgU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyIGYgPSAKLSAgICAgICAgICAgICAgICAgIG5ldyBTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBmLnNldFdpdGhPdXRBbmRFcnIoICJ3aXRob3V0YW5kZXJyIi5lcXVhbHNJZ25vcmVDYXNlKCBzdW1tYXJ5VmFsdWUgKSk7Ci0gICAgICAgICAgICAgICAgZi5zZXRPdXRwdXQoIGdldERlZmF1bHRPdXRwdXQoKSApOwotICAgICAgICAgICAgICAgIHJ1bm5lci5hZGRGb3JtYXR0ZXIoZik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIEZvcm1hdHRlckVsZW1lbnRbXSBmZUFycmF5ID0gbWVyZ2VGb3JtYXR0ZXJzKHRlc3QpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRm9ybWF0dGVyRWxlbWVudCBmZSA9IGZlQXJyYXlbaV07Ci0gICAgICAgICAgICAgICAgRmlsZSBvdXRGaWxlID0gZ2V0T3V0cHV0KGZlLHRlc3QpOwotICAgICAgICAgICAgICAgIGlmIChvdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmUuc2V0T3V0ZmlsZShvdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmZS5zZXRPdXRwdXQoIGdldERlZmF1bHRPdXRwdXQoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBydW5uZXIuYWRkRm9ybWF0dGVyKGZlLmNyZWF0ZUZvcm1hdHRlcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcnVubmVyLnJ1bigpOwotICAgICAgICAgICAgcmV0dXJuIHJ1bm5lci5nZXRSZXRDb2RlKCk7Ci0gICAgICAgIH0gZmluYWxseXsKLSAgICAgICAgICAgIGlmIChzeXNQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzeXNQcm9wZXJ0aWVzLnJlc3RvcmVTeXN0ZW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSBpcyBhIHRpbWVvdXQgdmFsdWUsIG90aGVyd2lzZSB0aGUKLSAgICAgKiB3YXRjaGRvZyBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRXhlY3V0ZVdhdGNoZG9nIGNyZWF0ZVdhdGNoZG9nKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEV4ZWN1dGVXYXRjaGRvZyh0aW1lb3V0LmludFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGVmYXVsdCBvdXRwdXQgZm9yIGEgZm9ybWF0dGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0RGVmYXVsdE91dHB1dCgpewotICAgICAgICByZXR1cm4gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSBhbGwgaW5kaXZpZHVhbCB0ZXN0cyBmcm9tIHRoZSBiYXRjaHRlc3Qgd2l0aCBhbGwgaW5kaXZpZHVhbCB0ZXN0cwotICAgICAqIGFuZCByZXR1cm4gYW4gZW51bWVyYXRpb24gb3ZlciBhbGwgPHR0PkpVbml0VGVzdDwvdHQ+LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbnVtZXJhdGlvbiBnZXRJbmRpdmlkdWFsVGVzdHMoKXsKLSAgICAgICAgRW51bWVyYXRpb25bXSBlbnVtcyA9IG5ldyBFbnVtZXJhdGlvblsgYmF0Y2hUZXN0cy5zaXplKCkgKyAxXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXRjaFRlc3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBCYXRjaFRlc3QgYmF0Y2h0ZXN0ID0gKEJhdGNoVGVzdCliYXRjaFRlc3RzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGVudW1zW2ldID0gYmF0Y2h0ZXN0LmVsZW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZW51bXNbZW51bXMubGVuZ3RoIC0gMV0gPSB0ZXN0cy5lbGVtZW50cygpOwotICAgICAgICByZXR1cm4gRW51bWVyYXRpb25zLmZyb21Db21wb3VuZChlbnVtcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uIGFsbFRlc3RzKCkgewotICAgICAgICBFbnVtZXJhdGlvbltdIGVudW1zID0geyB0ZXN0cy5lbGVtZW50cygpLCBiYXRjaFRlc3RzLmVsZW1lbnRzKCkgfTsKLSAgICAgICAgcmV0dXJuIEVudW1lcmF0aW9ucy5mcm9tQ29tcG91bmQoZW51bXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgRm9ybWF0dGVyRWxlbWVudFtdIG1lcmdlRm9ybWF0dGVycyhKVW5pdFRlc3QgdGVzdCl7Ci0gICAgICAgIFZlY3RvciBmZVZlY3RvciA9IChWZWN0b3IpZm9ybWF0dGVycy5jbG9uZSgpOwotICAgICAgICB0ZXN0LmFkZEZvcm1hdHRlcnNUbyhmZVZlY3Rvcik7Ci0gICAgICAgIEZvcm1hdHRlckVsZW1lbnRbXSBmZUFycmF5ID0gbmV3IEZvcm1hdHRlckVsZW1lbnRbZmVWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgICAgZmVWZWN0b3IuY29weUludG8oZmVBcnJheSk7Ci0gICAgICAgIHJldHVybiBmZUFycmF5OwotICAgIH0KLQotICAgIC8qKiByZXR1cm4gdGhlIGZpbGUgb3IgbnVsbCBpZiBkb2VzIG5vdCB1c2UgYSBmaWxlICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0T3V0cHV0KEZvcm1hdHRlckVsZW1lbnQgZmUsIEpVbml0VGVzdCB0ZXN0KXsKLSAgICAgICAgaWYgKGZlLmdldFVzZUZpbGUoKSkgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gdGVzdC5nZXRPdXRmaWxlKCkgKyBmZS5nZXRFeHRlbnNpb24oKTsKLSAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZSggdGVzdC5nZXRUb2RpcigpLCBmaWxlbmFtZSApOwotICAgICAgICAgICAgU3RyaW5nIGFic0ZpbGVuYW1lID0gZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdC5yZXNvbHZlRmlsZShhYnNGaWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZCB0aGUgZGlyZWN0b3J5IG9yIGFyY2hpdmUKLSAgICAgKiB0aGF0IGNvbnRhaW5zIGl0IHRvIHRoZSBjbGFzc3BhdGguCi0gICAgICoKLSAgICAgKiA8cD5Eb2Vzbid0IHdvcmsgZm9yIGFyY2hpdmVzIGluIEpESyAxLjEgYXMgdGhlIFVSTCByZXR1cm5lZCBieQotICAgICAqIGdldFJlc291cmNlIGRvZXNuJ3QgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZS48L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQ2xhc3NwYXRoRW50cnkoU3RyaW5nIHJlc291cmNlKSB7Ci0gICAgICAgIFVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKHJlc291cmNlKTsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdSA9IHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKHUuc3RhcnRzV2l0aCgiamFyOmZpbGU6IikpIHsKLSAgICAgICAgICAgICAgICBpbnQgcGxpbmcgPSB1LmluZGV4T2YoIiEiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgamFyTmFtZSA9IHUuc3Vic3RyaW5nKDksIHBsaW5nKTsKLSAgICAgICAgICAgICAgICBsb2coIkltcGxpY2l0bHkgYWRkaW5nICIramFyTmFtZSsiIHRvIGNsYXNzcGF0aCIsIAotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0TG9jYXRpb24obmV3IEZpbGUoKG5ldyBGaWxlKGphck5hbWUpKS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh1LnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKLSAgICAgICAgICAgICAgICBpbnQgdGFpbCA9IHUuaW5kZXhPZihyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpck5hbWUgPSB1LnN1YnN0cmluZyg1LCB0YWlsKTsKLSAgICAgICAgICAgICAgICBsb2coIkltcGxpY2l0bHkgYWRkaW5nICIrZGlyTmFtZSsiIHRvIGNsYXNzcGF0aCIsIAotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0TG9jYXRpb24obmV3IEZpbGUoKG5ldyBGaWxlKGRpck5hbWUpKS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkRvblwndCBrbm93IGhvdyB0byBoYW5kbGUgcmVzb3VyY2UgVVJMICIrdSwgCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiQ291bGRuXCd0IGZpbmQgIityZXNvdXJjZSwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ2YjliLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogPHA+IFJ1biBhIHNpbmdsZSBKVW5pdCB0ZXN0LgotICoKLSAqIDxwPiBUaGUgSlVuaXQgdGVzdCBpcyBhY3R1YWxseSBydW4gYnkge0BsaW5rIEpVbml0VGVzdFJ1bm5lcn0uCi0gKiBTbyByZWFkIHRoZSBkb2MgY29tbWVudHMgZm9yIHRoYXQgY2xhc3MgOikKLSAqCi0gKiBAYXV0aG9yIFRob21hcyBIYWFzCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+LAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqCi0gKiBAc2VlIEpVbml0VGFzawotICogQHNlZSBKVW5pdFRlc3RSdW5uZXIKLSAqLwotcHVibGljIGNsYXNzIEpVbml0VGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKLSAgICAKLSAgICAvKiogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIAotICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0IGZpbGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBvdXRmaWxlID0gbnVsbDsKLQotICAgIC8vIEB0b2RvIHRoaXMgaXMgZHVwbGljYXRpbmcgVGVzdFJlc3VsdCBpbmZvcm1hdGlvbi4gT25seSB0aGUgdGltZSBpcyBub3QKLSAgICAvLyBwYXJ0IG9mIHRoZSByZXN1bHQuIFNvIHdlJ2QgYmV0dGVyIGRlcml2ZSBhIG5ldyBjbGFzcyBmcm9tIFRlc3RSZXN1bHQKLSAgICAvLyBhbmQgZGVhbCB3aXRoIGl0LiAoU0IpCi0gICAgcHJpdmF0ZSBsb25nIHJ1bnMsIGZhaWx1cmVzLCBlcnJvcnM7Ci0gICAgcHJpdmF0ZSBsb25nIHJ1blRpbWU7Ci0KLSAgICAvLyBTbmFwc2hvdCBvZiB0aGUgc3lzdGVtIHByb3BlcnRpZXMKLSAgICBwcml2YXRlIFByb3BlcnRpZXMgcHJvcHMgPSBudWxsOwotCi0gICAgcHVibGljIEpVbml0VGVzdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlVuaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSAgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBKVW5pdFRlc3QoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaGFsdE9uRXJyb3IsIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSkgewotICAgICAgICB0aGlzLm5hbWUgID0gbmFtZTsKLSAgICAgICAgdGhpcy5oYWx0T25FcnJvciA9IGhhbHRPbkVycm9yOwotICAgICAgICB0aGlzLmhhbHRPbkZhaWwgPSBoYWx0T25GYWlsOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0ZmlsZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgb3V0ZmlsZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPdXRmaWxlKCkgewotICAgICAgICByZXR1cm4gb3V0ZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb3VudHMobG9uZyBydW5zLCBsb25nIGZhaWx1cmVzLCBsb25nIGVycm9ycykgewotICAgICAgICB0aGlzLnJ1bnMgPSBydW5zOwotICAgICAgICB0aGlzLmZhaWx1cmVzID0gZmFpbHVyZXM7Ci0gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJ1blRpbWUobG9uZyBydW5UaW1lKSB7Ci0gICAgICAgIHRoaXMucnVuVGltZSA9IHJ1blRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgcnVuQ291bnQoKSB7cmV0dXJuIHJ1bnM7fQotICAgIHB1YmxpYyBsb25nIGZhaWx1cmVDb3VudCgpIHtyZXR1cm4gZmFpbHVyZXM7fQotICAgIHB1YmxpYyBsb25nIGVycm9yQ291bnQoKSB7cmV0dXJuIGVycm9yczt9Ci0gICAgcHVibGljIGxvbmcgZ2V0UnVuVGltZSgpIHtyZXR1cm4gcnVuVGltZTt9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgeyByZXR1cm4gcHJvcHM7fQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoSGFzaHRhYmxlIHApIHsgCi0gICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsgIAotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGVudW0gPSBwLmtleXMoKTsgZW51bS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgcHJvcHMucHV0KGtleSwgcC5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmIChpZlByb3BlcnR5ICE9IG51bGwgJiYgcC5nZXRQcm9wZXJ0eShpZlByb3BlcnR5KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAodW5sZXNzUHJvcGVydHkgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KHVubGVzc1Byb3BlcnR5KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9ybWF0dGVyRWxlbWVudFtdIGdldEZvcm1hdHRlcnMoKSB7Ci0gICAgICAgIEZvcm1hdHRlckVsZW1lbnRbXSBmZXMgPSBuZXcgRm9ybWF0dGVyRWxlbWVudFtmb3JtYXR0ZXJzLnNpemUoKV07Ci0gICAgICAgIGZvcm1hdHRlcnMuY29weUludG8oZmVzKTsKLSAgICAgICAgcmV0dXJuIGZlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW50IG1ldGhvZCB0byBhZGQgZm9ybWF0dGVycyB0byBhIHZlY3RvcgotICAgICAqLwotICAgIHZvaWQgYWRkRm9ybWF0dGVyc1RvKFZlY3RvciB2KXsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZm9ybWF0dGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKyl7Ci0gICAgICAgICAgICB2LmFkZEVsZW1lbnQoIGZvcm1hdHRlcnMuZWxlbWVudEF0KGkpICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RSdW5uZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDU3YWE0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFNpbXBsZSBUZXN0cnVubmVyIGZvciBKVW5pdCB0aGF0IHJ1bnMgYWxsIHRlc3RzIG9mIGEgdGVzdHN1aXRlLgotICoKLSAqIDxwPlRoaXMgVGVzdFJ1bm5lciBleHBlY3RzIGEgbmFtZSBvZiBhIFRlc3RDYXNlIGNsYXNzIGFzIGl0cwotICogYXJndW1lbnQuIElmIHRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzdGF0aWMgc3VpdGUoKSBtZXRob2QgaXQgd2lsbCBiZQotICogY2FsbGVkIGFuZCB0aGUgcmVzdWx0aW5nIFRlc3Qgd2lsbCBiZSBydW4uIFNvLCB0aGUgc2lnbmF0dXJlIHNob3VsZCBiZSAKLSAqIDxwcmU+PGNvZGU+Ci0gKiAgICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpCi0gKiA8L2NvZGU+PC9wcmU+Ci0gKgotICogPHA+IElmIG5vIHN1Y2ggbWV0aG9kIGV4aXN0cywgYWxsIHB1YmxpYyBtZXRob2RzIHN0YXJ0aW5nIHdpdGggInRlc3QiIGFuZCB0YWtpbmcgbm8KLSAqIGFyZ3VtZW50IHdpbGwgYmUgcnVuLiAKLSAqCi0gKiA8cD4gU3VtbWFyeSBvdXRwdXQgaXMgZ2VuZXJhdGVkIGF0IHRoZSBlbmQuIAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmVyaWtAaGF0Y2hlci5uZXQiPkVyaWsgSGF0Y2hlcjwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSlVuaXRUZXN0UnVubmVyIGltcGxlbWVudHMgVGVzdExpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIE5vIHByb2JsZW1zIHdpdGggdGhpcyB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1MgPSAwOwotCi0gICAgLyoqCi0gICAgICogU29tZSB0ZXN0cyBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFJTFVSRVMgPSAxOwotCi0gICAgLyoqCi0gICAgICogQW4gZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUlMgPSAyOwotCi0gICAgLyoqCi0gICAgICogSG9sZHMgdGhlIHJlZ2lzdGVyZWQgZm9ybWF0dGVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciBmb3JtYXR0ZXJzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdHMgVGVzdFJlc3VsdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXN0UmVzdWx0IHJlczsKLQotICAgIC8qKgotICAgICAqIERvIHdlIHN0b3Agb24gZXJyb3JzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBoYWx0T25FcnJvciA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogRG8gd2Ugc3RvcCBvbiB0ZXN0IGZhaWx1cmVzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBoYWx0T25GYWlsdXJlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29ycmVzcG9uZGluZyB0ZXN0c3VpdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXN0IHN1aXRlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEV4Y2VwdGlvbiBjYXVnaHQgaW4gY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuY29kZQotICAgICAqLwotICAgIHByaXZhdGUgaW50IHJldENvZGUgPSBTVUNDRVNTOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRlc3RTdWl0ZSB3ZSBhcmUgY3VycmVudGx5IHJ1bm5pbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBKVW5pdFRlc3QganVuaXRUZXN0OwotCi0gICAgLyoqIG91dHB1dCB3cml0dGVuIGR1cmluZyB0aGUgdGVzdCAqLwotICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gc3lzdGVtRXJyb3I7Ci0gICAgCi0gICAgLyoqIEVycm9yIG91dHB1dCBkdXJpbmcgdGhlIHRlc3QgKi8KLSAgICBwcml2YXRlIFByaW50U3RyZWFtIHN5c3RlbU91dDsgICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIGZvcms9dHJ1ZSBvciB3aGVuIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgYQotICAgICAqIGNsYXNzcGF0aC4gIAotICAgICAqLwotICAgIHB1YmxpYyBKVW5pdFRlc3RSdW5uZXIoSlVuaXRUZXN0IHRlc3QsIGJvb2xlYW4gaGFsdE9uRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhbHRPbkZhaWx1cmUpIHsKLSAgICAgICAgdGhpcyh0ZXN0LCBoYWx0T25FcnJvciwgaGFsdE9uRmFpbHVyZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdG8gdXNlIHdoZW4gdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIGNsYXNzcGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSlVuaXRUZXN0UnVubmVyKEpVbml0VGVzdCB0ZXN0LCBib29sZWFuIGhhbHRPbkVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYWx0T25GYWlsdXJlLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLSAgICAgICAgdGhpcy5qdW5pdFRlc3QgPSB0ZXN0OwotICAgICAgICB0aGlzLmhhbHRPbkVycm9yID0gaGFsdE9uRXJyb3I7Ci0gICAgICAgIHRoaXMuaGFsdE9uRmFpbHVyZSA9IGhhbHRPbkZhaWx1cmU7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRlc3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGVzdENsYXNzID0gbG9hZGVyLmxvYWRDbGFzcyh0ZXN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIuaW5pdGlhbGl6ZUNsYXNzKHRlc3RDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1ldGhvZCBzdWl0ZU1ldGhvZCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgc3VpdGUgbWV0aG9kCi0gICAgICAgICAgICAgICAgc3VpdGVNZXRob2Q9IHRlc3RDbGFzcy5nZXRNZXRob2QoInN1aXRlIiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBhcHByb3ByaWF0ZSBzdWl0ZSBtZXRob2QgZm91bmQuIFdlIGRvbid0IHJlcG9ydCBhbnkKLSAgICAgICAgICAgICAgICAvLyBlcnJvciBoZXJlIHNpbmNlIGl0IG1pZ2h0IGJlIHBlcmZlY3RseSBub3JtYWwuIFdlIGRvbid0Ci0gICAgICAgICAgICAgICAgLy8ga25vdyBleGFjdGx5IHdoYXQgaXMgdGhlIGNhdXNlLCBidXQgd2UncmUgZG9pbmcgZXhhY3RseQotICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIGFzIEpVbml0IFRlc3RSdW5uZXIgZG8uIFdlIHN3YWxsb3cgdGhlIGV4Y2VwdGlvbnMuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3VpdGVNZXRob2QgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBzdWl0ZSBtZXRob2QgYXZhaWxhYmxlLCB0aGVuIHRyeQotICAgICAgICAgICAgICAgIC8vIHRvIGV4dHJhY3QgdGhlIHN1aXRlIGZyb20gaXQuIElmIHRoZXJlIGlzIGFuIGVycm9yCi0gICAgICAgICAgICAgICAgLy8gaGVyZSBpdCB3aWxsIGJlIGNhdWdodCBiZWxvdyBhbmQgcmVwb3J0ZWQuCi0gICAgICAgICAgICAgICAgc3VpdGUgPSAoVGVzdClzdWl0ZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGV4dHJhY3QgYSB0ZXN0IHN1aXRlIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgaWYgdGhlIGNsYXNzIGlzIG5vIHN1aXRhYmxlIFRlc3QKLSAgICAgICAgICAgICAgICBzdWl0ZT0gbmV3IFRlc3RTdWl0ZSh0ZXN0Q2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldENvZGUgPSBFUlJPUlM7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICByZXMgPSBuZXcgVGVzdFJlc3VsdCgpOwotICAgICAgICByZXMuYWRkTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZvcm1hdHRlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHJlcy5hZGRMaXN0ZW5lcigoVGVzdExpc3RlbmVyKWZvcm1hdHRlcnMuZWxlbWVudEF0KGkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICBmaXJlU3RhcnRUZXN0U3VpdGUoKTsKLSAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7IC8vIGhhZCBhbiBleGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmb3JtYXR0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgKChUZXN0TGlzdGVuZXIpZm9ybWF0dGVycy5lbGVtZW50QXQoaSkpLmFkZEVycm9yKG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAganVuaXRUZXN0LnNldENvdW50cygxLCAwLCAxKTsKLSAgICAgICAgICAgIGp1bml0VGVzdC5zZXRSdW5UaW1lKDApOwotICAgICAgICB9IGVsc2UgewotCi0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnJTdHJtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgc3lzdGVtRXJyb3IgPSBuZXcgUHJpbnRTdHJlYW0oZXJyU3RybSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgc3lzdGVtT3V0ID0gbmV3IFByaW50U3RyZWFtKG91dFN0cm0pOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN1aXRlLnJ1bihyZXMpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzeXN0ZW1FcnJvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHN5c3RlbUVycm9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzeXN0ZW1PdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBzeXN0ZW1PdXQgPSBudWxsOwotICAgICAgICAgICAgICAgIHNlbmRPdXRBbmRFcnIobmV3IFN0cmluZyhvdXRTdHJtLnRvQnl0ZUFycmF5KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhlcnJTdHJtLnRvQnl0ZUFycmF5KCkpKTsKLQotICAgICAgICAgICAgICAgIGp1bml0VGVzdC5zZXRDb3VudHMocmVzLnJ1bkNvdW50KCksIHJlcy5mYWlsdXJlQ291bnQoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZXJyb3JDb3VudCgpKTsKLSAgICAgICAgICAgICAgICBqdW5pdFRlc3Quc2V0UnVuVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaXJlRW5kVGVzdFN1aXRlKCk7Ci0KLSAgICAgICAgaWYgKHJldENvZGUgIT0gU1VDQ0VTUyB8fCByZXMuZXJyb3JDb3VudCgpICE9IDApIHsKLSAgICAgICAgICAgIHJldENvZGUgPSBFUlJPUlM7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzLmZhaWx1cmVDb3VudCgpICE9IDApIHsKLSAgICAgICAgICAgIHJldENvZGUgPSBGQUlMVVJFUzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hhdCBTeXN0ZW0uZXhpdCgpIHdvdWxkIHJldHVybiBpbiB0aGUgc3RhbmRhbG9uZSB2ZXJzaW9uLgotICAgICAqCi0gICAgICogQHJldHVybiAyIGlmIGVycm9ycyBvY2N1cnJlZCwgMSBpZiB0ZXN0cyBmYWlsZWQgZWxzZSAwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UmV0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHJldENvZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lci4KLSAgICAgKgotICAgICAqIDxwPkEgbmV3IFRlc3QgaXMgc3RhcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0KSB7fQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lci4KLSAgICAgKgotICAgICAqIDxwPkEgVGVzdCBpcyBmaW5pc2hlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkge30KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZsdDs9IDMuNC4KLSAgICAgKgotICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGlmIChoYWx0T25GYWlsdXJlKSB7Ci0gICAgICAgICAgICByZXMuc3RvcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lciBmb3IgSlVuaXQgJmd0OyAzLjQuCi0gICAgICoKLSAgICAgKiA8cD5BIFRlc3QgZmFpbGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7Ci0gICAgICAgIGFkZEZhaWx1cmUodGVzdCwgKFRocm93YWJsZSkgdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lci4KLSAgICAgKgotICAgICAqIDxwPkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgcnVubmluZyB0aGUgdGVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGlmIChoYWx0T25FcnJvcikgewotICAgICAgICAgICAgcmVzLnN0b3AoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dChTdHJpbmcgbGluZSkgewotICAgICAgICBpZiAoc3lzdGVtT3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN5c3RlbU91dC5wcmludGxuKGxpbmUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yT3V0cHV0KFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmIChzeXN0ZW1FcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzeXN0ZW1FcnJvci5wcmludGxuKGxpbmUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZW5kT3V0QW5kRXJyKFN0cmluZyBvdXQsIFN0cmluZyBlcnIpIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZvcm1hdHRlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEpVbml0UmVzdWx0Rm9ybWF0dGVyIGZvcm1hdHRlciA9IAotICAgICAgICAgICAgICAgICgoSlVuaXRSZXN1bHRGb3JtYXR0ZXIpZm9ybWF0dGVycy5lbGVtZW50QXQoaSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3JtYXR0ZXIuc2V0U3lzdGVtT3V0cHV0KG91dCk7Ci0gICAgICAgICAgICBmb3JtYXR0ZXIuc2V0U3lzdGVtRXJyb3IoZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXJlU3RhcnRUZXN0U3VpdGUoKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxmb3JtYXR0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKEpVbml0UmVzdWx0Rm9ybWF0dGVyKWZvcm1hdHRlcnMuZWxlbWVudEF0KGkpKS5zdGFydFRlc3RTdWl0ZShqdW5pdFRlc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVFbmRUZXN0U3VpdGUoKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxmb3JtYXR0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKEpVbml0UmVzdWx0Rm9ybWF0dGVyKWZvcm1hdHRlcnMuZWxlbWVudEF0KGkpKS5lbmRUZXN0U3VpdGUoanVuaXRUZXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZvcm1hdHRlcihKVW5pdFJlc3VsdEZvcm1hdHRlciBmKSB7Ci0gICAgICAgIGZvcm1hdHRlcnMuYWRkRWxlbWVudChmKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnRyeSBwb2ludCBmb3Igc3RhbmRhbG9uZSAoZm9ya2VkKSBtb2RlLgotICAgICAqCi0gICAgICogUGFyYW1ldGVyczogdGVzdGNhc2VjbGFzc25hbWUgcGx1cyBwYXJhbWV0ZXJzIGluIHRoZSBmb3JtYXQKLSAgICAgKiBrZXk9dmFsdWUsIG5vbmUgb2Ygd2hpY2ggaXMgcmVxdWlyZWQuCi0gICAgICoKLSAgICAgKiA8dGFibGUgY29scz0iNCIgYm9yZGVyPSIxIj4KLSAgICAgKiA8dHI+PHRoPmtleTwvdGg+PHRoPmRlc2NyaXB0aW9uPC90aD48dGg+ZGVmYXVsdCB2YWx1ZTwvdGg+PC90cj4KLSAgICAgKgotICAgICAqIDx0cj48dGQ+aGFsdE9uRXJyb3I8L3RkPjx0ZD5oYWx0IHRlc3Qgb24KLSAgICAgKiBlcnJvcnM/PC90ZD48dGQ+ZmFsc2U8L3RkPjwvdHI+Ci0gICAgICoKLSAgICAgKiA8dHI+PHRkPmhhbHRPbkZhaWx1cmU8L3RkPjx0ZD5oYWx0IHRlc3Qgb24KLSAgICAgKiBmYWlsdXJlcz88L3RkPjx0ZD5mYWxzZTwvdGQ+PC90cj4KLSAgICAgKgotICAgICAqIDx0cj48dGQ+Zm9ybWF0dGVyPC90ZD48dGQ+QSBKVW5pdFJlc3VsdEZvcm1hdHRlciBnaXZlbiBhcwotICAgICAqIGNsYXNzbmFtZSxmaWxlbmFtZS4gSWYgZmlsZW5hbWUgaXMgb21taXR0ZWQsIFN5c3RlbS5vdXQgaXMKLSAgICAgKiBhc3N1bWVkLjwvdGQ+PHRkPm5vbmU8L3RkPjwvdHI+Ci0gICAgICoKLSAgICAgKiA8L3RhYmxlPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGV4aXRBdEVuZCA9IHRydWU7Ci0gICAgICAgIGJvb2xlYW4gaGFsdEVycm9yID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaGFsdEZhaWwgPSBmYWxzZTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmVxdWlyZWQgYXJndW1lbnQgVGVzdENsYXNzTmFtZSBtaXNzaW5nIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdChFUlJPUlMpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaT0xOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoImhhbHRPbkVycm9yPSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFsdEVycm9yID0gUHJvamVjdC50b0Jvb2xlYW4oYXJnc1tpXS5zdWJzdHJpbmcoMTIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCJoYWx0T25GYWlsdXJlPSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFsdEZhaWwgPSBQcm9qZWN0LnRvQm9vbGVhbihhcmdzW2ldLnN1YnN0cmluZygxNCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoImZvcm1hdHRlcj0iKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFuZFN0b3JlRm9ybWF0dGVyKGFyZ3NbaV0uc3Vic3RyaW5nKDEwKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KEVSUk9SUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoInByb3BzZmlsZT0iKSkgewotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnc1tpXS5zdWJzdHJpbmcoMTApKTsKLSAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBKVW5pdFRlc3QgdCA9IG5ldyBKVW5pdFRlc3QoYXJnc1swXSk7Ci0KLSAgICAgICAgLy8gQWRkL292ZXJsYXkgc3lzdGVtIHByb3BlcnRpZXMgb24gdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgQW50IHByb2plY3QKLSAgICAgICAgSGFzaHRhYmxlIHAgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGVudW0gPSBwLmtleXMoKTsgZW51bS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgcHJvcHMucHV0KGtleSwgcC5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgdC5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQotICAgICAgICBKVW5pdFRlc3RSdW5uZXIgcnVubmVyID0gbmV3IEpVbml0VGVzdFJ1bm5lcih0LCBoYWx0RXJyb3IsIGhhbHRGYWlsKTsKLSAgICAgICAgdHJhbnNmZXJGb3JtYXR0ZXJzKHJ1bm5lcik7Ci0gICAgICAgIHJ1bm5lci5ydW4oKTsKLSAgICAgICAgU3lzdGVtLmV4aXQocnVubmVyLmdldFJldENvZGUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGZyb21DbWRMaW5lID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmFuc2ZlckZvcm1hdHRlcnMoSlVuaXRUZXN0UnVubmVyIHJ1bm5lcikgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZnJvbUNtZExpbmUuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHJ1bm5lci5hZGRGb3JtYXR0ZXIoKEpVbml0UmVzdWx0Rm9ybWF0dGVyKSBmcm9tQ21kTGluZS5lbGVtZW50QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGluZSBmb3JtYXQgaXM6IGZvcm1hdHRlcj08Y2xhc3NuYW1lPigsPHBhdGhuYW1lPik/Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVBbmRTdG9yZUZvcm1hdHRlcihTdHJpbmcgbGluZSkKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRm9ybWF0dGVyRWxlbWVudCBmZSA9IG5ldyBGb3JtYXR0ZXJFbGVtZW50KCk7Ci0gICAgICAgIGludCBwb3MgPSBsaW5lLmluZGV4T2YoJywnKTsKLSAgICAgICAgaWYgKHBvcyA9PSAtMSkgewotICAgICAgICAgICAgZmUuc2V0Q2xhc3NuYW1lKGxpbmUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmUuc2V0Q2xhc3NuYW1lKGxpbmUuc3Vic3RyaW5nKDAsIHBvcykpOwotICAgICAgICAgICAgZmUuc2V0T3V0ZmlsZSggbmV3IEZpbGUobGluZS5zdWJzdHJpbmcocG9zICsgMSkpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJvbUNtZExpbmUuYWRkRWxlbWVudChmZS5jcmVhdGVGb3JtYXR0ZXIoKSk7Ci0gICAgfQotCi19IC8vIEpVbml0VGVzdFJ1bm5lcgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTFmOWNmLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1BsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogUHJpbnRzIHBsYWluIHRleHQgb3V0cHV0IG9mIHRoZSB0ZXN0IHRvIGEgc3BlY2lmaWVkIFdyaXRlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIgaW1wbGVtZW50cyBKVW5pdFJlc3VsdEZvcm1hdHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXR0ZXIgZm9yIHRpbWluZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOdW1iZXJGb3JtYXQgbmYgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKLSAgICAvKioKLSAgICAgKiBUaW1pbmcgaGVscGVyLgotICAgICAqLwotICAgIHByaXZhdGUgbG9uZyBsYXN0VGVzdFN0YXJ0ID0gMDsKLSAgICAvKioKLSAgICAgKiBXaGVyZSB0byB3cml0ZSB0aGUgbG9nIHRvLgotICAgICAqLwotICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKLSAgICAvKioKLSAgICAgKiBIZWxwZXIgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIG91dHB1dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1dyaXRlciBpbm5lcjsKLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBsYXllciBvbiB0b3Agb2Yge0BsaW5rICNpbm5lciBpbm5lcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcmludFdyaXRlciB3cmk7Ci0gICAgLyoqCi0gICAgICogU3VwcHJlc3MgZW5kVGVzdCBpZiB0ZXN0Y2FzZSBmYWlsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZhaWxlZCA9IHRydWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzeXN0ZW1PdXRwdXQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHN5c3RlbUVycm9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBQbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgewotICAgICAgICBpbm5lciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgd3JpID0gbmV3IFByaW50V3JpdGVyKGlubmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoT3V0cHV0U3RyZWFtIG91dCkgewotICAgICAgICB0aGlzLm91dCA9IG91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nIG91dCkgewotICAgICAgICBzeXN0ZW1PdXRwdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtRXJyb3IoU3RyaW5nIGVycikgewotICAgICAgICBzeXN0ZW1FcnJvciA9IGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2hvbGUgdGVzdHN1aXRlIGVuZGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJUZXN0c3VpdGU6ICIpOwotICAgICAgICBzYi5hcHBlbmQoc3VpdGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIlRlc3RzIHJ1bjogIik7Ci0gICAgICAgIHNiLmFwcGVuZChzdWl0ZS5ydW5Db3VudCgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIEZhaWx1cmVzOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmZhaWx1cmVDb3VudCgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIEVycm9yczogIik7Ci0gICAgICAgIHNiLmFwcGVuZChzdWl0ZS5lcnJvckNvdW50KCkpOwotICAgICAgICBzYi5hcHBlbmQoIiwgVGltZSBlbGFwc2VkOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKG5mLmZvcm1hdChzdWl0ZS5nZXRSdW5UaW1lKCkvMTAwMC4wKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIHNlYyIpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBhcHBlbmQgdGhlIGVyciBhbmQgb3V0cHV0IHN0cmVhbXMgdG8gdGhlIGxvZwotICAgICAgICBpZiAoc3lzdGVtT3V0cHV0ICE9IG51bGwgJiYgc3lzdGVtT3V0cHV0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0iICkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKG5ld0xpbmUpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChzeXN0ZW1PdXRwdXQpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSIgKQotICAgICAgICAgICAgICAgIC5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzeXN0ZW1FcnJvciAhPSBudWxsICYmIHN5c3RlbUVycm9yLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIEVycm9yIC0tLS0tLS0tLS0tLS0tLS0tIiApCi0gICAgICAgICAgICAgICAgLmFwcGVuZChuZXdMaW5lKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoc3lzdGVtRXJyb3IpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSIgKQotICAgICAgICAgICAgICAgIC5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0KLSAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dC53cml0ZShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIHdyaS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShpbm5lci50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIG91dHB1dCIsIGlvZXgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAob3V0ICE9IFN5c3RlbS5vdXQgJiYgb3V0ICE9IFN5c3RlbS5lcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIuCi0gICAgICoKLSAgICAgKiA8cD5BIG5ldyBUZXN0IGlzIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdCkgewotICAgICAgICBsYXN0VGVzdFN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdyaS5wcmludCgiVGVzdGNhc2U6ICIgKyAoKFRlc3RDYXNlKSB0KS5uYW1lKCkpOwotICAgICAgICBmYWlsZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgVGVzdExpc3RlbmVyLgotICAgICAqCi0gICAgICogPHA+QSBUZXN0IGlzIGZpbmlzaGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGlmIChmYWlsZWQpIHJldHVybjsKLSAgICAgICAgd3JpLnByaW50bG4oIiB0b29rICIgCi0gICAgICAgICAgICAgICAgICAgICsgbmYuZm9ybWF0KChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1sYXN0VGVzdFN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIDEwMDAuMCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlYyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZsdDs9IDMuNC4KLSAgICAgKgotICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGZvcm1hdEVycm9yKCJcdEZBSUxFRCIsIHRlc3QsIHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZndDsgMy40LgotICAgICAqCi0gICAgICogPHA+QSBUZXN0IGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgewotICAgICAgICBhZGRGYWlsdXJlKHRlc3QsIChUaHJvd2FibGUpIHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIuCi0gICAgICoKLSAgICAgKiA8cD5BbiBlcnJvciBvY2N1cmVkIHdoaWxlIHJ1bm5pbmcgdGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgewotICAgICAgICBmb3JtYXRFcnJvcigiXHRDYXVzZWQgYW4gRVJST1IiLCB0ZXN0LCB0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZm9ybWF0RXJyb3IoU3RyaW5nIHR5cGUsIFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5kVGVzdCh0ZXN0KTsKLSAgICAgICAgfQotICAgICAgICBmYWlsZWQgPSB0cnVlOwotCi0gICAgICAgIHdyaS5wcmludGxuKHR5cGUpOwotICAgICAgICB3cmkucHJpbnRsbih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHdyaSk7Ci0gICAgICAgIHdyaS5wcmludGxuKCIiKTsKLSAgICB9Ci19IC8vIFBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1N1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmYyMmEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKLQotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcmludHMgc2hvcnQgc3VtbWFyeSBvdXRwdXQgb2YgdGhlIHRlc3QgdG8gQW50J3MgbG9nZ2luZyBzeXN0ZW0uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICovCi0gCi1wdWJsaWMgY2xhc3MgU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyIGltcGxlbWVudHMgSlVuaXRSZXN1bHRGb3JtYXR0ZXIgewotCi0gICAgLyoqCi0gICAgICogRm9ybWF0dGVyIGZvciB0aW1pbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7Ci0gICAgLyoqCi0gICAgICogT3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRvLgotICAgICAqLwotICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB3aXRoT3V0QW5kRXJyID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3lzdGVtT3V0cHV0ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBzeXN0ZW1FcnJvciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBFbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIoKSB7fQotICAgIC8qKgotICAgICAqIEVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB7fQotICAgIC8qKgotICAgICAqIEVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdCkge30KLSAgICAvKioKLSAgICAgKiBFbXB0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7fQotICAgIC8qKgotICAgICAqIEVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7fQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZndDsgMy40LgotICAgICAqCi0gICAgICogPHA+QSBUZXN0IGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgewotICAgICAgICBhZGRGYWlsdXJlKHRlc3QsIChUaHJvd2FibGUpIHQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBFbXB0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHt9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtT3V0cHV0KCBTdHJpbmcgb3V0ICkgewotICAgICAgICBzeXN0ZW1PdXRwdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtRXJyb3IoIFN0cmluZyBlcnIgKSB7Ci0gICAgICAgIHN5c3RlbUVycm9yID0gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3VsZCB0aGUgb3V0cHV0IHRvIFN5c3RlbS5vdXQgYW5kIFN5c3RlbS5lcnIgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoZSBzdW1tYXJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdpdGhPdXRBbmRFcnIoIGJvb2xlYW4gdmFsdWUgKSB7Ci0gICAgICAgIHdpdGhPdXRBbmRFcnIgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2hvbGUgdGVzdHN1aXRlIGVuZGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJUZXN0cyBydW46ICIpOwotICAgICAgICBzYi5hcHBlbmQoc3VpdGUucnVuQ291bnQoKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBGYWlsdXJlczogIik7Ci0gICAgICAgIHNiLmFwcGVuZChzdWl0ZS5mYWlsdXJlQ291bnQoKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBFcnJvcnM6ICIpOwotICAgICAgICBzYi5hcHBlbmQoc3VpdGUuZXJyb3JDb3VudCgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIFRpbWUgZWxhcHNlZDogIik7Ci0gICAgICAgIHNiLmFwcGVuZChuZi5mb3JtYXQoc3VpdGUuZ2V0UnVuVGltZSgpLzEwMDAuMCkpOwotICAgICAgICBzYi5hcHBlbmQoIiBzZWMiKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotCi0gICAgICAgIGlmICh3aXRoT3V0QW5kRXJyKSB7Ci0gICAgICAgICAgICBpZiAoc3lzdGVtT3V0cHV0ICE9IG51bGwgJiYgc3lzdGVtT3V0cHV0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIk91dHB1dDoiICkuYXBwZW5kKG5ld0xpbmUpLmFwcGVuZChzeXN0ZW1PdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzeXN0ZW1FcnJvciAhPSBudWxsICYmIHN5c3RlbUVycm9yLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIkVycm9yOiAiICkuYXBwZW5kKG5ld0xpbmUpLmFwcGVuZChzeXN0ZW1FcnJvcikKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBzdW1tYXJ5IG91dHB1dCIsIGlvZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dCAhPSBTeXN0ZW0ub3V0ICYmIG91dCAhPSBTeXN0ZW0uZXJyKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTENvbnN0YW50cy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTQ1MDIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7Ci0KLS8qKgotICogPHA+IEludGVyZmFjZSBncm91cHMgWE1MIGNvbnN0YW50cy4KLSAqIEludGVyZmFjZSB0aGF0IGdyb3VwcyBhbGwgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgPHR0PlhNTDwvdHQ+Ci0gKiBkb2N1bWVudHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSA8dHQ+WE1MSlVuaXRSZXN1bHRGb3JtYXR0ZXI8L3R0PgotICogQXMgb2Ygbm93IHRoZSBEVEQgaXM6Ci0gKiA8Y29kZT48cHJlPgotICogPC0tLS0tLS0tLS0tLS0tLS0tIEB0b2RvIGRlc2NyaWJlIERURHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLSAqCi0gKiA8L3ByZT48L2NvZGU+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICogQHNlZSBYTUxKVW5pdFJlc3VsdEZvcm1hdHRlcgotICogQHNlZSBYTUxSZXN1bHRBZ2dyZWdhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MQ29uc3RhbnRzIHsKLSAgICAvKiogdGhlIHRlc3RzdWl0ZXMgZWxlbWVudCBmb3IgdGhlIGFnZ3JlZ2F0ZSBkb2N1bWVudCAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRFU1RTVUlURVMgPSAidGVzdHN1aXRlcyI7Ci0KLSAgICAvKiogdGhlIHRlc3RzdWl0ZSBlbGVtZW50ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVTVFNVSVRFID0gInRlc3RzdWl0ZSI7Ci0KLSAgICAvKiogdGhlIHRlc3RjYXNlIGVsZW1lbnQgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBURVNUQ0FTRSA9ICJ0ZXN0Y2FzZSI7Ci0KLSAgICAvKiogdGhlIGVycm9yIGVsZW1lbnQgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFUlJPUiA9ICJlcnJvciI7Ci0KLSAgICAvKiogdGhlIGZhaWx1cmUgZWxlbWVudCAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZBSUxVUkUgPSAiZmFpbHVyZSI7Ci0KLSAgICAvKiogdGhlIHN5c3RlbS1lcnIgZWxlbWVudCAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNZU1RFTV9FUlIgPSAic3lzdGVtLWVyciI7Ci0KLSAgICAvKiogdGhlIHN5c3RlbS1vdXQgZWxlbWVudCAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNZU1RFTV9PVVQgPSAic3lzdGVtLW91dCI7Ci0KLSAgICAvKiogcGFja2FnZSBhdHRyaWJ1dGUgZm9yIHRoZSBhZ2dyZWdhdGUgZG9jdW1lbnQgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1BBQ0tBR0UgPSAicGFja2FnZSI7Ci0KLSAgICAvKiogbmFtZSBhdHRyaWJ1dGUgZm9yIHByb3BlcnR5LCB0ZXN0Y2FzZSBhbmQgdGVzdHN1aXRlIGVsZW1lbnRzICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCi0gICAgLyoqIHRpbWUgYXR0cmlidXRlIGZvciB0ZXN0Y2FzZSBhbmQgdGVzdHN1aXRlIGVsZW1lbnRzICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9USU1FID0gInRpbWUiOwotCi0gICAgLyoqIGVycm9ycyBhdHRyaWJ1dGUgZm9yIHRlc3RzdWl0ZSBlbGVtZW50cyAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfRVJST1JTID0gImVycm9ycyI7Ci0KLSAgICAvKiogZmFpbHVyZXMgYXR0cmlidXRlIGZvciB0ZXN0c3VpdGUgZWxlbWVudHMgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0ZBSUxVUkVTID0gImZhaWx1cmVzIjsKLQotICAgIC8qKiB0ZXN0cyBhdHRyaWJ1dGUgZm9yIHRlc3RzdWl0ZSBlbGVtZW50cyAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVEVTVFMgPSAidGVzdHMiOwotCi0gICAgLyoqIHR5cGUgYXR0cmlidXRlIGZvciBmYWlsdXJlIGFuZCBlcnJvciBlbGVtZW50cyAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsKLQotICAgIC8qKiBtZXNzYWdlIGF0dHJpYnV0ZSBmb3IgZmFpbHVyZSBlbGVtZW50cyAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTUVTU0FHRSA9ICJtZXNzYWdlIjsKLQotICAgIC8qKiB0aGUgcHJvcGVydGllcyBlbGVtZW50ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsKLQotICAgIC8qKiB0aGUgcHJvcGVydHkgZWxlbWVudCAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZID0gInByb3BlcnR5IjsKLQotICAgIC8qKiB2YWx1ZSBhdHRyaWJ1dGUgZm9yIHByb3BlcnR5IGVsZW1lbnRzICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9WQUxVRSA9ICJ2YWx1ZSI7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTM2NDIzLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7Ci1pbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRPTUVsZW1lbnRXcml0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFByaW50cyBYTUwgb3V0cHV0IG9mIHRoZSB0ZXN0IHRvIGEgc3BlY2lmaWVkIFdyaXRlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzplcmlrQGhhdGNoZXIubmV0Ij5FcmlrIEhhdGNoZXI8L2E+Ci0gKgotICogQHNlZSBGb3JtYXR0ZXJFbGVtZW50IAotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxKVW5pdFJlc3VsdEZvcm1hdHRlciBpbXBsZW1lbnRzIEpVbml0UmVzdWx0Rm9ybWF0dGVyLCBYTUxDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcihleGMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIFhNTCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIERvY3VtZW50IGRvYzsKLSAgICAvKioKLSAgICAgKiBUaGUgd3JhcHBlciBmb3IgdGhlIHdob2xlIHRlc3RzdWl0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgcm9vdEVsZW1lbnQ7Ci0gICAgLyoqCi0gICAgICogRWxlbWVudCBmb3IgdGhlIGN1cnJlbnQgdGVzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgY3VycmVudFRlc3Q7Ci0gICAgLyoqCi0gICAgICogVGltaW5nIGhlbHBlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgbGFzdFRlc3RTdGFydCA9IDA7Ci0gICAgLyoqCi0gICAgICogV2hlcmUgdG8gd3JpdGUgdGhlIGxvZyB0by4KLSAgICAgKi8KLSAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7Ci0KLSAgICBwdWJsaWMgWE1MSlVuaXRSZXN1bHRGb3JtYXR0ZXIoKSB7fQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtT3V0cHV0KFN0cmluZyBvdXQpIHsKLSAgICAgICAgZm9ybWF0T3V0cHV0KFNZU1RFTV9PVVQsIG91dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtRXJyb3IoU3RyaW5nIG91dCkgewotICAgICAgICBmb3JtYXRPdXRwdXQoU1lTVEVNX0VSUiwgb3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2hvbGUgdGVzdHN1aXRlIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB7Ci0gICAgICAgIGRvYyA9IGdldERvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gICAgICAgIHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoVEVTVFNVSVRFKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfTkFNRSwgc3VpdGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBPdXRwdXQgcHJvcGVydGllcwotICAgICAgICBFbGVtZW50IHByb3BzRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFBST1BFUlRJRVMpOwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChwcm9wc0VsZW1lbnQpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gc3VpdGUuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBpZiAocHJvcHMgIT0gbnVsbCkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBwcm9wRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFBST1BFUlRZKTsKLSAgICAgICAgICAgICAgICBwcm9wRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9OQU1FLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBwcm9wRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9WQUxVRSwgcHJvcHMuZ2V0UHJvcGVydHkobmFtZSkpOwotICAgICAgICAgICAgICAgIHByb3BzRWxlbWVudC5hcHBlbmRDaGlsZChwcm9wRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2hvbGUgdGVzdHN1aXRlIGVuZGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX1RFU1RTLCAiIitzdWl0ZS5ydW5Db3VudCgpKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfRkFJTFVSRVMsICIiK3N1aXRlLmZhaWx1cmVDb3VudCgpKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfRVJST1JTLCAiIitzdWl0ZS5lcnJvckNvdW50KCkpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9USU1FLCAiIisoc3VpdGUuZ2V0UnVuVGltZSgpLzEwMDAuMCkpOwotICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFdyaXRlciB3cmkgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3cmkgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURjgiKTsKLSAgICAgICAgICAgICAgICB3cmkud3JpdGUoIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4iKTsKLSAgICAgICAgICAgICAgICAobmV3IERPTUVsZW1lbnRXcml0ZXIoKSkud3JpdGUocm9vdEVsZW1lbnQsIHdyaSwgMCwgIiAgIik7Ci0gICAgICAgICAgICAgICAgd3JpLmZsdXNoKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIGxvZyBmaWxlIiwgZXhjKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dCAhPSBTeXN0ZW0ub3V0ICYmIG91dCAhPSBTeXN0ZW0uZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3cmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmkuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgVGVzdExpc3RlbmVyLgotICAgICAqCi0gICAgICogPHA+QSBuZXcgVGVzdCBpcyBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChUZXN0IHQpIHsKLSAgICAgICAgbGFzdFRlc3RTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBjdXJyZW50VGVzdCA9IGRvYy5jcmVhdGVFbGVtZW50KFRFU1RDQVNFKTsKLSAgICAgICAgY3VycmVudFRlc3Quc2V0QXR0cmlidXRlKEFUVFJfTkFNRSwgKChUZXN0Q2FzZSkgdCkubmFtZSgpKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3VycmVudFRlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIuCi0gICAgICoKLSAgICAgKiA8cD5BIFRlc3QgaXMgZmluaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgY3VycmVudFRlc3Quc2V0QXR0cmlidXRlKEFUVFJfVElNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKygoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktbGFzdFRlc3RTdGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIDEwMDAuMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZsdDs9IDMuNC4KLSAgICAgKgotICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGZvcm1hdEVycm9yKEZBSUxVUkUsIHRlc3QsIHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZndDsgMy40LgotICAgICAqCi0gICAgICogPHA+QSBUZXN0IGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgewotICAgICAgICBhZGRGYWlsdXJlKHRlc3QsIChUaHJvd2FibGUpIHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIuCi0gICAgICoKLSAgICAgKiA8cD5BbiBlcnJvciBvY2N1cmVkIHdoaWxlIHJ1bm5pbmcgdGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgewotICAgICAgICBmb3JtYXRFcnJvcihFUlJPUiwgdGVzdCwgdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZvcm1hdEVycm9yKFN0cmluZyB0eXBlLCBUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuZFRlc3QodGVzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbGVtZW50IG5lc3RlZCA9IGRvYy5jcmVhdGVFbGVtZW50KHR5cGUpOwotICAgICAgICBpZiAodGVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJyZW50VGVzdC5hcHBlbmRDaGlsZChuZXN0ZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobmVzdGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gdC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIG5lc3RlZC5zZXRBdHRyaWJ1dGUoQVRUUl9NRVNTQUdFLCB0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbmVzdGVkLnNldEF0dHJpYnV0ZShBVFRSX1RZUEUsIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIFN0cmluZ1dyaXRlciBzd3IgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzd3IsIHRydWUpKTsKLSAgICAgICAgVGV4dCB0cmFjZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZShzd3IudG9TdHJpbmcoKSk7Ci0gICAgICAgIG5lc3RlZC5hcHBlbmRDaGlsZCh0cmFjZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZvcm1hdE91dHB1dChTdHJpbmcgdHlwZSwgU3RyaW5nIG91dHB1dCkgewotICAgICAgICBFbGVtZW50IG5lc3RlZCA9IGRvYy5jcmVhdGVFbGVtZW50KHR5cGUpOwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChuZXN0ZWQpOwotICAgICAgICBUZXh0IGNvbnRlbnQgPSBkb2MuY3JlYXRlVGV4dE5vZGUob3V0cHV0KTsKLSAgICAgICAgbmVzdGVkLmFwcGVuZENoaWxkKGNvbnRlbnQpOwotICAgIH0KLQotfSAvLyBYTUxKVW5pdFJlc3VsdEZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MUmVzdWx0QWdncmVnYXRvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MUmVzdWx0QWdncmVnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QzYjM4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTFJlc3VsdEFnZ3JlZ2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5ET01FbGVtZW50V3JpdGVyOwotCi0KLS8qKgotICogPHA+IFRoaXMgaXMgYW4gaGVscGVyIGNsYXNzIHRoYXQgd2lsbCBhZ2dyZWdhdGUgYWxsIHRlc3RzdWl0ZXMgdW5kZXIgYSBzcGVjaWZpYwotICogZGlyZWN0b3J5IGFuZCBjcmVhdGUgYSBuZXcgc2luZ2xlIGRvY3VtZW50LiBJdCBpcyBub3QgcGFydGljdWxhcnkgY2xlYW4gYnV0Ci0gKiBzaG91bGQgYmUgaGVscGZ1bCB3aGlsZSBJIGFtIHRoaW5raW5nIGFib3V0IGFub3RoZXIgdGVjaG5pcXVlLgotICoKLSAqIDxwPiBUaGUgbWFpbiBwcm9ibGVtIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGEgSlZNIGNhbiBiZSBmb3JrZWQgZm9yIGEgdGVzdGNhc2UKLSAqIHRodXMgbWFraW5nIGl0IGltcG9zc2libGUgdG8gYWdncmVnYXRlIGFsbCB0ZXN0Y2FzZXMgc2luY2UgdGhlIGxpc3RlbmVyIGlzCi0gKiAob2J2aW91c2x5KSBpbiB0aGUgZm9ya2VkIEpWTS4gQSBzb2x1dGlvbiBjb3VsZCBiZSB0byB3cml0ZSBhCi0gKiBUZXN0TGlzdGVuZXIgdGhhdCB3aWxsIHJlY2VpdmUgZXZlbnRzIGZyb20gdGhlIFRlc3RSdW5uZXIgdmlhIHNvY2tldHMuIFRoaXMKLSAqIGlzIElNSE8gdGhlIHNpbXBsZXN0IHdheSB0byBkbyBpdCB0byBhdm9pZCB0aGlzIGZpbGUgaGFja2luZyB0aGluZy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgWE1MUmVzdWx0QWdncmVnYXRvciBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBYTUxDb25zdGFudHMgewotICAgIAotICAgIC8qKiB0aGUgbGlzdCBvZiBhbGwgZmlsZXNldHMsIHRoYXQgc2hvdWxkIGNvbnRhaW5zIHRoZSB4bWwgdG8gYWdncmVnYXRlICovCi0gICAgcHJvdGVjdGVkIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICAvKiogdGhlIG5hbWUgb2YgdGhlIHJlc3VsdCBmaWxlICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0b0ZpbGU7Ci0gICAgCi0gICAgLyoqIHRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGZpbGUgdG8gKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSB0b0RpcjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIHRyYW5zZm9ybWVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICAvKiogdGhlIGRlZmF1bHQgZGlyZWN0b3J5OiA8dHQ+LjwvdHQ+LiBJdCBpcyByZXNvbHZlZCBmcm9tIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfRElSID0gIi4iOwotICAgIAotICAgIC8qKiB0aGUgZGVmYXVsdCBmaWxlIG5hbWU6IDx0dD5URVNUUy1UZXN0U3VpdGVzLnhtbDwvdHQ+ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9GSUxFTkFNRSA9ICJURVNUUy1UZXN0U3VpdGVzLnhtbCI7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIGNyZWF0ZVJlcG9ydCgpewotICAgICAgICBBZ2dyZWdhdGVUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG5ldyBBZ2dyZWdhdGVUcmFuc2Zvcm1lcih0aGlzKTsKLSAgICAgICAgdHJhbnNmb3JtZXJzLmFkZEVsZW1lbnQodHJhbnNmb3JtZXIpOwotICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhZ2dyZWdhdGluZyB0aGUgcmVzdWx0cy4gSXQgbXVzdCBiZSByZWxhdGl2ZQotICAgICAqIGZyb20gdGhlIDx0dD50b2RpcjwvdHQ+IGF0dHJpYnV0ZS4gSWYgbm90IHNldCBpdCB3aWxsIHVzZSB7QGxpbmsgI0RFRkFVTFRfRklMRU5BTUV9Ci0gICAgICogQHBhcmFtICB2YWx1ZSAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEBzZWUgI3NldFRvZGlyKEZpbGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9maWxlKFN0cmluZyB2YWx1ZSl7Ci0gICAgICAgIHRvRmlsZSA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgcmVzdWx0cyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbm90Ci0gICAgICogc2V0IGlmIHdpbGwgdXNlIHtAbGluayAjREVGQVVMVF9ESVJ9LiBXaGVuIGdpdmVuIGEgcmVsYXRpdmUgZGlyZWN0b3J5Ci0gICAgICogaXQgd2lsbCByZXNvbHZlIGl0IGZyb20gdGhlIHByb2plY3QgZGlyZWN0b3J5LgotICAgICAqIEBwYXJhbSB2YWx1ZSAgICB0aGUgZGlyZWN0b3J5IHdoZXJlIHRvIHdyaXRlIHRoZSByZXN1bHRzLCBhYnNvbHV0ZSBvcgotICAgICAqIHJlbGF0aXZlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvZGlyKEZpbGUgdmFsdWUpewotICAgICAgICB0b0RpciA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXcgZmlsZXNldCBjb250YWluaW5nIHRoZSB4bWwgcmVzdWx0cyB0byBhZ2dyZWdhdGUKLSAgICAgKiBAcGFyYW0gICAgZnMgICAgICB0aGUgbmV3IGZpbGVzZXQgb2YgeG1sIHJlc3VsdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZVNldChGaWxlU2V0IGZzKSB7Ci0gICAgICAgIGZpbGVzZXRzLmFkZEVsZW1lbnQoZnMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZ2dyZWdhdGUgYWxsIHRlc3RzdWl0ZXMgaW50byBhIHNpbmdsZSBkb2N1bWVudCBhbmQgd3JpdGUgaXQgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgZmlsZS4KLSAgICAgKiBAdGhyb3dzCUJ1aWxkRXhjZXB0aW9uCXRocm93biBpZiB0aGVyZSBpcyBhIHNlcmlvdXMgZXJyb3Igd2hpbGUgd3JpdGluZwotICAgICAqCQkJdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKLSAgICAgICAgRmlsZSBkZXN0RmlsZSA9IGdldERlc3RpbmF0aW9uRmlsZSgpOwotICAgICAgICAvLyB3cml0ZSB0aGUgZG9jdW1lbnQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlRE9NVHJlZShyb290RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCksICBkZXN0RmlsZSApOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIHRlc3QgYWdncmVnYXRlIHRvICciICsgZGVzdEZpbGUgKyAiJyIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGFwcGx5IHRyYW5zZm9ybWF0aW9uCi0gICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSB0cmFuc2Zvcm1lcnMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KLSAgICAgICAgICAgICAgICAoQWdncmVnYXRlVHJhbnNmb3JtZXIpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFhtbERvY3VtZW50KHJvb3RFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZ1bGwgZGVzdGluYXRpb24gZmlsZSB3aGVyZSB0byB3cml0ZSB0aGUgcmVzdWx0LiBJdCBpcyBtYWRlIG9mCi0gICAgICogdGhlIDx0dD50b2RpcjwvdHQ+IGFuZCA8dHQ+dG9maWxlPC90dD4gYXR0cmlidXRlcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIHdoZXJlIHNob3VsZCBiZSB3cml0dGVuIHRoZSByZXN1bHQgZmlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXREZXN0aW5hdGlvbkZpbGUoKXsKLSAgICAgICAgaWYgKHRvRmlsZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHRvRmlsZSA9IERFRkFVTFRfRklMRU5BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvRGlyID09IG51bGwpewotICAgICAgICAgICAgdG9EaXIgPSBwcm9qZWN0LnJlc29sdmVGaWxlKERFRkFVTFRfRElSKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZpbGUodG9EaXIsIHRvRmlsZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhbGwgPGNvZGU+LnhtbDwvY29kZT4gZmlsZXMgaW4gdGhlIGZpbGVzZXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFsbCBmaWxlcyBpbiB0aGUgZmlsZXNldCB0aGF0IGVuZCB3aXRoIGEgJy54bWwnLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlW10gZ2V0RmlsZXMoKSB7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGZpbGVzZXRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgICBkcy5zY2FuKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhuYW1lID0gZltqXTsKLSAgICAgICAgICAgICAgICBpZiAoIHBhdGhuYW1lLmVuZHNXaXRoKCIueG1sIikgKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRzLmdldEJhc2VkaXIoKSwgcGF0aG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBmaWxlID0gcHJvamVjdC5yZXNvbHZlRmlsZShmaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudCggZmlsZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbdi5zaXplKCldOwotICAgICAgICB2LmNvcHlJbnRvKGZpbGVzKTsKLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tIGZyb20gbm93LCB0aGUgbWV0aG9kcyBhcmUgYWxsIHJlbGF0ZWQgdG8gRE9NIHRyZWUgbWFuaXB1bGF0aW9uCi0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIERPTSB0cmVlIHRvIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gZG9jIHRoZSBYTUwgZG9jdW1lbnQgdG8gZHVtcCB0byBkaXNrLgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlbmFtZSB0byB3cml0ZSB0aGUgZG9jdW1lbnQgdG8uIFNob3VsZCBvYnZpb3VzbGx5IGJlIGEgLnhtbCBmaWxlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHdyaXRpbmcgdGhlIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVET01UcmVlKERvY3VtZW50IGRvYywgRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGZpbGUgKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgd3JpID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiVVRGOCIpKTsKLSAgICAgICAgd3JpLndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuIik7Ci0gICAgICAgIChuZXcgRE9NRWxlbWVudFdyaXRlcigpKS53cml0ZShkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksIHdyaSwgMCwgIiAgIik7Ci0gICAgICAgIHdyaS5mbHVzaCgpOwotICAgICAgICB3cmkuY2xvc2UoKTsKLSAgICAgICAgLy8gd3JpdGVycyBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucywgc28gY2hlY2sgZm9yIHRoZW0uCi0gICAgICAgIGlmICh3cmkuY2hlY2tFcnJvcigpKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3Igd2hpbGUgd3JpdGluZyBET00gY29udGVudCIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPiBDcmVhdGUgYSBET00gdHJlZS4gCi0gICAgICogSGFzICd0ZXN0c3VpdGVzJyBhcyBmaXJzdGNoaWxkIGFuZCBhZ2dyZWdhdGVzIGFsbAotICAgICAqIHRlc3RzdWl0ZSByZXN1bHRzIHRoYXQgZXhpc3RzIGluIHRoZSBiYXNlIGRpcmVjdG9yeS4KLSAgICAgKiBAcmV0dXJuCXRoZSByb290IGVsZW1lbnQgb2YgRE9NIHRyZWUgdGhhdCBhZ2dyZWdhdGVzIGFsbCB0ZXN0c3VpdGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZURvY3VtZW50KCkgewotICAgICAgICAvLyBjcmVhdGUgdGhlIGRvbSB0cmVlCi0gICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZ2V0RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFRFU1RTVUlURVMpOwotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICAKLSAgICAgICAgLy8gZ2V0IGFsbCBmaWxlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGRvY3VtZW50Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGdldEZpbGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJQYXJzaW5nIGZpbGU6ICciICsgZmlsZXNbaV0gKyAiJyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgIC8vWFhYIHRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIHhlcmNlcyAxLjMuMCB0aGF0IGRvZXNuJ3QgbGlrZSBmaWxlIG9iamVjdAotICAgICAgICAgICAgICAgIC8vIHdpbGwgaW52ZXN0aWdhdGUgbGF0ZXIuIEl0IGRvZXMgbm90IHVzZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGJ1dAotICAgICAgICAgICAgICAgIC8vIHRoZSB2bSBkaXIgaW5zdGVhZCA/IFdvcmtzIGZpbmUgd2l0aCBjcmltc29uLgotICAgICAgICAgICAgICAgIERvY3VtZW50IHRlc3RzdWl0ZURvYyA9IGJ1aWxkZXIucGFyc2UoICJmaWxlOi8vLyIgKyBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbSA9IHRlc3RzdWl0ZURvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIFJFQUxMWSBhIHRlc3RzdWl0ZS4KLSAgICAgICAgICAgICAgICBpZiAoIFRFU1RTVUlURS5lcXVhbHMoZWxlbS5nZXROb2RlTmFtZSgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkVGVzdFN1aXRlKHJvb3RFbGVtZW50LCBlbGVtKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhIHdhcm5pbmcuCi0gICAgICAgICAgICAgICAgICAgIGxvZygidGhlIGZpbGUgIiArIGZpbGVzW2ldICsgIiBpcyBub3QgYSB2YWxpZCB0ZXN0c3VpdGUgWE1MIGRvY3VtZW50IiwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIC8vIGEgdGVzdGNhc2UgbWlnaHQgaGF2ZSBmYWlsZWQgYW5kIHdyaXRlIGEgemVyby1sZW5ndGggZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgLy8gSXQgaGFzIGFscmVhZHkgZmFpbGVkLCBidXQgaGV5Li4uLiBtbS4ganVzdCBwdXQgYSB3YXJuaW5nCi0gICAgICAgICAgICAgICAgbG9nKCJUaGUgZmlsZSAiICsgZmlsZXNbaV0gKyAiIGlzIG5vdCBhIHZhbGlkIFhNTCBkb2N1bWVudC4gSXQgaXMgcG9zc2libHkgY29ycnVwdGVkLiIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKLSAgICAgICAgICAgICAgICBsb2coc3cudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgbG9nKCJFcnJvciB3aGlsZSBhY2Nlc3NpbmcgZmlsZSAiICsgZmlsZXNbaV0gKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD4gQWRkIGEgbmV3IHRlc3RzdWl0ZSBub2RlIHRvIHRoZSBkb2N1bWVudC4KLSAgICAgKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgaXQKLSAgICAgKiBzcGxpdCB0aGUgcHJldmlvdXMgZnVsbHkgcXVhbGlmaWVkIG5hbWUgaW50byBhIHBhY2thZ2UgYW5kIGEgbmFtZS4KLSAgICAgKiA8cD4gRm9yIGV4YW1wbGU6IDx0dD5vcmcuYXBhY2hlLldoYXRldmVyPC90dD4gd2lsbCBiZSBzcGxpdCBpbnRvCi0gICAgICogPHR0Pm9yZy5hcGFjaGU8L3R0PiBhbmQgPHR0PldoYXRldmVyPC90dD4uCi0gICAgICogQHBhcmFtIHJvb3QgdGhlIHJvb3QgZWxlbWVudCB0byB3aGljaCB0aGUgPHR0PnRlc3RzdWl0ZTwvdHQ+IG5vZGUgc2hvdWxkCi0gICAgICogICAgICAgIGJlIGFwcGVuZGVkLgotICAgICAqIEBwYXJhbSB0ZXN0c3VpdGUgdGhlIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZSBnaXZlbiByb290LiBJdCB3aWxsIHNsaWdodGx5Ci0gICAgICogICAgICAgIG1vZGlmeSB0aGUgb3JpZ2luYWwgbm9kZSB0byBjaGFuZ2UgdGhlIG5hbWUgYXR0cmlidXRlIGFuZCBhZGQKLSAgICAgKiAgICAgICAgYSBwYWNrYWdlIG9uZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUZXN0U3VpdGUoRWxlbWVudCByb290LCBFbGVtZW50IHRlc3RzdWl0ZSl7Ci0gICAgICAgIFN0cmluZyBmdWxsY2xhc3NuYW1lID0gdGVzdHN1aXRlLmdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotICAgICAgICBpbnQgcG9zID0gZnVsbGNsYXNzbmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAKLSAgICAgICAgLy8gYSBtaXNzaW5nIC4gbWlnaHQgaW1wbHkgbm8gcGFja2FnZSBhdCBhbGwuIERvbid0IGdldCBmb29sZWQuCi0gICAgICAgIFN0cmluZyBwa2dOYW1lID0gKHBvcyA9PSAtMSkgPyAiIiA6IGZ1bGxjbGFzc25hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSAocG9zID09IC0xKSA/IGZ1bGxjbGFzc25hbWUgOiBmdWxsY2xhc3NuYW1lLnN1YnN0cmluZyhwb3MgKyAxKTsKLSAgICAgICAgRWxlbWVudCBjb3B5ID0gKEVsZW1lbnQpRE9NVXRpbC5pbXBvcnROb2RlKHJvb3QsIHRlc3RzdWl0ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBtb2RpZnkgdGhlIG5hbWUgYXR0cmlidXRlIGFuZCBzZXQgdGhlIHBhY2thZ2UKLSAgICAgICAgY29weS5zZXRBdHRyaWJ1dGUoQVRUUl9OQU1FLCBjbGFzc25hbWUpOwotICAgICAgICBjb3B5LnNldEF0dHJpYnV0ZShBVFRSX1BBQ0tBR0UsIHBrZ05hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgZG9jdW1lbnQgYnVpbGRlci4gV2lsbCBpc3N1ZSBhbiA8dHQ+RXhjZXB0aW9uSW5pdGlhbGl6ZXJFcnJvcjwvdHQ+Ci0gICAgICogaWYgc29tZXRoaW5nIGlzIGdvaW5nIHdyb25nLiBJdCBpcyBmYXRhbCBhbnl3YXkuCi0gICAgICogQHJldHVybiBhIG5ldyBkb2N1bWVudCBidWlsZGVyIHRvIGNyZWF0ZSBhIERPTQotICAgICAqIEB0b2RvIGZhY3Rvcml6ZSB0aGlzIHNvbWV3aGVyZSBlbHNlLiBJdCBpcyBkdXBsaWNhdGVkIGNvZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcihleGMpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbWV0YW1hdGEvQWJzdHJhY3RNZXRhbWF0YVRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL21ldGFtYXRhL0Fic3RyYWN0TWV0YW1hdGFUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmZkNDIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbWV0YW1hdGEvQWJzdHJhY3RNZXRhbWF0YVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5tZXRhbWF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBTb21ld2hhdCBhYnN0cmFjdCBmcmFtZXdvcmsgdG8gYmUgdXNlZCBmb3Igb3RoZXIgbWV0YW1hIDIuMCB0YXNrcy4KLSAqIFRoaXMgc2hvdWxkIGluY2x1ZGUsIGF1ZGl0LCBtZXRyaWNzLCBjb3ZlciBhbmQgbXBhcnNlLgotICoKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCB2aXNpdCB0aGUgd2Vic2l0ZSBhdAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5tZXRhbWF0YS5jb20iPnd3dy5tZXRhbWF0YS5jb208L2E+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0YW1hdGFUYXNrIGV4dGVuZHMgVGFza3sKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFUVFJJQlVURVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFRoZSB1c2VyIGNsYXNzcGF0aCB0byBiZSBwcm92aWRlZC4gSXQgbWF0Y2hlcyB0aGUgLWNsYXNzcGF0aCBvZiB0aGUKLSAgICAgKiBjb21tYW5kIGxpbmUuIFRoZSBjbGFzc3BhdGggbXVzdCBpbmNsdWRlcyBib3RoIHRoZSA8dHQ+LmNsYXNzPC90dD4gYW5kIHRoZQotICAgICAqIDx0dD4uamF2YTwvdHQ+IGZpbGVzIGZvciBhY2N1cmF0ZSBhdWRpdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUGF0aCBjbGFzc1BhdGggPSBudWxsOwotCi0gICAgLyoqIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZSAqLwotICAgIHByb3RlY3RlZCBQYXRoIHNvdXJjZVBhdGggPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogTWV0YW1hdGEgaG9tZSBkaXJlY3RvcnkuIEl0IHdpbGwgYmUgcGFzc2VkIGFzIGEgPHR0Pm1ldGFtYXRhLmhvbWU8L3R0PiBwcm9wZXJ0eQotICAgICAqIGFuZCBzaG91bGQgbm9ybWFsbHkgbWF0Y2hlcyB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgPHR0Pk1FVEFfSE9NRTwvdHQ+Ci0gICAgICogc2V0IGJ5IHRoZSBNZXRhbWF0YSBpbnN0YWxsZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgbWV0YW1hdGFIb21lID0gbnVsbDsKLQotICAgIC8qKiB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gcnVuIE1BdWRpdCAqLwotICAgIHByb3RlY3RlZCBDb21tYW5kbGluZUphdmEgY21kbCA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKLQotICAgIC8qKiB0aGUgc2V0IG9mIGZpbGVzIHRvIGJlIGF1ZGl0ZWQgKi8KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVTZXRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyoqIHRoZSBvcHRpb25zIGZpbGUgd2hlcmUgYXJlIHN0b3JlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBvcHRpb25zRmlsZSA9IG51bGw7Ci0KLSAgICAvLyB0aGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBmaWxlcyB3ZXJlIGluY2x1ZGVkLiBJdCB3aWxsCi0gICAgLy8gYmUgc2V0IHdoZW4gY2FsbGluZyBzY2FuRmlsZVNldHMoKTsKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGluY2x1ZGVkRmlsZXMgPSBudWxsOwotCi0gICAgcHVibGljIEFic3RyYWN0TWV0YW1hdGFUYXNrKCl7Ci0gICAgfQotCi0gICAgLyoqIGluaXRpYWxpemUgdGhlIHRhc2sgd2l0aCB0aGUgY2xhc3NuYW1lIG9mIHRoZSB0YXNrIHRvIHJ1biAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdE1ldGFtYXRhVGFzayhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGNtZGwuc2V0Vm0oImphdmEiKTsKLSAgICAgICAgY21kbC5zZXRDbGFzc25hbWUoY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICAvKiogdGhlIG1ldGFtYXRhLmhvbWUgcHJvcGVydHkgdG8gcnVuIGFsbCB0YXNrcy4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhbWF0YWhvbWUoZmluYWwgRmlsZSBtZXRhbWF0YUhvbWUpewotICAgICAgICB0aGlzLm1ldGFtYXRhSG9tZSA9IG1ldGFtYXRhSG9tZTsKLSAgICB9Ci0KLSAgICAvKiogdXNlciBjbGFzc3BhdGggKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChjbGFzc1BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NQYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzUGF0aDsKLSAgICB9Ci0KLSAgICAvKiogY3JlYXRlIHRoZSBzb3VyY2UgcGF0aCBmb3IgdGhpcyB0YXNrICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlU291cmNlcGF0aCgpewotICAgICAgICBpZiAoc291cmNlUGF0aCA9PSBudWxsKXsKLSAgICAgICAgICAgIHNvdXJjZVBhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc291cmNlUGF0aDsKLSAgICB9Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5lc3RlZCBqdm1hcmcgZWxlbWVudC4gKi8KLSAgICBwdWJsaWMgQ29tbWFuZGxpbmUuQXJndW1lbnQgY3JlYXRlSnZtYXJnKCkgewotICAgICAgICByZXR1cm4gY21kbC5jcmVhdGVWbUFyZ3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqICAtbXggb3IgLVhteCBkZXBlbmRpbmcgb24gVk0gdmVyc2lvbiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1heG1lbW9yeShTdHJpbmcgbWF4KXsKLSAgICAgICAgaWYgKFByb2plY3QuZ2V0SmF2YVZlcnNpb24oKS5zdGFydHNXaXRoKCIxLjEiKSkgewotICAgICAgICAgICAgY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1teCIgKyBtYXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1YbXgiICsgbWF4KTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqIFRoZSBqYXZhIGZpbGVzIG9yIGRpcmVjdG9yeSB0byBiZSBhdWRpdGVkICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZVNldChGaWxlU2V0IGZzKSB7Ci0gICAgICAgIGZpbGVTZXRzLmFkZEVsZW1lbnQoZnMpOwotICAgIH0KLQotICAgIC8qKiBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFVwKCk7Ci0gICAgICAgICAgICBFeGVjdXRlU3RyZWFtSGFuZGxlciBoYW5kbGVyID0gY3JlYXRlU3RyZWFtSGFuZGxlcigpOwotICAgICAgICAgICAgZXhlY3V0ZTAoaGFuZGxlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbGVhblVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQUklWQVRFL1BST1RFQ1RFRCBNRVRIT0RTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogY2hlY2sgdGhlIG9wdGlvbnMgYW5kIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrT3B0aW9ucygpOwotCi0gICAgICAgIC8vIHNldCB0aGUgY2xhc3NwYXRoIGFzIHRoZSBqYXIgZmlsZQotICAgICAgICBGaWxlIGphciA9IGdldE1ldGFtYXRhSmFyKG1ldGFtYXRhSG9tZSk7Ci0gICAgICAgIGZpbmFsIFBhdGggY2xhc3NQYXRoID0gY21kbC5jcmVhdGVDbGFzc3BhdGgocHJvamVjdCk7Ci0gICAgICAgIGNsYXNzUGF0aC5jcmVhdGVQYXRoRWxlbWVudCgpLnNldExvY2F0aW9uKGphcik7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBtZXRhbWF0YS5ob21lIHByb3BlcnR5Ci0gICAgICAgIGZpbmFsIENvbW1hbmRsaW5lLkFyZ3VtZW50IHZtQXJncyA9IGNtZGwuY3JlYXRlVm1Bcmd1bWVudCgpOwotICAgICAgICB2bUFyZ3Muc2V0VmFsdWUoIi1EbWV0YW1hdGEuaG9tZT0iICsgbWV0YW1hdGFIb21lLmdldEFic29sdXRlUGF0aCgpICk7Ci0KLSAgICAgICAgLy8gcmV0cmlldmUgYWxsIHRoZSBmaWxlcyB3ZSB3YW50IHRvIHNjYW4KLSAgICAgICAgaW5jbHVkZWRGaWxlcyA9IHNjYW5GaWxlU2V0cygpOwotICAgICAgICBsb2coaW5jbHVkZWRGaWxlcy5zaXplKCkgKyAiIGZpbGVzIGFkZGVkIGZvciBhdWRpdCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCi0gICAgICAgIC8vIHdyaXRlIGFsbCB0aGUgb3B0aW9ucyB0byBhIHRlbXAgZmlsZSBhbmQgdXNlIGl0IHJvIHJ1biB0aGUgcHJvY2VzcwotICAgICAgICBWZWN0b3Igb3B0aW9ucyA9IGdldE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9uc0ZpbGUgPSBjcmVhdGVUbXBGaWxlKCk7Ci0gICAgICAgIGdlbmVyYXRlT3B0aW9uc0ZpbGUob3B0aW9uc0ZpbGUsIG9wdGlvbnMpOwotICAgICAgICBDb21tYW5kbGluZS5Bcmd1bWVudCBhcmdzID0gY21kbC5jcmVhdGVBcmd1bWVudCgpOwotICAgICAgICBhcmdzLnNldExpbmUoIi1hcmd1bWVudHMgIiArIG9wdGlvbnNGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIG91dHB1dCBzaW5jZQotICAgICAqIG1ldGFtYXRhIHRvb2xzIGRvIG5vdCByZXBvcnQgd2l0aCBjb252ZW5pZW50IGZpbGVzIHN1Y2ggYXMgWE1MLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFeGVjdXRlU3RyZWFtSGFuZGxlciBjcmVhdGVTdHJlYW1IYW5kbGVyKCk7Ci0KLQotICAgIC8qKiBleGVjdXRlIHRoZSBwcm9jZXNzIHdpdGggYSBzcGVjaWZpYyBoYW5kbGVyICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZTAoRXhlY3V0ZVN0cmVhbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgRXhlY3V0ZSBwcm9jZXNzID0gbmV3IEV4ZWN1dGUoaGFuZGxlcik7Ci0gICAgICAgIGxvZyhjbWRsLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICBwcm9jZXNzLnNldENvbW1hbmRsaW5lKGNtZGwuZ2V0Q29tbWFuZGxpbmUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocHJvY2Vzcy5leGVjdXRlKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWV0YW1hdGEgdGFzayBmYWlsZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gbGF1bmNoIE1ldGFtYXRhIHRhc2s6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBjbGVhbiB1cCBhbGwgdGhlIG1lc3MgdGhhdCB3ZSBkaWQgd2l0aCB0ZW1wb3Jhcnkgb2JqZWN0cyAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoKXsKLSAgICAgICAgaWYgKG9wdGlvbnNGaWxlICE9IG51bGwpewotICAgICAgICAgICAgb3B0aW9uc0ZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICBvcHRpb25zRmlsZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgamFyIGZpbGUgdXNlZCB0byBydW4gKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZSBnZXRNZXRhbWF0YUphcihGaWxlIGhvbWUpewotICAgICAgICByZXR1cm4gbmV3IEZpbGUobmV3IEZpbGUoaG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSksICJsaWIvbWV0YW1hdGEuamFyIik7Ci0gICAgfQotCi0gICAgLyoqIHZhbGlkYXRlIG9wdGlvbnMgc2V0ICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tPcHRpb25zKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZG8gc29tZSB2YWxpZGF0aW9uIGZpcnN0Ci0gICAgICAgIGlmIChtZXRhbWF0YUhvbWUgPT0gbnVsbCB8fCAhbWV0YW1hdGFIb21lLmV4aXN0cygpKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJ21ldGFtYXRhaG9tZScgbXVzdCBwb2ludCB0byBNZXRhbWF0YSBob21lIGRpcmVjdG9yeS4iKTsKLSAgICAgICAgfQotICAgICAgICBtZXRhbWF0YUhvbWUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKG1ldGFtYXRhSG9tZS5nZXRQYXRoKCkpOwotICAgICAgICBGaWxlIGphciA9IGdldE1ldGFtYXRhSmFyKG1ldGFtYXRhSG9tZSk7Ci0gICAgICAgIGlmICghamFyLmV4aXN0cygpKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggamFyICsgIiBkb2VzIG5vdCBleGlzdC4gQ2hlY2sgeW91ciBtZXRhbWF0YSBpbnN0YWxsYXRpb24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogcmV0dXJuIGFsbCBvcHRpb25zIG9mIHRoZSBjb21tYW5kIGxpbmUgYXMgc3RyaW5nIGVsZW1lbnRzICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFZlY3RvciBnZXRPcHRpb25zKCk7Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlT3B0aW9uc0ZpbGUoRmlsZSB0b2ZpbGUsIFZlY3RvciBvcHRpb25zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZ3ID0gbmV3IEZpbGVXcml0ZXIodG9maWxlKTsKLSAgICAgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKGZ3KTsKLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gb3B0aW9ucy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKyl7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbiggb3B0aW9ucy5lbGVtZW50QXQoaSkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LmZsdXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSB3cml0aW5nIG9wdGlvbnMgZmlsZSAiICsgdG9maWxlLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChmdyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmdy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpe30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXRGaWxlTWFwcGluZygpewotICAgICAgICByZXR1cm4gaW5jbHVkZWRGaWxlczsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogY29udmVuaWVudCBtZXRob2QgZm9yIEpESyAxLjEuIFdpbGwgY29weSBhbGwgZWxlbWVudHMgZnJvbSBzcmMgdG8gZGVzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgdm9pZCBhZGRBbGxWZWN0b3IoVmVjdG9yIGRlc3QsIEVudW1lcmF0aW9uIGZpbGVzKXsKLSAgICAgICAgd2hpbGUgKGZpbGVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBkZXN0LmFkZEVsZW1lbnQoIGZpbGVzLm5leHRFbGVtZW50KCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIEZpbGUgY3JlYXRlVG1wRmlsZSgpewotICAgICAgICAvLyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBKREsgMS4xICEhISEKLSAgICAgICAgZmluYWwgbG9uZyByYW5kID0gKG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKS5uZXh0TG9uZygpOwotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgibWV0YW1hdGEiICsgcmFuZCArICIudG1wIik7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgLmphdmEgZmlsZXMgKGFzIHRoZWlyIGFic29sdXRlIHBhdGgpIHRoYXQgc2hvdWxkCi0gICAgICogICAgICAgICBiZSBhdWRpdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBIYXNodGFibGUgc2NhbkZpbGVTZXRzKCl7Ci0gICAgICAgIEhhc2h0YWJsZSBmaWxlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlU2V0cy5zaXplKCk7IGkrKyl7Ci0gICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVTZXRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgZHMuc2NhbigpOwotICAgICAgICAgICAgU3RyaW5nW10gZiA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgIGxvZyhpICsgIikgQWRkaW5nICIgKyBmLmxlbmd0aCArICIgZmlsZXMgZnJvbSBkaXJlY3RvcnkgIiArIGRzLmdldEJhc2VkaXIoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGYubGVuZ3RoOyBqKyspewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRobmFtZSA9IGZbal07Ci0gICAgICAgICAgICAgICAgaWYgKCBwYXRobmFtZS5lbmRzV2l0aCgiLmphdmEiKSApewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSggZHMuZ2V0QmFzZWRpcigpLCBwYXRobmFtZSk7Ci0vLyAgICAgICAgICAgICAgICAgIGZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gcGF0aG5hbWUuc3Vic3RyaW5nKDAsIHBhdGhuYW1lLmxlbmd0aCgpLSIuamF2YSIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7Ci0gICAgICAgICAgICAgICAgICAgZmlsZXMucHV0KCBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBjbGFzc25hbWUgKTsgLy8gaXQncyBhIGphdmEgZmlsZSwgYWRkIGl0LgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9tZXRhbWF0YS9NQXVkaXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL21ldGFtYXRhL01BdWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODY3MzkyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL21ldGFtYXRhL01BdWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm1ldGFtYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogTWV0YW1hdGEgQXVkaXQgZXZhbHVhdGVzIEphdmEgY29kZSBmb3IgcHJvZ3JhbW1pbmcgZXJyb3JzLCB3ZWFrbmVzc2VzLCBhbmQKLSAqIHN0eWxlIHZpb2xhdGlvbi4KLSAqIDxwPgotICogTWV0YW1hdGEgQXVkaXQgZXhpc3RzIGluIHRocmVlIHZlcnNpb25zOgotICogPHVsPgotICogIDxsaT5UaGUgTGl0ZSB2ZXJzaW9uIGV2YWx1YXRlcyBhYm91dCAxNSBidWlsdC1pbiBydWxlcy48L2xpPgotICogIDxsaT5UaGUgUHJvIHZlcnNpb24gZXZhbHVhdGVzIGFib3V0IDUwIGJ1aWx0LWluIHJ1bGVzLjwvbGk+Ci0gKiAgPGxpPlRoZSBFbnRlcnByaXNlIHZlcnNpb24gYWxsb3dzIHlvdSB0byBhZGQgeW91ciBvd24gY3VzdG9taXplZCBydWxlcyB2aWEgdGhlIEFQSS48L2xpPgotICogPHVsPgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSB3ZWJzaXRlIGF0Ci0gKiA8YSBocmVmPSJodHRwOi8vd3d3Lm1ldGFtYXRhLmNvbSI+d3d3Lm1ldGFtYXRhLmNvbTwvYT4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgTUF1ZGl0IGV4dGVuZHMgQWJzdHJhY3RNZXRhbWF0YVRhc2sgewotCi0gICAgLyogQXMgb2YgTWV0YW1hdGEgMi4wLCB0aGUgY29tbWFuZCBsaW5lIG9mIE1BdWRpdCBpcyBhcyBmb2xsb3dzOgotICAgIFVzYWdlCi0gICAgICAgIG1hdWRpdCA8b3B0aW9uPi4uLiA8cGF0aD4uLi4gWy11bnVzZWQgPHNlYXJjaC1wYXRoPi4uLl0KLQotICAgIFBhcmFtZXRlcnMKLSAgICAgICAgcGF0aCAgICAgICAgICAgICAgIEZpbGUgb3IgZGlyZWN0b3J5IHRvIGF1ZGl0LgotICAgICAgICBzZWFyY2gtcGF0aCAgICAgICAgRmlsZSBvciBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciBkZWNsYXJhdGlvbiB1c2VzLgotCi0gICAgT3B0aW9ucwotICAgICAgICAtYXJndW1lbnRzICAtQSAgICAgPGZpbGU+ICAgICBJbmNsdWRlcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZyb20gZmlsZS4KLSAgICAgICAgLWNsYXNzcGF0aCAgLWNwICAgIDxwYXRoPiAgICAgU2V0cyBjbGFzcyBwYXRoIChhbHNvIHNvdXJjZSBwYXRoIHVubGVzcyBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRseSBzZXQpLiBPdmVycmlkZXMgTUVUQVBBVEgvQ0xBU1NQQVRILgotICAgICAgICAtZXhpdCAgICAgICAteCAgICAgICAgICAgICAgICBFeGl0cyBhZnRlciB0aGUgZmlyc3QgZXJyb3IuCi0gICAgICAgIC1maXggICAgICAgIC1mICAgICAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZml4ZXMgY2VydGFpbiBlcnJvcnMuCi0gICAgICAgIC1mdWxscGF0aCAgICAgICAgICAgICAgICAgICAgIFByaW50cyBmdWxsIHBhdGggZm9yIGxvY2F0aW9ucy4KLSAgICAgICAgLWhlbHAgICAgICAgLWggICAgICAgICAgICAgICAgUHJpbnRzIGhlbHAgYW5kIGV4aXRzLgotICAgICAgICAtbGlzdCAgICAgICAtbCAgICAgICAgICAgICAgICBDcmVhdGVzIGxpc3RpbmcgZmlsZSBmb3IgZWFjaCBhdWRpdGVkIGZpbGUuCi0gICAgICAgIC1vZmZzZXRzICAgIC1vZmYgICAgICAgICAgICAgIE9mZnNldCBhbmQgbGVuZ3RoIGZvciBsb2NhdGlvbnMuCi0gICAgICAgIC1vdXRwdXQgICAgIC1vICAgICA8ZmlsZT4gICAgIFByaW50cyBvdXRwdXQgdG8gZmlsZS4KLSAgICAgICAgLXF1aWV0ICAgICAgLXEgICAgICAgICAgICAgICAgU3VwcHJlc3NlcyBjb3B5cmlnaHQgYW5kIHN1bW1hcnkgbWVzc2FnZXMuCi0gICAgICAgIC1zb3VyY2VwYXRoICAgICAgICA8cGF0aD4gICAgIFNldHMgc291cmNlIHBhdGguIE92ZXJyaWRlcyBTT1VSQ0VQQVRILgotICAgICAgICAtdGFiICAgICAgICAtdCAgICAgICAgICAgICAgICBQcmludHMgYSB0YWIgY2hhcmFjdGVyIGFmdGVyIGZpcnN0IGFyZ3VtZW50LgotICAgICAgICAtdW51c2VkICAgICAtdSAgICAgICAgICAgICAgICBGaW5kcyBkZWNsYXJhdGlvbnMgdW51c2VkIGluIHNlYXJjaCBwYXRocy4KLSAgICAgICAgLXZlcmJvc2UgICAgLXYgICAgICAgICAgICAgICAgUHJpbnRzIGFsbCBtZXNzYWdlcy4KLSAgICAgICAgLXZlcnNpb24gICAgLVYgICAgICAgICAgICAgICAgUHJpbnRzIHZlcnNpb24gYW5kIGV4aXRzLgotICAgICovCi0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFVCTElDIE1FVEhPRFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogcGF0dGVybiB1c2VkIGJ5IG1hdWRpdCB0byByZXBvcnQgdGhlIGVycm9yIGZvciBhIGZpbGUgKi8KLSAgICAvKiogUkUgZG9lcyBub3Qgc2VlbXMgdG8gc3VwcG9ydCByZWdleHAgcGF0dGVybiB3aXRoIGNvbW1lbnRzIHNvIGknbSBzdHJpcHBpbmcgaXQqLwotICAgIC8vICg/OmZpbGU6KT8oKD8jZmlsZXBhdGgpLispOigoPyNsaW5lKVxcZCspXFxzKjpcXHMrKCg/I21lc3NhZ2UpLiopCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJVF9QQVRURVJOID0gIig/OmZpbGU6KT8oLispOihcXGQrKVxccyo6XFxzKyguKikiOwotCi0gICAgcHJvdGVjdGVkIEZpbGUgb3V0RmlsZSA9IG51bGw7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFBhdGggc2VhcmNoUGF0aCA9IG51bGw7Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZml4ID0gZmFsc2U7Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdCA9IGZhbHNlOwotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIHVudXNlZCA9IGZhbHNlOwotCi0gICAgLyoqIGRlZmF1bHQgY29uc3RydWN0b3IgKi8KLSAgICBwdWJsaWMgTUF1ZGl0KCkgewotICAgICAgICBzdXBlcigiY29tLm1ldGFtYXRhLmd1aS5yYy5NQXVkaXQiKTsKLSAgICB9Ci0KLSAgICAvKiogc2V0IHRoZSBkZXN0aW5hdGlvbiBmaWxlIHdoaWNoIHNob3VsZCBiZSBhbiB4bWwgZmlsZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvZmlsZShGaWxlIG91dEZpbGUpewotICAgICAgICB0aGlzLm91dEZpbGUgPSBvdXRGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpeChib29sZWFuIGZsYWcpewotICAgICAgICB0aGlzLmZpeCA9IGZsYWc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdChib29sZWFuIGZsYWcpewotICAgICAgICB0aGlzLmxpc3QgPSBmbGFnOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVudXNlZChib29sZWFuIGZsYWcpewotICAgICAgICB0aGlzLnVudXNlZCA9IGZsYWc7Ci0gICAgfQotCi0gICAgcHVibGljIFBhdGggY3JlYXRlU2VhcmNocGF0aCgpewotICAgICAgICBpZiAoc2VhcmNoUGF0aCA9PSBudWxsKXsKLSAgICAgICAgICAgIHNlYXJjaFBhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VhcmNoUGF0aDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGdldE9wdGlvbnMoKXsKLSAgICAgICAgVmVjdG9yIG9wdGlvbnMgPSBuZXcgVmVjdG9yKDUxMik7Ci0gICAgICAgIC8vIHRoZXJlIGlzIGEgYnVnIGluIE1ldGFtYXRhIDIuMCBidWlsZCAzNy4gVGhlIHNvdXJjZXBhdGggYXJndW1lbnQgZG9lcwotICAgICAgICAvLyBub3Qgd29yay4gU28gd2Ugd2lsbCB1c2UgdGhlIHNvdXJjZXBhdGggcHJlcGVuZGVkIHRvIGNsYXNzcGF0aC4gKG9yZGVyCi0gICAgICAgIC8vIGlzIGltcG9ydGFudCBzaW5jZSBNZXRhbWF0YSBsb29rcyBhdCAuY2xhc3MgYW5kIC5qYXZhKQotICAgICAgICBpZiAoc291cmNlUGF0aCAhPSBudWxsKXsKLSAgICAgICAgICAgIHNvdXJjZVBhdGguYXBwZW5kKGNsYXNzUGF0aCk7IC8vIHNyY3BhdGggaXMgcHJlcGVuZGVkCi0gICAgICAgICAgICBjbGFzc1BhdGggPSBzb3VyY2VQYXRoOwotICAgICAgICAgICAgc291cmNlUGF0aCA9IG51bGw7IC8vIHByZXZlbnQgZnJvbSB1c2luZyAtc291cmNlcGF0aAotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIGRvbid0IGZvcmdldCB0byBtb2RpZnkgdGhlIHBhdHRlcm4gaWYgeW91IGNoYW5nZSB0aGUgb3B0aW9ucyByZXBvcnRpbmcKLSAgICAgICAgaWYgKGNsYXNzUGF0aCAhPSBudWxsKXsKLSAgICAgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCgiLWNsYXNzcGF0aCIpOwotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KGNsYXNzUGF0aC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBzdXBwcmVzcyBjb3B5cmlnaHQgbXNnIHdoZW4gcnVubmluZywgd2Ugd2lsbCBsZXQgaXQgc28gdGhhdCB0aGlzCi0gICAgICAgIC8vIHdpbGwgYmUgdGhlIG9ubHkgb3V0cHV0IHRvIHRoZSBjb25zb2xlIGlmIGluIHhtbCBtb2RlCi0vLyAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCgiLXF1aWV0Iik7Ci0gICAgICAgIGlmIChmaXgpewotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItZml4Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItZnVsbHBhdGgiKTsKLQotICAgICAgICAvLyBnZW5lcmF0ZSAubWF1ZGl0IGZpbGVzIG11Y2ggbW9yZSBkZXRhaWxlZCB0aGFuIHRoZSByZXBvcnQKLSAgICAgICAgLy8gSSBkb24ndCBsaWtlIGl0IHZlcnkgbXVjaCwgSSB0aGluayBpdCBjb3VsZCBiZSBpbnRlcmVzdGluZwotICAgICAgICAvLyB0byBnZXQgYWxsIC5tYXVkaXQgZmlsZXMgYW5kIGluY2x1ZGUgdGhlbSBpbiB0aGUgWE1MLgotICAgICAgICBpZiAobGlzdCl7Ci0gICAgICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoIi1saXN0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvdXJjZVBhdGggIT0gbnVsbCl7Ci0gICAgICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoIi1zb3VyY2VwYXRoIik7Ci0gICAgICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc291cmNlUGF0aC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHVudXNlZCl7Ci0gICAgICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoIi11bnVzZWQiKTsKLSAgICAgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzZWFyY2hQYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGFkZEFsbFZlY3RvcihvcHRpb25zLCBpbmNsdWRlZEZpbGVzLmtleXMoKSk7Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrT3B0aW9ucygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmNoZWNrT3B0aW9ucygpOwotICAgICAgICBpZiAodW51c2VkICYmIHNlYXJjaFBhdGggPT0gbnVsbCl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIidzZWFyY2hwYXRoJyBlbGVtZW50IG11c3QgYmUgc2V0IHdoZW4gbG9va2luZyBmb3IgJ3VudXNlZCcgZGVjbGFyYXRpb25zLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdW51c2VkICYmIHNlYXJjaFBhdGggIT0gbnVsbCl7Ci0gICAgICAgICAgICBsb2coIidzZWFyY2hwYXRoJyBlbGVtZW50IGlnbm9yZWQuICd1bnVzZWQnIGF0dHJpYnV0ZSBpcyBkaXNhYmxlZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgY3JlYXRlU3RyZWFtSGFuZGxlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotICAgICAgICAvLyBpZiB3ZSBkaWRuJ3Qgc3BlY2lmeSBhIGZpbGUsIHRoZW4gdXNlIGEgc2NyZWVuIHJlcG9ydAotICAgICAgICBpZiAob3V0RmlsZSA9PSBudWxsKXsKLSAgICAgICAgICAgaGFuZGxlciA9IG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvL1hYWAotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggb3V0RmlsZSApOwotICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgTUF1ZGl0U3RyZWFtSGFuZGxlcih0aGlzLCBvdXQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYW5kbGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5jbGVhblVwKCk7Ci0gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgaWYgLWxpc3QgaXMgdXNlZCwgd2Ugc2hvdWxkIG1vdmUKLSAgICAgICAgLy8gdGhlIC5tYXVkaXQgZmlsZSBzaW5jZSB3ZSBjYW5ub3QgY2hvb3NlIHRoZWlyIGxvY2F0aW9uIDooCi0gICAgICAgIC8vIHRoZSAubWF1ZGl0IGZpbGVzIG1hdGNoIHRoZSAuamF2YSBmaWxlcwotICAgICAgICAvLyB3ZSdsbCB1c2UgaW5jbHVkZWRGaWxlcyB0byBnZXQgdGhlIC5tYXVkaXQgZmlsZXMuCi0KLSAgICAgICAgLyppZiAob3V0ICE9IG51bGwpewotICAgICAgICAgICAgLy8gY2xvc2UgaXQgaWYgbm90IGNsb3NlZCBieSB0aGUgaGFuZGxlci4uLgotICAgICAgICB9Ki8KLSAgICB9Ci0KLSAgICAvKiogdGhlIGlubmVyIGNsYXNzIHVzZWQgdG8gcmVwb3J0IHZpb2xhdGlvbiBpbmZvcm1hdGlvbiAqLwotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBWaW9sYXRpb24gewotICAgICAgICBpbnQgbGluZTsKLSAgICAgICAgU3RyaW5nIGVycm9yOwotICAgIH0KLQotICAgIC8qKiBoYW5keSBmYWN0b3J5IHRvIGNyZWF0ZSBhIHZpb2xhdGlvbiAqLwotICAgIHN0YXRpYyBmaW5hbCBWaW9sYXRpb24gY3JlYXRlVmlvbGF0aW9uKGludCBsaW5lLCBTdHJpbmcgbXNnKXsKLSAgICAgICAgVmlvbGF0aW9uIHZpb2xhdGlvbiA9IG5ldyBWaW9sYXRpb24oKTsKLSAgICAgICAgdmlvbGF0aW9uLmxpbmUgPSBsaW5lOwotICAgICAgICB2aW9sYXRpb24uZXJyb3IgPSBtc2c7Ci0gICAgICAgIHJldHVybiB2aW9sYXRpb247Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbWV0YW1hdGEvTUF1ZGl0U3RyZWFtSGFuZGxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbWV0YW1hdGEvTUF1ZGl0U3RyZWFtSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzE3ZTRiLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL21ldGFtYXRhL01BdWRpdFN0cmVhbUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5tZXRhbWF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRPTUVsZW1lbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgdmVyeSBiYWQgc3RyZWFtIGhhbmRsZXIgZm9yIHRoZSBNQXVkaXQgdGFzay4KLSAqIEFsbCByZXBvcnQgdG8gc3Rkb3V0IHRoYXQgZG9lcyBub3QgbWF0Y2ggYSBzcGVjaWZpYyByZXBvcnQgcGF0dGVybiBpcyBkdW1wZWQKLSAqIHRvIHRoZSBBbnQgb3V0cHV0IGFzIHdhcm4gbGV2ZWwuIFRoZSByZXBvcnQgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiBpcyBzdG9yZWQKLSAqIGluIGEgbWFwIHdpdGggdGhlIGtleSBiZWluZyB0aGUgZmlsZXBhdGggdGhhdCBjYXVzZWQgdGhlIGVycm9yIHJlcG9ydC4KLSAqIDxwPgotICogVGhlIGxpbWl0YXRpb24gd2l0aCB0aGUgY2hvb3NlbiBpbXBsZW1lbnRhdGlvbiBpcyBjbGVhcjoKLSAqIDx1bD4KLSAqIDxsaT5pdCBkb2VzIG5vdCBoYW5kbGUgbXVsdGlsaW5lIHJlcG9ydCggbWVzc2FnZSB0aGF0IGhhcyBcbiApLiB0aGUgcGFydCB1bnRpbAotICogdGhlIFxuIHdpbGwgYmUgc3RvcmVkIGFuZCB0aGUgb3RoZXIgcGFydCAod2hpY2ggd2lsbCBub3QgbWF0Y2ggdGhlIHBhdHRlcm4pCi0gKiB3aWxsIGdvIHRvIEFudCBvdXRwdXQgaW4gV2FybiBsZXZlbC4KLSAqIDxsaT5pdCBkb2VzIG5vdCByZXBvcnQgZXJyb3IgdGhhdCBnb2VzIHRvIHN0ZGVyci4KLSAqIDwvdWw+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1jbGFzcyBNQXVkaXRTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgewotCi0gICAgcHJvdGVjdGVkIE1BdWRpdCB0YXNrOwotCi0gICAgLyoqIHJlYWRlciBmb3Igc3Rkb3V0ICovCi0gICAgcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIGJyOwotCi0gICAgLyoqIG1hdGNoZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgaW5mbyBmcm9tIHRoZSBsaW5lICovCi0gICAgcHJvdGVjdGVkIFJlZ2V4cE1hdGNoZXIgbWF0Y2hlcjsKLQotICAgIC8qKgotICAgICAqIHRoaXMgaXMgd2hlcmUgdGhlIFhNTCBvdXRwdXQgd2lsbCBnbywgc2hvdWxkIG1vc3RseSBiZSBhIGZpbGUKLSAgICAgKiB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmbHVzaGluZyBhbmQgY2xvc2luZyB0aGlzIHN0cmVhbQotICAgICAqLwotICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0geG1sT3V0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIHRoZSBtdWx0aW1hcC4gVGhlIGtleSBpbiB0aGUgbWFwIGlzIHRoZSBmaWxlcGF0aCB0aGF0IGNhdXNlZCB0aGUgYXVkaXQKLSAgICAgKiBlcnJvciBhbmQgdGhlIHZhbHVlIGlzIGEgdmVjdG9yIG9mIE1BdWRpdC5WaW9sYXRpb24gZW50cmllcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGF1ZGl0ZWRGaWxlcyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIE1BdWRpdFN0cmVhbUhhbmRsZXIoTUF1ZGl0IHRhc2ssIE91dHB1dFN0cmVhbSB4bWxPdXQpewotICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwotICAgICAgICB0aGlzLnhtbE91dCA9IHhtbE91dDsKLSAgICAgICAgLyoqIHRoZSBtYXRjaGVyIHNob3VsZCBiZSB0aGUgT3JvIG9uZS4gSSBkb24ndCBrbm93IGFib3V0IHRoZSBvdGhlciBvbmUgKi8KLSAgICAgICAgbWF0Y2hlciA9IChuZXcgUmVnZXhwTWF0Y2hlckZhY3RvcnkoKSkubmV3UmVnZXhwTWF0Y2hlcigpOwotICAgICAgICBtYXRjaGVyLnNldFBhdHRlcm4oTUF1ZGl0LkFVRElUX1BBVFRFUk4pOwotICAgIH0KLQotICAgIC8qKiBJZ25vcmUuICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0lucHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykge30KLQotICAgIC8qKiBJZ25vcmUuICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKElucHV0U3RyZWFtIGlzKSB7fQotCi0gICAgLyoqIFNldCB0aGUgaW5wdXRzdHJlYW0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzT3V0cHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKLSAgICB9Ci0KLSAgICAvKiogSW52b2tlcyBwYXJzZU91dHB1dC4gVGhpcyB3aWxsIGJsb2NrIHVudGlsIHRoZSBlbmQgOi0oKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHBhcnNlT3V0cHV0KGJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmV0dHkgZGFuZ2Vyb3VzIGJ1c2luZXNzIGhlcmUuIEl0IHNlcmlhbGl6ZXMgd2hhdCB3YXMgZXh0cmFjdGVkIGZyb20KLSAgICAgKiB0aGUgTUF1ZGl0IG91dHB1dCBhbmQgd3JpdGUgaXQgdG8gdGhlIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNvbnRlbnQgYXMgWE1MLCBtb3ZlIHRoaXMgdG8gYW5vdGhlciBtZXRob2QKLSAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSBjb2RlIHRoYXQgY291bGQgYmUgbmVlZGVkIHRvIGJlIG92ZXJyaWRlZAotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNsYXNzZXMiKTsKLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGF1ZGl0ZWRGaWxlcy5rZXlzKCk7Ci0gICAgICAgIEhhc2h0YWJsZSBmaWxlbWFwcGluZyA9IHRhc2suZ2V0RmlsZU1hcHBpbmcoKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJhdWRpdGVkIiwgU3RyaW5nLnZhbHVlT2YoZmlsZW1hcHBpbmcuc2l6ZSgpKSk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgicmVwb3J0ZWQiLCBTdHJpbmcudmFsdWVPZihhdWRpdGVkRmlsZXMuc2l6ZSgpKSk7Ci0gICAgICAgIGludCBlcnJvcnMgPSAwOwotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZXBhdGggPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFZlY3RvciB2ID0gKFZlY3RvcilhdWRpdGVkRmlsZXMuZ2V0KGZpbGVwYXRoKTsKLSAgICAgICAgICAgIFN0cmluZyBmdWxsY2xhc3NuYW1lID0gKFN0cmluZylmaWxlbWFwcGluZy5nZXQoZmlsZXBhdGgpOwotICAgICAgICAgICAgaWYgKGZ1bGxjbGFzc25hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhc2suZ2V0UHJvamVjdCgpLmxvZygiQ291bGQgbm90IGZpbmQgY2xhc3MgbWFwcGluZyBmb3IgIiArIGZpbGVwYXRoLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBwb3MgPSBmdWxsY2xhc3NuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICBTdHJpbmcgcGtnID0gKHBvcyA9PSAtMSkgPyAiIiA6IGZ1bGxjbGFzc25hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhenpuYW1lID0gKHBvcyA9PSAtMSkgPyBmdWxsY2xhc3NuYW1lIDogZnVsbGNsYXNzbmFtZS5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgICAgICAgICBFbGVtZW50IGNsYXp6ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNsYXNzIik7Ci0gICAgICAgICAgICBjbGF6ei5zZXRBdHRyaWJ1dGUoInBhY2thZ2UiLCBwa2cpOwotICAgICAgICAgICAgY2xhenouc2V0QXR0cmlidXRlKCJuYW1lIiwgY2xhenpuYW1lKTsKLSAgICAgICAgICAgIGNsYXp6LnNldEF0dHJpYnV0ZSgidmlvbGF0aW9ucyIsIFN0cmluZy52YWx1ZU9mKHYuc2l6ZSgpKSk7Ci0gICAgICAgICAgICBlcnJvcnMgKz0gdi5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspewotICAgICAgICAgICAgICAgIE1BdWRpdC5WaW9sYXRpb24gdmlvbGF0aW9uID0gKE1BdWRpdC5WaW9sYXRpb24pdi5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlcnJvciA9IGRvYy5jcmVhdGVFbGVtZW50KCJ2aW9sYXRpb24iKTsKLSAgICAgICAgICAgICAgICBlcnJvci5zZXRBdHRyaWJ1dGUoImxpbmUiLCBTdHJpbmcudmFsdWVPZih2aW9sYXRpb24ubGluZSkpOwotICAgICAgICAgICAgICAgIGVycm9yLnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsIHZpb2xhdGlvbi5lcnJvcik7Ci0gICAgICAgICAgICAgICAgY2xhenouYXBwZW5kQ2hpbGQoZXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgidmlvbGF0aW9ucyIsIFN0cmluZy52YWx1ZU9mKGVycm9ycykpOwotCi0gICAgICAgIC8vIG5vdyB3cml0ZSBpdCB0byB0aGUgb3V0cHV0c3RyZWFtLCBub3QgdmVyeSBuaWNlIGNvZGUKLSAgICAgICAgaWYgKHhtbE91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXcml0ZXIgd3JpID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd3JpID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcih4bWxPdXQsICJVVEYtOCIpOwotICAgICAgICAgICAgICAgIHdyaS53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiIpOwotICAgICAgICAgICAgICAgIChuZXcgRE9NRWxlbWVudFdyaXRlcigpKS53cml0ZShyb290RWxlbWVudCwgd3JpLCAwLCAiICAiKTsKLSAgICAgICAgICAgICAgICB3cmkuZmx1c2goKTsKLSAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICAgICAgdGFzay5sb2coIlVuYWJsZSB0byB3cml0ZSBsb2cgZmlsZSIsIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmICh4bWxPdXQgIT0gU3lzdGVtLm91dCAmJiB4bWxPdXQgIT0gU3lzdGVtLmVycikgewotICAgICAgICAgICAgICAgICAgICBpZiAod3JpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IoZXhjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiByZWFkIGVhY2ggbGluZSBhbmQgcHJvY2VzcyBpdCAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlT3V0cHV0KEJ1ZmZlcmVkUmVhZGVyIGJyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgIHdoaWxlICggKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsICl7Ci0gICAgICAgICAgICBwcm9jZXNzTGluZShsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHdlIHN1cHBvc2UgaGVyZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHJlcG9ydCAvIGxpbmUuCi0gICAgLy8gVGhlcmUgd2lsbCBvYnZpb3VzbGx5IGJlIGEgcHJvYmxlbSBpZiB0aGUgbWVzc2FnZSBpcyBvbiBzZXZlcmFsIGxpbmVzLi4uCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xpbmUoU3RyaW5nIGxpbmUpewotICAgICAgICBWZWN0b3IgbWF0Y2hlcyA9IG1hdGNoZXIuZ2V0R3JvdXBzKGxpbmUpOwotICAgICAgICBpZiAobWF0Y2hlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZSA9IChTdHJpbmcpbWF0Y2hlcy5lbGVtZW50QXQoMSk7Ci0gICAgICAgICAgICBpbnQgbGluZU51bSA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZyltYXRjaGVzLmVsZW1lbnRBdCgyKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gKFN0cmluZyltYXRjaGVzLmVsZW1lbnRBdCgzKTsKLSAgICAgICAgICAgIGFkZFZpb2xhdGlvbkVudHJ5KGZpbGUsIE1BdWRpdC5jcmVhdGVWaW9sYXRpb24obGluZU51bSwgbXNnKSApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdGhpcyBkb2Vzbid0IG1hdGNoLi5yZXBvcnQgaXQgYXMgaW5mbywgaXQgY291bGQgYmUKLSAgICAgICAgICAgIC8vIGVpdGhlciB0aGUgY29weXJpZ2h0LCBzdW1tYXJ5IG9yIGEgbXVsdGlsaW5lIG1lc3NhZ2UgKGRhbW4gISkKLSAgICAgICAgICAgIHRhc2subG9nKGxpbmUsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIGFkZCBhIHZpb2xhdGlvbiBlbnRyeSBmb3IgdGhlIGZpbGUgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWaW9sYXRpb25FbnRyeShTdHJpbmcgZmlsZSwgTUF1ZGl0LlZpb2xhdGlvbiBlbnRyeSl7Ci0gICAgICAgICAgICBWZWN0b3IgdmlvbGF0aW9ucyA9IChWZWN0b3IpYXVkaXRlZEZpbGVzLmdldChmaWxlKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGRlY2wgZm9yIHRoaXMgZmlsZSB5ZXQsIGNyZWF0ZSBpdC4KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25zID09IG51bGwpewotICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgYXVkaXRlZEZpbGVzLnB1dChmaWxlLCB2aW9sYXRpb25zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpb2xhdGlvbnMuYWRkKCBlbnRyeSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbWV0YW1hdGEvTU1ldHJpY3MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL21ldGFtYXRhL01NZXRyaWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDQ5YWQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbWV0YW1hdGEvTU1ldHJpY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5tZXRhbWF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci0KLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIENhbGN1bGF0ZXMgZ2xvYmFsIGNvbXBsZXhpdHkgYW5kIHF1YWxpdHkgbWV0cmljcyBvbiBKYXZhIHNvdXJjZSBjb2RlLgotICoKLSAqIFlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSB0aGlzIHRhc2sgd2l0aCB0aGUgZXZhbHVhdGlvbiB2ZXJzaW9uIHNpbmNlCi0gKiBhcyBvZiBNZXRhbWF0YSAyLjAsIE1ldHJpY3MgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kIGxpbmUgOi0oCi0gKgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSB3ZWJzaXRlIGF0Ci0gKiA8YSBocmVmPSJodHRwOi8vd3d3Lm1ldGFtYXRhLmNvbSI+d3d3Lm1ldGFtYXRhLmNvbTwvYT4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgTU1ldHJpY3MgZXh0ZW5kcyBBYnN0cmFjdE1ldGFtYXRhVGFzayB7Ci0vKgotICAgIFRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcyBvZiBNZXRhbWF0YSAyLjAgYXJlIGFzIGZvbGxvd3M6Ci0KLVVzYWdlCi0gICAgbW1ldHJpY3MgPG9wdGlvbj4uLi4gPHBhdGg+Li4uCi0KLVBhcmFtZXRlcnMKLSAgICBwYXRoICAgICAgICAgICAgICBGaWxlIG9yIGRpcmVjdG9yeSB0byBtZWFzdXJlLgotCi1PcHRpb25zCi0gICAgLWFyZ3VtZW50cyAgIC1BICAgPGZpbGU+ICAgICAgSW5jbHVkZXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmcm9tIGZpbGUuCi0gICAgLWNsYXNzcGF0aCAgIC1jcCAgPHBhdGg+ICAgICAgU2V0cyBjbGFzcyBwYXRoIChhbHNvIHNvdXJjZSBwYXRoIHVubGVzcyBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdGx5IHNldCkuIE92ZXJyaWRlcyBNRVRBUEFUSC9DTEFTU1BBVEguCi0gICAgLWNvbXBpbGF0aW9uLXVuaXRzICAgICAgICAgICAgTWVhc3VyZSBjb21waWxhdGlvbiB1bml0cy4KLSAgICAtZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlIGNvbXBpbGF0aW9uIHVuaXRzLgotICAgIC1mb3JtYXQgICAgICAtZiAgIDxmb3JtYXQ+ICAgIFNldHMgb3V0cHV0IGZvcm1hdCwgZGVmYXVsdCBvdXRwdXQgZmlsZSB0eXBlLgotICAgIC1oZWxwICAgICAgICAtaCAgICAgICAgICAgICAgIFByaW50cyBoZWxwIGFuZCBleGl0cy4KLSAgICAtaW5kZW50ICAgICAgLWkgICA8c3RyaW5nPiAgICBTZXRzIHN0cmluZyB1c2VkIHRvIGluZGVudCBsYWJlbHMgb25lIGxldmVsLgotICAgIC1tZXRob2RzICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmUgbWV0aG9kcywgdHlwZXMsIGFuZCBjb21waWxhdGlvbiB1bml0cy4KLSAgICAtb3V0cHV0ICAgICAgLW8gICA8ZmlsZT4gICAgICBTZXRzIG91dHB1dCBmaWxlIG5hbWUuCi0gICAgLXF1aWV0ICAgICAgIC1xICAgICAgICAgICAgICAgU3VwcHJlc3NlcyBjb3B5cmlnaHQgbWVzc2FnZS4KLSAgICAtc291cmNlcGF0aCAgICAgICA8cGF0aD4gICAgICBTZXRzIHNvdXJjZSBwYXRoLiBPdmVycmlkZXMgU09VUkNFUEFUSC4KLSAgICAtdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlIHR5cGVzIGFuZCBjb21waWxhdGlvbiB1bml0cy4KLSAgICAtdmVyYm9zZSAgICAgLXYgICAgICAgICAgICAgICBQcmludHMgYWxsIG1lc3NhZ2VzLgotICAgIC12ZXJzaW9uICAgICAtViAgICAgICAgICAgICAgIFByaW50cyB2ZXJzaW9uIGFuZCBleGl0cy4KLQotRm9ybWF0IE9wdGlvbnMKLSAgICBjb21tYSBjc3YgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgb3V0cHV0IGFzIGNvbW1hLXNlcGFyYXRlZCB0ZXh0LgotICAgIGh0bWwgaHRtICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCBvdXRwdXQgYXMgYW4gSFRNTCB0YWJsZS4KLSAgICB0YWIgdGFiLXNlcGFyYXRlZCB0c3YgICAgICAgICBGb3JtYXQgb3V0cHV0IGFzIHRhYi1zZXBhcmF0ZWQgdGV4dC4KLSAgICB0ZXh0IHR4dCAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgb3V0cHV0IGFzIHNwYWNlLWFsaWduZWQgdGV4dC4KLSovCi0KLSAgICAvKiogdGhlIGdyYW51bGFyaXR5IG1vZGUuIFNob3VsZCBiZSBvbmUgb2YgJ2ZpbGVzJywgJ21ldGhvZHMnIGFuZCAndHlwZXMnLiAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ3JhbnVsYXJpdHkgPSBudWxsOwotCi0gICAgLyoqIHRoZSBYTUwgb3V0cHV0IGZpbGUgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBvdXRGaWxlID0gbnVsbDsKLSAgICAKLSAgICAvKiogdGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wb3JhcnkgdHh0IHJlcG9ydCAqLwotICAgIHByb3RlY3RlZCBGaWxlIHRtcEZpbGUgPSBjcmVhdGVUbXBGaWxlKCk7Ci0KLSAgICBwcm90ZWN0ZWQgUGF0aCBwYXRoID0gbnVsbDsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBVQkxJQyBNRVRIT0RTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBkZWZhdWx0IGNvbnN0cnVjdG9yICovCi0gICAgcHVibGljIE1NZXRyaWNzKCkgewotICAgICAgICBzdXBlcigiY29tLm1ldGFtYXRhLnNjLk1NZXRyaWNzIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0IHRoZSBncmFudWxhcml0eSBvZiB0aGUgYXVkaXQuIFNob3VsZCBiZSBvbmUgb2YgJ2ZpbGVzJywgJ21ldGhvZHMnCi0gICAgICogb3IgJ3R5cGVzJy4KLSAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgICB0aGUgYXVkaXQgcmVwb3J0aW5nIG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R3JhbnVsYXJpdHkoU3RyaW5nIGdyYW51bGFyaXR5KXsKLSAgICAgICAgdGhpcy5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgb3V0cHV0IFhNTCBmaWxlCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIHhtbCBmaWxlIHRvIHdyaXRlIHRoZSBYTUwgcmVwb3J0IHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvZmlsZShGaWxlIGZpbGUpewotICAgICAgICB0aGlzLm91dEZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhIG5ldyBwYXRoIChkaXJlY3RvcnkpIHRvIG1lYXN1cmUgbWV0cmljcyBmcm9tLgotICAgICAqIEByZXR1cm4gdGhlIHBhdGggaW5zdGFuY2UgdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZVBhdGgoKXsKLSAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoOwotCi0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tIFBST1RFQ1RFRCAvIFBSSVZBVEUgTUVUSE9EUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICAvLyBjaGVjayBmb3IgZXhpc3Rpbmcgb3B0aW9ucyBhbmQgb3V0ZmlsZSwgYWxsIG90aGVyIGFyZSBvcHRpb25hbAotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrT3B0aW9ucygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmNoZWNrT3B0aW9ucygpOwotCi0gICAgICAgIGlmICggISJmaWxlcyIuZXF1YWxzKGdyYW51bGFyaXR5KSAmJiAhIm1ldGhvZHMiLmVxdWFscyhncmFudWxhcml0eSkKLSAgICAgICAgICAgJiYgISJ0eXBlcyIuZXF1YWxzKGdyYW51bGFyaXR5KSApewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNZXRyaWNzIHJlcG9ydGluZyBncmFudWxhcml0eSBpcyBpbnZhbGlkLiBNdXN0IGJlIG9uZSBvZiAnZmlsZXMnLCAnbWV0aG9kcycsICd0eXBlcyciKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3V0RmlsZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT3V0cHV0IFhNTCBmaWxlIG11c3QgYmUgc2V0IHZpYSAndG9maWxlJyBhdHRyaWJ1dGUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhdGggPT0gbnVsbCAmJiBmaWxlU2V0cy5zaXplKCkgPT0gMCl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk11c3Qgc2V0IGVpdGhlciBwYXRocyAocGF0aCBlbGVtZW50KSBvciBmaWxlcyAoZmlsZXNldCBlbGVtZW50KSIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEkgZG9uJ3QgYWNjZXB0IGRpcnMgYW5kIGZpbGVzIGF0IHRoZSBzYW1lIHRpbWUsIEkgY2Fubm90IHJlY29nbml6ZSB0aGUgc2VtYW50aWMgaW4gdGhlIHJlc3VsdAotICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIGZpbGVTZXRzLnNpemUoKSA+IDApewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IHBhdGhzIChwYXRoIGVsZW1lbnQpIGFuZCBmaWxlcyAoZmlsZXNldCBlbGVtZW50KSBhdCB0aGUgc2FtZSB0aW1lIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlMChFeGVjdXRlU3RyZWFtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5leGVjdXRlMChoYW5kbGVyKTsKLSAgICAgICAgdHJhbnNmb3JtRmlsZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB0cmFuc2Zvcm0gdGhlIGdlbmVyYXRlZCBmaWxlIHZpYSB0aGUgaGFuZGxlcgotICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGVpdGhlciBiZSBjYWxsZWQgaWYgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQKLSAgICAgKiBmaWxlIHZpYSAtb3V0cHV0IG9yIHdlIGNvdWxkIHVzZSB0aGUgaGFuZGxlciBkaXJlY3RseSBvbiBzdGRvdXQgaWYgbm90LgotICAgICAqIEBzZWUgI2NyZWF0ZVN0cmVhbUhhbmRsZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRyYW5zZm9ybUZpbGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gdG1wU3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRtcFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIHRtcEZpbGUgKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgdGVtcG9yYXJ5IGZpbGU6ICIgKyB0bXBGaWxlLCBlKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHhtbFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4bWxTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKTsKLSAgICAgICAgICAgIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHhtbEhhbmRsZXIgPSBuZXcgTU1ldHJpY3NTdHJlYW1IYW5kbGVyKHRoaXMsIHhtbFN0cmVhbSk7Ci0gICAgICAgICAgICB4bWxIYW5kbGVyLnNldFByb2Nlc3NPdXRwdXRTdHJlYW0odG1wU3RyZWFtKTsKLSAgICAgICAgICAgIHhtbEhhbmRsZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIHhtbEhhbmRsZXIuc3RvcCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IGZpbGU6ICIgKyBvdXRGaWxlLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh4bWxTdHJlYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCl7fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRtcFN0cmVhbSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0bXBTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKXt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICAvKiogY2xlYW51cCB0aGUgdGVtcG9yYXJ5IHR4dCByZXBvcnQgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLmNsZWFuVXAoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh0bXBGaWxlICE9IG51bGwpewotICAgICAgICAgICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgdG1wRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiB0aGUgcmVwb3J0IGlzIHRyYW5zZm9ybSB2aWEgYSB0ZW1wb3JhcnkgdHh0IGZpbGUgd2Ugc2hvdWxkIHVzZSBhCi0gICAgICogYSBub3JtYWwgbG9nZ2VyIGhlcmUsIG90aGVyd2lzZSB3ZSBjb3VsZCB1c2UgdGhlIG1ldHJpY3MgaGFuZGxlcgotICAgICAqIGRpcmVjdGx5IHRvIGNhcHR1cmUgYW5kIHRyYW5zZm9ybSB0aGUgb3V0cHV0IG9uIHN0ZG91dCB0byBYTUwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIGNyZWF0ZVN0cmVhbUhhbmRsZXIoKXsKLSAgICAgICAgLy8gd3JpdGUgdGhlIHJlcG9ydCBkaXJlY3R0bHkgdG8gYW4gWE1MIHN0cmVhbQotICAgICAgICAvLyByZXR1cm4gbmV3IE1NZXRyaWNzU3RyZWFtSGFuZGxlcih0aGlzLCB4bWxTdHJlYW0pOwotICAgICAgICByZXR1cm4gbmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywgUHJvamVjdC5NU0dfSU5GTywgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGdldE9wdGlvbnMoKXsKLSAgICAgICAgVmVjdG9yIG9wdGlvbnMgPSBuZXcgVmVjdG9yKDUxMik7Ci0gICAgICAgIC8vIHRoZXJlIGlzIGEgYnVnIGluIE1ldGFtYXRhIDIuMCBidWlsZCAzNy4gVGhlIHNvdXJjZXBhdGggYXJndW1lbnQgZG9lcwotICAgICAgICAvLyBub3Qgd29yay4gU28gd2Ugd2lsbCB1c2UgdGhlIHNvdXJjZXBhdGggcHJlcGVuZGVkIHRvIGNsYXNzcGF0aC4gKG9yZGVyCi0gICAgICAgIC8vIGlzIGltcG9ydGFudCBzaW5jZSBNZXRhbWF0YSBsb29rcyBhdCAuY2xhc3MgYW5kIC5qYXZhKQotICAgICAgICBpZiAoc291cmNlUGF0aCAhPSBudWxsKXsKLSAgICAgICAgICAgIHNvdXJjZVBhdGguYXBwZW5kKGNsYXNzUGF0aCk7IC8vIHNyY3BhdGggaXMgcHJlcGVuZGVkCi0gICAgICAgICAgICBjbGFzc1BhdGggPSBzb3VyY2VQYXRoOwotICAgICAgICAgICAgc291cmNlUGF0aCA9IG51bGw7IC8vIHByZXZlbnQgZnJvbSB1c2luZyAtc291cmNlcGF0aAotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIGRvbid0IGZvcmdldCB0byBtb2RpZnkgdGhlIHBhdHRlcm4gaWYgeW91IGNoYW5nZSB0aGUgb3B0aW9ucyByZXBvcnRpbmcKLSAgICAgICAgaWYgKGNsYXNzUGF0aCAhPSBudWxsKXsKLSAgICAgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCgiLWNsYXNzcGF0aCIpOwotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KGNsYXNzUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCAiLW91dHB1dCIgKTsKLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCB0bXBGaWxlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCggIi0iICsgZ3JhbnVsYXJpdHkpOwotICAgICAgICAKLSAgICAgICAgLy8gZGlzcGxheSB0aGUgbWV0YW1hdGEgY29weXJpZ2h0Ci0gICAgICAgIC8vIG9wdGlvbnMuYWRkRWxlbWVudCggIi1xdWlldCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoICItZm9ybWF0Iik7Ci0gICAgICAgIAotICAgICAgICAvLyBuZWVkIHRoaXMgYmVjYXVzZSB0aGF0J3Mgd2hhdCB0aGUgaGFuZGxlciBpcyB1c2luZywgaXQncwotICAgICAgICAvLyB3YXkgZWFzaWVyIHRvIHByb2Nlc3MgdGhhbiBhbnkgb3RoZXIgc2VwYXJhdG9yCi0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCggInRhYiIpOwotICAgICAgICAKLSAgICAgICAgLy8gc3BlY2lmeSBhIC8gYXMgdGhlIGluZGVudCBjaGFyYWN0ZXIsIHVzZWQgYnkgdGhlIGhhbmRsZXIuCi0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCggIi1pIik7Ci0gICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCggIi8iKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGRpcmVjdG9yaWVzCi0gICAgICAgIFN0cmluZ1tdIGRpcnMgPSBwYXRoLmxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCggZGlyc1tpXSApOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZpbGVzIG5leHQuIAotICAgICAgICBhZGRBbGxWZWN0b3Iob3B0aW9ucywgaW5jbHVkZWRGaWxlcy5rZXlzKCkpOwotICAgICAgICByZXR1cm4gb3B0aW9uczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL21ldGFtYXRhL01NZXRyaWNzU3RyZWFtSGFuZGxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbWV0YW1hdGEvTU1ldHJpY3NTdHJlYW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWQ1NjEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbWV0YW1hdGEvTU1ldHJpY3NTdHJlYW1IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubWV0YW1hdGE7Ci0KLQotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi0vKioKLSAqIEEgaGFuZHkgbWV0cmljcyBoYW5kbGVyLiBNb3N0IG9mIHRoaXMgY29kZSB3YXMgZG9uZSBvbmx5IHdpdGggdGhlCi0gKiBzY3JlZW5zaG90cyBvbiB0aGUgZG9jdW1lbnRhdGlvbiBzaW5jZSB0aGUgZXZhbHVhdGlvbiB2ZXJzaW9uIGFzCi0gKiBvZiB0aGlzIHdyaXRpbmcgZG9lcyBub3QgYWxsb3cgdG8gc2F2ZSBtZXRyaWNzIG9yIHRvIHJ1biBpdCB2aWEKLSAqIGNvbW1hbmQgbGluZS4gCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gdHJhbnNmb3JtIGEgdGV4dCBmaWxlIG9yIHRvIHByb2Nlc3MgdGhlCi0gKiBvdXRwdXQgc3RyZWFtIGRpcmVjdGx5LgotICoKLSAqIEBhdXRob3IgIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgTU1ldHJpY3NTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgewotCi0gICAgLyoqIENMQVNTIGNvbnN0cnVjdCwgaXQgc2hvdWxkIGJlIG5hbWVkIHNvbWV0aGluZyBsaWtlICdNeUNsYXNzJyAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTID0gImNsYXNzIjsKLSAgICAKLSAgICAvKiogcGFja2FnZSBjb25zdHJ1Y3QsIGl0IHNob3VsZCBiZSBsb29rIGxpa2UgJ2NvbS5teWNvbXBhbnkuc29tZXRoaW5nJyAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7Ci0gICAgCi0gICAgLyoqIEZJTEUgY29uc3RydWN0LCBpdCBzaG91bGQgbG9vayBsaWtlIHNvbWV0aGluZyAnTXlDbGFzcy5qYXZhJyBvciAnTXlDbGFzcy5jbGFzcycgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFID0gImZpbGUiOwotICAgIAotICAgIC8qKiBNRVRIT0QgY29uc3RydWN0LCBpdCBzaG91bGQgbG9va2UgbGlrZSBzb21ldGhpbmcgJ2RvU29tZXRoaW5nKC4uLiknIG9yICdkb1NvbWV0aGluZygpJyAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FVEhPRCA9ICJtZXRob2QiOwotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gQVRUUklCVVRFUyA9IHsgIm5hbWUiLCAidmciLCAibG9jIiwKLSAgICAiZGl0IiwgIm5vYSIsICJucm0iLCAibmxtIiwgIndtYyIsICJyZmMiLCAiZGFjIiwgImZhbm91dCIsICJjYm8iLCAibGNvbSIsICJub2NsIgotICAgIH07Ci0gICAgCi0gICAgLyoqIHJlYWRlciBmb3Igc3Rkb3V0ICovCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIG1ldHJpY3NPdXRwdXQ7Ci0gICAgCi0gICAgLyoqCi0gICAgICogdGhpcyBpcyB3aGVyZSB0aGUgWE1MIG91dHB1dCB3aWxsIGdvLCBzaG91bGQgbW9zdGx5IGJlIGEgZmlsZQotICAgICAqIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZsdXNoaW5nIGFuZCBjbG9zaW5nIHRoaXMgc3RyZWFtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE91dHB1dFN0cmVhbSB4bWxPdXRwdXRTdHJlYW07Ci0KLSAgICAvKiogbWV0cmljcyBoYW5kbGVyICovCi0gICAgcHJvdGVjdGVkIFRyYW5zZm9ybWVySGFuZGxlciBtZXRyaWNzSGFuZGxlcjsKLSAgICAKLSAgICAvKiogdGhlIHRhc2sgKi8KLSAgICBwcm90ZWN0ZWQgVGFzayB0YXNrOwotCi0gICAgLyoqCi0gICAgICogdGhlIHN0YWNrIHdoZXJlIGFyZSBzdG9yZWQgdGhlIG1ldHJpY3MgZWxlbWVudCBzbyB0aGF0IHRoZXkgd2UgY2FuCi0gICAgICoga25vdyBpZiB3ZSBoYXZlIHRvIGNsb3NlIGFuIGVsZW1lbnQgb3Igbm90LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOwotICAgICAgICAgIAotICAgIC8qKiBpbml0aWFsaXplIHRoaXMgaGFuZGxlciAqLwotICAgIE1NZXRyaWNzU3RyZWFtSGFuZGxlcihUYXNrIHRhc2ssIE91dHB1dFN0cmVhbSB4bWxPdXQpewotICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwotICAgICAgICB0aGlzLnhtbE91dHB1dFN0cmVhbSA9IHhtbE91dDsKLSAgICB9Ci0KLSAgICAvKiogSWdub3JlLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NJbnB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcDEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgLyoqIElnbm9yZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzRXJyb3JTdHJlYW0oSW5wdXRTdHJlYW0gcDEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgaW5wdXRzdHJlYW0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzT3V0cHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgbWV0cmljc091dHB1dCA9IGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0cmFuc2Zvcm1lciBoYW5kbGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNlcmlhbGl6ZQotICAgICAgICAvLyB0aGUgb3V0cHV0LgotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBpZiAoICFmYWN0b3J5LmdldEZlYXR1cmUoU0FYVHJhbnNmb3JtZXJGYWN0b3J5LkZFQVRVUkUpICl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIFRyYW5zZm9ybWVyIGZhY3RvcnkgZmVhdHVyZSIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXRyaWNzSGFuZGxlciA9ICgoU0FYVHJhbnNmb3JtZXJGYWN0b3J5KWZhY3RvcnkpLm5ld1RyYW5zZm9ybWVySGFuZGxlcigpOwotICAgICAgICAgICAgbWV0cmljc0hhbmRsZXIuc2V0UmVzdWx0KCBuZXcgU3RyZWFtUmVzdWx0KCBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHhtbE91dHB1dFN0cmVhbSwgIlVURi04IikpICk7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG1ldHJpY3NIYW5kbGVyLmdldFRyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzdGFydCB0aGUgZG9jdW1lbnQgd2l0aCBhICdtZXRyaWNzJyByb290Ci0gICAgICAgICAgICBtZXRyaWNzSGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgICAgICBBdHRyaWJ1dGVzSW1wbCBhdHRyID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgICAgICBhdHRyLmFkZEF0dHJpYnV0ZSgiIiwgImNvbXBhbnkiLCAiY29tcGFueSIsICJDREFUQSIsICJtZXRhbWF0YSIpOwotICAgICAgICAgICAgbWV0cmljc0hhbmRsZXIuc3RhcnRFbGVtZW50KCIiLCAibWV0cmljcyIsICJtZXRyaWNzIiwgYXR0cik7Ci0KLSAgICAgICAgICAgIC8vIG5vdyBwYXJzZSB0aGUgd2hvbGUgdGhpbmcKLSAgICAgICAgICAgIHBhcnNlT3V0cHV0KCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmV0dHkgZGFuZ2Vyb3VzIGJ1c2luZXNzIGhlcmUuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHBvcCBldmVyeXRoaW5nIGFuZCBjbG9zZSBlbGVtZW50cyB0aGF0IGhhdmUgbm90IGJlZW4KLSAgICAgICAgICAgIC8vIGNsb3NlZCB5ZXQuCi0gICAgICAgICAgICB3aGlsZSAoIHN0YWNrLnNpemUoKSA+IDApewotICAgICAgICAgICAgICAgIEVsZW1lbnRFbnRyeSBlbGVtID0gKEVsZW1lbnRFbnRyeSlzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICBtZXRyaWNzSGFuZGxlci5lbmRFbGVtZW50KCIiLCBlbGVtLmdldFR5cGUoKSwgZWxlbS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHJvb3QKLSAgICAgICAgICAgIG1ldHJpY3NIYW5kbGVyLmVuZEVsZW1lbnQoIiIsICJtZXRyaWNzIiwgIm1ldHJpY3MiKTsKLSAgICAgICAgICAgIC8vIGRvY3VtZW50IGlzIGZpbmlzaGVkIGZvciBnb29kCi0gICAgICAgICAgICBtZXRyaWNzSGFuZGxlci5lbmREb2N1bWVudCgpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9ICAKLQotICAgIC8qKiByZWFkIGVhY2ggbGluZSBhbmQgcHJvY2VzcyBpdCAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobWV0cmljc091dHB1dCkpOwotICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgIHdoaWxlICggKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsICl7Ci0gICAgICAgICAgICBwcm9jZXNzTGluZShsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBtZXRyaWNzIGxpbmUuIElmIHRoZSBtZXRyaWNzIGlzIGludmFsaWQgYW5kIHRoYXQgdGhpcyBpcyBub3QKLSAgICAgKiB0aGUgaGVhZGVyIGxpbmUsIGl0IGlzIGRpc3BsYXkgYXMgaW5mby4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwcm9jZXNzLCBpdCBpcyBub3JtYWxseSBhIGxpbmUgZnVsbCBvZiBtZXRyaWNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaW5lKFN0cmluZyBsaW5lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCBsaW5lLnN0YXJ0c1dpdGgoIkNvbnN0cnVjdFx0VihHKVx0TE9DXHRESVRcdE5PQVx0TlJNXHROTE1cdFdNQ1x0UkZDXHREQUNcdEZBTk9VVFx0Q0JPXHRMQ09NXHROT0NMIikgKXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0cmljc0VsZW1lbnQgZWxlbSA9IE1ldHJpY3NFbGVtZW50LnBhcnNlKGxpbmUpOwotICAgICAgICAgICAgc3RhcnRFbGVtZW50KGVsZW0pOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgLy8gaW52YWxpZCBsaW5lcyBhcmUgc2VudCB0byB0aGUgb3V0cHV0IGFzIGluZm9ybWF0aW9uLCBpdCBtaWdodCBiZSBhbnl0aGluZywKLSAgICAgICAgICAgdGFzay5sb2cobGluZSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RhcnQgYSBuZXcgY29uc3RydWN0LiBFbGVtZW50cyBhcmUgcG9wcGVkIHVudGlsIHdlIGFyZSBvbiB0aGUgc2FtZQotICAgICAqIHBhcmVudCBub2RlLCB0aGVuIHRoZSBlbGVtZW50IHR5cGUgaXMgZ3Vlc3NlZCBhbmQgcHVzaGVkIG9uIHRoZQotICAgICAqIHN0YWNrLgotICAgICAqIEBwYXJhbSBlbGVtIHRoZSBlbGVtZW50IHRvIHByb2Nlc3MuCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aGVuIHNlbmRpbmcgU0FYIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydEVsZW1lbnQoTWV0cmljc0VsZW1lbnQgZWxlbSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBlbGVtZW50cyBpbiB0aGUgc3RhY2sgd2UgcG9zc2libHkgbmVlZCB0byBjbG9zZSBvbmUgb3IKLSAgICAgICAgLy8gbW9yZSBlbGVtZW50cyBwcmV2aW91cyB0byB0aGlzIG9uZSB1bnRpbCB3ZSBnb3QgaXRzIHBhcmVudAotICAgICAgICBpbnQgaW5kZW50ID0gZWxlbS5nZXRJbmRlbnQoKTsKLSAgICAgICAgaWYgKCBzdGFjay5zaXplKCkgPiAwICl7Ci0gICAgICAgICAgICBFbGVtZW50RW50cnkgcHJldmlvdXMgPSAoRWxlbWVudEVudHJ5KXN0YWNrLnBlZWsoKTsKLSAgICAgICAgICAgIC8vIGNsb3NlIG5vZGVzIHVudGlsIHlvdSBnb3QgdGhlIHBhcmVudC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBpbmRlbnQgPD0gcHJldmlvdXMuZ2V0SW5kZW50KCkgJiYgc3RhY2suc2l6ZSgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAgICBtZXRyaWNzSGFuZGxlci5lbmRFbGVtZW50KCIiLCBwcmV2aW91cy5nZXRUeXBlKCksIHByZXZpb3VzLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IChFbGVtZW50RW50cnkpc3RhY2sucGVlaygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gaWdub3JlZCl7fQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBvaywgbm93IHN0YXJ0IHRoZSBuZXcgY29uc3RydWN0Ci0gICAgICAgIFN0cmluZyB0eXBlID0gZ2V0Q29uc3RydWN0VHlwZShlbGVtKTsKLSAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IGNyZWF0ZUF0dHJpYnV0ZXMoZWxlbSk7Ci0gICAgICAgIG1ldHJpY3NIYW5kbGVyLnN0YXJ0RWxlbWVudCgiIiwgdHlwZSwgdHlwZSwgYXR0cnMpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBrZWVwIHRyYWNrIG9mIHdoYXQgd2UgZGlkLCB0aGF0J3MgaGlzdG9yeQotICAgICAgICBzdGFjay5wdXNoKCBuZXcgRWxlbWVudEVudHJ5KHR5cGUsIGluZGVudCkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIGNvbnN0cnVjdCB0eXBlIG9mIHRoZSBlbGVtZW50LiBXZSBjYW4gaGFyZGx5IHJlY29nbml6ZSB0aGUKLSAgICAgKiB0eXBlIG9mIGEgbWV0cmljcyBlbGVtZW50LCBzbyB3ZSBhcmUga2luZCBvZiBmb3JjZWQgdG8gZG8gc29tZSBibGFjawotICAgICAqIG1hZ2ljIGJhc2VkIG9uIHRoZSBuYW1lIGFuZCBpbmRlbnRhdGlvbiB0byByZWNvZ25pemUgdGhlIHR5cGUuCi0gICAgICogQHBhcmFtIGVsZW0gIHRoZSBtZXRyaWNzIGVsZW1lbnQgdG8gZ3Vlc3MgZm9yIGl0cyB0eXBlLgotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIG1ldHJpY3MgZWxlbWVudCwgZWl0aGVyIFBBQ0tBR0UsIEZJTEUsIENMQVNTIG9yCi0gICAgICogTUVUSE9ELgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uc3RydWN0VHlwZShNZXRyaWNzRWxlbWVudCBlbGVtKXsKLSAgICAgICAgLy8gb2sgbm8gZG91YnQsIGl0J3MgYSBmaWxlCi0gICAgICAgIGlmICggZWxlbS5pc0NvbXBpbGF0aW9uVW5pdCgpICl7Ci0gICAgICAgICAgICByZXR1cm4gRklMRTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc2FtZSwgd2UncmUgc3VyZSBpdCdzIGEgbWV0aG9kCi0gICAgICAgIGlmICggZWxlbS5pc01ldGhvZCgpICl7Ci0gICAgICAgICAgICByZXR1cm4gTUVUSE9EOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgaXQncyBlbXB0eSwgYW5kIG5vbmUgb2YgdGhlIGFib3ZlIGl0IHNob3VsZCBiZSBhIHBhY2thZ2UKLSAgICAgICAgaWYgKCBzdGFjay5zaXplKCkgPT0gMCApewotICAgICAgICAgICAgcmV0dXJuIFBBQ0tBR0U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG9rLCB0aGlzIGlzIG5vdyBibGFjayBtYWdpYyB0aW1lLCB3ZSB3aWxsIGd1ZXNzIHRoZSB0eXBlIGJhc2VkIG9uCi0gICAgICAgIC8vIHRoZSBwcmV2aW91cyB0eXBlIGFuZCBpdHMgaW5kZW50Li4uCi0gICAgICAgIGZpbmFsIEVsZW1lbnRFbnRyeSBwcmV2aW91cyA9IChFbGVtZW50RW50cnkpc3RhY2sucGVlaygpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJldlR5cGUgPSBwcmV2aW91cy5nZXRUeXBlKCk7Ci0gICAgICAgIGZpbmFsIGludCBwcmV2SW5kZW50ID0gcHJldmlvdXMuZ2V0SW5kZW50KCk7Ci0gICAgICAgIGZpbmFsIGludCBpbmRlbnQgPSBlbGVtLmdldEluZGVudCgpOwotICAgICAgICAvLyB3ZSdyZSBqdXN0IHVuZGVyIGEgZmlsZSB3aXRoIGEgYmlnZ2VyIGluZGVudCBzbyBpdCdzIGEgY2xhc3MKLSAgICAgICAgaWYgKCBwcmV2VHlwZS5lcXVhbHMoRklMRSkgJiYgaW5kZW50ID4gcHJldkluZGVudCApewotICAgICAgICAgICAgcmV0dXJuIENMQVNTOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UncmUganVzdCB1bmRlciBhIGNsYXNzIHdpdGggYSBncmVhdGVyIG9yIGVxdWFscyBpbmRlbnQsIGl0J3MgYSBjbGFzcwotICAgICAgICAvLyAodGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCBjbGFzc2VzIGluIGEgY29tcGlsYXRpb24gdW5pdCBhbmQgaW5uZXIgY2xhc3NlcyBhcyB3ZWxsKQotICAgICAgICBpZiAoIHByZXZUeXBlLmVxdWFscyhDTEFTUykgJiYgaW5kZW50ID49IHByZXZJbmRlbnQgKXsKLSAgICAgICAgICAgIHJldHVybiBDTEFTUzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBvdGhlciBhcmUgcGFja2FnZQotICAgICAgICByZXR1cm4gUEFDS0FHRTsKLSAgICB9ICAgIAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbGwgYXR0cmlidXRlcyBvZiBhIE1ldHJpY3NFbGVtZW50IHNraXBwaW5nIHRob3NlIHdobyBoYXZlIGFuCi0gICAgICogZW1wdHkgc3RyaW5nCi0gICAgICogQHBhcmFtICAgZWxlbSAgICAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXR0cmlidXRlcyBjcmVhdGVBdHRyaWJ1dGVzKE1ldHJpY3NFbGVtZW50IGVsZW0pewotICAgICAgICBBdHRyaWJ1dGVzSW1wbCBpbXBsID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBBVFRSSUJVVEVTW2krK107Ci0gICAgICAgIGltcGwuYWRkQXR0cmlidXRlKCIiLCBuYW1lLCBuYW1lLCAiQ0RBVEEiLCBlbGVtLmdldE5hbWUoKSk7Ci0gICAgICAgIEVudW1lcmF0aW9uIG1ldHJpY3MgPSBlbGVtLmdldE1ldHJpY3MoKTsKLSAgICAgICAgZm9yICg7IG1ldHJpY3MuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKyl7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKW1ldHJpY3MubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmICggdmFsdWUubGVuZ3RoKCkgPiAwICl7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IEFUVFJJQlVURVNbaV07Ci0gICAgICAgICAgICAgICAgaW1wbC5hZGRBdHRyaWJ1dGUoIiIsIG5hbWUsIG5hbWUsICJDREFUQSIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW1wbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaGVscGVyIGNsYXNzIHRvIGtlZXAgdHJhY2sgb2YgZWxlbWVudHMgdmlhIGl0cyB0eXBlIGFuZCBpbmRlbnQKLSAgICAgKiB0aGF0J3MgYWxsIHdlIG5lZWQgdG8gZ3Vlc3MgYSB0eXBlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIEVsZW1lbnRFbnRyeSB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0gICAgICAgIHByaXZhdGUgaW50IGluZGVudDsKLSAgICAgICAgRWxlbWVudEVudHJ5KFN0cmluZyB0eXBlLCBpbnQgaW5kZW50KXsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmluZGVudCA9IGluZGVudDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKXsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SW5kZW50KCkgewotICAgICAgICAgICAgcmV0dXJuIGluZGVudDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY2xhc3MgTWV0cmljc0VsZW1lbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTnVtYmVyRm9ybWF0IE1FVEFNQVRBX05GOwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIE51bWJlckZvcm1hdCBORVVUUkFMX05GOwotCXN0YXRpYyB7Ci0gICAgICAgIE1FVEFNQVRBX05GID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1FVEFNQVRBX05GLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cygxKTsKLSAgICAgICAgTkVVVFJBTF9ORiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwotCQlpZiAoTkVVVFJBTF9ORiBpbnN0YW5jZW9mIERlY2ltYWxGb3JtYXQpIHsKLQkJCSgoRGVjaW1hbEZvcm1hdCkgTkVVVFJBTF9ORikuYXBwbHlQYXR0ZXJuKCIjIyMwLiMjIzstIyMjMC4jIyMiKTsKLQkJfQotICAgICAgICBORVVUUkFMX05GLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cygxKTsKLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgaW5kZW50OwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGNvbnN0cnVjdDsKLSAgICAKLSAgICBwcml2YXRlIFZlY3RvciBtZXRyaWNzOwotICAgIAotICAgIE1ldHJpY3NFbGVtZW50KGludCBpbmRlbnQsIFN0cmluZyBjb25zdHJ1Y3QsIFZlY3RvciBtZXRyaWNzKXsKLSAgICAgICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7Ci0gICAgICAgIHRoaXMuY29uc3RydWN0ID0gY29uc3RydWN0OwotICAgICAgICB0aGlzLm1ldHJpY3MgPSBtZXRyaWNzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEluZGVudCgpewotICAgICAgICByZXR1cm4gaW5kZW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKXsKLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWV0cmljcygpewotICAgICAgICByZXR1cm4gbWV0cmljcy5lbGVtZW50cygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGF0aW9uVW5pdCgpewotICAgICAgICByZXR1cm4gKCBjb25zdHJ1Y3QuZW5kc1dpdGgoIi5qYXZhIikgfHwgY29uc3RydWN0LmVuZHNXaXRoKCIuY2xhc3MiKSApOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2QoKXsKLSAgICAgICAgcmV0dXJuICggY29uc3RydWN0LmVuZHNXaXRoKCIoLi4uKSIpIHx8IGNvbnN0cnVjdC5lbmRzV2l0aCgiKCkiKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIE1ldHJpY3NFbGVtZW50IHBhcnNlKFN0cmluZyBsaW5lKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWZWN0b3IgbWV0cmljcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgaW50IHBvczsKLSAgICAgICAgCi0gICAgICAgIC8vIGknbSB1c2luZyBpbmRleE9mIHNpbmNlIEkgbmVlZCB0byBrbm93IGlmIHRoZXJlIGFyZSBlbXB0eSBzdHJpbmdzCi0gICAgICAgIC8vIGJldHdlZW4gdGFicyBhbmQgSSBmaW5kIGl0IGVhc2llciB0aGFuIHdpdGggU3RyaW5nVG9rZW5pemVyCi0gICAgICAgIHdoaWxlICggKHBvcyA9IGxpbmUuaW5kZXhPZignXHQnKSkgIT0gLTEgKXsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICAvLyBvbmx5IHBhcnNlIHdoYXQgY291ZGwgYmUgYSB2YWxpZCBudW1iZXIuIGllIG5vdCBjb25zdHJ1Y3RzIG5vciBubyB2YWx1ZQotICAgICAgICAgICAgLyppZiAobWV0cmljcy5zaXplKCkgIT0gMCB8fCB0b2tlbi5sZW5ndGgoKSAhPSAwKXsKLQkgICAgICAgICAgICBOdW1iZXIgbnVtID0gTUVUQU1BVEFfTkYucGFyc2UodG9rZW4pOyAvLyBwYXJzZSB3aXRoIE1ldGFtYXRhIE5GCi0JICAgICAgICAgICAgdG9rZW4gPSBORVVUUkFMX05GLmZvcm1hdChudW0uZG91YmxlVmFsdWUoKSk7IC8vIGFuZCBmb3JtYXQgd2l0aCBhIG5ldXRyYWwgTkYKLQkgICAgICAgIH0qLwotICAgICAgICAgICAgbWV0cmljcy5hZGRFbGVtZW50KCB0b2tlbiApOwotICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKHBvcyArIDEpOwotICAgICAgICB9Ci0gICAgICAgIG1ldHJpY3MuYWRkRWxlbWVudCggbGluZSApOwotICAgICAgICAKLSAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgMTQgdG9rZW5zICgxIG5hbWUgKyAxMyBtZXRyaWNzKSwgaWYgbm90LCB0aGVyZSBpcyBhIHByb2JsZW0gIQotICAgICAgICBpZiAoIG1ldHJpY3Muc2l6ZSgpICE9IDE0ICl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkNvdWxkIG5vdCBwYXJzZSB0aGUgZm9sbG93aW5nIGxpbmUgYXMgYSBtZXRyaWNzOiAtLT4iICsgbGluZSArIjwtLSIsIC0xKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBmaXJzdCB0b2tlbiBpdCdzIG1hZGUgb2YgdGhlIGluZGVudGF0aW9uIHN0cmluZyBhbmQgdGhlCi0gICAgICAgIC8vIGNvbnN0cnVjdCBuYW1lLCB3ZSdsbCBuZWVkIGFsbCB0aGlzIHRvIGZpZ3VyZSBvdXQgd2hhdCB0eXBlIG9mCi0gICAgICAgIC8vIGNvbnN0cnVjdCBpdCBpcyBzaW5jZSB3ZSBsb3N0IGFsbCBzZW1hbnRpY3MgOigKLSAgICAgICAgLy8gKCNpbmRlbnRbL10qKSgjY29uc3RydWN0LiopCi0gICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyltZXRyaWNzLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgbWV0cmljcy5yZW1vdmVFbGVtZW50QXQoMCk7Ci0gICAgICAgIGludCBpbmRlbnQgPSAwOwotICAgICAgICBwb3MgPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgIGlmIChwb3MgIT0gLTEpewotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKHBvcyArIDEpOwotICAgICAgICAgICAgaW5kZW50ID0gcG9zICsgMTsgLy8gaW5kZW50YXRpb24gaXMgbGFzdCBwb3NpdGlvbiBvZiB0b2tlbiArIDEKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1ldHJpY3NFbGVtZW50KGluZGVudCwgbmFtZSwgbWV0cmljcyk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9tZXRhbWF0YS9NUGFyc2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL21ldGFtYXRhL01QYXJzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg5MzVmLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL21ldGFtYXRhL01QYXJzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubWV0YW1hdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBTaW1wbGUgTWV0YW1hdGEgTVBhcnNlIHRhc2sgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdyaXR0ZW4gYnkKLSAqIDxhIGhyZWY9Im1haWx0bzp0aG9tYXMuaGFhc0Bzb2Z0d2lyZWQtaW5jLmNvbSI+VGhvbWFzIEhhYXM8L2E+Ci0gKiAKLSAqIFRoaXMgdmVyc2lvbiB3YXMgd3JpdHRlbiBmb3IgTWV0YW1hdGEgMi4wIGF2YWlsYWJsZSBhdAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5tZXRhbWF0YS5jb20iPmh0dHA6Ly93d3cubWV0YW1hdGEuY29tPC9hPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNUGFyc2UgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGggPSBudWxsOwotICAgIHByaXZhdGUgUGF0aCBzb3VyY2VwYXRoID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgbWV0YWhvbWUgPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSB0YXJnZXQgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlYnVncGFyc2VyID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnc2Nhbm5lciA9IGZhbHNlOyAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY2xlYW51cCA9IGZhbHNlOwotICAgIHByaXZhdGUgQ29tbWFuZGxpbmVKYXZhIGNtZGwgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7Ci0gICAgcHJpdmF0ZSBGaWxlIG9wdGlvbnNGaWxlID0gbnVsbDsKLQotICAgIC8qKiBsb2NhdGlvbiBvZiBtZXRhbWF0YSBkZXYgZW52aXJvbm1lbnQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhbWF0YWhvbWUoRmlsZSBtZXRhbWF0YWhvbWUpIHsKLSAgICAgICAgdGhpcy5tZXRhaG9tZSA9IG1ldGFtYXRhaG9tZTsKLSAgICB9Ci0KLSAgICAvKiogdGhlIC5qaiBmaWxlIHRvIHByb2Nlc3MgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoRmlsZSB0YXJnZXQpIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqIGNyZWF0ZSBhIGNsYXNzcGF0aCBlbnRyeSAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHJldHVybiBjbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqIGNyZWF0ZXMgYSBzb3VyY2VwYXRoIGVudHJ5ICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlU291cmNlcGF0aCgpIHsKLSAgICAgICAgaWYgKHNvdXJjZXBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgc291cmNlcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNvdXJjZXBhdGg7Ci0gICAgfQotCi0gICAgLyoqIHNldCB2ZXJib3NlIG1vZGUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gZmxhZyl7Ci0gICAgICAgIHZlcmJvc2UgPSBmbGFnOwotICAgIH0KLQotICAgIC8qKiBzZXQgc2Nhbm5lciBkZWJ1ZyBtb2RlICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWdzY2FubmVyKGJvb2xlYW4gZmxhZyl7Ci0gICAgICAgIGRlYnVnc2Nhbm5lciA9IGZsYWc7Ci0gICAgfQotCi0gICAgLyoqIHNldCBwYXJzZXIgZGVidWcgbW9kZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlYnVncGFyc2VyKGJvb2xlYW4gZmxhZyl7Ci0gICAgICAgIGRlYnVncGFyc2VyID0gZmxhZzsKLSAgICB9Ci0KLSAgICAvKiogc2V0IHRoZSBoYWNrIHRvIGNsZWFudXAgdGhlIHRlbXAgZmlsZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsZWFudXAoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBjbGVhbnVwID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXN0ZWQganZtYXJnIGVsZW1lbnQuICovCi0gICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUp2bWFyZygpIHsKLSAgICAgICAgcmV0dXJuIGNtZGwuY3JlYXRlVm1Bcmd1bWVudCgpOwotICAgIH0KLQotICAgIC8qKiAgLW14IG9yIC1YbXggZGVwZW5kaW5nIG9uIFZNIHZlcnNpb24gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhtZW1vcnkoU3RyaW5nIG1heCl7Ci0gICAgICAgIGlmIChQcm9qZWN0LmdldEphdmFWZXJzaW9uKCkuc3RhcnRzV2l0aCgiMS4xIikpIHsKLSAgICAgICAgICAgIGNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItbXgiICsgbWF4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItWG14IiArIG1heCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTVBhcnNlKCkgewotICAgICAgICBjbWRsLnNldFZtKCJqYXZhIik7Ci0gICAgICAgIGNtZGwuc2V0Q2xhc3NuYW1lKCJjb20ubWV0YW1hdGEuamouTVBhcnNlIik7Ci0gICAgfQotCi0gICAKLSAgICAvKiogZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRVcCgpOwotICAgICAgICAgICAgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgaGFuZGxlciA9IGNyZWF0ZVN0cmVhbUhhbmRsZXIoKTsKLSAgICAgICAgICAgIF9leGVjdXRlKGhhbmRsZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xlYW5VcCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKiByZXR1cm4gdGhlIGRlZmF1bHQgc3RyZWFtIGhhbmRsZXIgZm9yIHRoaXMgdGFzayAqLwotICAgIHByb3RlY3RlZCBFeGVjdXRlU3RyZWFtSGFuZGxlciBjcmVhdGVTdHJlYW1IYW5kbGVyKCl7Ci0gICAgICAgIHJldHVybiBuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLCBQcm9qZWN0Lk1TR19JTkZPLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogY2hlY2sgdGhlIG9wdGlvbnMgYW5kIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrT3B0aW9ucygpOwotCi0gICAgICAgIC8vIHNldCB0aGUgY2xhc3NwYXRoIGFzIHRoZSBqYXIgZmlsZXMKLSAgICAgICAgRmlsZVtdIGphcnMgPSBnZXRNZXRhbWF0YUxpYnMoKTsKLSAgICAgICAgZmluYWwgUGF0aCBjbGFzc1BhdGggPSBjbWRsLmNyZWF0ZUNsYXNzcGF0aChwcm9qZWN0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIGNsYXNzUGF0aC5jcmVhdGVQYXRoRWxlbWVudCgpLnNldExvY2F0aW9uKGphcnNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBtZXRhbWF0YS5ob21lIHByb3BlcnR5Ci0gICAgICAgIGZpbmFsIENvbW1hbmRsaW5lLkFyZ3VtZW50IHZtQXJncyA9IGNtZGwuY3JlYXRlVm1Bcmd1bWVudCgpOwotICAgICAgICB2bUFyZ3Muc2V0VmFsdWUoIi1EbWV0YW1hdGEuaG9tZT0iICsgbWV0YWhvbWUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLQotCi0gICAgICAgIC8vIHdyaXRlIGFsbCB0aGUgb3B0aW9ucyB0byBhIHRlbXAgZmlsZSBhbmQgdXNlIGl0IHJvIHJ1biB0aGUgcHJvY2VzcwotICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0gZ2V0T3B0aW9ucygpOwotICAgICAgICBvcHRpb25zRmlsZSA9IGNyZWF0ZVRtcEZpbGUoKTsKLSAgICAgICAgZ2VuZXJhdGVPcHRpb25zRmlsZShvcHRpb25zRmlsZSwgb3B0aW9ucyk7Ci0gICAgICAgIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZ3MgPSBjbWRsLmNyZWF0ZUFyZ3VtZW50KCk7Ci0gICAgICAgIGFyZ3Muc2V0TGluZSgiLWFyZ3VtZW50cyAiICsgb3B0aW9uc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIH0gICAgCi0KLSAgICAKLSAgICAvKiogZXhlY3V0ZSB0aGUgcHJvY2VzcyB3aXRoIGEgc3BlY2lmaWMgaGFuZGxlciAqLwotICAgIHByb3RlY3RlZCB2b2lkIF9leGVjdXRlKEV4ZWN1dGVTdHJlYW1IYW5kbGVyIGhhbmRsZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRhcmdldCBoYXMgYmVlbiBjaGVja2VkIGFzIGEgLmpqLCBzZWUgaWYgdGhlcmUgaXMgYSBtYXRjaGluZwotICAgICAgICAvLyBqYXZhIGZpbGUgYW5kIGlmIGl0IGlzIG5lZWRlZCB0byBydW4gdG8gcHJvY2VzcyB0aGUgZ3JhbW1hcgotICAgICAgICBTdHJpbmcgcGF0aG5hbWUgPSB0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIGludCBwb3MgPSBwYXRobmFtZS5sZW5ndGgoKSAtICIuamoiLmxlbmd0aCgpOwotICAgICAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cmluZygwLCBwb3MpICsgIi5qYXZhIjsKLSAgICAgICAgRmlsZSBqYXZhRmlsZSA9IG5ldyBGaWxlKHBhdGhuYW1lKTsKLSAgICAgICAgaWYgKGphdmFGaWxlLmV4aXN0cygpICYmIHRhcmdldC5sYXN0TW9kaWZpZWQoKSA8IGphdmFGaWxlLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZygiVGFyZ2V0IGlzIGFscmVhZHkgYnVpbGQgLSBza2lwcGluZyAoIiArIHRhcmdldCArICIpIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEV4ZWN1dGUgcHJvY2VzcyA9IG5ldyBFeGVjdXRlKGhhbmRsZXIpOwotICAgICAgICBsb2coY21kbC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgcHJvY2Vzcy5zZXRDb21tYW5kbGluZShjbWRsLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHByb2Nlc3MuZXhlY3V0ZSgpICE9IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1ldGFtYXRhIHRhc2sgZmFpbGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIGxhdW5jaCBNZXRhbWF0YSB0YXNrOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIC8qKiBjbGVhbiB1cCBhbGwgdGhlIG1lc3MgdGhhdCB3ZSBkaWQgd2l0aCB0ZW1wb3Jhcnkgb2JqZWN0cyAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoKXsKLSAgICAgICAgaWYgKG9wdGlvbnNGaWxlICE9IG51bGwpewotICAgICAgICAgICAgb3B0aW9uc0ZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICBvcHRpb25zRmlsZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsZWFudXApIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdGFyZ2V0LmdldE5hbWUoKTsKLSAgICAgICAgICAgIGludCBwb3MgPSBuYW1lLmxlbmd0aCgpIC0gIi5qaiIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBuYW1lID0gIl9famoiICsgbmFtZS5zdWJzdHJpbmcoMCwgcG9zKSArICIuc3VuamoiOwotICAgICAgICAgICAgZmluYWwgRmlsZSBzdW5qaiA9IG5ldyBGaWxlKHRhcmdldC5nZXRQYXJlbnQoKSwgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoc3VuamouZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZygiUmVtb3Zpbmcgc3RhbGUgZmlsZTogIiArIHN1bmpqLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgc3VuamouZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVzIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIG5lZWRlZAotICAgICAqIGxpYnJhcmllcyB0byBydW4gbWV0YW1hdGEuIFRoZSBmaWxlIGFyZSBub3QgY2hlY2tlZCBmb3IKLSAgICAgKiBleGlzdGVuY2UuIFlvdSBzaG91bGQgZG8gdGhpcyB5b3Vyc2VsZiBpZiBuZWVkZWQgb3Igc2ltcGx5IGxldCB0aGUKLSAgICAgKiBmb3JrZWQgcHJvY2VzcyBkbyBpdCBmb3IgeW91LgotICAgICAqIEByZXR1cm4gYXJyYXkgb2YgamFycy96aXBzIG5lZWRlZCB0byBydW4gbWV0YW1hdGEuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGVbXSBnZXRNZXRhbWF0YUxpYnMoKXsKLSAgICAgICAgVmVjdG9yIGZpbGVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmaWxlcy5hZGRFbGVtZW50KCBuZXcgRmlsZShtZXRhaG9tZSwgImxpYi9tZXRhbWF0YS5qYXIiKSApOwotICAgICAgICBmaWxlcy5hZGRFbGVtZW50KCBuZXcgRmlsZShtZXRhaG9tZSwgImJpbi9saWIvSmF2YUNDLnppcCIpICk7Ci0gICAgICAgIAotICAgICAgICBGaWxlW10gYXJyYXkgPSBuZXcgRmlsZVsgZmlsZXMuc2l6ZSgpIF07Ci0gICAgICAgIGZpbGVzLmNvcHlJbnRvKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZSBvcHRpb25zIHNldCBhbmQgcmVzb2x2ZSBmaWxlcyBhbmQgcGF0aHMKLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHRocm93biBpZiBhbiBvcHRpb24gaGFzIGFuIGluY29ycmVjdCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja09wdGlvbnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geyAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgaG9tZSBpcyBvay4KLSAgICAgICAgaWYgKG1ldGFob21lID09IG51bGwgfHwgIW1ldGFob21lLmV4aXN0cygpKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJ21ldGFtYXRhaG9tZScgbXVzdCBwb2ludCB0byBNZXRhbWF0YSBob21lIGRpcmVjdG9yeS4iKTsKLSAgICAgICAgfQotICAgICAgICBtZXRhaG9tZSA9IHByb2plY3QucmVzb2x2ZUZpbGUobWV0YWhvbWUuZ2V0UGF0aCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIG5lZWRlZCBqYXIgZXhpc3RzLgotICAgICAgICBGaWxlW10gamFycyA9IGdldE1ldGFtYXRhTGlicygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGphcnMubGVuZ3RoOyBpKyspewotICAgICAgICAgICAgaWYgKCFqYXJzW2ldLmV4aXN0cygpKXsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIGphcnNbaV0gKyAiIGRvZXMgbm90IGV4aXN0LiBDaGVjayB5b3VyIG1ldGFtYXRhIGluc3RhbGxhdGlvbi4iKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSB0YXJnZXQgaXMgb2sgYW5kIHJlc29sdmUgaXQuCi0gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCAhdGFyZ2V0LmlzRmlsZSgpIHx8ICF0YXJnZXQuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamoiKSApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCB0YXJnZXQ6ICIgKyB0YXJnZXQpOwotICAgICAgICB9Ci0gICAgICAgIHRhcmdldCA9IHByb2plY3QucmVzb2x2ZUZpbGUodGFyZ2V0LmdldFBhdGgoKSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiByZXR1cm4gYWxsIG9wdGlvbnMgb2YgdGhlIGNvbW1hbmQgbGluZSBhcyBzdHJpbmcgZWxlbWVudHMKLSAgICAgKiBAcGFyYW0gYW4gYXJyYXkgb2Ygb3B0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZXR0ZWQgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0T3B0aW9ucygpewotICAgICAgICBWZWN0b3Igb3B0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgaWYgKHZlcmJvc2UpewotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItdmVyYm9zZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWJ1Z3NjYW5uZXIpewotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItZHMiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVidWdwYXJzZXIpewotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItZHAiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpewotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY2xhc3NwYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2VwYXRoICE9IG51bGwpewotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KCItc291cmNlcGF0aCIpOwotICAgICAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KHNvdXJjZXBhdGgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3B0aW9ucy5hZGRFbGVtZW50KHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbb3B0aW9ucy5zaXplKCldOwotICAgICAgICBvcHRpb25zLmNvcHlJbnRvKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB3cml0ZSBhbGwgb3B0aW9ucyB0byBhIGZpbGUgd2l0aCBvbmUgb3B0aW9uIC8gbGluZQotICAgICAqIEBwYXJhbSB0b2ZpbGUgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIG9wdGlvbnMgdG8uCi0gICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIGFycmF5IG9mIG9wdGlvbnMgZWxlbWVudCB0byB3cml0ZSB0byB0aGUgZmlsZS4KLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2hpbGUgd3JpdGluZwotICAgICAqIHRvIHRoZSBmaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlT3B0aW9uc0ZpbGUoRmlsZSB0b2ZpbGUsIFN0cmluZ1tdIG9wdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVXcml0ZXIgZncgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZncgPSBuZXcgRmlsZVdyaXRlcih0b2ZpbGUpOwotICAgICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoZncpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCBvcHRpb25zW2ldICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdy5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgd3JpdGluZyBvcHRpb25zIGZpbGUgIiArIHRvZmlsZSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZncgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZncuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKXt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgRmlsZSBjcmVhdGVUbXBGaWxlKCl7Ci0gICAgICAgIC8vIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIEpESyAxLjEgISEhIQotICAgICAgICBmaW5hbCBsb25nIHJhbmQgPSAobmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpLm5leHRMb25nKCk7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJtZXRhbWF0YSIgKyByYW5kICsgIi50bXAiKTsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmE1NDkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0OwotCi1pbXBvcnQgY29tLm9yb2luYy5uZXQuZnRwLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi0vKioKLSAqIEJhc2ljIEZUUCBjbGllbnQgdGhhdCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gKiA8dWw+Ci0gKiAgIDxsaT48c3Ryb25nPnNlbmQ8L3N0cm9uZz4gLSBzZW5kIGZpbGVzIHRvIGEgcmVtb3RlIHNlcnZlci4gIFRoaXMgaXMgdGhlCi0gKiAgICAgICAgICAgICAgZGVmYXVsdCBhY3Rpb24uPC9saT4KLSAqICAgPGxpPjxzdHJvbmc+Z2V0PC9zdHJvbmc+IC0gcmV0cml2ZSBmaWxlcyBmcm9tIGEgcmVtb3RlIHNlcnZlci48L2xpPgotICogICA8bGk+PHN0cm9uZz5kZWw8L3N0cm9uZz4gLSBkZWxldGUgZmlsZXMgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuPC9saT4KLSAqICAgPGxpPjxzdHJvbmc+bGlzdDwvc3Ryb25nPiAtIGNyZWF0ZSBhIGZpbGUgbGlzdGluZy48L2xpPgotICogPC91bD4KLSAqCi0gKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+Ci0gKiBTb21lIEZUUCBzZXJ2ZXJzIC0gbm90YWJseSB0aGUgU29sYXJpcyBzZXJ2ZXIgLSBzZWVtIHRvIGhvbGQgZGF0YSBwb3J0cwotICogb3BlbiBhZnRlciBhICJyZXRyIiBvcGVyYXRpb24sIGFsbG93aW5nIHRoZW0gdG8gdGltZW91dCBpbnN0ZWFkIG9mCi0gKiBzaHV0dGluZyB0aGVtIGRvd24gY2xlYW5seS4gIFRoaXMgaGFwcGVucyBpbiBhY3RpdmUgb3IgcGFzc2l2ZSBtb2RlLAotICogYW5kIHRoZSBwb3J0cyB3aWxsIHJlbWFpbiBvcGVuIGV2ZW4gYWZ0ZXIgZW5kaW5nIHRoZSBGVFAgc2Vzc2lvbi4KLSAqIEZUUCAic2VuZCIgb3BlcmF0aW9ucyBzZWVtIHRvIGNsb3NlIHBvcnRzIGltbWVkaWF0ZWx5LiAgVGhpcyBiZWhhdmlvcgotICogbWF5IGNhdXNlIHByb2JsZW1zIG9uIHNvbWUgc3lzdGVtcyB3aGVuIGRvd25sb2FkaW5nIGxhcmdlIHNldHMgb2YgZmlsZXMuCi0gKgotICogQGF1dGhvciBSb2dlciBWYXVnaG4gPGEgaHJlZj0ibWFpbHRvOnJ2YXVnaG5Ac2VhY29uaW5jLmNvbSI+cnZhdWdobkBzZWFjb25pbmMuY29tPC9hPgotICogQGF1dGhvciBHbGVubiBNY0FsbGlzdGVyIDxhIGhyZWY9Im1haWx0bzpnbGVubm1AY2EuaWJtLmNvbSI+Z2xlbm5tQGNhLmlibS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGVFAKLSAgICBleHRlbmRzIFRhc2sKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTRU5EX0ZJTEVTICAgPSAwOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEdFVF9GSUxFUyAgICA9IDE7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgREVMX0ZJTEVTICAgID0gMjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBMSVNUX0ZJTEVTICAgPSAzOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IE1LX0RJUiAgICAgICA9IDQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZW1vdGVkaXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyOwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJpZDsKLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKLSAgICBwcml2YXRlIEZpbGUgbGlzdGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gYmluYXJ5ID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcGFzc2l2ZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG5ld2VyT25seSA9IGZhbHNlOwotICAgIHByaXZhdGUgaW50IGFjdGlvbiA9IFNFTkRfRklMRVM7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZGlyQ2FjaGUgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBpbnQgdHJhbnNmZXJyZWQgPSAwOwotICAgIHByaXZhdGUgU3RyaW5nIHJlbW90ZUZpbGVTZXAgPSAiLyI7Ci0gICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDIxOwotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwRmFpbGVkVHJhbnNmZXJzPWZhbHNlOwotICAgIHByaXZhdGUgaW50IHNraXBwZWQ9MDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlTm9uY3JpdGljYWxFcnJvcnM9ZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIEFDVElPTl9TVFJTID0gewotICAgICAgICAic2VuZGluZyIsCi0gICAgICAgICJnZXR0aW5nIiwKLSAgICAgICAgImRlbGV0aW5nIiwKLSAgICAgICAgImxpc3RpbmciLAotICAgICAgICAibWFraW5nIGRpcmVjdG9yeSIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBDT01QTEVURURfQUNUSU9OX1NUUlMgPSB7Ci0gICAgICAgICJzZW50IiwKLSAgICAgICAgInJldHJpZXZlZCIsCi0gICAgICAgICJkZWxldGVkIiwKLSAgICAgICAgImxpc3RlZCIsCi0gICAgICAgICJjcmVhdGVkIGRpcmVjdG9yeSIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIGNsYXNzIEZUUERpcmVjdG9yeVNjYW5uZXIgZXh0ZW5kcyBEaXJlY3RvcnlTY2FubmVyIHsKLSAgICAgICAgcHJvdGVjdGVkIEZUUENsaWVudCBmdHAgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBGVFBEaXJlY3RvcnlTY2FubmVyKEZUUENsaWVudCBmdHApIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLmZ0cCA9IGZ0cDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNjYW4oKSB7Ci0gICAgICAgICAgICBpZiAoaW5jbHVkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIE5vIGluY2x1ZGVzIHN1cHBsaWVkLCBzbyBzZXQgaXQgdG8gJ21hdGNoZXMgYWxsJwotICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgICAgICAgICAgICBpbmNsdWRlc1swXSA9ICIqKiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXhjbHVkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGV4Y2x1ZGVzID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlsZXNJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGZpbGVzTm90SW5jbHVkZWQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgZGlyc0luY2x1ZGVkID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgZGlyc05vdEluY2x1ZGVkID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgZGlyc0V4Y2x1ZGVkID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjd2QgPSBmdHAucHJpbnRXb3JraW5nRGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgc2NhbmRpcigiLiIsICIiLCB0cnVlKTsgLy8gYWx3YXlzIHN0YXJ0IGZyb20gdGhlIGN1cnJlbnQgZnRwIHdvcmtpbmcgZGlyCi0gICAgICAgICAgICAgICAgZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBzY2FuIEZUUCBzZXJ2ZXI6ICIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2NhbmRpcihTdHJpbmcgZGlyLCBTdHJpbmcgdnBhdGgsIGJvb2xlYW4gZmFzdCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGRpcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEZUUEZpbGVbXSBuZXdmaWxlcyA9IGZ0cC5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3ZmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmdHAuY2hhbmdlVG9QYXJlbnREaXJlY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3ZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlRQRmlsZSBmaWxlID0gbmV3ZmlsZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZS5nZXROYW1lKCkuZXF1YWxzKCIuIikgJiYgIWZpbGUuZ2V0TmFtZSgpLmVxdWFscygiLi4iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5jbHVkZWQobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzSW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihuYW1lLCB2cGF0aCArIG5hbWUgKyBGaWxlLnNlcGFyYXRvciwgZmFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzRXhjbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnNOb3RJbmNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdCAmJiBjb3VsZEhvbGRJbmNsdWRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihuYW1lLCB2cGF0aCArIG5hbWUgKyBGaWxlLnNlcGFyYXRvciwgZmFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIobmFtZSwgdnBhdGggKyBuYW1lICsgRmlsZS5zZXBhcmF0b3IsIGZhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB2cGF0aCArIGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNJbmNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc05vdEluY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnRwLmNoYW5nZVRvUGFyZW50RGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBjb21tdW5pY2F0aW5nIHdpdGggRlRQIHNlcnZlcjogIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZW1vdGUgZGlyZWN0b3J5IHdoZXJlIGZpbGVzIHdpbGwgYmUgcGxhY2VkLiAgVGhpcyBtYXkKLSAgICAgKiBiZSBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgsIGFuZCBtdXN0IGJlIGluIHRoZSBwYXRoIHN5bnRheAotICAgICAqIGV4cGVjdGVkIGJ5IHRoZSByZW1vdGUgc2VydmVyLiAgTm8gY29ycmVjdGlvbiBvZiBwYXRoIHN5bnRheCB3aWxsCi0gICAgICogYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZWRpcihTdHJpbmcgZGlyKQotICAgIHsKLSAgICAgICAgdGhpcy5yZW1vdGVkaXIgPSBkaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgRlRQIHNlcnZlciB0byBzZW5kIGZpbGVzIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlcihTdHJpbmcgc2VydmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgRlRQIHBvcnQgdXNlZCBieSB0aGUgcmVtb3RlIHNlcnZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KQotICAgIHsKLSAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2dpbiB1c2VyIGlkIHRvIHVzZSBvbiB0aGUgc3BlY2lmaWVkIHNlcnZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyaWQoU3RyaW5nIHVzZXJpZCkKLSAgICB7Ci0gICAgICAgIHRoaXMudXNlcmlkID0gdXNlcmlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvZ2luIHBhc3N3b3JkIGZvciB0aGUgZ2l2ZW4gdXNlciBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCi0gICAgewotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGJpbmFyeS1tb2RlIG9yIHRleHQtbW9kZSB0cmFuc2ZlcnMuICBTZXQKLSAgICAgKiB0byB0cnVlIHRvIHNlbmQgYmluYXJ5IG1vZGUuICBCaW5hcnkgbW9kZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmluYXJ5KGJvb2xlYW4gYmluYXJ5KQotICAgIHsKLSAgICAgICAgdGhpcy5iaW5hcnkgPSBiaW5hcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHBhc3NpdmUgbW9kZS4gIFNldCB0byB0cnVlIGlmIHlvdQotICAgICAqIGFyZSBiZWhpbmQgYSBmaXJld2FsbCBhbmQgY2Fubm90IGNvbm5lY3Qgd2l0aG91dCBpdC4gIFBhc3NpdmUgbW9kZQotICAgICAqIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc2l2ZShib29sZWFuIHBhc3NpdmUpCi0gICAgewotICAgICAgICB0aGlzLnBhc3NpdmUgPSBwYXNzaXZlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0byB0cnVlIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIGFib3V0IGVhY2ggZmlsZSBhcyBpdCBpcwotICAgICAqIHRyYW5zZmVycmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKQotICAgIHsKLSAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdG8gdHJ1ZSB0byB0cmFuc21pdCBvbmx5IGZpbGVzIHRoYXQgYXJlIG5ldyBvciBjaGFuZ2VkIGZyb20gdGhlaXIKLSAgICAgKiByZW1vdGUgY291bnRlcnBhcnRzLiAgVGhlIGRlZmF1bHQgaXMgdG8gdHJhbnNtaXQgYWxsIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5ld2VyKGJvb2xlYW4gbmV3ZXIpCi0gICAgewotICAgICAgICB0aGlzLm5ld2VyT25seSA9IG5ld2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgc3lub255bSBmb3Igc2V0TmV3ZXIuICBTZXQgdG8gdHJ1ZSB0byB0cmFuc21pdCBvbmx5IG5ldyBvciBjaGFuZ2VkCi0gICAgICogZmlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVwZW5kcyhib29sZWFuIGRlcGVuZHMpCi0gICAgewotICAgICAgICB0aGlzLm5ld2VyT25seSA9IGRlcGVuZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVtb3RlIGZpbGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4gIFRoaXMgbm9ybWFsbHkgZGVmYXVsdHMgdG8KLSAgICAgKiB0aGUgVW5peCBzdGFuZGFyZCBmb3J3YXJkIHNsYXNoLCBidXQgY2FuIGJlIG1hbnVhbGx5IG92ZXJyaWRkZW4gdXNpbmcKLSAgICAgKiB0aGlzIGNhbGwgaWYgdGhlIHJlbW90ZSBzZXJ2ZXIgcmVxdWlyZXMgc29tZSBvdGhlciBzZXBhcmF0b3IuICBPbmx5Ci0gICAgICogdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGlzIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyBzZXBhcmF0b3IpCi0gICAgewotICAgICAgICByZW1vdGVGaWxlU2VwID0gc2VwYXJhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgewotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgRlRQIGFjdGlvbiB0byBiZSB0YWtlbi4gIEN1cnJlbnRseSBhY2NlcHRzICJwdXQiLCAiZ2V0IiwKLSAgICAgKiAiZGVsIiwgYW5kICJsaXN0Ii4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoYWN0aW9uLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJzZW5kIikgfHwKLSAgICAgICAgICAgIGFjdGlvbi50b0xvd2VyQ2FzZSgpLmVxdWFscygicHV0IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuYWN0aW9uID0gU0VORF9GSUxFUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhY3Rpb24udG9Mb3dlckNhc2UoKS5lcXVhbHMoInJlY3YiKSB8fAotICAgICAgICAgICAgICAgICBhY3Rpb24udG9Mb3dlckNhc2UoKS5lcXVhbHMoImdldCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmFjdGlvbiA9IEdFVF9GSUxFUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhY3Rpb24udG9Mb3dlckNhc2UoKS5lcXVhbHMoImRlbCIpIHx8Ci0gICAgICAgICAgICAgICAgIGFjdGlvbi50b0xvd2VyQ2FzZSgpLmVxdWFscygiZGVsZXRlIiApKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmFjdGlvbiA9IERFTF9GSUxFUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhY3Rpb24udG9Mb3dlckNhc2UoKS5lcXVhbHMoImxpc3QiKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5hY3Rpb24gPSBMSVNUX0ZJTEVTOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFjdGlvbi50b0xvd2VyQ2FzZSgpLmVxdWFscygibWtkaXIiKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5hY3Rpb24gPSBNS19ESVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFjdGlvbiAiICsgYWN0aW9uICsgIiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb3V0cHV0IGZpbGUgZm9yIHRoZSAibGlzdCIgYWN0aW9uLiAgVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBmb3IKLSAgICAgKiBhbnkgb3RoZXIgYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0aW5nKEZpbGUgbGlzdGluZykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5saXN0aW5nID0gbGlzdGluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgZmFpbGVkIHRyYW5zZmVyIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwRmFpbGVkVHJhbnNmZXJzKGJvb2xlYW4gc2tpcEZhaWxlZFRyYW5zZmVycykgewotICAgICAgICB0aGlzLnNraXBGYWlsZWRUcmFuc2ZlcnM9c2tpcEZhaWxlZFRyYW5zZmVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgdGhlIGZsYWcgdG8gc2tpcCBlcnJvcnMgb24gZGlyIGNyZWF0aW9uIChhbmQgbWF5YmUgbGF0ZXIgb3RoZXIKLSAgICAgKiBzZXJ2ZXIgc3BlY2lmaWMgZXJyb3JzKQotICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVOb25jcml0aWNhbEVycm9ycyhib29sZWFuIGlnbm9yZU5vbmNyaXRpY2FsRXJyb3JzKSB7Ci0gICAgICAgICB0aGlzLmlnbm9yZU5vbmNyaXRpY2FsRXJyb3JzPWlnbm9yZU5vbmNyaXRpY2FsRXJyb3JzOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIHRoYXQgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHNldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzZXJ2ZXIgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1c2VyaWQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ1c2VyaWQgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInBhc3N3b3JkIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoYWN0aW9uID09IExJU1RfRklMRVMpICYmIChsaXN0aW5nID09IG51bGwpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImxpc3RpbmcgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciBsaXN0IGFjdGlvbiEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBhY3Rpb24gPT0gTUtfRElSICYmIHJlbW90ZWRpciA9PSBudWxsICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJyZW1vdGVkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciBta2RpciBhY3Rpb24hIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgZWFjaCBmaWxlIGluIHRoZSBmaWxlc2V0LCBkbyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uOiBzZW5kLCBnZXQsIGRlbGV0ZSwKLSAgICAgKiBvciBsaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdHJhbnNmZXJGaWxlcyhGVFBDbGllbnQgZnRwLCBGaWxlU2V0IGZzKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlU2Nhbm5lciBkczsKLQotICAgICAgICBpZiAoYWN0aW9uID09IFNFTkRfRklMRVMpIHsKLSAgICAgICAgICAgIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRzID0gbmV3IEZUUERpcmVjdG9yeVNjYW5uZXIoZnRwKTsKLSAgICAgICAgICAgIGZzLnNldHVwRGlyZWN0b3J5U2Nhbm5lcihkcywgcHJvamVjdCk7Ci0gICAgICAgICAgICBkcy5zY2FuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBkc2ZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICBTdHJpbmcgZGlyID0gbnVsbDsKLSAgICAgICAgaWYgKChkcy5nZXRCYXNlZGlyKCkgPT0gbnVsbCkgJiYgKChhY3Rpb24gPT0gU0VORF9GSUxFUykgfHwgKGFjdGlvbiA9PSBHRVRfRklMRVMpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAidGhlIGRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIHNlbmQgYW5kIGdldCBhY3Rpb25zIiApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChhY3Rpb24gPT0gU0VORF9GSUxFUykgfHwgKGFjdGlvbiA9PSBHRVRfRklMRVMpKSB7Ci0gICAgICAgICAgICAgICAgZGlyID0gZHMuZ2V0QmFzZWRpcigpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgYXJlIGRvaW5nIGEgbGlzdGluZywgd2UgbmVlZCB0aGUgb3V0cHV0IHN0cmVhbSBjcmVhdGVkIG5vdy4KLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBudWxsOwotICAgICAgICBpZiAoYWN0aW9uID09IExJU1RfRklMRVMpIHsKLSAgICAgICAgICAgIEZpbGUgcGQgPSBuZXcgRmlsZShsaXN0aW5nLmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIGlmICghcGQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBwZC5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGxpc3RpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHNmaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICAgICAgICAgIGNhc2UgU0VORF9GSUxFUzogewotICAgICAgICAgICAgICAgIHNlbmRGaWxlKGZ0cCwgZGlyLCBkc2ZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBHRVRfRklMRVM6IHsKLSAgICAgICAgICAgICAgICBnZXRGaWxlKGZ0cCwgZGlyLCBkc2ZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBERUxfRklMRVM6IHsKLSAgICAgICAgICAgICAgICBkZWxGaWxlKGZ0cCwgZHNmaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgTElTVF9GSUxFUzogewotICAgICAgICAgICAgICAgIGxpc3RGaWxlKGZ0cCwgYncsIGRzZmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ1bmtub3duIGZ0cCBhY3Rpb24gIiArIGFjdGlvbiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdGlvbiA9PSBMSVNUX0ZJTEVTKSB7Ci0gICAgICAgICAgICBidy5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRzZmlsZXMubGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGFsbCBmaWxlcyBzcGVjaWZpZWQgYnkgdGhlIGNvbmZpZ3VyZWQgZmlsZXNldHMgdG8gdGhlIHJlbW90ZQotICAgICAqIHNlcnZlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0cmFuc2ZlckZpbGVzKEZUUENsaWVudCBmdHApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyYW5zZmVycmVkID0gMDsKLSAgICAgICAgc2tpcHBlZD0wOwotCi0gICAgICAgIGlmIChmaWxlc2V0cy5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJhdCBsZWFzdCBvbmUgZmlsZXNldCBtdXN0IGJlIHNwZWNpZmllZC4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGdldCBmaWxlcyBmcm9tIGZpbGVzZXRzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzZXRzLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJGaWxlcyhmdHAsIGZzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb2codHJhbnNmZXJyZWQgKyAiIGZpbGVzICIgKyBDT01QTEVURURfQUNUSU9OX1NUUlNbYWN0aW9uXSk7Ci0gICAgICAgIGlmKHNraXBwZWQhPTApIHsKLSAgICAgICAgICAgIGxvZyhza2lwcGVkICsgIiBmaWxlcyB3ZXJlIG5vdCBzdWNjZXNzZnVsbHkgIisgQ09NUExFVEVEX0FDVElPTl9TVFJTW2FjdGlvbl0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ycmVjdCBhIGZpbGUgcGF0aCB0byBjb3JyZXNwb25kIHRvIHRoZSByZW1vdGUgaG9zdCByZXF1aXJlbWVudHMuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgYXNzdW1lcyB0aGF0IHRoZSByZW1vdGUgZW5kIGNhbgotICAgICAqIGhhbmRsZSBVbml4LXN0eWxlIHBhdGhzIHdpdGggZm9yd2FyZC1zbGFzaCBzZXBhcmF0b3JzLiAgVGhpcyBjYW4KLSAgICAgKiBiZSBvdmVycmlkZGVuIHdpdGggdGhlIDxjb2RlPnNlcGFyYXRvcjwvY29kZT4gdGFzayBwYXJhbWV0ZXIuICBObwotICAgICAqIGF0dGVtcHQgaXMgbWFkZSB0byBkZXRlcm1pbmUgd2hhdCBzeW50YXggaXMgYXBwcm9wcmlhdGUgZm9yIHRoZQotICAgICAqIHJlbW90ZSBob3N0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUZpbGUoU3RyaW5nIGZpbGUpCi0gICAgewotICAgICAgICByZXR1cm4gZmlsZS5yZXBsYWNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKS5jaGFyQXQoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRmlsZVNlcC5jaGFyQXQoMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYWxsIHBhcmVudCBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gYSBjb21wbGV0ZSByZWxhdGl2ZQotICAgICAqIHBhdGhuYW1lLiAgQXR0ZW1wdHMgdG8gY3JlYXRlIGV4aXN0aW5nIGRpcmVjdG9yaWVzIHdpbGwgbm90IGNhdXNlCi0gICAgICogZXJyb3JzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhcmVudHMoRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGZpbGVuYW1lKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBWZWN0b3IgcGFyZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0gICAgICAgIFN0cmluZyBkaXJuYW1lOwotCi0gICAgICAgIHdoaWxlICgoZGlybmFtZSA9IGRpci5nZXRQYXJlbnQoKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoZGlybmFtZSk7Ci0gICAgICAgICAgICBwYXJlbnRzLmFkZEVsZW1lbnQoZGlyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSBwYXJlbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXIgPSAoRmlsZSlwYXJlbnRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGlmICghZGlyQ2FjaGUuY29udGFpbnMoZGlyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2coImNyZWF0aW5nIHJlbW90ZSBkaXJlY3RvcnkgIiArIHJlc29sdmVGaWxlKGRpci5nZXRQYXRoKCkpLAotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICBmdHAubWFrZURpcmVjdG9yeShyZXNvbHZlRmlsZShkaXIuZ2V0UGF0aCgpKSk7Ci0gICAgICAgICAgICAgICAgLy8gQm90aCBjb2RlcyA1NTAgYW5kIDU1MyBjYW4gYmUgcHJvZHVjZWQgYnkgRlRQIFNlcnZlcnMKLSAgICAgICAgICAgICAgICAvLyAgdG8gaW5kaWNhdGUgdGhhdCBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSBoYXMKLSAgICAgICAgICAgICAgICAvLyAgZmFpbGVkIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cy4KLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0PWZ0cC5nZXRSZXBseUNvZGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKHJlc3VsdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQgIT0gNTUwKSAmJiAocmVzdWx0IT0gNTUzKSAgICYmCi0gICAgICAgICAgICAgICAgICAgICAhaWdub3JlTm9uY3JpdGljYWxFcnJvcnMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNyZWF0ZSBkaXJlY3Rvcnk6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwLmdldFJlcGx5U3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkaXJDYWNoZS5hZGRFbGVtZW50KGRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSByZW1vdGUgZmlsZSBpcyBjdXJyZW50IGFzIGNvbXBhcmVkIHdpdGggdGhlCi0gICAgICogbG9jYWwgZmlsZS4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVtb3RlIGZpbGUgaXMgdXAgdG8gZGF0ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwVG9EYXRlKEZUUENsaWVudCBmdHAsIEZpbGUgbG9jYWxGaWxlLCBTdHJpbmcgcmVtb3RlRmlsZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbG9nKCJjaGVja2luZyBkYXRlIGZvciAiICsgcmVtb3RlRmlsZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgRlRQRmlsZVtdIGZpbGVzID0gZnRwLmxpc3RGaWxlcyhyZW1vdGVGaWxlKTsKLQotICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHNlbmRpbmcgZmlsZXMsIHRoZW4gYXNzdW1lIG91dCBvZiBkYXRlLgotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGdldHRpbmcgZmlsZXMsIHRoZW4gdGhyb3cgYW4gZXJyb3IKLQotICAgICAgICAgICAgaWYoIGFjdGlvbiA9PSBTRU5EX0ZJTEVTICkgewotICAgICAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGRhdGUgdGVzdCByZW1vdGUgZmlsZTogIiArIHJlbW90ZUZpbGUKLSAgICAgICAgICAgICAgICAgICAgKyAiYXNzdW1pbmcgb3V0IG9mIGRhdGUuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBkYXRlIHRlc3QgcmVtb3RlIGZpbGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHJlbW90ZVRpbWVzdGFtcCA9IGZpbGVzWzBdLmdldFRpbWVzdGFtcCgpLmdldFRpbWUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGxvbmcgbG9jYWxUaW1lc3RhbXAgPSBsb2NhbEZpbGUubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgIGlmICh0aGlzLmFjdGlvbiA9PSBTRU5EX0ZJTEVTKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVtb3RlVGltZXN0YW1wID4gbG9jYWxUaW1lc3RhbXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYWxUaW1lc3RhbXAgPiByZW1vdGVUaW1lc3RhbXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHNpbmdsZSBmaWxlIHRvIHRoZSByZW1vdGUgaG9zdC4KLSAgICAgKiA8Y29kZT5maWxlbmFtZTwvY29kZT4gbWF5IGNvbnRhaW4gYSByZWxhdGl2ZSBwYXRoIHNwZWNpZmljYXRpb24uCi0gICAgICogV2hlbiB0aGlzIGlzIHRoZSBjYXNlLCA8Y29kZT5zZW5kRmlsZTwvY29kZT4gd2lsbCBhdHRlbXB0IHRvIGNyZWF0ZQotICAgICAqIGFueSBuZWNlc3NhcnkgcGFyZW50IGRpcmVjdG9yaWVzIGJlZm9yZSBzZW5kaW5nIHRoZSBmaWxlLiAgVGhlIGZpbGUKLSAgICAgKiB3aWxsIHRoZW4gYmUgc2VudCB1c2luZyB0aGUgZW50aXJlIHJlbGF0aXZlIHBhdGggc3BlYyAtIG5vIGF0dGVtcHQKLSAgICAgKiBpcyBtYWRlIHRvIGNoYW5nZSBkaXJlY3Rvcmllcy4gIEl0IGlzIGFudGljaXBhdGVkIHRoYXQgdGhpcyBtYXkKLSAgICAgKiBldmVudHVhbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggc29tZSBGVFAgc2VydmVycywgYnV0IGl0IHNpbXBsaWZpZXMKLSAgICAgKiB0aGUgY29kaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbmRGaWxlKEZUUENsaWVudCBmdHAsIFN0cmluZyBkaXIsIFN0cmluZyBmaWxlbmFtZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gcHJvamVjdC5yZXNvbHZlRmlsZShuZXcgRmlsZShkaXIsIGZpbGVuYW1lKS5nZXRQYXRoKCkpOwotCi0gICAgICAgICAgICBpZiAobmV3ZXJPbmx5ICYmIGlzVXBUb0RhdGUoZnRwLCBmaWxlLCByZXNvbHZlRmlsZShmaWxlbmFtZSkpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nKCJ0cmFuc2ZlcnJpbmcgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCi0gICAgICAgICAgICBjcmVhdGVQYXJlbnRzKGZ0cCwgZmlsZW5hbWUpOwotCi0gICAgICAgICAgICBmdHAuc3RvcmVGaWxlKHJlc29sdmVGaWxlKGZpbGVuYW1lKSwgaW5zdHJlYW0pOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzPUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSk7Ci0gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHM9ImNvdWxkIG5vdCBwdXQgZmlsZTogIiArIGZ0cC5nZXRSZXBseVN0cmluZygpOwotICAgICAgICAgICAgICAgIGlmKHNraXBGYWlsZWRUcmFuc2ZlcnM9PXRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKHMsUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgICAgIHNraXBwZWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgICAgbG9nKCJGaWxlICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBjb3BpZWQgdG8gIiArIHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgdHJhbnNmZXJyZWQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgYSBmaWxlIGZyb20gdGhlIHJlbW90ZSBob3N0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlbEZpbGUoRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGZpbGVuYW1lKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgIGxvZygiZGVsZXRpbmcgIiArIGZpbGVuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZnRwLmRlbGV0ZUZpbGUocmVzb2x2ZUZpbGUoZmlsZW5hbWUpKSkgewotICAgICAgICAgICAgU3RyaW5nIHM9ImNvdWxkIG5vdCBkZWxldGUgZmlsZTogIiArIGZ0cC5nZXRSZXBseVN0cmluZygpOwotICAgICAgICAgICAgaWYoc2tpcEZhaWxlZFRyYW5zZmVycz09dHJ1ZSkgewotICAgICAgICAgICAgICAgIGxvZyhzLFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgIHNraXBwZWQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiRmlsZSAiICsgZmlsZW5hbWUgKyAiIGRlbGV0ZWQgZnJvbSAiICsgc2VydmVyLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIHRyYW5zZmVycmVkKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBhIHNpbmdsZSBmaWxlIHRvIHRoZSByZW1vdGUgaG9zdC4KLSAgICAgKiA8Y29kZT5maWxlbmFtZTwvY29kZT4gbWF5IGNvbnRhaW4gYSByZWxhdGl2ZSBwYXRoIHNwZWNpZmljYXRpb24uCi0gICAgICogVGhlIGZpbGUgd2lsbCB0aGVuIGJlIHJldHJlaXZlZCB1c2luZyB0aGUgZW50aXJlIHJlbGF0aXZlIHBhdGggc3BlYyAtCi0gICAgICogbm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGNoYW5nZSBkaXJlY3Rvcmllcy4gIEl0IGlzIGFudGljaXBhdGVkIHRoYXQgdGhpcyBtYXkKLSAgICAgKiBldmVudHVhbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggc29tZSBGVFAgc2VydmVycywgYnV0IGl0IHNpbXBsaWZpZXMKLSAgICAgKiB0aGUgY29kaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdldEZpbGUoRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGRpciwgU3RyaW5nIGZpbGVuYW1lKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0c3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUobmV3IEZpbGUoZGlyLCBmaWxlbmFtZSkuZ2V0UGF0aCgpKTsKLQotICAgICAgICAgICAgaWYgKG5ld2VyT25seSAmJiBpc1VwVG9EYXRlKGZ0cCwgZmlsZSwgcmVzb2x2ZUZpbGUoZmlsZW5hbWUpKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZygidHJhbnNmZXJyaW5nICIgKyBmaWxlbmFtZSArICIgdG8gIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIEZpbGUgcGRpciA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50KCkpOyAgICAgICAgLy8gc3RheSAxLjEgY29tcGF0aWJsZQotICAgICAgICAgICAgaWYgKCFwZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcGRpci5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7Ci0gICAgICAgICAgICBmdHAucmV0cmlldmVGaWxlKHJlc29sdmVGaWxlKGZpbGVuYW1lKSwgb3V0c3RyZWFtKTsKLQotICAgICAgICAgICAgaWYgKCFGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzPSJjb3VsZCBub3QgZ2V0IGZpbGU6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZihza2lwRmFpbGVkVHJhbnNmZXJzPT10cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhzLFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgICAgICBza2lwcGVkKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkZpbGUgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGNvcGllZCBmcm9tICIgKyBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3V0c3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGZpbGUgZnJvbSB0aGUgcmVtb3RlIGhvc3QuCi0gICAgICogPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IG1heSBjb250YWluIGEgcmVsYXRpdmUgcGF0aCBzcGVjaWZpY2F0aW9uLgotICAgICAqIFRoZSBmaWxlIGxpc3Rpbmcgd2lsbCB0aGVuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgZW50aXJlIHJlbGF0aXZlIHBhdGggc3BlYwotICAgICAqIC0gbm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGNoYW5nZSBkaXJlY3Rvcmllcy4gIEl0IGlzIGFudGljaXBhdGVkIHRoYXQgdGhpcyBtYXkKLSAgICAgKiBldmVudHVhbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggc29tZSBGVFAgc2VydmVycywgYnV0IGl0IHNpbXBsaWZpZXMKLSAgICAgKiB0aGUgY29kaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RGaWxlKEZUUENsaWVudCBmdHAsIEJ1ZmZlcmVkV3JpdGVyIGJ3LCBTdHJpbmcgZmlsZW5hbWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICBsb2coImxpc3RpbmcgIiArIGZpbGVuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZUUEZpbGUgZnRwZmlsZSA9IGZ0cC5saXN0RmlsZXMocmVzb2x2ZUZpbGUoZmlsZW5hbWUpKVswXTsKLSAgICAgICAgYncud3JpdGUoZnRwZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgYncubmV3TGluZSgpOwotCi0gICAgICAgIHRyYW5zZmVycmVkKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IG9uIHRoZSByZW1vdGUgaG9zdC4KLSAgICAgKiBAcGFyYW0gZnRwIFRoZSBGVFAgY2xpZW50IGNvbm5lY3Rpb24KLSAgICAgKiBAcGFyYW0gZGlyIFRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlIChmb3JtYXQgbXVzdCBiZSBjb3JyZWN0IGZvciBob3N0IHR5cGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFrZVJlbW90ZURpciggRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGRpciApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICBsb2coImNyZWF0aW5nIGRpcmVjdG9yeTogIiArIGRpcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggISBmdHAubWFrZURpcmVjdG9yeSggZGlyICkgKSB7Ci0gICAgICAgICAgICAvLyBCb3RoIGNvZGVzIDU1MCBhbmQgNTUzIGNhbiBiZSBwcm9kdWNlZCBieSBGVFAgU2VydmVycwotICAgICAgICAgICAgLy8gIHRvIGluZGljYXRlIHRoYXQgYW4gYXR0ZW1wdCB0byBjcmVhdGUgYSBkaXJlY3RvcnkgaGFzCi0gICAgICAgICAgICAvLyAgZmFpbGVkIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cy4KLQotICAgICAgICAgICAgaW50IHJjID0gZnRwLmdldFJlcGx5Q29kZSgpOwotICAgICAgICAgICAgaWYoIHJjICE9IDU1MCAmJiByYyAhPSA1NTMgJiYgIWlnbm9yZU5vbmNyaXRpY2FsRXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiY291bGQgbm90IGNyZWF0ZSBkaXJlY3Rvcnk6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwLmdldFJlcGx5U3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHZlcmJvc2UgKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCAiZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoIHZlcmJvc2UgKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCAiZGlyZWN0b3J5IGNyZWF0ZWQgT0siICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSB0YXNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNoZWNrQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIEZUUENsaWVudCBmdHAgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2coIk9wZW5pbmcgRlRQIGNvbm5lY3Rpb24gdG8gIiArIHNlcnZlciwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgICAgIGZ0cCA9IG5ldyBGVFBDbGllbnQoKTsKLQotICAgICAgICAgICAgZnRwLmNvbm5lY3Qoc2VydmVyLCBwb3J0KTsKLSAgICAgICAgICAgIGlmICghRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZUUCBjb25uZWN0aW9uIGZhaWxlZDogIiArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIGxvZygibG9nZ2luZyBpbiB0byBGVFAgc2VydmVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgICAgIGlmICghZnRwLmxvZ2luKHVzZXJpZCwgcGFzc3dvcmQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGxvZ2luIHRvIEZUUCBzZXJ2ZXIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9nKCJsb2dpbiBzdWNjZWVkZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQotICAgICAgICAgICAgaWYgKGJpbmFyeSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmdHAuc2V0RmlsZVR5cGUoY29tLm9yb2luYy5uZXQuZnRwLkZUUC5JTUFHRV9GSUxFX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmICghRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3Qgc2V0IHRyYW5zZmVyIHR5cGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwLmdldFJlcGx5U3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhc3NpdmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nKCJlbnRlcmluZyBwYXNzaXZlIG1vZGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICBmdHAuZW50ZXJMb2NhbFBhc3NpdmVNb2RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBlbnRlciBpbnRvIHBhc3NpdmUgbW9kZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB0aGUgYWN0aW9uIGlzIE1LX0RJUiwgdGhlbiB0aGUgc3BlY2lmaWVkIHJlbW90ZSBkaXJlY3RvcnkgaXMgdGhlCi0gICAgICAgICAgICAvLyBkaXJlY3RvcnkgdG8gY3JlYXRlLgotCi0gICAgICAgICAgICBpZiggYWN0aW9uID09IE1LX0RJUiApIHsKLQotICAgICAgICAgICAgICAgIG1ha2VSZW1vdGVEaXIoIGZ0cCwgcmVtb3RlZGlyICk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbW90ZWRpciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJjaGFuZ2luZyB0aGUgcmVtb3RlIGRpcmVjdG9yeSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICBmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShyZW1vdGVkaXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsb2coQUNUSU9OX1NUUlNbYWN0aW9uXSArICIgZmlsZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJGaWxlcyhmdHApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImVycm9yIGR1cmluZyBGVFAgdHJhbnNmZXI6ICIgKyBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZnRwICE9IG51bGwgJiYgZnRwLmlzQ29ubmVjdGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2coImRpc2Nvbm5lY3RpbmciLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgZnRwLmxvZ291dCgpOwotICAgICAgICAgICAgICAgICAgICBmdHAuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9NaW1lTWFpbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L01pbWVNYWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTA5NmYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L01pbWVNYWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldDsKLQotCi0vLyBTdGFuZGFyZCBTREsgaW1wb3J0cwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8vaW1wb3J0ZWQgZm9yIHRoZSBtYWlsIGFwaQotaW1wb3J0IGphdmF4Lm1haWwuQWRkcmVzczsKLWltcG9ydCBqYXZheC5tYWlsLlNlc3Npb247Ci1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4Lm1haWwuQm9keVBhcnQ7Ci1pbXBvcnQgamF2YXgubWFpbC5NdWx0aXBhcnQ7Ci1pbXBvcnQgamF2YXgubWFpbC5TZW5kRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuVHJhbnNwb3J0OwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuSW50ZXJuZXRBZGRyZXNzOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lQm9keVBhcnQ7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTXVsdGlwYXJ0OwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuQWRkcmVzc0V4Y2VwdGlvbjsKLQotLy9pbXBvcnRlZCBmb3IgZGF0YSBzb3VyY2UgYW5kIGhhbmRsZXIKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7Ci0KLS8vIEFudCBpbXBvcnRzCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5GaWxlU2Nhbm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotCi0KLQotLyoqCi0gKiBBIHRhc2sgdG8gc2VuZCBTTVRQIGVtYWlsLiBUaGlzIHZlcnNpb24gaGFzIG5lYXIgaWRlbnRpY2FsIHN5bnRheCB0bwotICogdGhlIFNlbmRFbWFpbCB0YXNrLCBidXQgaXMgTUlNRSBhd2FyZS4gSXQgYWxzbyByZXF1aXJlcyBTdW4ncyBtYWlsLmphciBhbmQKLSAqIGFjdGl2YXRpb24uamFyIHRvIGNvbXBpbGUgYW5kIGV4ZWN1dGUsIHdoaWNoIHB1dHMgaXQgY2xlYXJseSBpbnRvIHRoZQotICogdmVyeSBvcHRpb25hbCBjYXRlZ29yeS4KLSAqCi0gKiBAYXV0aG9yIGdsZW5uX3R3aWdnc0BibWMuY29tCi0gKiBAYXV0aG9yIHN0ZXZlX2xAaXNlcmFuLmNvbSBzdGV2ZSBsb3VnaHJhbgotICogQGF1dGhvciBlcmlrQGhhdGNoZXIubmV0IEVyaWsgSGF0Y2hlcgotICogQGF1dGhvciBwYXVsby5nYXNwYXJAa3Jhbmtpa29tLmRlIFBhdWxvIEdhc3BhcgotICogQGNyZWF0ZWQgMDEgTWF5IDIwMDEKLSAqLwotcHVibGljIGNsYXNzIE1pbWVNYWlsIGV4dGVuZHMgVGFzayB7Ci0gICAgLyoqCi0gICAgICogZmFpbHVyZSBmbGFnCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIHNlbmRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZyb20gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogaG9zdCBydW5uaW5nIFNNVFAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYWlsaG9zdCA9ICJsb2NhbGhvc3QiOwotCi0gICAgLyoqCi0gICAgICogYW55IHRleHQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQotCi0gICAgLyoqCi0gICAgICogIG1lc3NhZ2UgZmlsZSAobXV0dWFsbHkgZXhjbHVzaXZlIGZyb20gbWVzc2FnZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgbWVzc2FnZUZpbGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVE8gcmVjaXBpZW50cwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRvTGlzdCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDQyAoQ2FyYm9uIENvcHkpIHJlY2lwaWVudHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nICAgY2NMaXN0ICA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBCQ0MgKEJsaW5kIENhcmJvbiBDb3B5KSByZWNpcGllbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyAgIGJjY0xpc3QgID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIHN1YmplY3QgZmllbGQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzdWJqZWN0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIGZpbGUgbGlzdAotICAgICAqLwotICAgIHByaXZhdGUgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLyoqCi0gICAgICogdHlwZSBvZiB0aGUgdGV4dCBtZXNzYWdlLCBwbGFpbnRleHQgYnkgZGVmYXVsdCBidXQgdGV4dC9odG1sIG9yCi0gICAgICogdGV4dC94bWwgaXMgcXVpdGUgZmVhc2libGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlTWltZVR5cGUgPSAidGV4dC9wbGFpbiI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBNaW1lTWFpbCgpIHsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEZhaWxPbkVycm9yIGF0dHJpYnV0ZSBvZiB0aGUgTWltZU1haWwgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFpbE9uRXJyb3IgVGhlIG5ldyBGYWlsT25FcnJvciB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gZmFpbE9uRXJyb3IpIHsKLSAgICAgICAgdGhpcy5mYWlsT25FcnJvciA9IGZhaWxPbkVycm9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgewotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdG9MaXN0IHBhcmFtZXRlciBvZiB0aGlzIGJ1aWxkIHRhc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdG9MaXN0IENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGVtYWlsIHJlY2lwaWVudCBhZGRyZXNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0xpc3QoU3RyaW5nIHRvTGlzdCkgewotICAgICAgICB0aGlzLnRvTGlzdCA9IHRvTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0b0xpc3QgcGFyYW1ldGVyIG9mIHRoaXMgYnVpbGQgdGFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0b0xpc3QgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZW1haWwgcmVjaXBpZW50IGFkZHJlc2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENjTGlzdChTdHJpbmcgY2NMaXN0KSB7Ci0gICAgICAgIHRoaXMuY2NMaXN0ID0gY2NMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRvTGlzdCBwYXJhbWV0ZXIgb2YgdGhpcyBidWlsZCB0YXNrLgotICAgICAqCi0gICAgICogQHBhcmFtIHRvTGlzdCBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBlbWFpbCByZWNpcGllbnQgYWRkcmVzZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmNjTGlzdChTdHJpbmcgYmNjTGlzdCkgewotICAgICAgICB0aGlzLmJjY0xpc3QgPSBiY2NMaXN0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgImZyb20iIHBhcmFtZXRlciBvZiB0aGlzIGJ1aWxkIHRhc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJvbSBFbWFpbCBhZGRyZXNzIG9mIHNlbmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBmcm9tKSB7Ci0gICAgICAgIHRoaXMuZnJvbSA9IGZyb207Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtYWlsaG9zdCBwYXJhbWV0ZXIgb2YgdGhpcyBidWlsZCB0YXNrLgotICAgICAqCi0gICAgICogQHBhcmFtIG1haWxob3N0IE1haWwgaG9zdCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1haWxob3N0KFN0cmluZyBtYWlsaG9zdCkgewotICAgICAgICB0aGlzLm1haWxob3N0ID0gbWFpbGhvc3Q7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZXNzYWdlIHBhcmFtZXRlciBvZiB0aGlzIGJ1aWxkIHRhc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGJvZHkgb2YgdGhpcyBlbWFpbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUZpbGUoRmlsZSBtZXNzYWdlRmlsZSkgewotICAgICAgICB0aGlzLm1lc3NhZ2VGaWxlID0gbWVzc2FnZUZpbGU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBzZXQgdHlwZSBvZiB0aGUgdGV4dCBtZXNzYWdlLCBwbGFpbnRleHQgYnkgZGVmYXVsdCBidXQgdGV4dC9odG1sCi0gICAgICogb3IgdGV4dC94bWwgaXMgcXVpdGUgZmVhc2libGUKLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuZXcgTWVzc2FnZU1pbWVUeXBlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZU1pbWVUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZU1pbWVUeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdWJqZWN0IHBhcmFtZXRlciBvZiB0aGlzIGJ1aWxkIHRhc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ViamVjdCBTdWJqZWN0IG9mIHRoaXMgZW1haWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgc3ViamVjdCkgewotICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogdmVyaWZ5IHBhcmFtZXRlcnMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLSAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBdHRyaWJ1dGUgXCJmcm9tXCIgaXMgcmVxdWlyZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHRvTGlzdCA9PSBudWxsKSAmJiAoY2NMaXN0ID09IG51bGwpICYmIChiY2NMaXN0ID09IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0dHJpYnV0ZSBcInRvTGlzdFwiLCBcImNjTGlzdFwiIG9yIFwiYmNjTGlzdFwiIGlzIHJlcXVpcmVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCAmJiBmaWxlc2V0cy5pc0VtcHR5KCkgJiYgbWVzc2FnZUZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlU2V0LCBcIm1lc3NhZ2VcIiwgb3IgXCJtZXNzYWdlRmlsZVwiIGlzIHJlcXVpcmVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG9mIFwibWVzc2FnZVwiIG9yIFwibWVzc2FnZUZpbGVcIiBtYXkgYmUgc3BlY2lmaWVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGlzIGJ1aWxkIHRhc2suIHRocm93cyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbgotICAgICAqIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0YXNrIGV4ZWN1dGlvbi4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gRGVzY3JpcHRpb24gb2YgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgZG9NYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsb2codGV4dCwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gaGVscGVyIG1ldGhvZCB0byBhZGQgcmVjaXBpZW50cwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVjaXBpZW50cyggTWltZU1lc3NhZ2UgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5SZWNpcGllbnRUeXBlIHJlY2lwVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyVXNlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkckxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChudWxsID09IGFkZHJMaXN0KSB8fCAoYWRkckxpc3QudHJpbSgpLmxlbmd0aCgpIDw9IDApKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnRlcm5ldEFkZHJlc3NbXSBhZGRyQXJyYXkgPSBJbnRlcm5ldEFkZHJlc3MucGFyc2UoYWRkckxpc3QpOwotCi0gICAgICAgICAgICBpZiAoKG51bGwgPT0gYWRkckFycmF5KSB8fCAoMCA9PSBhZGRyQXJyYXkubGVuZ3RoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVtcHR5ICIgKyBhZGRyVXNlck5hbWUgKyAiIHJlY2lwaWVudHMgbGlzdCB3YXMgc3BlY2lmaWVkIik7Ci0KLSAgICAgICAgICAgIG1zZy5zZXRSZWNpcGllbnRzKHJlY2lwVHlwZSwgYWRkckFycmF5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChBZGRyZXNzRXhjZXB0aW9uIGFlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgIiArIGFkZHJVc2VyTmFtZSArICIgcmVjaXBpZW50IGxpc3QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGhlcmUgaXMgd2hlcmUgdGhlIG1haWwgaXMgc2VudAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBNZXNzYWdpbmdFeGNlcHRpb24gRGVzY3JpcHRpb24gb2YgRXhjZXB0aW9uCi0gICAgICogQGV4Y2VwdGlvbiBBZGRyZXNzRXhjZXB0aW9uIERlc2NyaXB0aW9uIG9mIEV4Y2VwdGlvbgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gRGVzY3JpcHRpb24gb2YgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9NYWlsKCkKLSAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiwgQWRkcmVzc0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMucHV0KCJtYWlsLnNtdHAuaG9zdCIsIG1haWxob3N0KTsKLQotICAgICAgICAvL0FzaWRlLCB0aGUgSkRLIGlzIGNsZWFybHkgdW5hd2FyZSBvZiB0aGUgc2NvdHRpc2ggJ3Nlc3Npb24nLCB3aGljaAotICAgICAgICAvL2ludm9sdmVzIGV4Y2Vzc2l2ZSBxdWFudGl0aWVzIG9mIGFsY29ob2wgOi0pCi0gICAgICAgIFNlc3Npb24gc2VzaCA9IFNlc3Npb24uZ2V0RGVmYXVsdEluc3RhbmNlKHByb3BzLCBudWxsKTsKLQotICAgICAgICAvL2NyZWF0ZSB0aGUgbWVzc2FnZQotICAgICAgICBNaW1lTWVzc2FnZSBtc2cgPSBuZXcgTWltZU1lc3NhZ2Uoc2VzaCk7Ci0KLSAgICAgICAgLy9zZXQgdGhlIHNlbmRlcgotICAgICAgICBsb2coIm1lc3NhZ2Ugc2VuZGVyOiAiICsgZnJvbSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIG1zZy5zZXRGcm9tKG5ldyBJbnRlcm5ldEFkZHJlc3MoZnJvbSkpOwotCi0gICAgICAgIC8vIGFkZCByZWNpcGllbnQgbGlzdHMKLSAgICAgICAgYWRkUmVjaXBpZW50cyhtc2csIE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5UTywgICJUbyIsICB0b0xpc3QpOwotICAgICAgICBhZGRSZWNpcGllbnRzKG1zZywgTWVzc2FnZS5SZWNpcGllbnRUeXBlLkNDLCAgIkNjIiwgIGNjTGlzdCk7Ci0gICAgICAgIGFkZFJlY2lwaWVudHMobXNnLCBNZXNzYWdlLlJlY2lwaWVudFR5cGUuQkNDLCAiQmNjIiwgYmNjTGlzdCk7Ci0KLSAgICAgICAgaWYgKHN1YmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCJzdWJqZWN0OiAiICsgc3ViamVjdCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBtc2cuc2V0U3ViamVjdChzdWJqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vbm93IHRoZSBjb21wbGV4IGJpdDsgYWRkaW5nIG11bHRpcGxlIG1pbWUgb2JqZWN0cy4gQW5kIGd1ZXNzaW5nCi0gICAgICAgIC8vdGhlIGZpbGUgdHlwZQotICAgICAgICBNaW1lTXVsdGlwYXJ0IGF0dGFjaG1lbnRzID0gbmV3IE1pbWVNdWx0aXBhcnQoKTsKLQotICAgICAgICAvL2ZpcnN0IGEgbWVzc2FnZQotICAgICAgICBpZiAobWVzc2FnZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KW1lc3NhZ2VGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgYnl0ZSBkYXRhW10gPSBuZXcgYnl0ZVtzaXplXTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1lc3NhZ2VGaWxlKTsKLSAgICAgICAgICAgICAgICBpblN0cmVhbS5yZWFkKGRhdGEpOwotICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTdHJpbmcoZGF0YSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgTWltZUJvZHlQYXJ0IHRleHRib2R5ID0gbmV3IE1pbWVCb2R5UGFydCgpOwotICAgICAgICAgICAgdGV4dGJvZHkuc2V0Q29udGVudChtZXNzYWdlLCBtZXNzYWdlTWltZVR5cGUpOwotICAgICAgICAgICAgYXR0YWNobWVudHMuYWRkQm9keVBhcnQodGV4dGJvZHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc2V0cy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBkc2ZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgICAgIEZpbGUgYmFzZURpciA9IGRzLmdldEJhc2VkaXIoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZHNmaWxlcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2VEaXIsIGRzZmlsZXNbal0pOwotICAgICAgICAgICAgICAgICAgICBNaW1lQm9keVBhcnQgYm9keTsKLSAgICAgICAgICAgICAgICAgICAgYm9keSA9IG5ldyBNaW1lQm9keVBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhblJlYWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlIFwiIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCByZWFkYWJsZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2coIkF0dGFjaGluZyAiICsgZmlsZS50b1N0cmluZygpKyIgLSAiICtmaWxlLmxlbmd0aCgpKyIgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhU291cmNlIGZpbGVEYXRhID0gbmV3IEZpbGVEYXRhU291cmNlKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICBEYXRhSGFuZGxlciBmaWxlRGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoZmlsZURhdGEpOwotICAgICAgICAgICAgICAgICAgICBib2R5LnNldERhdGFIYW5kbGVyKGZpbGVEYXRhSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHkuc2V0RmlsZU5hbWUoZmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5hZGRCb2R5UGFydChib2R5KTsKLSAgICAgICAgICAgICAgICB9IC8vIGZvciBqCi0gICAgICAgICAgICB9IC8vIGlmIChmcyAhPSBudWxsKQotICAgICAgICB9IC8vIGZvciBpCi0KLSAgICAgICAgbXNnLnNldENvbnRlbnQoYXR0YWNobWVudHMpOwotICAgICAgICBsb2coInNlbmRpbmcgZW1haWwgIik7Ci0gICAgICAgIFRyYW5zcG9ydC5zZW5kKG1zZyk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvVGVsbmV0VGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L1RlbG5ldFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4OGQwZS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvVGVsbmV0VGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOwotaW1wb3J0IGNvbS5vcm9pbmMubmV0LnRlbG5ldC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBDbGFzcyB0byBwcm92aWRlIGF1dG9tYXRlZCB0ZWxuZXQgcHJvdG9jb2wgc3VwcG9ydCBmb3IgdGhlIEFudCBidWlsZCB0b29sCi0gKgotICogQGF1dGhvciBTY290dCBDYXJsc29uPGEgaHJlZj0ibWFpbHRvOlNjb3R0Q2FybHNvbkBlbWFpbC5jb20iPlNjb3R0Q2FybHNvbkBlbWFpbC5jb208L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLQotcHVibGljIGNsYXNzIFRlbG5ldFRhc2sgZXh0ZW5kcyBUYXNrIHsKLSAgICAvKioKLSAgICAgKiAgVGhlIHVzZXJpZCB0byBsb2dpbiB3aXRoLCBpZiBhdXRvbWF0ZWQgbG9naW4gaXMgdXNlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJpZCAgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBwYXNzd29yZCB0byBsb2dpbiB3aXRoLCBpZiBhdXRvbWF0ZWQgbG9naW4gaXMgdXNlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBzZXJ2ZXIgdG8gY29ubmVjdCB0by4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyICA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHRjcCBwb3J0IHRvIGNvbm5lY3QgdG8uIAotICAgICAqLwotICAgIHByaXZhdGUgaW50IHBvcnQgPSAyMzsKLQotICAgIC8qKgotICAgICAqICBUaGUgT2JqZWN0IHdoaWNoIGhhbmRsZXMgdGhlIHRlbG5ldCBzZXNzaW9uLgotICAgICAqLwotICAgIHByaXZhdGUgQW50VGVsbmV0Q2xpZW50IHRlbG5ldCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGxpc3Qgb2YgcmVhZC93cml0ZSBjb21tYW5kcyBmb3IgdGhpcyBzZXNzaW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgdGVsbmV0VGFza3MgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvKiogCi0gICAgICogIElmIHRydWUsIGFkZHMgYSBDUiB0byBiZWdpbm5pbmcgb2YgbG9naW4gc2NyaXB0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGFkZENhcnJpYWdlUmV0dXJuID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiAgRGVmYXVsdCB0aW1lIGFsbG93ZWQgZm9yIHdhaXRpbmcgZm9yIGEgdmFsaWQgcmVzcG9uc2UKLSAgICAgKiAgZm9yIGFsbCBjaGlsZCByZWFkcy4gIEEgdmFsdWUgb2YgMCBtZWFucyBubyBsaW1pdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEludGVnZXIgZGVmYXVsdFRpbWVvdXQgPSBudWxsOwotCi0gICAgLyoqIAotICAgICAqICBWZXJpZnkgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuIAotICAgICAqICBDb25uZWN0IGFuZCBwb3NzaWJseSBsb2dpbgotICAgICAqICBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgUmVhZHMgYW5kIHdyaXRlcyAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIAotICAgIHsKLSAgICAgICAvKiogIEEgc2VydmVyIG5hbWUgaXMgcmVxdWlyZWQgdG8gY29udGludWUgKi8KLSAgICAgICBpZiAoc2VydmVyPT0gbnVsbCkKLSAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBTZXJ2ZXIgU3BlY2lmaWVkIik7Ci0gICAgICAgLyoqICBBIHVzZXJpZCBhbmQgcGFzc3dvcmQgbXVzdCBhcHBlYXIgdG9nZXRoZXIgCi0gICAgICAgICogICBpZiB0aGV5IGFwcGVhci4gIFRoZXkgYXJlIG5vdCByZXF1aXJlZC4KLSAgICAgICAgKi8KLSAgICAgICBpZiAodXNlcmlkID09IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBVc2VyaWQgU3BlY2lmaWVkIik7Ci0gICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwgJiYgdXNlcmlkICE9IG51bGwpCi0gICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gUGFzc3dvcmQgU3BlY2lmaWVkIik7Ci0KLSAgICAgICAvKiogIENyZWF0ZSB0aGUgdGVsbmV0IGNsaWVudCBvYmplY3QgKi8KLSAgICAgICB0ZWxuZXQgPSBuZXcgQW50VGVsbmV0Q2xpZW50KCk7Ci0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgdGVsbmV0LmNvbm5lY3Qoc2VydmVyLCBwb3J0KTsKLSAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4ndCBjb25uZWN0IHRvICIrc2VydmVyKTsKLSAgICAgICB9Ci0gICAgICAgLyoqICBMb2dpbiBpZiB1c2VyaWQgYW5kIHBhc3N3b3JkIHdlcmUgc3BlY2lmaWVkICovCi0gICAgICAgaWYgKHVzZXJpZCAhPSBudWxsICYmIHBhc3N3b3JkICE9IG51bGwpCi0gICAgICAgICAgbG9naW4oKTsKLSAgICAgICAvKiogIFByb2Nlc3MgZWFjaCBzdWIgY29tbWFuZCAqLwotICAgICAgIEVudW1lcmF0aW9uIHRhc2tzVG9SdW4gPSB0ZWxuZXRUYXNrcy5lbGVtZW50cygpOwotICAgICAgIHdoaWxlICh0YXNrc1RvUnVuIT1udWxsICYmIHRhc2tzVG9SdW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgewotICAgICAgICAgICBUZWxuZXRTdWJUYXNrIHRhc2sgPSAoVGVsbmV0U3ViVGFzaykgdGFza3NUb1J1bi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICBpZiAodGFzayBpbnN0YW5jZW9mIFRlbG5ldFJlYWQgJiYgZGVmYXVsdFRpbWVvdXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICgoVGVsbmV0UmVhZCl0YXNrKS5zZXREZWZhdWx0VGltZW91dChkZWZhdWx0VGltZW91dCk7Ci0gICAgICAgICAgIHRhc2suZXhlY3V0ZSh0ZWxuZXQpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogIAotICAgICAqICBQcm9jZXNzIGEgJ3R5cGljYWwnIGxvZ2luLiAgSWYgaXQgZGlmZmVycywgdXNlIHRoZSByZWFkIAotICAgICAqICBhbmQgd3JpdGUgdGFza3MgZXhwbGljaXRlbHkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9naW4oKQotICAgIHsKLSAgICAgICBpZiAoYWRkQ2FycmlhZ2VSZXR1cm4pCi0gICAgICAgICAgdGVsbmV0LnNlbmRTdHJpbmcoIlxuIiwgdHJ1ZSk7Ci0gICAgICAgdGVsbmV0LndhaXRGb3JTdHJpbmcoIm9naW46Iik7Ci0gICAgICAgdGVsbmV0LnNlbmRTdHJpbmcodXNlcmlkLCB0cnVlKTsKLSAgICAgICB0ZWxuZXQud2FpdEZvclN0cmluZygiYXNzd29yZDoiKTsKLSAgICAgICB0ZWxuZXQuc2VuZFN0cmluZyhwYXNzd29yZCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIHVzZXJpZCBhdHRyaWJ1dGUgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcmlkKFN0cmluZyB1KSB7IHRoaXMudXNlcmlkID0gdTsgfQotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgcGFzc3dvcmQgYXR0cmlidXRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwKSB7IHRoaXMucGFzc3dvcmQgPSBwOyB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHRoZSBzZXJ2ZXIgYWRkcmVzcyBhdHRyaWJ1dGUgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyKFN0cmluZyBtKSB7IHRoaXMuc2VydmVyID0gbTsgfQotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgdGNwIHBvcnQgdG8gY29ubmVjdCB0byBhdHRyaWJ1dGUgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcCkgeyB0aGlzLnBvcnQgPSBwOyB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHRoZSB0Y3AgcG9ydCB0byBjb25uZWN0IHRvIGF0dHJpYnV0ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ1IoYm9vbGVhbiBiKQotICAgIHsKLSAgICAgICB0aGlzLmFkZENhcnJpYWdlUmV0dXJuID0gYjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hhbmdlIHRoZSBkZWZhdWx0IHRpbWVvdXQgdG8gd2FpdCBmb3IgCi0gICAgICogIHZhbGlkIHJlc3BvbnNlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoSW50ZWdlciBpKQotICAgIHsKLSAgICAgICB0aGlzLmRlZmF1bHRUaW1lb3V0ID0gaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQSBzdWJUYXNrIDxyZWFkPiB0YWcgd2FzIGZvdW5kLiAgQ3JlYXRlIHRoZSBvYmplY3QsIAotICAgICAqICBTYXZlIGl0IGluIG91ciBsaXN0LCBhbmQgcmV0dXJuIGl0LgotICAgICAqLwotICAgCi0gICAgcHVibGljIFRlbG5ldFN1YlRhc2sgY3JlYXRlUmVhZCgpCi0gICAgewotICAgICAgICBUZWxuZXRTdWJUYXNrIHRhc2sgPSAoVGVsbmV0U3ViVGFzayluZXcgVGVsbmV0UmVhZCgpOwotICAgICAgICB0ZWxuZXRUYXNrcy5hZGRFbGVtZW50KHRhc2spOwotICAgICAgICByZXR1cm4gdGFzazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQSBzdWJUYXNrIDx3cml0ZT4gdGFnIHdhcyBmb3VuZC4gIENyZWF0ZSB0aGUgb2JqZWN0LCAKLSAgICAgKiAgU2F2ZSBpdCBpbiBvdXIgbGlzdCwgYW5kIHJldHVybiBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVsbmV0U3ViVGFzayBjcmVhdGVXcml0ZSgpCi0gICAgewotICAgICAgICBUZWxuZXRTdWJUYXNrIHRhc2sgPSAoVGVsbmV0U3ViVGFzayluZXcgVGVsbmV0V3JpdGUoKTsKLSAgICAgICAgdGVsbmV0VGFza3MuYWRkRWxlbWVudCh0YXNrKTsKLSAgICAgICAgcmV0dXJuIHRhc2s7Ci0gICAgfQotCi0gICAgLyoqICAKLSAgICAgKiAgVGhpcyBjbGFzcyBpcyB0aGUgcGFyZW50IG9mIHRoZSBSZWFkIGFuZCBXcml0ZSB0YXNrcy4KLSAgICAgKiAgSXQgaGFuZGxlcyB0aGUgY29tbW9uIGF0dHJpYnV0ZXMgZm9yIGJvdGguCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFRlbG5ldFN1YlRhc2sKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgdGFza1N0cmluZz0gIiI7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQW50VGVsbmV0Q2xpZW50IHRlbG5ldCkgCi0gICAgICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU2hvdWxkbid0IGJlIGFibGUgaW5zdGFudGlhdGUgYSBTdWJUYXNrIGRpcmVjdGx5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgcykgeyBzZXRTdHJpbmcocyk7fQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgdGFza1N0cmluZyArPSBzOyAKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiAgVGhpcyBjbGFzcyBzZW5kcyB0ZXh0IHRvIHRoZSBjb25uZWN0ZWQgc2VydmVyIAotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBUZWxuZXRXcml0ZSBleHRlbmRzIFRlbG5ldFN1YlRhc2sKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBlY2hvU3RyaW5nID0gdHJ1ZTsKLSAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShBbnRUZWxuZXRDbGllbnQgdGVsbmV0KSAKLSAgICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgIHRlbG5ldC5zZW5kU3RyaW5nKHRhc2tTdHJpbmcsIGVjaG9TdHJpbmcpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFY2hvKGJvb2xlYW4gYikKLSAgICAgICAgewotICAgICAgICAgICBlY2hvU3RyaW5nID0gYjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiAgVGhpcyBjbGFzcyByZWFkcyB0aGUgb3V0cHV0IGZyb20gdGhlIGNvbm5lY3RlZCBzZXJ2ZXIKLSAgICAgKiAgdW50aWwgdGhlIHJlcXVpcmVkIHN0cmluZyBpcyBmb3VuZC4gCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFRlbG5ldFJlYWQgZXh0ZW5kcyBUZWxuZXRTdWJUYXNrCi0gICAgewotICAgICAgICBwcml2YXRlIEludGVnZXIgdGltZW91dCA9IG51bGw7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQW50VGVsbmV0Q2xpZW50IHRlbG5ldCkgCi0gICAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdGVsbmV0LndhaXRGb3JTdHJpbmcodGFza1N0cmluZywgdGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBPdmVycmlkZSBhbnkgZGVmYXVsdCB0aW1lb3V0cwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gaTsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIFNldHMgdGhlIGRlZmF1bHQgdGltZW91dCBpZiBub25lIGhhcyBiZWVuIHNldCBhbHJlYWR5Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VGltZW91dChJbnRlZ2VyIGRlZmF1bHRUaW1lb3V0KQotICAgICAgICB7Ci0gICAgICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwpCi0gICAgICAgICAgICAgIHRpbWVvdXQgPSBkZWZhdWx0VGltZW91dDsKLSAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqICBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIGFic3RyYWN0aW9uIG9mIHRoZSB0ZWxuZXQgcHJvdG9jb2wuCi0gICAgICogIEN1cnJlbnRseSBpdCBpcyBhIHdyYXBwZXIgYXJvdW5kIDxhIGhyZWY9Ind3dy5vcm9pbmMuY29tIj5PUk88L2E+J3MgCi0gICAgICogIE5ldENvbXBvbmVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgQW50VGVsbmV0Q2xpZW50IGV4dGVuZHMgVGVsbmV0Q2xpZW50Ci0gICAgewotICAgICAgLyoqCi0gICAgICAgKiBSZWFkIGZyb20gdGhlIHRlbG5ldCBzZXNzaW9uIHVudGlsIHRoZSBzdHJpbmcgd2UgYXJlIAotICAgICAgICogd2FpdGluZyBmb3IgaXMgZm91bmQgCi0gICAgICAgKiBAcGFybSBzIFRoZSBzdHJpbmcgdG8gd2FpdCBvbiAKLSAgICAgICAqLwotICAgICAgcHVibGljIHZvaWQgd2FpdEZvclN0cmluZyhTdHJpbmcgcykKLSAgICAgIHsKLSAgICAgICAgICAgd2FpdEZvclN0cmluZyhzLCBudWxsKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZWFkIGZyb20gdGhlIHRlbG5ldCBzZXNzaW9uIHVudGlsIHRoZSBzdHJpbmcgd2UgYXJlIAotICAgICAgICogd2FpdGluZyBmb3IgaXMgZm91bmQgb3IgdGhlIHRpbWVvdXQgaGFzIGJlZW4gcmVhY2hlZAotICAgICAgICogQHBhcm0gcyBUaGUgc3RyaW5nIHRvIHdhaXQgb24gCi0gICAgICAgKiBAcGFybSB0aW1lb3V0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQKLSAgICAgICAqLwotICAgICAgcHVibGljIHZvaWQgd2FpdEZvclN0cmluZyhTdHJpbmcgcywgSW50ZWdlciB0aW1lb3V0KQotICAgICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9dGhpcy5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBpZiAodGltZW91dCA9PSBudWxsIHx8IHRpbWVvdXQuaW50VmFsdWUoKSA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgd2hpbGUgKHNiLnRvU3RyaW5nKCkuaW5kZXhPZihzKSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGlzLnJlYWQoKSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIENhbGVuZGFyIGVuZFRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOyAKLSAgICAgICAgICAgICAgZW5kVGltZS5hZGQoQ2FsZW5kYXIuU0VDT05ELHRpbWVvdXQuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgIHdoaWxlICggc2IudG9TdHJpbmcoKS5pbmRleE9mKHMpID09IC0xKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB3aGlsZSAoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5iZWZvcmUoZW5kVGltZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcy5hdmFpbGFibGUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDI1MCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoaXMuYXZhaWxhYmxlKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlc3BvbnNlIFRpbWVkLU91dCIsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBpcy5yZWFkKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGxvZyhzYi50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpCi0gICAgICAgIHsgCi0gICAgICAgICAgICB0aHJvdyBiZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIAotICAgICAgLyoqCi0gICAgICAgKiBXcml0ZSB0aGlzIHN0cmluZyB0byB0aGUgdGVsbmV0IHNlc3Npb24uCi0gICAgICAgKiBAcGFybSBlY2hvU3RyaW5nICBMb2dzIHN0cmluZyBzZW50Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyB2b2lkIHNlbmRTdHJpbmcoU3RyaW5nIHMsIGJvb2xlYW4gZWNob1N0cmluZykKLSAgICAgIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID10aGlzLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgIG9zLndyaXRlKChzICsgIlxuIikuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgaWYgKGVjaG9TdHJpbmcpCi0gICAgICAgICAgICAgIGxvZyhzLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICBvcy5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgeyAKLSAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEJhc2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDUwY2YyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnBlcmwuKjsKLQotCi0vKiogQmFzZSBjbGFzcyBmb3IgUGVyZm9yY2UgKFA0KSBBTlQgdGFza3MuIFNlZSBpbmRpdmlkdWFsIHRhc2sgZm9yIGV4YW1wbGUgdXNhZ2UuCi0gKgotICogQHNlZSBQNFN5bmMKLSAqIEBzZWUgUDRIYXZlCi0gKiBAc2VlIFA0Q2hhbmdlCi0gKiBAc2VlIFA0RWRpdAotICogQHNlZSBQNFN1Ym1pdAotICogQHNlZSBQNExhYmVsCi0gKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWMKLSAqIEBhdXRob3IgPEEgSFJFRj0ibWFpbHRvOmxlc2xpZS5odWdoZXNAcnVidXMuY29tIj5MZXMgSHVnaGVzPC9BPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUDRCYXNlIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayB7Ci0KLSAgICAvKipQZXJsNSByZWdleHAgaW4gSmF2YSAtIGNvb2wgZWg/ICovCi0gICAgcHJvdGVjdGVkIFBlcmw1VXRpbCB1dGlsID0gbnVsbDsKLSAgICAvKiogVGhlIE9TIHNoZWxsIHRvIHVzZSAoY21kLmV4ZSBvciAvYmluL3NoKSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2hlbGw7Ci0KLSAgICAvL1A0IHJ1bnRpbWUgZGlyZWN0aXZlcwotICAgIC8qKiBQZXJmb3JjZSBTZXJ2ZXIgUG9ydCAoZWcgS00wMToxNjY2KSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgUDRQb3J0ICAgICA9ICIiOwotICAgIC8qKiBQZXJmb3JjZSBDbGllbnQgKGVnIG15Y2xpZW50c3BlYykgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIFA0Q2xpZW50ICAgPSAiIjsKLSAgICAvKiogUGVyZm9yY2UgVXNlciAoZWcgZmJsb2dncykgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIFA0VXNlciAgICAgPSAiIjsKLSAgICAvKiogUGVyZm9yY2UgdmlldyBmb3IgY29tbWFuZHMgKGVnIC8vcHJvamVjdHMvZm9vYmFyL21haW4vc291cmNlLy4uLiApKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIFA0VmlldyAgICAgPSAiIjsKLQotICAgIC8vUDQgZy1vcHRzIGFuZCBjbWQgb3B0cyAocnRmbSkKLSAgICAvKiogUGVyZm9yY2UgJ2dsb2JhbCcgb3B0cy4KLSAgICAgICogRm9ybXMgaGFsZiBvZiBsb3cgbGV2ZWwgQVBJICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBQNE9wdHMgICAgID0gIiI7Ci0gICAgLyoqIFBlcmZvcmNlIGNvbW1hbmQgb3B0cy4KLSAgICAgICogRm9ybXMgaGFsZiBvZiBsb3cgbGV2ZWwgQVBJICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBQNENtZE9wdHMgID0gIiI7Ci0KLSAgICAvL1NldHRlcnMgY2FsbGVkIGJ5IEFudAotICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoU3RyaW5nIFA0UG9ydCkgICAgICAgIHsgdGhpcy5QNFBvcnQgICAgICAgPSAgICItcCIrUDRQb3J0OyAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50KFN0cmluZyBQNENsaWVudCkgICAgeyB0aGlzLlA0Q2xpZW50ICAgICA9ICAgIi1jIitQNENsaWVudDsgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyBQNFVzZXIpICAgICAgICB7IHRoaXMuUDRVc2VyICAgICAgID0gICAiLXUiK1A0VXNlcjsgICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFZpZXcoU3RyaW5nIFA0VmlldykgICAgICAgIHsgdGhpcy5QNFZpZXcgICAgICAgPSAgIFA0VmlldzsgICAgICAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0Q21kb3B0cyhTdHJpbmcgUDRDbWRPcHRzKSAgeyB0aGlzLlA0Q21kT3B0cyAgICA9ICAgUDRDbWRPcHRzOyAgICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0KLSAgICAgICAgdXRpbCA9IG5ldyBQZXJsNVV0aWwoKTsKLQotICAgICAgICAvL0dldCBkZWZhdWx0IFA0IHNldHRpbmdzIGZyb20gZW52aXJvbm1lbnQgLSBNYXJrIHdvdWxkIGhhdmUgZG9uZSBzb21ldGhpbmcgY29vbCB3aXRoCi0gICAgICAgICAgICAvL2ludHJvc3BlY3Rpb24gaGVyZS4uLi4uOi0pCi0gICAgICAgICAgICBTdHJpbmcgdG1wcHJvcDsKLSAgICAgICAgaWYoKHRtcHByb3AgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJwNC5wb3J0IikpICE9IG51bGwpIHNldFBvcnQodG1wcHJvcCk7Ci0gICAgICAgIGlmKCh0bXBwcm9wID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgicDQuY2xpZW50IikpICE9IG51bGwpIHNldENsaWVudCh0bXBwcm9wKTsKLSAgICAgICAgaWYoKHRtcHByb3AgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJwNC51c2VyIikpICE9IG51bGwpIHNldFVzZXIodG1wcHJvcCk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjUDRDb21tYW5kKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBleGVjUDRDb21tYW5kKGNvbW1hbmQsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKiogRXhlY3V0ZSBQNCBjb21tYW5kIGFzc2VtYmxlZCBieSBzdWJjbGFzc2VzLgotICAgICAgICBAcGFyYW0gY29tbWFuZCBUaGUgY29tbWFuZCB0byBydW4KLSAgICAgICAgQHBhcmFtIHA0aW5wdXQgSW5wdXQgdG8gYmUgZmVkIHRvIGNvbW1hbmQgb24gc3RkaW4KLSAgICAgICAgQHBhcmFtIGhhbmRsZXIgQSBQNEhhbmRsZXIgdG8gcHJvY2VzcyBhbnkgaW5wdXQgYW5kIG91dHB1dAotICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY1A0Q29tbWFuZChTdHJpbmcgY29tbWFuZCwgUDRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeXsKLQotICAgICAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZGxpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgICAgIGNvbW1hbmRsaW5lLnNldEV4ZWN1dGFibGUoInA0Iik7Ci0KLSAgICAgICAgICAgIC8vQ2hlY2sgQVBJIGZvciB0aGVzZSAtIGl0J3MgaG93IENWUyBkb2VzIGl0Li4uCi0gICAgICAgICAgICBpZiAoUDRQb3J0ICE9IG51bGwgJiYgUDRQb3J0Lmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFA0UG9ydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUDRVc2VyICE9IG51bGwgJiYgUDRVc2VyLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFA0VXNlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUDRDbGllbnQgIT0gbnVsbCAmJiBQNENsaWVudC5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShQNENsaWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUoY29tbWFuZCk7Ci0KLQotICAgICAgICAgICAgU3RyaW5nW10gY21kbGluZSA9IGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkgOwotICAgICAgICAgICAgU3RyaW5nIGNtZGwgPSAiIjsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MCA7IGkgPCBjbWRsaW5lLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgICAgIGNtZGwgKz0gY21kbGluZVtpXSArICIgIjsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGxvZygiRXhlY2luZyAiK2NtZGwsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCi0gICAgICAgICAgICBpZihoYW5kbGVyID09IG51bGwgKSBoYW5kbGVyID0gbmV3IFNpbXBsZVA0T3V0cHV0SGFuZGxlcih0aGlzKTsKLQotICAgICAgICAgICAgRXhlY3V0ZSBleGUgPSBuZXcgRXhlY3V0ZShoYW5kbGVyLCBudWxsKTsKLQotICAgICAgICAgICAgZXhlLnNldEFudFJ1bihwcm9qZWN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOwotCi0gICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgZXhlLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIH1jYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc3RvcCgpOwotICAgICAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2JsZW0gZXhlYydpbmcgUDQgY29tbWFuZDogIitlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRDaGFuZ2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0Q2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzY0ODIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi0vKiogUDRDaGFuZ2UgLSBncmFiIGEgbmV3IGNoYW5nZWxpc3QgZnJvbSBQZXJmb3JjZS4KLSAqCi0gKiBQNENoYW5nZSBjcmVhdGVzIGEgbmV3IGNoYW5nZWxpc3QgaW4gcGVyZm9yY2UuIFA0Q2hhbmdlIHNldHMgdGhlIHByb3BlcnR5Ci0gKiAke3A0LmNoYW5nZX0gd2l0aCB0aGUgbmV3IGNoYW5nZWxpc3QgbnVtYmVyLiBUaGlzIHNob3VsZCB0aGVuIGJlIHBhc3NlZCBpbnRvCi0gKiBwNGVkaXQgYW5kIHA0c3VibWl0LgotICoKLSAqIEBzZWUgUDRFZGl0Ci0gKiBAc2VlIFA0U3VibWl0Ci0gKiBAYXV0aG9yIDxBIEhSRUY9Im1haWx0bzpsZXNsaWUuaHVnaGVzQHJ1YnVzLmNvbSI+TGVzIEh1Z2hlczwvQT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQNENoYW5nZSBleHRlbmRzIFA0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVtcHR5Q2hhbmdlTGlzdCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9ICJBdXRvU3VibWl0IEJ5IEFudCI7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBpZihlbXB0eUNoYW5nZUxpc3QgPT0gbnVsbCkgZW1wdHlDaGFuZ2VMaXN0ID0gZ2V0RW1wdHlDaGFuZ2VMaXN0KCk7Ci0gICAgICAgIGZpbmFsIFByb2plY3QgbXlQcm9qID0gcHJvamVjdDsKLQotICAgICAgICBQNEhhbmRsZXIgaGFuZGxlciA9IG5ldyBQNEhhbmRsZXJBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwubWF0Y2goIi9DaGFuZ2UvIiwgbGluZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSBhbnkgbm9uLW51bWVyaWNhbCBjaGFycyAtIHNob3VsZCBsZWF2ZSB0aGUgY2hhbmdlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHV0aWwuc3Vic3RpdHV0ZSgicy9bXjAtOV0vL2ciLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlbnVtYmVyID0gSW50ZWdlci5wYXJzZUludChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ2hhbmdlIE51bWJlciBpcyAiK2NoYW5nZW51bWJlciwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBteVByb2ouc2V0UHJvcGVydHkoInA0LmNoYW5nZSIsICIiK2NoYW5nZW51bWJlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHV0aWwubWF0Y2goIi9lcnJvci8iLCBsaW5lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQZXJmb3JjZSBFcnJvciwgY2hlY2sgY2xpZW50IHNldHRpbmdzIGFuZC9vciBzZXJ2ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9fTsKLQotICAgICAgICBoYW5kbGVyLnNldE91dHB1dChlbXB0eUNoYW5nZUxpc3QpOwotCi0gICAgICAgIGV4ZWNQNENvbW1hbmQoImNoYW5nZSAtaSIsIGhhbmRsZXIpOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbXB0eUNoYW5nZUxpc3QoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAKLSAgICAgICAgZXhlY1A0Q29tbWFuZCgiY2hhbmdlIC1vIiwgbmV3IFA0SGFuZGxlckFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhTdHJpbmcgbGluZSkgewotICAgICAgICAgICAgICAgICAgICBpZighdXRpbC5tYXRjaCgiL14jLyIsbGluZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgaWYodXRpbC5tYXRjaCgiL2Vycm9yLyIsIGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ2xpZW50IEVycm9yIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQZXJmb3JjZSBFcnJvciwgY2hlY2sgY2xpZW50IHNldHRpbmdzIGFuZC9vciBzZXJ2ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHV0aWwubWF0Y2goIi88ZW50ZXIgZGVzY3JpcHRpb24gaGVyZT4vIixsaW5lKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHV0aWwuc3Vic3RpdHV0ZSgicy88ZW50ZXIgZGVzY3JpcHRpb24gaGVyZT4vIiArIGRlc2NyaXB0aW9uICsgIi8iLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZih1dGlsLm1hdGNoKCIvXFwvXFwvLyIsIGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXRjaCAiLy8iIGZvciBiZWdpbmluZyBvZiBkZXBvdCBmaWxlc3BlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nYnVmLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2J1Zi5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfX0pOwotICAgICAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gc3RyaW5nYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyogU2V0IERlc2NyaXB0aW9uIFZhcmlhYmxlLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKXsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2M7Ci0gICAgfQotCi19IC8vRW9GCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNENvdW50ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTZjMjk2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0Q291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKiBQNENvdW50ZXIgLSBPYnRhaW4gb3Igc2V0IHRoZSB2YWx1ZSBvZiBhIGNvdW50ZXIuCi0gKiBQNENvdW50ZXIgY2FuIGJlIHVzZWQgdG8gZWl0aGVyIHByaW50IHRoZSB2YWx1ZSBvZiBhIGNvdW50ZXIKLSAqIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGZvciB0aGUgcHJvamVjdCAoYnkgc2V0dGluZyB0aGUgIm5hbWUiCi0gKiBhdHRyaWJ1dGUgb25seSksIHRvIHNldCBhIHByb3BlcnR5IGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotICogYSBjb3VudGVyIChieSBzZXR0aW5nIHRoZSAicHJvcGVydHkiIGF0dHJpYnV0ZSkgb3IgdG8gc2V0IHRoZSBjb3VudGVyCi0gKiBvbiB0aGUgcGVyZm9yY2Ugc2VydmVyIChieSBzZXR0aW5nIHRoZSAidmFsdWUiIGF0dHJpYnV0ZSkuIAotICoKLSAqIEV4YW1wbGUgVXNhZ2U6PGJyPgotICogJmx0O3A0Y291bnRlciBuYW1lPSIke3A0LmNvdW50ZXJ9IiBwcm9wZXJ0eT0ke3A0LmNoYW5nZX0iLyZndDsKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtpcmtAcmFkaWsuY29tIj5LaXJrIFd5bGllPC9hPgotICovCi0gCi1wdWJsaWMgY2xhc3MgUDRDb3VudGVyIGV4dGVuZHMgUDRCYXNlIHsKLSAgICBwdWJsaWMgU3RyaW5nIGNvdW50ZXIgPSBudWxsOwotICAgIHB1YmxpYyBTdHJpbmcgcHJvcGVydHkgPSBudWxsOwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFNldFZhbHVlID0gZmFsc2U7Ci0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU2V0UHJvcGVydHkgPSBmYWxzZTsKLSAgICBwdWJsaWMgaW50IHZhbHVlID0gMDsKLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGNvdW50ZXIpIHsKLSAgICAgICAgdGhpcy5jb3VudGVyID0gY291bnRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICBzaG91bGRTZXRWYWx1ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICAgICAgc2hvdWxkU2V0UHJvcGVydHkgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIGlmKChjb3VudGVyID09IG51bGwpIHx8IGNvdW50ZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBjb3VudGVyIHNwZWNpZmllZCB0byByZXRyaWV2ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoc2hvdWxkU2V0VmFsdWUgJiYgc2hvdWxkU2V0UHJvcGVydHkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGJvdGggc2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYW5kIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICJjb3VudGVyICIgKyBQNENtZE9wdHMgKyAiICIgKyBjb3VudGVyOwotICAgICAgICBpZighc2hvdWxkU2V0UHJvcGVydHkpIHsKLSAgICAgICAgICAgIC8vIE5PVEUga2lya0ByYWRpay5jb20gMDQtQXByaWwtMjAwMSAtLSBJZiB5b3UgcHV0IGluIHRoZSAtcywgeW91Ci0gICAgICAgICAgICAvLyBoYXZlIHRvIHN0YXJ0IHJ1bm5pbmcgdGhyb3VnaCByZWd1bGFyIGV4cHJlc3Npb25zIGhlcmUuIE11Y2ggZWFzaWVyCi0gICAgICAgICAgICAvLyB0byBqdXN0IG5vdCBpbmNsdWRlIHRoZSBzY3JpcHRpbmcgaW5mb3JtYXRpb24gdGhhbiB0byB0cnkgdG8gYWRkIGl0Ci0gICAgICAgICAgICAvLyBhbmQgc3RyaXAgaXQgbGF0ZXIuCi0gICAgICAgICAgICBjb21tYW5kID0gIi1zICIgKyBjb21tYW5kOwotICAgICAgICB9Ci0gICAgICAgIGlmKHNob3VsZFNldFZhbHVlKSB7Ci0gICAgICAgICAgICBjb21tYW5kICs9ICIgIiArIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoc2hvdWxkU2V0UHJvcGVydHkpIHsKLSAgICAgICAgICAgIGZpbmFsIFByb2plY3QgbXlQcm9qID0gcHJvamVjdDsKLQotICAgICAgICAgICAgUDRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUDRIYW5kbGVyQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiUDRDb3VudGVyIHJldHJpZXZlZCBsaW5lIFwiIisgbGluZSArICJcIiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXlQcm9qLnNldFByb3BlcnR5KHByb3BlcnR5LCAiIit2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGVyZm9yY2UgZXJyb3IuIENvdWxkIG5vdCByZXRyaWV2ZSBjb3VudGVyIHZhbHVlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgZXhlY1A0Q29tbWFuZChjb21tYW5kLCBoYW5kbGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4ZWNQNENvbW1hbmQoY29tbWFuZCwgbmV3IFNpbXBsZVA0T3V0cHV0SGFuZGxlcih0aGlzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEVkaXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I2NDM5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotLyoqIFA0RWRpdCAtIGNoZWNrb3V0IGZpbGUocykgZm9yIGVkaXQuCi0gKgotICogRXhhbXBsZSBVc2FnZTo8YnI+Ci0gKiAmbHQ7cDRlZGl0IGNoYW5nZT0iJHtwNC5jaGFuZ2V9IiB2aWV3PSIvL2RlcG90L3Byb2plY3QvZm9vLnR4dCIgLyZndDsKLSAqIEBhdXRob3IgPEEgSFJFRj0ibWFpbHRvOmxlc2xpZS5odWdoZXNAcnVidXMuY29tIj5MZXMgSHVnaGVzPC9BPgotICoKLSAqIFRvRG86IFNob3VsZCBjYWxsIHJlb3BlbiBpZiBmaWxlIGlzIGFscmVhZHkgb3BlbiBpbiBvbmUgb2Ygb3VyIGNoYW5nZWxpc3RzIHBlcmhhcHM/Ci0gKi8KLSAKLSBwdWJsaWMgY2xhc3MgUDRFZGl0IGV4dGVuZHMgUDRCYXNlIHsKLSAKLSAgICAgcHVibGljIFN0cmluZyBjaGFuZ2UgPSBudWxsOwotICAgICAKLSAgICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlKFN0cmluZyBjaGFuZ2UpIHsKLSAgICAgICAgICAgICB0aGlzLmNoYW5nZSA9IGNoYW5nZTsKLQkgfQotCSAKLSAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgICBpZihjaGFuZ2UgIT0gbnVsbCApIFA0Q21kT3B0cyA9ICItYyAiK2NoYW5nZTsKLQkgICAgIGlmKFA0VmlldyA9PSBudWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHZpZXcgc3BlY2lmaWVkIHRvIGVkaXQiKTsKLSAgICAgICAgIGV4ZWNQNENvbW1hbmQoIi1zIGVkaXQgIitQNENtZE9wdHMrIiAiK1A0VmlldywgbmV3IFNpbXBsZVA0T3V0cHV0SGFuZGxlcih0aGlzKSk7Ci0JIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0SGFuZGxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjVmOTguLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVN0cmVhbUhhbmRsZXI7Ci0KLS8qKiBJbnRlcmZhY2UgZm9yIHA0IGpvYiBvdXRwdXQgc3RyZWFtIGhhbmRsZXIuIENsYXNzZXMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlCi0gKiBjYW4gYmUgY2FsbGVkIGJhY2sgYnkgUDRCYXNlLmV4ZWNQNENvbW1hbmQoKTsKLSAqCi0gKiBAYXV0aG9yIDxBIEhSRUY9Im1haWx0bzpsZXNsaWUuaHVnaGVzQHJ1YnVzLmNvbSI+TGVzIEh1Z2hlczwvQT4KLSAqLwotcHVibGljIGludGVyZmFjZSBQNEhhbmRsZXIgZXh0ZW5kcyBFeGVjdXRlU3RyZWFtSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KFN0cmluZyBsaW5lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEhhbmRsZXJBZGFwdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEhhbmRsZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzAwOTguLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRIYW5kbGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFA0SGFuZGxlckFkYXB0ZXIgaW1wbGVtZW50cyBQNEhhbmRsZXIgewotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VzcyhTdHJpbmcgbGluZSk7Ci0KLQotICAgIFN0cmluZyBwNGlucHV0ID0gIiI7Ci0KLSAgICAvL3NldCBhbnkgZGF0YSB0byBiZSB3cml0dGVuIHRvIFA0J3Mgc3RkaW4gLSBtZXNzeSwgbmVlZHMgd29yawotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgcDRJbnB1dCkgewotICAgICAgICB0aGlzLnA0aW5wdXQgPSBwNElucHV0OwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgdHJ5ewotICAgICAgICAvL0ZpcnN0IHdyaXRlIGFueSBvdXRwdXQgdG8gUDQgCi0gICAgICAgIGlmKHA0aW5wdXQgIT0gbnVsbCAmJiBwNGlucHV0Lmxlbmd0aCgpID4wICYmIG9zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3Mud3JpdGUocDRpbnB1dC5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAvL05vdyByZWFkIGFueSBpbnB1dCBhbmQgcHJvY2VzcwotICAgICAgCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGlucHV0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKGlzLGVzKSkpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLQkgICAgCXdoaWxlKChsaW5lID0gaW5wdXQucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCSAgICAJICAgcHJvY2VzcyhsaW5lKTsKLQkgICAgCX0KLQkgICAgCQotCSAgICAJaW5wdXQuY2xvc2UoKTsKLQotCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgT3V0cHV0U3RyZWFtIG9zOyAgICAvL09VdHB1dAotICAgIElucHV0U3RyZWFtIGlzOyAgICAgLy9JbnB1dAotICAgIElucHV0U3RyZWFtIGVzOyAgICAgLy9FcnJvcgotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0lucHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5vcyA9IG9zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NFcnJvclN0cmVhbShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5lcyA9IGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NPdXRwdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuaXMgPSBpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCl7fQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRIYXZlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEhhdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3MWYwMS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEhhdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLQotLyoqIFA0SGF2ZSAtIGxpc3RzIGZpbGVzIGN1cnJlbnRseSBvbiBjbGllbnQuCi0gKiAKLSAqIFA0SGF2ZSBzaW1wbHkgZHVtcHMgdGhlIGN1cnJlbnQgZmlsZSB2ZXJzaW9uIGluZm8gaW50bwotICogdGhlIEFudCBsb2cgKG9yIHN0ZG91dCkuCi0gKiBAYXV0aG9yIDxBIEhSRUY9Im1haWx0bzpsZXNsaWUuaHVnaGVzQHJ1YnVzLmNvbSI+TGVzIEh1Z2hlczwvQT4KLSAqLwotcHVibGljIGNsYXNzIFA0SGF2ZSBleHRlbmRzIFA0QmFzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY1A0Q29tbWFuZCgiaGF2ZSAiK1A0Q21kT3B0cysiICIrUDRWaWV3LCBuZXcgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKHRoaXMpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNExhYmVsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNExhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODZkYzcuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLQotCi0vKiogUDRMYWJlbCAtIGNyZWF0ZSBhIFBlcmZvcmNlIExhYmVsLgotICoKLSAqICBQNExhYmVsIGluc2VydHMgYSBsYWJlbCBpbnRvIHBlcmZvcmNlIHJlZmxlY3RpbmcgdGhlCi0gKiAgY3VycmVudCBjbGllbnQgY29udGVudHMuCi0gKgotICogIExhYmVsIG5hbWUgZGVmYXVsdHMgdG8gQW50TGFiZWwgaWYgbm9uZSBzZXQuCi0gKgotICogRXhhbXBsZSBVc2FnZTogPFA0TGFiZWwgbmFtZT0iTXlMYWJlbC0ke1RTVEFNUH0tJHtEU1RBTVB9IiBkZXNjPSJBdXRvIEJ1aWxkIExhYmVsIiAvPgotICoKLSAqIEBhdXRob3IgPEEgSFJFRj0ibWFpbHRvOmxlc2xpZS5odWdoZXNAcnVidXMuY29tIj5MZXMgSHVnaGVzPC9BPgotICovCi1wdWJsaWMgY2xhc3MgUDRMYWJlbCBleHRlbmRzIFA0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbG9jazsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKLSAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKLSAgICB9Ci0gICAKLSAJcHVibGljIHZvaWQgc2V0TG9jayhTdHJpbmcgbG9jaykgIHsKLSAgICAJdGhpcy5sb2NrID0gbG9jazsKLSAJfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nKCJQNExhYmVsIGV4ZWM6IixQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgCi0gICAgICAgIGlmKFA0VmlldyA9PSBudWxsIHx8IFA0Vmlldy5sZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgICAgIGxvZygiVmlldyBub3Qgc2V0LCBhc3N1bWluZyAvL2RlcG90Ly4uLiIsIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgUDRWaWV3ID0gIi8vZGVwb3QvLi4uIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoZGVzYyA9PSBudWxsIHx8IGRlc2MubGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgICAgICBsb2coIkxhYmVsIERlc2NyaXB0aW9uIG5vdCBzZXQsIGFzc3VtaW5nICdBbnRMYWJlbCciLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIGRlc2MgPSAiQW50TGFiZWwiOwotICAgICAgICB9Ci0gICAgICAgIAotCQlpZihsb2NrICE9IG51bGwgJiYgIWxvY2suZXF1YWxzSWdub3JlQ2FzZSgibG9ja2VkIikpIHsKLSAgICAgICAgCWxvZygibG9jayBhdHRyaWJ1dGUgaW52YWxpZCAtIGlnbm9yaW5nIixQcm9qZWN0Lk1TR19XQVJOKTsKLQkJfQotICAgICAgICAKLSAgICAgICAgaWYobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgieXl5eS5NTS5kZC1oaDptbSIpOwotICAgICAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgbmFtZSA9ICJBbnRMYWJlbC0iK2Zvcm1hdHRlci5mb3JtYXQobm93KTsKLSAgICAgICAgICAgIGxvZygibmFtZSBub3Qgc2V0LCBhc3N1bWluZyAnIituYW1lKyInIiwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL1dlIGhhdmUgdG8gY3JlYXRlIGEgdW5sb2NrZWQgbGFiZWwgZmlyc3QKLSAgICAgICAgU3RyaW5nIG5ld0xhYmVsID0gCi0gICAgICAgICAgICAiTGFiZWw6ICIrbmFtZSsiXG4iKwotICAgICAgICAgICAgIkRlc2NyaXB0aW9uOiAiK2Rlc2MrIlxuIisKLSAgICAgICAgICAgICJPcHRpb25zOiB1bmxvY2tlZFxuIisKLSAgICAgICAgICAgICJWaWV3OiAiK1A0VmlldysiXG4iOwotCi0gICAgICAgIFA0SGFuZGxlciBoYW5kbGVyID0gbmV3IFA0SGFuZGxlckFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICAgICAgbG9nKGxpbmUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGhhbmRsZXIuc2V0T3V0cHV0KG5ld0xhYmVsKTsKLQotICAgICAgICBleGVjUDRDb21tYW5kKCJsYWJlbCAtaSIsIGhhbmRsZXIpOwotICAgICAgICAKLSAgICAgICAgZXhlY1A0Q29tbWFuZCgibGFiZWxzeW5jIC1sICIrbmFtZSwgbmV3IFA0SGFuZGxlckFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICAgICAgbG9nKGxpbmUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBsb2coIkNyZWF0ZWQgTGFiZWwgIituYW1lKyIgKCIrZGVzYysiKSIsIFByb2plY3QuTVNHX0lORk8pOwotCi0gICAgICAgIC8vTm93IGxvY2sgaWYgcmVxdWlyZWQKLSAgICAgICAgaWYgKGxvY2sgIT0gbnVsbCAmJiBsb2NrLmVxdWFsc0lnbm9yZUNhc2UoImxvY2tlZCIpKSAgewotICAgICAgICAKLSAgICAgICAgCWxvZygiTW9kaWZ5aW5nIGxvY2sgc3RhdHVzIHRvICdsb2NrZWQnIixQcm9qZWN0Lk1TR19JTkZPKTsKLQotICAgICAgICAJZmluYWwgU3RyaW5nQnVmZmVyIGxhYmVsU3BlYyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIAotCQkJLy9SZWFkIGJhY2sgdGhlIGxhYmVsIHNwZWMgZnJvbSBwZXJmb3JjZSwgCi0gICAgICAgICAgICAvL1JlcGxhY2UgT3B0aW9ucwotICAgICAgICAgICAgLy9TdWJtaXQgYmFjayB0byBQZXJmb3JjZQotICAgICAgICAgICAgCi0gICAgICAgIAloYW5kbGVyID0gbmV3IFA0SGFuZGxlckFkYXB0ZXIoKSAgewotICAgICAgICAgICAJCXB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpICB7Ci0gICAgICAgICAgICAgICAgCWxvZyhsaW5lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgCi0JCQkJCWlmKHV0aWwubWF0Y2goIi9eT3B0aW9uczovIixsaW5lKSkgewotICAgCSAgICAgICAgICAgICAgICAJbGluZSA9ICJPcHRpb25zOiAiK2xvY2s7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsU3BlYy5hcHBlbmQobGluZSsiXG4iKTsKLSAgICAgICAgICAgCQl9Ci0gICAgICAgIAl9OwotICAgICAgICAKLSAgICAgICAgCQotICAgICAgICAgICAgCi0JCQlleGVjUDRDb21tYW5kKCJsYWJlbCAtbyAiK25hbWUsIGhhbmRsZXIpOwotICAgICAgICAgICAgbG9nKGxhYmVsU3BlYy50b1N0cmluZygpLFByb2plY3QuTVNHX0RFQlVHKTsKLQotICAgICAgICAgICAgbG9nKCJOb3cgbG9ja2luZyBsYWJlbC4uLiIsUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0JCQloYW5kbGVyID0gbmV3IFA0SGFuZGxlckFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvY2VzcyhTdHJpbmcgbGluZSkgewotCQkJCQlsb2cobGluZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0JCQkJfQotICAgICAgICAJfTsKLQotICAgICAgICAgICAgaGFuZGxlci5zZXRPdXRwdXQobGFiZWxTcGVjLnRvU3RyaW5nKCkpOwotCQkJZXhlY1A0Q29tbWFuZCgibGFiZWwgLWkiLCBoYW5kbGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNE91dHB1dEhhbmRsZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0T3V0cHV0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzQ4ZjQyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0T3V0cHV0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi0vKiogSW50ZXJmYWNlIGZvciBwNCBqb2Igb3V0cHV0IHN0cmVhbSBoYW5kbGVyLiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZQotICogY2FuIGJlIGNhbGxlZCBiYWNrIGJ5IFA0QmFzZS5leGVjUDRDb21tYW5kKCk7Ci0gKgotICogQGF1dGhvciA8QSBIUkVGPSJtYWlsdG86bGVzbGllLmh1Z2hlc0BydWJ1cy5jb20iPkxlcyBIdWdoZXM8L0E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUDRPdXRwdXRIYW5kbGVyIHsKLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0UmVvcGVuLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFJlb3Blbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjYzZjY2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0UmVvcGVuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi0vKiBQNFJlb3BlbiAtIG1vdmUgZmlsZXMgdG8gYSBuZXcgY2hhbmdlbGlzdAotICoKLSAqIEBhdXRob3IgPEEgSFJFRj0ibWFpbHRvOmxlc2xpZS5odWdoZXNAcnVidXMuY29tIj5MZXMgSHVnaGVzPC9BPgotICovCi1wdWJsaWMgY2xhc3MgUDRSZW9wZW4gZXh0ZW5kcyBQNEJhc2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9DaGFuZ2UgPSAiIjsKLQotICAgIHB1YmxpYyB2b2lkIHNldFRvQ2hhbmdlKFN0cmluZyB0b0NoYW5nZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYodG9DaGFuZ2UgPT0gbnVsbCAmJiAhdG9DaGFuZ2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUDRSZW9wZW46IHRvY2hhbmdlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0KLSAgICAgICAgdGhpcy50b0NoYW5nZSA9IHRvQ2hhbmdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZihQNFZpZXcgPT0gbnVsbCkgaWYoUDRWaWV3ID09IG51bGwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gdmlldyBzcGVjaWZpZWQgdG8gcmVvcGVuIik7Ci0gICAgICAgIGV4ZWNQNENvbW1hbmQoIi1zIHJlb3BlbiAtYyAiK3RvQ2hhbmdlKyIgIitQNFZpZXcsIG5ldyBTaW1wbGVQNE91dHB1dEhhbmRsZXIodGhpcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0UmV2ZXJ0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFJldmVydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IyNjI5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0UmV2ZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotLyogUDRSZXZlcnQgLSByZXZlcnQgb3BlbiBmaWxlcyBvciBmaWxlcyBpbiBhIGNoYW5nZWxpc3QKLSAqCi0gKiBAYXV0aG9yIDxBIEhSRUY9Im1haWx0bzpsZXNsaWUuaHVnaGVzQHJ1YnVzLmNvbSI+TGVzIEh1Z2hlczwvQT4KLSAqLwotcHVibGljIGNsYXNzIFA0UmV2ZXJ0IGV4dGVuZHMgUDRCYXNlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHJldmVydENoYW5nZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG9ubHlVbmNoYW5nZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENoYW5nZShTdHJpbmcgcmV2ZXJ0Q2hhbmdlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZihyZXZlcnRDaGFuZ2UgPT0gbnVsbCAmJiAhcmV2ZXJ0Q2hhbmdlLmVxdWFscygiIikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlA0UmV2ZXJ0OiBjaGFuZ2UgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQotICAgICAgICB0aGlzLnJldmVydENoYW5nZSA9IHJldmVydENoYW5nZTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJldmVydE9ubHlVbmNoYW5nZWQoYm9vbGVhbiBvbmx5VW5jaGFuZ2VkKSAgewotICAgICAgICB0aGlzLm9ubHlVbmNoYW5nZWQgPSBvbmx5VW5jaGFuZ2VkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIC8qIEhlcmUgd2UgY2FuIGVpdGhlciByZXZlcnQgYW55IHVuY2hhbmdlZCBmaWxlcyBpbiBhIGNoYW5nZWxpc3QKLSAgICAgICAgICogb3IKLSAgICAgICAgICogYW55IGZpbGVzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkIG9yIG5vdAotICAgICAgICAgKgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgd2hvbGUgcHJvY2VzcyBhbHNvIGFjY2VwdHMgYSBwNCBmaWxlc3BlYwotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIHA0Y21kID0gIi1zIHJldmVydCI7Ci0gICAgICAgIGlmKG9ubHlVbmNoYW5nZWQpIHA0Y21kKz0iIC1hIjsKLQotICAgICAgICBpZiAocmV2ZXJ0Q2hhbmdlICE9IG51bGwpIHA0Y21kICs9ICIgLWMgIityZXZlcnRDaGFuZ2U7Ci0KLSAgICAgICAgZXhlY1A0Q29tbWFuZChwNGNtZCsiICIrUDRWaWV3LCBuZXcgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKHRoaXMpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFN1Ym1pdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRTdWJtaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk0NDRiNy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFN1Ym1pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotLyoqIFA0U3VibWl0IC0gc3VibWl0IGEgbnVtYmVyZWQgY2hhbmdlbGlzdCB0byBQZXJmb3JjZS4KLSAqCi0gKiA8Qj5Ob3RlOjwvQj4gUDRTdWJtaXQgY2Fubm90ICh5ZXQpIHN1Ym1pdCB0aGUgZGVmYXVsdCBjaGFuZ2VsaXN0LiAKLSAqIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBBTlQgQVBJIGFzIHRoZSB1c3VhbCBmbG93IGlzIAotICogUDRDaGFuZ2UgdG8gY3JlYXRlIGEgbmV3IG51bWJlcmVkIGNoYW5nZSBmb2xsb3dlZCBieSBQNEVkaXQgdGhlbiBQNFN1Ym1pdC4KLSAqCi0gKiBFeGFtcGxlIFVzYWdlOi08YnI+Ci0gKiAmbHQ7cDRzdWJtaXQgY2hhbmdlPSIke3A0LmNoYW5nZX0iIC8mZ3Q7Ci0gKgotICogQGF1dGhvciA8QSBIUkVGPSJtYWlsdG86bGVzbGllLmh1Z2hlc0BydWJ1cy5jb20iPkxlcyBIdWdoZXM8L0E+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUDRTdWJtaXQgZXh0ZW5kcyBQNEJhc2UgewotCi0gICAgLy9Ub0RvOiBJZiBkZWFsaW5nIHdpdGggZGVmYXVsdCBjbCBuZWVkIHRvIHBhcnNlIG91dCA8ZW50ZXIgZGVzY3JpcHRpb24gaGVyZT4gICAgCi0gICAgcHVibGljIFN0cmluZyBjaGFuZ2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2UoU3RyaW5nIGNoYW5nZSkgewotICAgICAgICB0aGlzLmNoYW5nZSA9IGNoYW5nZTsKLQl9Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGNoYW5nZSAhPSBudWxsKSB7Ci0JICAgICAgICBleGVjUDRDb21tYW5kKCJzdWJtaXQgLWMgIitjaGFuZ2UsIG5ldyBQNEhhbmRsZXJBZGFwdGVyKCl7Ci0JCSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpIHsKLQkJCSAgICAgICAgICAgIGxvZyhsaW5lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQkJCQkgICAgfQotCQkgICAgfSk7Ci0JCi0JICAgIH0gZWxzZSB7Ci0JICAgIC8vaGVyZSB3ZSdkIHBhcnNlIHRoZSBvdXRwdXQgZnJvbSBjaGFuZ2UgLW8gaW50byBzdWJtaXQgLWkgCi0JICAgIC8vaW4gb3JkZXIgdG8gc3VwcG9ydCBkZWZhdWx0IGNoYW5nZS4KLQkgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBjaGFuZ2Ugc3BlY2lmaWVkIChubyBzdXBwb3J0IGZvciBkZWZhdWx0IGNoYW5nZSB5ZXQuLi4uIik7Ci0gICAgCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFN5bmMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0U3luYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTE1NjNjLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0U3luYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKiBQNFN5bmMgIC0gc3luY2hyb25pc2UgY2xpZW50IHNwYWNlIHRvIGEgcGVyZm9yY2UgZGVwb3Qgdmlldy4KLSAqICBUaGUgQVBJIGFsbG93cyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlICJwNCBzeW5jIiBjb21tYW5kIAotICogKHN1Y2ggYXMgInA0IHN5bmMgLWYgLy8uLi4jaGF2ZSIgb3Igb3RoZXIgZXhvdGljIGludm9jYXRpb25zKS48L1A+Ci0gKgotICogPGI+RXhhbXBsZSBVc2FnZTo8L2I+Ci0gKiA8dGFibGUgYm9yZGVyPSIxIj4KLSAqIDx0aD5GdW5jdGlvbjwvdGg+PHRoPkNvbW1hbmQ8L3RoPgotICogPHRyPjx0ZD5TeW5jIHRvIGhlYWQgdXNpbmcgUDRVU0VSLCBQNFBPUlQgYW5kIFA0Q0xJRU5UIHNldHRpbmdzIHNwZWNpZmllZDwvdGQ+PHRkPiZsdDtQNFN5bmMgPGJyPlA0dmlldz0iLy9wcm9qZWN0cy9mb28vbWFpbi9zb3VyY2UvLi4uIiA8YnI+UDRVc2VyPSJmYmxvZ2dzIiA8YnI+UDRQb3J0PSJrbTAxOjE2NjYiIDxicj5QNENsaWVudD0iZmJsb2dnc2NsaWVudCIgLyZndDs8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlN5bmMgdG8gaGVhZCB1c2luZyBQNFVTRVIsIFA0UE9SVCBhbmQgUDRDTElFTlQgc2V0dGluZ3MgZGVmaW5lZCBpbiBlbnZpcm9ubWVudDwvdGQ+PHRkPiZsdDtQNFN5bmMgUDR2aWV3PSIvL3Byb2plY3RzL2Zvby9tYWluL3NvdXJjZS8uLi4iIC8mZ3Q7PC90ZD48L3RyPgotICogPHRyPjx0ZD5Gb3JjZSBhIHJlLXN5bmMgdG8gaGVhZCwgcmVmcmVzaGluZyBhbGwgZmlsZXM8L3RkPjx0ZD4mbHQ7UDRTeW5jIGZvcmNlPSJ5ZXMiIFA0dmlldz0iLy9wcm9qZWN0cy9mb28vbWFpbi9zb3VyY2UvLi4uIiAvJmd0OzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+U3luYyB0byBhIGxhYmVsPC90ZD48dGQ+Jmx0O1A0U3luYyBsYWJlbD0ibXlQZXJmb3JjZUxhYmVsIiAvJmd0OzwvdGQ+PC90cj4KLSAqIDwvdGFibGU+Ci0gKgotICogVG9EbzogIEFkZCBkZWNlbnQgbGFiZWwgZXJyb3IgaGFuZGxpbmcgZm9yIG5vbi1leHNpdGFudCBsYWJlbHMKLSAqCi0gKiBAYXV0aG9yIDxBIEhSRUY9Im1haWx0bzpsZXNsaWUuaHVnaGVzQHJ1YnVzLmNvbSI+TGVzIEh1Z2hlczwvQT4KLSAqLwotcHVibGljIGNsYXNzIFA0U3luYyBleHRlbmRzIFA0QmFzZSB7Ci0KLSAgICBTdHJpbmcgbGFiZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3luY0NtZCA9ICIiOwotCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geyAKLSAgICAgICAgaWYobGFiZWwgPT0gbnVsbCAmJiAhbGFiZWwuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlA0U3luYzogTGFiZWxzIGNhbm5vdCBiZSBOdWxsIG9yIEVtcHR5Iik7Ci0KLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZShTdHJpbmcgZm9yY2UpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGZvcmNlID09IG51bGwgJiYgIWxhYmVsLmVxdWFscygiIikpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQNFN5bmM6IElmIHlvdSB3YW50IHRvIGZvcmNlLCBzZXQgZm9yY2UgdG8gbm9uLW51bGwgc3RyaW5nISIpOwotICAgICAgICAgICAgUDRDbWRPcHRzID0gIi1mIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGlmIChQNFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN5bmNDbWQgPSBQNFZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICAKLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhbGFiZWwuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHN5bmNDbWQgPSBzeW5jQ21kICsgIkAiICsgbGFiZWw7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgCi0gICAgICAgIGxvZygiRXhlY2luZyBzeW5jICIrUDRDbWRPcHRzKyIgIitzeW5jQ21kLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQotICAgICAgICBleGVjUDRDb21tYW5kKCItcyBzeW5jICIrUDRDbWRPcHRzKyIgIitzeW5jQ21kLCBuZXcgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKHRoaXMpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9TaW1wbGVQNE91dHB1dEhhbmRsZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1NpbXBsZVA0T3V0cHV0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGI1N2EzLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1NpbXBsZVA0T3V0cHV0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVA0T3V0cHV0SGFuZGxlciBleHRlbmRzIFA0SGFuZGxlckFkYXB0ZXIgewotCi0JUDRCYXNlIHBhcmVudDsKLQlwdWJsaWMgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKFA0QmFzZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCWlmKHBhcmVudC51dGlsLm1hdGNoKCIvXmV4aXQvIixsaW5lKSkgcmV0dXJuOwotCi0JCS8vVGhyb3cgZXhjZXB0aW9uIG9uIGVycm9ycyAoZXhjZXB0IHVwLXRvLWRhdGUpCi0JCS8vcDQgLXMgaXMgdW5wcmVkaWNhdGFibGUuIEZvciBleGFtcGxlIGEgc2VydmVyIGRvd24KLQkJLy9kb2VzIG5vdCByZXR1cm4gZXJyb3I6IG1hcmt1cAotCQkvLwotCQkvL1NvbWUgZm9ybXMgcHJvZHVjaW5nIGNvbW1hbmRzIChwNCAtcyBjaGFuZ2UgLW8pIGRvIHRhZyB0aGUgb3V0cHV0Ci0JCS8vb3RoZXJzIGRvbid0Li4uLi4KLQkJLy9PdGhlcnMgbWFyayBlcnJvcnMgYXMgaW5mbywgZm9yIGV4YW1wbGUgZWRpdCBhIGZpbGUKLQkJLy93aGljaCBpcyBhbHJlYWR5IG9wZW4gZm9yIGVkaXQuLi4uLgotCQkvL0p1c3QgbG9vayBmb3IgZXJyb3I6IC0gY2F0Y2hlcyBtb3N0IHRoaW5ncy4uLi4KLQotCQlpZihwYXJlbnQudXRpbC5tYXRjaCgiL2Vycm9yOi8iLCBsaW5lKSAmJiAhcGFyZW50LnV0aWwubWF0Y2goIi91cC10by1kYXRlLyIsIGxpbmUpKSB7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obGluZSk7Ci0JCi0JCX0gCi0KLQkJcGFyZW50LmxvZyhwYXJlbnQudXRpbC5zdWJzdGl0dXRlKCJzL14uKjogLy8iLGxpbmUpLCBQcm9qZWN0Lk1TR19JTkZPKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvcGFja2FnZS5odG1sIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmYzJhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTxib2R5PgotQU5UIFRhc2tzIGZvciBQZXJmb3JjZSBpbnRlZ3JhdGlvbi4KLQotVGhlc2UgdGFza3MgcHJvdmlkZSBiYXNpYyBQNCBjYXBhYmlsaXRpZXMgdG8gYXV0b21hdGVkIEFOVC1iYXNlZCBidWlsZCBzeXN0ZW1zLiA8Yj5Ob3RlOjwvYj4gCi10aGUgdGFza3MgaW4gdGhpcyBwYWNrYWdlIGFyZSBsaW5rZWQgYWdhaW5zdCB0aGUgSmFrYXJ0YSBPUk8gMi4wIGxpYnJhcnkgd2hpY2gKLWJyaW5ncyB0aGUgcG93ZXIgb2YgUGVybCA1IHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gSmF2YS4KLQotVGhlc2UgdGFza3MgYWxzbyByZXF1aXJlIHlvdSB0byBoYXZlIHRoZSBwNCAob3IgcDQuZXhlKSBjbGllbnQgaW4geW91ciBwYXRoLgotCi1Ac2VlIDxBIEhSRUY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvIj5KYWthcnRhIFByb2plY3Q8L0E+Ci1Ac2VlIDxBIEhSRUY9Imh0dHA6Ly93d3cucGVyZm9yY2UuY29tLyI+UGVyZm9yY2U8L0E+Ci0KLUBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRTeW5jCi1Ac2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0TGFiZWwKLUBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRIYXZlCi1Ac2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0Q2hhbmdlCi1Ac2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0RWRpdAotQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNFN1Ym1pdAotQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNENvdW50ZXIKLQotCi0KLUBhdXRob3IgPEEgSFJFRj0ibWFpbHRvOmxlc2xpZS5odWdoZXNAcnVidXMuY29tIj5MZXMgSHVnaGVzPC9BPgotCi0KLTwvYm9keT4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MvUHZjcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTM1MTYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFtBZGRpdGlvbmFsIG5vdGljZXMsIGlmIHJlcXVpcmVkIGJ5IHByaW9yIGxpY2Vuc2luZyBjb25kaXRpb25zXQotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wdmNzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dTdHJlYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlB1bXBTdHJlYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotCi0vKioKLSAqIEEgdGFzayB0aGF0IGZldGNoZXMgc291cmNlIGZpbGVzIGZyb20gYSBQVkNTIGFyY2hpdmUKLSAqCi0gKiA8Yj4xOS0wNC0yMDAxPC9iPiA8cD5UaGUgdGFzayBub3cgaGFzIGEgbW9yZSByb2J1c3QKLSAqIHBhcnNlci4gSXQgYWxsb3dzIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGFudCBmaWxlIHBhdGhzCi0gKiBhbmQgc3VwcG9ydHMgZmlsZSBuYW1lcyB3aXRoIDxpPigpPC9pPi4gVGhhbmtzIHRvIEVyaWsgSHVzYnkgZm9yCi0gKiBicmluZ2luZyB0aGUgYnVnIHRvIG15IGF0dGVudGlvbi4KLSAqCi0gKiA8Yj4yNy0wNC0yMDAxPC9iPiA8cD5VTkMgcGF0aHMgYXJlIG5vdyBoYW5kbGVkIHByb3Blcmx5LiAKLSAqIEZpeCBwcm92aWRlZCBieSBEb24gSmVmZmVyeS4gSGUgYWxzbyBhZGRlZCBhbiA8aT5VcGRhdGVPbmx5PC9pPiBmbGFnCi0gKiB0aGF0LCB3aGVuIHRydWUsIGNvbmRpdGlvbnMgdGhlIFBWQ1MgZ2V0IHVzaW5nIHRoZSAtVSBvcHRpb24gdG8gb25seSAKLSAqIHVwZGF0ZSB0aG9zZSBmaWxlcyB0aGF0IGhhdmUgYSBtb2RpZmljYXRpb24gdGltZSAoaW4gUFZDUykgdGhhdCBpcyBuZXdlciAKLSAqIHRoYW4gdGhlIGV4aXN0aW5nIHdvcmtmaWxlLgotICoKLSAqIEBhdXRob3IgVGhvbWFzIENocmlzdGVuc2VuIDx0Y2hyaXN0ZW5zZW5Abm9yZGlqYS5jb20+Ci0gKiBAYXV0aG9yIERvbiBKZWZmZXJ5IDxkb25qQGFwb2dlZW5ldC5jb20+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQdmNzIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHZjc2JpbjsKLSAgICBwcml2YXRlIFN0cmluZyByZXBvc2l0b3J5OwotICAgIHByaXZhdGUgU3RyaW5nIHB2Y3NQcm9qZWN0OwotICAgIHByaXZhdGUgVmVjdG9yIHB2Y3NQcm9qZWN0czsKLSAgICBwcml2YXRlIFN0cmluZyB3b3Jrc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZm9yY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvbW90aW9uZ3JvdXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZXJjOwotICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVPbmx5OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIHRoZSB0aGluZyB0byBleGVjdXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDTElfRVhFID0gInBjbGkiOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIHRoZSBQQ0xJIGxpc3R2ZXJzaW9uZWRmaWxlcyByZWN1cnNpdmUgaSBhIGZvcm1hdCAiZ2V0IiB1bmRlcnN0YW5kcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0xJX0xWRl9BUkdTID0gImx2ZiAteiAtYXciOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgZm9yIHRoZSB0aGluZyB0byBleGVjdXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9FWEUgPSAiZ2V0IjsKLQotCi0gICAgcHJvdGVjdGVkIGludCBydW5DbWQoQ29tbWFuZGxpbmUgY21kLCBFeGVjdXRlU3RyZWFtSGFuZGxlciBvdXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKG91dCk7Ci0gICAgICAgICAgICBleGUuc2V0QW50UnVuKGFQcm9qKTsKLSAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGFQcm9qLmdldEJhc2VEaXIoKSk7Ci0gICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICAgICAgcmV0dXJuIGV4ZS5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY21kLnRvU3RyaW5nKCkgKyAiLiBFeGNlcHRpb246ICIrZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRFeGVjdXRhYmxlKFN0cmluZyBleGUpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGNvcnJlY3RlZEV4ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYoZ2V0UHZjc2JpbigpIT1udWxsKQotICAgICAgICAgICAgaWYocHZjc2Jpbi5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0gICAgICAgICAgICAgICAgY29ycmVjdGVkRXhlLmFwcGVuZChwdmNzYmluKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb3JyZWN0ZWRFeGUuYXBwZW5kKHB2Y3NiaW4pLmFwcGVuZChGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgIHJldHVybiBjb3JyZWN0ZWRFeGUuYXBwZW5kKGV4ZSkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZXhjZXB0aW9uIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIFNvbWV0aGluZyBpcyBzdG9wcGluZyB0aGUgYnVpbGQuLi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICAgICAgaWYocmVwb3NpdG9yeSA9PSBudWxsIHx8IHJlcG9zaXRvcnkudHJpbSgpLmVxdWFscygiIikpIAotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhcmd1bWVudCByZXBvc2l0b3J5IG5vdCBzcGVjaWZpZWQiKTsKLQotICAgICAgICAvLyBDaGVjayB3b3Jrc3BhY2UgZXhpc3RzCi0gICAgICAgIC8vIExhdW5jaCBQQ0xJIGxpc3R2ZXJzaW9uZWRmaWxlcyAteiAtYXcKLSAgICAgICAgLy8gQ2FwdHVyZSBvdXRwdXQKLSAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgaXMKLSAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRFeGVjdXRhYmxlKFBDTElfRVhFKSk7Ci0KLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgibHZmIik7Ci0gICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi16Iik7Ci0gICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1hdyIpOwotICAgICAgICBpZihnZXRXb3Jrc3BhY2UoKSE9bnVsbCkKLSAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zcCIrZ2V0V29ya3NwYWNlKCkpOwotICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItcHIiK2dldFJlcG9zaXRvcnkoKSk7Ci0KLSAgICAgICAgLy8gZGVmYXVsdCBwdmNzIHByb2plY3QgaXMgIi8iCi0gICAgICAgIGlmKGdldFB2Y3Nwcm9qZWN0KCkgPT0gbnVsbCAmJiBnZXRQdmNzcHJvamVjdHMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBwdmNzUHJvamVjdCA9ICIvIjsKLQotICAgICAgICBpZihnZXRQdmNzcHJvamVjdCgpIT1udWxsKQotICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRQdmNzcHJvamVjdCgpKTsKLSAgICAgICAgaWYoIWdldFB2Y3Nwcm9qZWN0cygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGdldFB2Y3Nwcm9qZWN0cygpLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9ICgoUHZjc1Byb2plY3QpZS5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3ROYW1lID09IG51bGwgfHwgKHByb2plY3ROYW1lLnRyaW0oKSkuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGlzIGEgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHB2Y3Nwcm9qZWN0Iik7Ci0gICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIHRtcCA9IG51bGw7Ci0gICAgICAgIEZpbGUgdG1wMiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgICAgICAgICAgdG1wID0gbmV3IEZpbGUoInB2Y3NfYW50XyIrcmFuZC5uZXh0TG9uZygpKyIubG9nIik7Ci0gICAgICAgICAgICB0bXAyID0gbmV3IEZpbGUoInB2Y3NfYW50XyIrcmFuZC5uZXh0TG9uZygpKyIubG9nIik7Ci0gICAgICAgICAgICBsb2coIkV4ZWN1dGluZyAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICByZXN1bHQgPSBydW5DbWQoY29tbWFuZExpbmUsIG5ldyBQdW1wU3RyZWFtSGFuZGxlcihuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXApLCBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsUHJvamVjdC5NU0dfV0FSTikpKTsKLSAgICAgICAgICAgIGlmICggcmVzdWx0ICE9IDAgJiYgIWlnbm9yZXJjKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCF0bXAuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb21tdW5pY2F0aW9uIGJldHdlZW4gYW50IGFuZCBwdmNzIGZhaWxlZC4gTm8gb3V0cHV0IGdlbmVyYXRlZCBmcm9tIGV4ZWN1dGluZyBQVkNTIGNvbW1hbmRsaW5lIGludGVyZmFjZSBcInBjbGlcIiBhbmQgXCJnZXRcIiIpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgZm9sZGVycyBpbiB3b3Jrc3BhY2UKLSAgICAgICAgICAgIGxvZygiQ3JlYXRpbmcgZm9sZGVycyIsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgY3JlYXRlRm9sZGVycyh0bXApOwotCi0gICAgICAgICAgICAvLyBNYXNzYWdlIFBDTEkgbHZmIG91dHB1dCB0cmFuc2Zvcm1pbmcgJ1wnIHRvICcvJyBzbyBnZXQgY29tbWFuZCB3b3JrcyBhcHByb3ByaWF0ZWx5Ci0gICAgICAgICAgICBtYXNzYWdlUENMSSh0bXAsIHRtcDIpOwotCi0gICAgICAgICAgICAvLyBMYXVuY2ggZ2V0IG9uIG91dHB1dCBjYXB0dXJlZCBmcm9tIFBDTEkgbHZmCi0gICAgICAgICAgICBjb21tYW5kTGluZS5jbGVhckFyZ3MoKTsKLSAgICAgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0RXhlY3V0YWJsZShHRVRfRVhFKSk7Ci0KLSAgICAgICAgICAgIGlmKGdldEZvcmNlKCkhPW51bGwgJiYgZ2V0Rm9yY2UoKS5lcXVhbHMoInllcyIpKQotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ZIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLU4iKTsKLQotICAgICAgICAgICAgaWYoZ2V0UHJvbW90aW9uZ3JvdXAoKSE9bnVsbCkKLSAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItRyIrZ2V0UHJvbW90aW9uZ3JvdXAoKSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihnZXRMYWJlbCgpIT1udWxsKQotICAgICAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItciIrZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh1cGRhdGVPbmx5KSB7Ci0gICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiQCIrdG1wMi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBsb2coIkdldHRpbmcgZmlsZXMiLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgIGxvZygiRXhlY3V0aW5nICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJ1bkNtZChjb21tYW5kTGluZSwgbmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcyxQcm9qZWN0Lk1TR19JTkZPLCBQcm9qZWN0Lk1TR19XQVJOKSk7Ci0gICAgICAgICAgICBpZiAoIHJlc3VsdCAhPSAwICYmICFpZ25vcmVyYykgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCkgKyAiLiBSZXR1cm4gY29kZSB3YXMgIityZXN1bHQ7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2goRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCkgKyAiLiBFeGNlcHRpb246ICIrZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLGxvY2F0aW9uKTsKLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpICsgIi4gRXhjZXB0aW9uOiAiK2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyxsb2NhdGlvbik7Ci0gICAgICAgIH0gY2F0Y2goUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKSArICIuIEV4Y2VwdGlvbjogIitlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csbG9jYXRpb24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG1wLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRtcDIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRtcDIuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGZpbGUgYW5kIGNyZWF0ZXMgdGhlIGZvbGRlcnMgc3BlY2lmaWVkIGluIHRoZSBvdXRwdXQgc2VjdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGb2xkZXJzKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLSAgICAgICAgTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KCJ7MH0tYXJjKHsxfSkiKTsKLSAgICAgICAgU3RyaW5nIGxpbmUgPSBpbi5yZWFkTGluZSgpOwotICAgICAgICB3aGlsZShsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZygiQ29uc2lkZXJpbmcgXCIiK2xpbmUrIlwiIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBpZihsaW5lLnN0YXJ0c1dpdGgoIlwiXFwiKSB8fCBsaW5lLnN0YXJ0c1dpdGgoIlwiLyIpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gb2JqcyA9IG1mLnBhcnNlKGxpbmUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmID0gKFN0cmluZylvYmpzWzFdOwotICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBmcm9tIHRoZSBmaWxlbmFtZQotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGYubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoZi5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIWRpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDcmVhdGluZyAiK2Rpci5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihkaXIubWtkaXJzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkNyZWF0ZWQgIitkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkZhaWxlZCB0byBjcmVhdGUgIitkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZXhpc3RzLiBTa2lwcGluZyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJGaWxlIHNlcGFyYXRvciBwcm9ibGVtIHdpdGggIiArIGxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIlNraXBwZWQgXCIiK2xpbmUrIlwiIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsaW5lID0gaW4ucmVhZExpbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBoYWNrIHRvIGhhbmRsZSB0aGUgUFZDUyBjb21tYW5kLWxpbmUgdG9vbHMgYm90Y2ggd2hlbiBoYW5kbGluZyBVTkMgbm90YXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1hc3NhZ2VQQ0xJKEZpbGUgaW4sIEZpbGUgb3V0KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaW4pKTsKLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0V3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKG91dCkpOwotICAgICAgICBTdHJpbmcgcyA9IG51bGw7Ci0gICAgICAgIHdoaWxlICgocyA9IGluUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzTm9ybWFsID0gcy5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgICAgICBvdXRXcml0ZXIud3JpdGUoc05vcm1hbCk7Ci0gICAgICAgICAgICBvdXRXcml0ZXIubmV3TGluZSgpOwotICAgICAgICB9Ci0gICAgICAgIGluUmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIG91dFdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBuZXR3b3JrIG5hbWUgb2YgdGhlIFBWQ1MgcmVwb3NpdG9yeQotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5KCkgewotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgdGhlIG5ldHdvcmsgbmFtZSBvZiB0aGUgUFZDUyByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHJlcG8gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeShTdHJpbmcgcmVwbykgewotICAgICAgICByZXBvc2l0b3J5ID0gcmVwbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiB0aGUgUFZDUyByZXBvc2l0b3J5Ci0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB2Y3Nwcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHZjc1Byb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGluIHRoZSBQVkNTIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gcHJqIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFB2Y3Nwcm9qZWN0KFN0cmluZyBwcmopIHsKLSAgICAgICAgcHZjc1Byb2plY3QgPSBwcmo7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG5hbWUgb2YgdGhlIHByb2plY3QgaW4gdGhlIFBWQ1MgcmVwb3NpdG9yeQotICAgICAqIEByZXR1cm4gVmVjdG9yCi0gICAgICovCi0gICAgcHVibGljIFZlY3RvciBnZXRQdmNzcHJvamVjdHMoKSB7Ci0gICAgICAgIHJldHVybiBwdmNzUHJvamVjdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG5hbWUgb2YgdGhlIHdvcmtzcGFjZSB0byBzdG9yZSB0aGUgcmV0cmlldmVkIGZpbGVzCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdvcmtzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHdvcmtzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHdvcmtzcGFjZSB0byBzdG9yZSByZXRyaWV2ZWQgZmlsZXMKLSAgICAgKiBAcGFyYW0gd3MgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V29ya3NwYWNlKFN0cmluZyB3cykgewotICAgICAgICB3b3Jrc3BhY2UgPSB3czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmFtZSBvZiB0aGUgUFZDUyBiaW4gZGlyZWN0b3J5IAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQdmNzYmluKCkgewotICAgICAgICByZXR1cm4gcHZjc2JpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBQVkNTIGJpbiBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gd3MgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHZjc2JpbihTdHJpbmcgYmluKSB7Ci0gICAgICAgIHB2Y3NiaW4gPSBiaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHZhbHVlIG9mIGZvcmNlCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcmNlKCkgewotICAgICAgICByZXR1cm4gZm9yY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgZm9yY2UgYXJndW1lbnQKLSAgICAgKiBAcGFyYW0gcmVwbyBTdHJpbmcgKHllcy9ubykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZShTdHJpbmcgZikgewotICAgICAgICBpZihmIT1udWxsICYmIGYuZXF1YWxzSWdub3JlQ2FzZSgieWVzIikpCi0gICAgICAgICAgICBmb3JjZT0ieWVzIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZm9yY2UgPSAibm8iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB2YWx1ZSBvZiBwcm9tb3Rpb25ncm91cAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9tb3Rpb25ncm91cCgpIHsKLSAgICAgICAgcmV0dXJuIHByb21vdGlvbmdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJvbW90aW9uZ3JvdXAgYXJndW1lbnQKLSAgICAgKiBAcGFyYW0gcmVwbyBTdHJpbmcgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvbW90aW9uZ3JvdXAoU3RyaW5nIHcpIHsKLSAgICAgICAgcHJvbW90aW9uZ3JvdXA9dzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdmFsdWUgb2YgbGFiZWwKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGxhYmVsIGFyZ3VtZW50Ci0gICAgICogQHBhcmFtIHJlcG8gU3RyaW5nIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsKSB7Ci0gICAgICAgIGxhYmVsPWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHZhbHVlIG9mIGlnbm9yZXJldHVybmNvZGUKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldElnbm9yZVJldHVybkNvZGUoKSB7Ci0gICAgICAgIHJldHVybiBpZ25vcmVyYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gZXhlY3V0aW5nIHRoZSBwdmNzIAotICAgICAqIGNvbW1hbmRzIGFyZSBpZ25vcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZVJldHVybkNvZGUoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGlnbm9yZXJjID0gYjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBoYW5kbGVzICZsdDtwdmNzcHJvamVjdCZndDsgc3ViZWxlbWVudHMKLSAgICAgKiBAcGFyYW0gUHZjc1Byb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQdmNzcHJvamVjdChQdmNzUHJvamVjdCBwKSB7Ci0gICAgICAgIHB2Y3NQcm9qZWN0cy5hZGRFbGVtZW50KHApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFVwZGF0ZU9ubHkoKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGVPbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHNldCB0byB0cnVlIGZpbGVzIGFyZSBnb3R0ZW4gb25seSBpZiBuZXdlcgotICAgICAqIHRoYW4gZXhpc3RpbmcgbG9jYWwgZmlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXBkYXRlT25seShib29sZWFuIGwpIHsKLSAgICAgICAgdXBkYXRlT25seSA9IGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFB2Y3Mgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFB2Y3MoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHB2Y3NQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgcHZjc1Byb2plY3RzID0gbmV3IFZlY3RvcigpOwotICAgICAgICB3b3Jrc3BhY2UgPSBudWxsOwotICAgICAgICByZXBvc2l0b3J5ID0gbnVsbDsKLSAgICAgICAgcHZjc2JpbiA9IG51bGw7Ci0gICAgICAgIGZvcmNlPW51bGw7Ci0gICAgICAgIHByb21vdGlvbmdyb3VwPW51bGw7Ci0gICAgICAgIGxhYmVsPW51bGw7Ci0gICAgICAgIGlnbm9yZXJjPWZhbHNlOwotICAgICAgICB1cGRhdGVPbmx5ID0gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzUHJvamVjdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2ViNWI4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MvUHZjc1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucHZjczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci0KLS8qKgotICogY2xhc3MgdG8gaGFuZGxlICZsdDtwdmNzcHJvamVjJmd0OyBlbGVtZW50cwotICovCi1wdWJsaWMgY2xhc3MgUHZjc1Byb2plY3QgewotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgcHVibGljIFB2Y3NQcm9qZWN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFB2Y3NQcm9qZWN0LnRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NtL0FudFN0YXJUZWFtQ2hlY2tPdXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjbS9BbnRTdGFyVGVhbUNoZWNrT3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMTFiMjUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NtL0FudFN0YXJUZWFtQ2hlY2tPdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MjAgKzAsMCBAQAotLyogCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zY207IAotIAotaW1wb3J0IGNvbS5zdGFyYmFzZS5zdGFydGVhbS4qOwotaW1wb3J0IGNvbS5zdGFyYmFzZS51dGlsLlBsYXRmb3JtOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi0vKioKLSAqIENoZWNrcyBvdXQgZmlsZXMgZnJvbSBhIHNwZWNpZmljIFN0YXJUZWFtIHNlcnZlciwgcHJvamVjdCwgdmlldywgYW5kCi0gKiBmb2xkZXIuCi0gKiA8QlI+PEJSPgotICogVGhpcyBwcm9ncmFtIGxvZ3MgaW4gdG8gYSBTdGFyVGVhbSBzZXJ2ZXIgYW5kIG9wZW5zIHVwIHRoZSBzcGVjaWZpZWQKLSAqIHByb2plY3QgYW5kIHZpZXcuICBUaGVuLCBpdCBzZWFyY2hlcyB0aHJvdWdoIHRoYXQgdmlldyBmb3IgdGhlIGdpdmVuCi0gKiBmb2xkZXIgKG9yLCBpZiB5b3UgcHJlZmVyLCBpdCB1c2VzIHRoZSByb290IGZvbGRlcikuICBCZWdpbm5pbmcgd2l0aAotICogdGhhdCBmb2xkZXIgYW5kIG9wdGlvbmFsbHkgY29udGludWluZyByZWN1cnNpdmVzbHksIEFudFN0YXJUZWFtQ2hlY2tPdXQKLSAqIGNvbXBhcmVzIGVhY2ggZmlsZSB3aXRoIHlvdXIgaW5jbHVkZSBhbmQgZXhjbHVkZSBmaWx0ZXJzIGFuZCBjaGVja3MgaXQKLSAqIG91dCBvbmx5IGlmIGFwcHJvcHJpYXRlLgotICogPEJSPjxCUj4KLSAqIENoZWNrZWQgb3V0IGZpbGVzIGdvIHRvIGEgZGlyZWN0b3J5IHlvdSBzcGVjaWZ5IHVuZGVyIHRoZSBzdWJmb2xkZXIKLSAqIG5hbWVkIGZvciB0aGUgZGVmYXVsdCBTdGFyVGVhbSBwYXRoIHRvIHRoZSB2aWV3LiAgVGhhdCBpcywgaWYgeW91Ci0gKiBlbnRlcmVkIC9ob21lL2Nwb3Zpcmsvd29yayBhcyB0aGUgdGFyZ2V0IGZvbGRlciwgeW91ciBwcm9qZWN0IHdhcyBuYW1lZAotICogIk91clByb2plY3QsIiB0aGUgZ2l2ZW4gdmlldyB3YXMgbmFtZWQgIlRlc3RWaWV3LCIgYW5kIHRoYXQgdmlldyBpcwotICogc3RvcmVkIGJ5IGRlZmF1bHQgYXQgIkM6XHByb2plY3RzXFRlc3QsIiB5b3VyIGZpbGVzIHdvdWxkIGJlIGNoZWNrZWQKLSAqIG91dCB0byAvaG9tZS9jcG92aXJrL3dvcmsvVGVzdC4iICBJIGF2b2lkZWQgdXNpbmcgdGhlIHByb2plY3QgbmFtZSBpbgotICogdGhlIHBhdGggYmVjYXVzZSB5b3UgbWF5IHdhbnQgdG8ga2VlcCBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSBzYW1lCi0gKiBwcm9qZWN0IG9uIHlvdXIgY29tcHV0ZXIsIGFuZCBJIGRpZG4ndCB3YW50IHRvIHVzZSB0aGUgdmlldyBuYW1lLCBhcwotICogdGhlcmUgbWF5IGJlIG1hbnkgIlRlc3QiIG9yICJWZXJzaW9uIDEuMCIgdmlld3MsIGZvciBleGFtcGxlLiAgVGhpcwotICogc3lzdGVtJ3Mgc3VjY2Vzcywgb2YgY291cnNlLCBkZXBlbmRzIG9uIHdoYXQgeW91IHNldCB0aGUgZGVmYXVsdCBwYXRoCi0gKiB0byBpbiBTdGFyVGVhbS4KLSAqIDxCUj48QlI+Ci0gKiBZb3UgY2FuIHNldCBBbnRTdGFyVGVhbUNoZWNrT3V0IHRvIHZlcmJvc2Ugb3IgcXVpZXQgbW9kZS4gIEFsc28sIGl0IGhhcwotICogYSBzYWZlZ3VhcmQgYWdhaW5zdCBvdmVyd3JpdGluZyB0aGUgZmlsZXMgb24geW91ciBjb21wdXRlcjogIElmIHRoZQotICogdGFyZ2V0IGRpcmVjdG9yeSB5b3Ugc3BlY2lmeSBhbHJlYWR5IGV4aXN0cywgdGhlIHByb2dyYW0gd2lsbCB0aHJvdyBhCi0gKiBCdWlsZEV4Y2VwdGlvbi4gIFRvIG92ZXJyaWRlIHRoZSBleGNlcHRpb24sIHNldCA8Q09ERT5mb3JjZTwvQ09ERT4gdG8KLSAqIHRydWUuCi0gKiA8QlI+PEJSPgotICogPEI+VGhpcyBwcm9ncmFtIG1ha2VzIHVzZSBvZiBmdW5jdGlvbnMgZnJvbSB0aGUgU3RhclRlYW0gQVBJLiAgQXMgYSByZXN1bHQKLSAqIEFudFN0YXJUZWFtQ2hlY2tPdXQgaXMgYXZhaWxhYmxlIG9ubHkgdG8gbGljZW5zZWQgdXNlcnMgb2YgU3RhclRlYW0gYW5kCi0gKiByZXF1aXJlcyB0aGUgU3RhclRlYW0gU0RLIHRvIGZ1bmN0aW9uLiAgWW91IG11c3QgaGF2ZQotICogPENPREU+c3RhcnRlYW0tc2RrLmphcjwvQ09ERT4gaW4geW91ciBjbGFzc3BhdGggdG8gcnVuIHRoaXMgcHJvZ3JhbS4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBTdGFyVGVhbSBBUEkgYW5kIGhvdyB0byBsaWNlbnNlIGl0LCBzZWUKLSAqIHRoZSBsaW5rIGJlbG93LjwvQj4KLSAqCi0gKiBAYXV0aG9yIDxBIEhSRUY9Im1haWx0bzpjaHJpcy5wb3ZpcmtAcGF5dGVjLmNvbSI+Q2hyaXMgUG92aXJrPC9BPgotICogQGF1dGhvciA8QSBIUkVGPSJtYWlsdG86amMubWFubkBwYXl0ZWMuY29tIj5KQyBNYW5uPC9BPgotICogQGF1dGhvciA8QSBIUkVGPSJtYWlsdG86amVmZi5nZXR0bGVAcGF5dGVjLmNvbSI+SmVmZiBHZXR0bGU8L0E+Ci0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzZWUgPEEgSFJFRj0iaHR0cDovL3d3dy5zdGFyYmFzZS5jb20vIj5TdGFyQmFzZSBXZWIgU2l0ZTwvQT4KLSAqLwotcHVibGljIGNsYXNzIEFudFN0YXJUZWFtQ2hlY2tPdXQgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrIAotewotICAgIC8qKgotICAgICAqIEJ5IGRlZmF1bHQsIDxDT0RFPmZvcmNlPC9DT0RFPiBpcyBzZXQgdG8gImZhbHNlIiB0aHJvdWdoIHRoaXMgZmllbGQuCi0gICAgICogSWYgeW91IHNldCA8Q09ERT5mb3JjZTwvQ09ERT4gdG8gInRydWUsIiBBbnRTdGFyVGVhbUNoZWNrT3V0IHdpbGwKLSAgICAgKiBvdmVyd3JpdGUgZmlsZXMgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkuIElmIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMKLSAgICAgKiBub3QgZXhpc3QsIHRoZSA8Q09ERT5mb3JjZTwvQ09ERT4gc2V0dGluZyBkb2VzIG5vdGhpbmcuIE5vdGUgdGhhdAotICAgICAqIDxDT0RFPkRFRkFVTFRfRk9SQ0VTRVRUSU5HPC9DT0RFPiBhbmQgPENPREU+Zm9yY2U8L0NPREU+IGFyZSBzdHJpbmdzLAotICAgICAqIG5vdCBib29sZWFuIHZhbHVlcy4gU2VlIHRoZSBsaW5rcyBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRGb3JjZSgpCi0gICAgICogQHNlZSAjZ2V0Rm9yY2VBc0Jvb2xlYW4oKQotICAgICAqIEBzZWUgI3NldEZvcmNlKFN0cmluZyBmb3JjZSkKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPUkNFU0VUVElORyA9ICJmYWxzZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgaW4gc2V0dGluZyA8Q09ERT52ZXJib3NlPC9DT0RFPiB0byAiZmFsc2UiLCB0aGUKLSAgICAgKiBkZWZhdWx0LiBJZiA8Q09ERT52ZXJib3NlPC9DT0RFPiBpcyB0cnVlLCBBbnRTdGFyVGVhbUNoZWNrT3V0IHdpbGwKLSAgICAgKiBkaXNwbGF5IGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyBhcyBpdCBjaGVja3MgZmlsZXMgb3V0LiBUaGUgZGVmYXVsdAotICAgICAqIHNldHRpbmcgZGlzcGxheXMgb25seSBhIHRvdGFsLiBOb3RlIHRoYXQKLSAgICAgKiA8Q09ERT5ERUZBVUxUX1ZFUkJPU0VTRVRUSU5HPC9DT0RFPiBhbmQgPENPREU+dmVyYm9zZTwvQ09ERT4gYXJlCi0gICAgICogc3RyaW5ncywgbm90IGJvb2xlYW4gdmFsdWVzLiBTZWUgdGhlIGxpbmtzIGJlbG93IGZvciBtb3JlCi0gICAgICogaW5mb3JtYXRpb24uCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0VmVyYm9zZSgpCi0gICAgICogQHNlZSAjZ2V0VmVyYm9zZUFzQm9vbGVhbigpCi0gICAgICogQHNlZSAjc2V0VmVyYm9zZShTdHJpbmcgdmVyYm9zZSkKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZFUkJPU0VTRVRUSU5HID0gImZhbHNlIjsKLQotICAgIC8qKgotICAgICAqIDxDT0RFPkRFRkFVTFRfUkVDVVJTSU9OU0VUVElORzwvQ09ERT4gY29udGFpbnMgdGhlIG5vcm1hbCBzZXR0aW5nIC0tCi0gICAgICogdHJ1ZSAtLSBmb3IgcmVjdXJzaW9uLiAgVGh1cywgaWYgeW91IGRvIG5vdAotICAgICAqIDxDT0RFPnNldFJlY3Vyc2lvbigiZmFsc2UiKTwvQ09ERT4gc29tZXdoZXJlIGluIHlvdXIgcHJvZ3JhbSwKLSAgICAgKiBBbnRTdGFyVGVhbUNoZWNrT3V0IHdpbGwgY2hlY2sgZmlsZXMgb3V0IGZyb20gYWxsIHN1YmZvbGRlcnMgYXMgd2VsbAotICAgICAqIGFzIGZyb20gdGhlIGdpdmVuIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRSZWN1cnNpb24oKQotICAgICAqIEBzZWUgI3NldFJlY3Vyc2lvbihTdHJpbmcgcmVjdXJzaW9uKQotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVDVVJTSU9OU0VUVElORyA9ICJ0cnVlIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY29uc3RhbnQgc2V0cyB0aGUgZmlsdGVyIHRvIGluY2x1ZGUgYWxsIGZpbGVzLiBUaGlzIGRlZmF1bHQgaGFzCi0gICAgICogdGhlIHNhbWUgcmVzdWx0IGFzIDxDT0RFPnNldEluY2x1ZGVzKCIqIik8L0NPREU+LgotICAgICAqIAotICAgICAqIEBzZWUgI2dldEluY2x1ZGVzKCkKLSAgICAgKiBAc2VlICNzZXRJbmNsdWRlcyhTdHJpbmcgaW5jbHVkZXMpCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTkNMVURFU0VUVElORyA9ICIqIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgZGlzYWJsZXMgdGhlIGV4Y2x1ZGUgZmlsdGVyIGJ5IGRlZmF1bHQuIEluIG90aGVyIHdvcmRzLCBubyBmaWxlcwotICAgICAqIGFyZSBleGNsdWRlZC4gVGhpcyBzZXR0aW5nIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgKiA8Q09ERT5zZXRFeGNsdWRlcyhudWxsKTwvQ09ERT4uCi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0RXhjbHVkZXMoKQotICAgICAqIEBzZWUgI3NldEV4Y2x1ZGVzKFN0cmluZyBleGNsdWRlcykKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYQ0xVREVTRVRUSU5HID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGZvbGRlciB0byBzZWFyY2g7IHRoZSByb290IGZvbGRlci4gIFNpbmNlCi0gICAgICogQW50U3RhclRlYW1DaGVja091dCBzZWFyY2hlcyBzdWJmb2xkZXJzLCBieSBkZWZhdWx0IGl0IHByb2Nlc3NlcyBhbgotICAgICAqIGVudGlyZSB2aWV3LgotICAgICAqIAotICAgICAqIEBzZWUgI2dldEZvbGRlck5hbWUoKQotICAgICAqIEBzZWUgI3NldEZvbGRlck5hbWUoU3RyaW5nIGZvbGRlck5hbWUpCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GT0xERVJTRVRUSU5HID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIG91dHB1dC4gVGhlIGRpcmVjdG9yeSBuYW1lIGlzCi0gICAgICogZGlzcGxheWVkIG9ubHkgd2hlbiBpdCBjaGFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgRm9sZGVyIHByZXZGb2xkZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBmaWVsZCBrZWVwcyBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGZpbGVzIGNoZWNrZWQgb3V0LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNoZWNrZWRPdXQ7Ci0KLSAgICAvLyBDaGFuZ2UgdGhlc2UgdGhyb3VnaCB0aGVpciBHRVQgYW5kIFNFVCBtZXRob2RzLgotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIgeW91IHdpc2ggdG8gY29ubmVjdCB0by4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJOYW1lID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBwb3J0IG9uIHRoZSBzZXJ2ZXIgdXNlZCBmb3IgU3RhclRlYW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyUG9ydCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB5b3VyIHByb2plY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGZvbGRlciB5b3Ugd2FudCB0byBjaGVjayBvdXQgZmlsZXMgZnJvbS4gQWxsCi0gICAgICogc3ViZm9sZGVycyB3aWxsIGJlIHNlYXJjaGVkLCBhcyB3ZWxsLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZvbGRlck5hbWUgPSBERUZBVUxUX0ZPTERFUlNFVFRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmlldyB0aGF0IHRoZSBmaWxlcyB5b3Ugd2FudCBhcmUgaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlld05hbWUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogWW91ciB1c2VybmFtZSBvbiB0aGUgU3RhclRlYW0gc2VydmVyLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFlvdXIgU3RhclRlYW0gcGFzc3dvcmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhdGggdG8gdGhlIHJvb3QgZm9sZGVyIHlvdSB3YW50IHRvIGNoZWNrIG91dCB0by4gVGhpcyBpcyBhIGxvY2FsCi0gICAgICogZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldEZvbGRlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBJZiBmb3JjZSBzZXQgdG8gdHJ1ZSwgQW50U3RhclRlYW1DaGVja091dCB3aWxsIG92ZXJ3cml0ZSBmaWxlcyBpbiB0aGUKLSAgICAgKiB0YXJnZXQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZvcmNlID0gREVGQVVMVF9GT1JDRVNFVFRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHZlcmJvc2UgaXMgdHJ1ZSwgdGhlIHByb2dyYW0gd2lsbCBkaXNwbGF5IGFsbCBmaWxlcyBhbmQKLSAgICAgKiBkaXJlY3RvcmllcyBhcyB0aGV5IGFyZSBjaGVja2VkIG91dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB2ZXJib3NlID0gREVGQVVMVF9WRVJCT1NFU0VUVElORzsKLQotICAgIC8qKgotICAgICAqIFNldCByZWN1cnNpb24gdG8gZmFsc2UgdG8gY2hlY2sgb3V0IGZpbGVzIGluIG9ubHkgdGhlIGdpdmVuIGZvbGRlcgotICAgICAqIGFuZCBub3QgaW4gaXRzIHN1YmZvbGRlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVjdXJzaW9uID0gREVGQVVMVF9SRUNVUlNJT05TRVRUSU5HOwotCi0gICAgLy8gVGhlc2UgZmllbGRzIGRlYWwgd2l0aCBpbmNsdWRlcyBhbmQgZXhjbHVkZXMKLQotICAgIC8qKgotICAgICAqIEFsbCBmaWxlcyB0aGF0IGZpdCB0aGlzIHBhdHRlcm4gYXJlIGNoZWNrZWQgb3V0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGluY2x1ZGVzID0gREVGQVVMVF9JTkNMVURFU0VUVElORzsKLQotICAgIC8qKgotICAgICAqIEFsbCBmaWxlcyBmaXR0aW5nIHRoaXMgcGF0dGVybiBhcmUgaWdub3JlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBleGNsdWRlcyA9IERFRkFVTFRfRVhDTFVERVNFVFRJTkc7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGUgZGVsaW1pdG9yIG9uIHRoZSB1c2VyJ3Mgc3lzdGVtLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlbGltID0gUGxhdGZvcm0uZ2V0RmlsZVBhdGhEZWxpbSgpOwotICAgIAotICAgIC8qKgotICAgICAqIERvIHRoZSBleGVjdXRpb24uCi0gICAgICogCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIGFsbCBvZiB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSByZXF1aXJlZC4KLSAgICAgICAgaWYgKCBnZXRTZXJ2ZXJOYW1lKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2plY3QubG9nKCJTZXJ2ZXJOYW1lIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBnZXRTZXJ2ZXJQb3J0KCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2plY3QubG9nKCJTZXJ2ZXJQb3J0IG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBnZXRQcm9qZWN0TmFtZSgpID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZygiUHJvamVjdE5hbWUgbXVzdCBub3QgYmUgbnVsbC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGdldFZpZXdOYW1lKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2plY3QubG9nKCJWaWV3TmFtZSBtdXN0IG5vdCBiZSBudWxsLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICggZ2V0VXNlcm5hbWUoKSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdC5sb2coIlVzZXJuYW1lIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBnZXRQYXNzd29yZCgpID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZygiUGFzc3dvcmQgbXVzdCBub3QgYmUgbnVsbC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGdldFRhcmdldEZvbGRlcigpID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZygiVGFyZ2V0Rm9sZGVyIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSB3YXkgSSBjcmVhdGUgdGhlIGZ1bGwgdGFyZ2V0IHBhdGgsIHRoZXJlCi0gICAgICAgIC8vIG11c3QgYmUgTk8gc2xhc2ggYXQgdGhlIGVuZCBvZiB0YXJnZXRGb2xkZXIgYW5kIGZvbGRlck5hbWUKLSAgICAgICAgLy8gSG93ZXZlciwgaWYgdGhlIHNsYXNoIG9yIGJhY2tzbGFzaCBpcyB0aGUgb25seSBjaGFyYWN0ZXIsIGxlYXZlIGl0IGFsb25lCi0gICAgICAgIGlmIChudWxsICE9IGdldFRhcmdldEZvbGRlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGdldFRhcmdldEZvbGRlcigpLmVuZHNXaXRoKCIvIikgfHwgCi0gICAgICAgICAgICAgICAgIGdldFRhcmdldEZvbGRlcigpLmVuZHNXaXRoKCJcXCIpKSAmJiBnZXRUYXJnZXRGb2xkZXIoKS5sZW5ndGgoKSA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0VGFyZ2V0Rm9sZGVyKGdldFRhcmdldEZvbGRlcigpLnN1YnN0cmluZygwLCBnZXRUYXJnZXRGb2xkZXIoKS5sZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbnVsbCAhPSBnZXRGb2xkZXJOYW1lKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGdldEZvbGRlck5hbWUoKS5lbmRzV2l0aCgiLyIpIHx8IAotICAgICAgICAgICAgICAgICBnZXRGb2xkZXJOYW1lKCkuZW5kc1dpdGgoIlxcIikpICYmIGdldEZvbGRlck5hbWUoKS5sZW5ndGgoKSA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0Rm9sZGVyTmFtZShnZXRGb2xkZXJOYW1lKCkuc3Vic3RyaW5nKDAsIGdldEZvbGRlck5hbWUoKS5sZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBleGlzdHMuCi0gICAgICAgIGphdmEuaW8uRmlsZSBkaXJFeGlzdCA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0VGFyZ2V0Rm9sZGVyKCkpOwotICAgICAgICBpZiAoZGlyRXhpc3QuaXNEaXJlY3RvcnkoKSAmJiAhZ2V0Rm9yY2VBc0Jvb2xlYW4oKSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdC5sb2coICJUYXJnZXQgZGlyZWN0b3J5IGV4aXN0cy4gU2V0IFwiZm9yY2VcIiB0byBcInRydWVcIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAidG8gY29udGludWUgYW55d2F5LiIgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb25uZWN0IHRvIHRoZSBTdGFyVGVhbSBzZXJ2ZXIsIGFuZCBsb2cgb24uCi0gICAgICAgICAgICBTZXJ2ZXIgcyA9IGdldFNlcnZlcigpOwotCi0gICAgICAgICAgICAvLyBTZWFyY2ggdGhlIGl0ZW1zIG9uIHRoaXMgc2VydmVyLgotICAgICAgICAgICAgcnVuU2VydmVyKHMpOwotCi0gICAgICAgICAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIHNlcnZlci4KLSAgICAgICAgICAgIHMuZGlzY29ubmVjdCgpOwotCi0gICAgICAgICAgICAvLyBhZnRlciB5b3UgYXJlIGFsbCBvZiB0aGUgcHJvcGVydGllcyBhcmUgb2ssIGRvIHlvdXIgdGhpbmcKLSAgICAgICAgICAgIC8vIHdpdGggU3RhclRlYW0uICBJZiB0aGVyZSBhcmUgYW55IGtpbmQgb2YgZXhjZXB0aW9ucyB0aGVuCi0gICAgICAgICAgICAvLyBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBwcm9qZWN0IGxvZy4KLQotICAgICAgICAgICAgLy8gVGVsbCBob3cgbWFueSBmaWxlcyB3ZXJlIGNoZWNrZWQgb3V0LgotICAgICAgICAgICAgcHJvamVjdC5sb2coY2hlY2tlZE91dCArICIgZmlsZXMgY2hlY2tlZCBvdXQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZygiICAgICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCBsb2dzIGluIHRvIGEgU3RhclRlYW0gc2VydmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBTdGFyVGVhbSBzZXJ2ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNlcnZlciBnZXRTZXJ2ZXIoKQotICAgIHsKLSAgICAgICAgLy8gU2ltcGxlc3QgY29uc3RydWN0b3IsIHVzZXMgZGVmYXVsdCBlbmNyeXB0aW9uIGFsZ29yaXRobSBhbmQgY29tcHJlc3Npb24gbGV2ZWwuCi0gICAgICAgIFNlcnZlciBzID0gbmV3IFNlcnZlcihnZXRTZXJ2ZXJOYW1lKCksIGdldFNlcnZlclBvcnRBc0ludCgpKTsKLQotICAgICAgICAvLyBPcHRpb25hbDsgbG9nT24oKSBjb25uZWN0cyBpZiBuZWNlc3NhcnkuCi0gICAgICAgIHMuY29ubmVjdCgpOwotCi0gICAgICAgIC8vIExvZ29uIHVzaW5nIHNwZWNpZmllZCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLgotICAgICAgICBzLmxvZ09uKGdldFVzZXJuYW1lKCksIGdldFBhc3N3b3JkKCkpOwotCi0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3Qgb24gdGhlIHNlcnZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyAgICAgIEEgU3RhclRlYW0gc2VydmVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJ1blNlcnZlcihTZXJ2ZXIgcykKLSAgICB7Ci0gICAgICAgIGNvbS5zdGFyYmFzZS5zdGFydGVhbS5Qcm9qZWN0W10gcHJvamVjdHMgPSBzLmdldFByb2plY3RzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbS5zdGFyYmFzZS5zdGFydGVhbS5Qcm9qZWN0IHAgPSBwcm9qZWN0c1tpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHAuZ2V0TmFtZSgpLmVxdWFscyhnZXRQcm9qZWN0TmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0VmVyYm9zZUFzQm9vbGVhbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIkZvdW5kICIgKyBnZXRQcm9qZWN0TmFtZSgpICsgZGVsaW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBydW5Qcm9qZWN0KHMsIHApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgZm9yIHRoZSBnaXZlbiB2aWV3IGluIHRoZSBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzICAgICAgQSBTdGFyVGVhbSBzZXJ2ZXIuCi0gICAgICogQHBhcmFtIHAgICAgICBBIHZhbGlkIHByb2plY3Qgb24gdGhlIGdpdmVuIHNlcnZlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5Qcm9qZWN0KFNlcnZlciBzLCBjb20uc3RhcmJhc2Uuc3RhcnRlYW0uUHJvamVjdCBwKQotICAgIHsKLSAgICAgICAgVmlld1tdIHZpZXdzID0gcC5nZXRWaWV3cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZpZXdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWaWV3IHYgPSB2aWV3c1tpXTsKLSAgICAgICAgICAgIGlmICh2LmdldE5hbWUoKS5lcXVhbHMoZ2V0Vmlld05hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFZlcmJvc2VBc0Jvb2xlYW4oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJGb3VuZCAiICsgZ2V0UHJvamVjdE5hbWUoKSArIGRlbGltICsgZ2V0Vmlld05hbWUoKSArIGRlbGltKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcnVuVHlwZShzLCBwLCB2LCBzLnR5cGVGb3JOYW1lKChTdHJpbmcpcy5nZXRUeXBlTmFtZXMoKS5GSUxFKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gdmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyAgICAgIEEgU3RhclRlYW0gc2VydmVyLgotICAgICAqIEBwYXJhbSBwICAgICAgQSB2YWxpZCBwcm9qZWN0IG9uIHRoZSBzZXJ2ZXIuCi0gICAgICogQHBhcmFtIHYgICAgICBBIHZpZXcgbmFtZSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gdCAgICAgIEFuIGl0ZW0gdHlwZSB3aGljaCBpcyBjdXJyZW50bHkgYWx3YXlzICJmaWxlIi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5UeXBlKFNlcnZlciBzLCBjb20uc3RhcmJhc2Uuc3RhcnRlYW0uUHJvamVjdCBwLCBWaWV3IHYsIFR5cGUgdCkKLSAgICB7Ci0gICAgICAgIC8vIFRoaXMgaXMgdWdseTsgY2hlY2tpbmcgZm9yIHRoZSByb290IGZvbGRlci4KLSAgICAgICAgRm9sZGVyIGYgPSB2LmdldFJvb3RGb2xkZXIoKTsKLSAgICAgICAgaWYgKCEoZ2V0Rm9sZGVyTmFtZSgpPT1udWxsKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdldEZvbGRlck5hbWUoKS5lcXVhbHMoIlxcIikgfHwgZ2V0Rm9sZGVyTmFtZSgpLmVxdWFscygiLyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldEZvbGRlck5hbWUobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZiA9IFN0YXJUZWFtRmluZGVyLmZpbmRGb2xkZXIodi5nZXRSb290Rm9sZGVyKCksIGdldEZvbGRlck5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0VmVyYm9zZUFzQm9vbGVhbigpICYmICEoZ2V0Rm9sZGVyTmFtZSgpPT1udWxsKSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdC5sb2coICJGb3VuZCAiICsgZ2V0UHJvamVjdE5hbWUoKSArIGRlbGltICsgZ2V0Vmlld05hbWUoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltICsgZ2V0Rm9sZGVyTmFtZSgpICsgZGVsaW0gKyAiXG4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgaXQgaXMgaW1wb3J0YW50IHRvIHByZS1mZXRjaCBhbGwgdGhlCi0gICAgICAgIC8vIHByb3BlcnRpZXMgd2UnbGwgbmVlZCBmb3IgYWxsIHRoZSBpdGVtcyB3ZSdsbCBiZSBzZWFyY2hpbmcuCi0KLSAgICAgICAgLy8gV2UgYWx3YXlzIGRpc3BsYXkgdGhlIEl0ZW1JRCAoT0JKRUNUX0lEKSBhbmQgcHJpbWFyeSBkZXNjcmlwdG9yLgotICAgICAgICBpbnQgblByb3BlcnRpZXMgPSAyOwotCi0gICAgICAgIC8vIFdlJ2xsIG5lZWQgdGhpcyBpdGVtIHR5cGUncyBwcmltYXJ5IGRlc2NyaXB0b3IuCi0gICAgICAgIFByb3BlcnR5IHAxID0gZ2V0UHJpbWFyeURlc2NyaXB0b3IodCk7Ci0KLSAgICAgICAgLy8gRG9lcyB0aGlzIGl0ZW0gdHlwZSBoYXZlIGEgc2Vjb25kYXJ5IGRlc2NyaXB0b3I/Ci0gICAgICAgIC8vIElmIHNvLCB3ZSdsbCBuZWVkIGl0LgotICAgICAgICBQcm9wZXJ0eSBwMiA9IGdldFNlY29uZGFyeURlc2NyaXB0b3IodCk7Ci0gICAgICAgIGlmIChwMiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBuUHJvcGVydGllcysrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93LCBidWlsZCBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgbmFtZXMuCi0gICAgICAgIFN0cmluZ1tdIHN0ck5hbWVzID0gbmV3IFN0cmluZ1tuUHJvcGVydGllc107Ci0gICAgICAgIGludCBpUHJvcGVydHkgPSAwOwotICAgICAgICBzdHJOYW1lc1tpUHJvcGVydHkrK10gPSBzLmdldFByb3BlcnR5TmFtZXMoKS5PQkpFQ1RfSUQ7Ci0gICAgICAgIHN0ck5hbWVzW2lQcm9wZXJ0eSsrXSA9IHAxLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKHAyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ck5hbWVzW2lQcm9wZXJ0eSsrXSA9IHAyLmdldE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByZS1mZXRjaCB0aGUgaXRlbSBwcm9wZXJ0aWVzIGFuZCBjYWNoZSB0aGVtLgotICAgICAgICBmLnBvcHVsYXRlTm93KHQuZ2V0TmFtZSgpLCBzdHJOYW1lcywgLTEpOwotCi0gICAgICAgIC8vIE5vdywgc2VhcmNoIGZvciBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgZm9sZGVyLgotICAgICAgICBydW5Gb2xkZXIocywgcCwgdiwgdCwgZik7Ci0KLSAgICAgICAgLy8gRnJlZSB1cCB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIGNhY2hlZCBpdGVtcy4KLSAgICAgICAgZi5kaXNjYXJkSXRlbXModC5nZXROYW1lKCksIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgZmlsZXMgaW4gdGhlIGdpdmVuIGZvbGRlci4gIFRoaXMgbWV0aG9kIGlzIHJlY3Vyc2l2ZSBhbmQKLSAgICAgKiB0aHVzIHNlYXJjaGVzIGFsbCBzdWJmb2xkZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzICAgICAgQSBTdGFyVGVhbSBzZXJ2ZXIuCi0gICAgICogQHBhcmFtIHAgICAgICBBIHZhbGlkIHByb2plY3Qgb24gdGhlIHNlcnZlci4KLSAgICAgKiBAcGFyYW0gdiAgICAgIEEgdmlldyBuYW1lIGZyb20gdGhlIHNwZWNpZmllZCBwcm9qZWN0LgotICAgICAqIEBwYXJhbSB0ICAgICAgQW4gaXRlbSB0eXBlIHdoaWNoIGlzIGN1cnJlbnRseSBhbHdheXMgImZpbGUiLgotICAgICAqIEBwYXJhbSBmICAgICAgVGhlIGZvbGRlciB0byBzZWFyY2guCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuRm9sZGVyKCBTZXJ2ZXIgcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uc3RhcmJhc2Uuc3RhcnRlYW0uUHJvamVjdCBwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sZGVyIGYgKQotICAgIHsKLSAgICAgICAgLy8gUHJvY2VzcyBhbGwgaXRlbXMgaW4gdGhpcyBmb2xkZXIuCi0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGYuZ2V0SXRlbXModC5nZXROYW1lKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBydW5JdGVtKHMsIHAsIHYsIHQsIGYsIGl0ZW1zW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgYWxsIHN1YmZvbGRlcnMgcmVjdXJzaXZlbHkgaWYgcmVjdXJzaW9uIGlzIG9uLgotICAgICAgICBpZiAoZ2V0UmVjdXJzaW9uQXNCb29sZWFuKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZvbGRlcltdIHN1YmZvbGRlcnMgPSBmLmdldFN1YkZvbGRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViZm9sZGVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBydW5Gb2xkZXIocywgcCwgdiwgdCwgc3ViZm9sZGVyc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBvdXQgb25lIGZpbGUgaWYgaXQgbWF0Y2hlcyB0aGUgaW5jbHVkZSBmaWx0ZXIgYnV0IG5vdCB0aGUKLSAgICAgKiBleGNsdWRlIGZpbHRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyAgICAgIEEgU3RhclRlYW0gc2VydmVyLgotICAgICAqIEBwYXJhbSBwICAgICAgQSB2YWxpZCBwcm9qZWN0IG9uIHRoZSBzZXJ2ZXIuCi0gICAgICogQHBhcmFtIHYgICAgICBBIHZpZXcgbmFtZSBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gdCAgICAgIEFuIGl0ZW0gdHlwZSB3aGljaCBpcyBjdXJyZW50bHkgYWx3YXlzICJmaWxlIi4KLSAgICAgKiBAcGFyYW0gZiAgICAgIFRoZSBmb2xkZXIgdGhlIGZpbGUgaXMgbG9jYWxlZCBpbi4KLSAgICAgKiBAcGFyYW0gaXRlbSAgIFRoZSBmaWxlIHRvIGNoZWNrIG91dC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5JdGVtKCBTZXJ2ZXIgcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN0YXJiYXNlLnN0YXJ0ZWFtLlByb2plY3QgcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyB2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRlciBmLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVtIGl0ZW0gKQotICAgIHsKLSAgICAgICAgLy8gR2V0IGRlc2NyaXB0b3JzIGZvciB0aGlzIGl0ZW0gdHlwZS4KLSAgICAgICAgUHJvcGVydHkgcDEgPSBnZXRQcmltYXJ5RGVzY3JpcHRvcih0KTsKLSAgICAgICAgUHJvcGVydHkgcDIgPSBnZXRTZWNvbmRhcnlEZXNjcmlwdG9yKHQpOwotCi0gICAgICAgIC8vIFRpbWUgdG8gZmlsdGVyLi4uCi0gICAgICAgIFN0cmluZyBwTmFtZSA9IChTdHJpbmcpaXRlbS5nZXQocDEuZ2V0TmFtZSgpKTsKLSAgICAgICAgYm9vbGVhbiBpbmNsdWRlSXQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBleGNsdWRlSXQgPSBmYWxzZTsKLQotICAgICAgICAvLyBTZWUgaWYgaXQgZml0cyBhbnkgaW5jbHVkZXMuCi0gICAgICAgIGlmIChnZXRJbmNsdWRlcygpIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgaW5TdHIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdldEluY2x1ZGVzKCksICIgIik7Ci0gICAgICAgICAgICB3aGlsZSAoaW5TdHIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtYXRjaChpblN0ci5uZXh0VG9rZW4oKSwgcE5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgaWYgaXQgZml0cyBhbnkgZXhjbHVkZXMuCi0gICAgICAgIGlmIChnZXRFeGNsdWRlcygpIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZXhTdHIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdldEV4Y2x1ZGVzKCksICIgIik7Ci0gICAgICAgICAgICB3aGlsZSAoZXhTdHIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtYXRjaChleFN0ci5uZXh0VG9rZW4oKSwgcE5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZUl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEb24ndCBjaGVjayBpdCBvdXQgaWYKLSAgICAgICAgLy8gKGEpIEl0IGZpdHMgbm8gaW5jbHVkZSBmaWx0ZXJzCi0gICAgICAgIC8vIChiKSBJdCBmaXRzIGFuIGV4Y2x1ZGUgZmlsdGVyCi0gICAgICAgIGlmICghaW5jbHVkZUl0IHwgZXhjbHVkZUl0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBWRVJCT1NFIE1PREUgT05MWQotICAgICAgICBpZiAoZ2V0VmVyYm9zZUFzQm9vbGVhbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTaG93IGZvbGRlciBvbmx5IGlmIGNoYW5nZWQuCi0gICAgICAgICAgICBib29sZWFuIGJTaG93SGVhZGVyID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChmICE9IHByZXZGb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBkaXNwbGF5IHRoZSBmb2xkZXIgdGhlIHNhbWUgd2F5IHlvdSB3b3VsZAotICAgICAgICAgICAgICAgIC8vIGVudGVyIGl0IG9uIHRoZSBjb21tYW5kIGxpbmUgLi4uIHNvIHdlIHJlbW92ZSB0aGUgCi0gICAgICAgICAgICAgICAgLy8gVmlldyBuYW1lICh3aGljaCBpcyBhbHNvIHRoZSBuYW1lIG9mIHRoZSByb290IGZvbGRlciwKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmVmb3JlIHNob3dzIHVwIGF0IHRoZSBzdGFydCBvZiB0aGUgcGF0aCkuCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN0ckZvbGRlciA9IGYuZ2V0Rm9sZGVySGllcmFyY2h5KCk7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSBzdHJGb2xkZXIuaW5kZXhPZihkZWxpbSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ckZvbGRlciA9IHN0ckZvbGRlci5zdWJzdHJpbmcoaSsxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICBGb2xkZXI6IFwiIiArIHN0ckZvbGRlciArICJcIiIpOwotICAgICAgICAgICAgICAgIHByZXZGb2xkZXIgPSBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJTaG93SGVhZGVyICAgICAgICA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBJZiB3ZSBkaXNwbGF5ZWQgdGhlIHByb2plY3QsIHZpZXcsIGl0ZW0gdHlwZSwgb3IgZm9sZGVyLAotICAgICAgICAgICAgLy8gdGhlbiBzaG93IHRoZSBsaXN0IG9mIHJlbGV2YW50IGl0ZW0gcHJvcGVydGllcy4KLSAgICAgICAgICAgIGlmIChiU2hvd0hlYWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgICAgICAgICAgICAgICAgSXRlbSIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIixcdCIgKyBwMS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocDIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIixcdCIgKyBwMi5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluYWxseSwgc2hvdyB0aGUgSXRlbSBwcm9wZXJ0aWVzIC4uLgotCi0gICAgICAgICAgICAvLyBBbHdheXMgc2hvdyB0aGUgSXRlbUlELgotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICAgICAgICAgICAgICAgICIgKyBpdGVtLmdldEl0ZW1JRCgpKTsKLQotICAgICAgICAgICAgLy8gU2hvdyB0aGUgcHJpbWFyeSBkZXNjcmlwdG9yLgotICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBvbmUuCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsXHQiICsgZm9ybWF0Rm9yRGlzcGxheShwMSwgaXRlbS5nZXQocDEuZ2V0TmFtZSgpKSkpOwotCi0gICAgICAgICAgICAvLyBTaG93IHRoZSBzZWNvbmRhcnkgZGVzY3JpcHRvciwgaWYgdGhlcmUgaXMgb25lLgotICAgICAgICAgICAgLy8gU29tZSBpdGVtIHR5cGVzIGhhdmUgb25lLCBzb21lIGRvbid0LgotICAgICAgICAgICAgaWYgKHAyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLFx0IiArIGZvcm1hdEZvckRpc3BsYXkocDIsIGl0ZW0uZ2V0KHAyLmdldE5hbWUoKSkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2hvdyBpZiB0aGUgZmlsZSBpcyBsb2NrZWQuCi0gICAgICAgICAgICBpbnQgbG9ja2VyID0gaXRlbS5nZXRMb2NrZXIoKTsKLSAgICAgICAgICAgIGlmIChsb2NrZXI+LTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIsXHRMb2NrZWQgYnkgIiArIGxvY2tlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIsXHROb3QgbG9ja2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRU5EIFZFUkJPU0UgT05MWQotCi0gICAgICAgIC8vIENoZWNrIGl0IG91dDsgYWxzbyB1Z2x5LgotCi0gICAgICAgIC8vIENoYW5nZSB0aGUgaXRlbSB0byBiZSBjaGVja2VkIG91dCB0byBhIFN0YXJUZWFtIEZpbGUuCi0gICAgICAgIGNvbS5zdGFyYmFzZS5zdGFydGVhbS5GaWxlIHJlbW90ZSA9IChjb20uc3RhcmJhc2Uuc3RhcnRlYW0uRmlsZSlpdGVtOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIHZhcmlhYmxlIGRpck5hbWUgdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiAKLSAgICAgICAgLy90aGUgU3RhclRlYW0gZm9sZGVyIHRoYXQgaXMgdGhlIHJvb3QgZm9sZGVyIGluIHRoaXMgdmlldy4KLSAgICAgICAgLy8gR2V0IHRoZSBkZWZhdWx0IHBhdGggdG8gdGhlIGN1cnJlbnQgdmlldy4KLSAgICAgICAgU3RyaW5nIGRpck5hbWUgPSB2LmdldERlZmF1bHRQYXRoKCk7Ci0gICAgICAgIC8vIFNldHRsZSBvbiAiLyIgYXMgdGhlIGRlZmF1bHQgcGF0aCBzZXBhcmF0b3IgZm9yIHRoaXMgcHVycG9zZSBvbmx5LgotICAgICAgICBkaXJOYW1lID0gZGlyTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgIC8vIFRha2UgdGhlIFN0YXJUZWFtIGZvbGRlciBuYW1lIGZ1cnRoZXN0IGRvd24gaW4gdGhlIGhpZXJhcmNoeS4KLSAgICAgICAgaW50IGVuZERpckluZGV4ID0gZGlyTmFtZS5sZW5ndGgoKTsKLSAgICAgICAgLy8gSWYgaXQgZW5kcyB3aXRoIHNlcGFyYXRvciB0aGVuIHN0cmlwIGl0IG9mZgotICAgICAgICBpZiAoZGlyTmFtZS5lbmRzV2l0aCgiLyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSB0aGUgU3VuT1MgYW5kIExpbnV4IGNhc2UKLSAgICAgICAgICAgIGVuZERpckluZGV4LS07Ci0gICAgICAgIH0KLSAgICAgICAgZGlyTmFtZSA9IAotICAgICAgICAgICAgZGlyTmFtZS5zdWJzdHJpbmcoZGlyTmFtZS5sYXN0SW5kZXhPZigiLyIsIGRpck5hbWUubGVuZ3RoKCkgLSAyKSArIDEsIGVuZERpckluZGV4KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gUmVwbGFjZSB0aGUgcHJvamVjdE5hbWUgaW4gdGhlIGZpbGUncyBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2aWV3TmFtZS4KLSAgICAgICAgLy8gVGhpcyBldmVudHVhbGx5IG1ha2VzIHRoZSB0YXJnZXQgb2YgYSBjaGVja291dCBvcGVyYXRpb24gZXF1YWwgdG86Ci0gICAgICAgIC8vIHRhcmdldEZvbGRlciArIGRpck5hbWUgKyBbc3ViZm9sZGVyc10gKyBpdGVtTmFtZQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGF0aFRva2VuaXplciA9IAotICAgICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihpdGVtLmdldFBhcmVudEZvbGRlcigpLmdldEZvbGRlckhpZXJhcmNoeSgpLCBkZWxpbSk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBkZWxpbTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlbiA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChwYXRoVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFRva2VuID0gcGF0aFRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50VG9rZW4uZXF1YWxzKGdldFByb2plY3ROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IGRpck5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2NhbE5hbWUgKz0gY3VycmVudFRva2VuICsgZGVsaW07Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHRoZSBsb2NhbCB0YXJnZXQgZmlsZSB1c2luZyB0aGUgZm9ybWF0IGxpc3RlZCBhYm92ZS4KLSAgICAgICAgamF2YS5pby5GaWxlIGxvY2FsID0gbmV3IGphdmEuaW8uRmlsZSggZ2V0VGFyZ2V0Rm9sZGVyKCkgKyBsb2NhbE5hbWUgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5nZXQocDEuZ2V0TmFtZSgpKSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3RlLmNoZWNrb3V0VG8obG9jYWwsIEl0ZW0uTG9ja1R5cGUuVU5DSEFOR0VELCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZygiICAgICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tlZE91dCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJpbWFyeSBkZXNjcmlwdG9yIG9mIHRoZSBnaXZlbiBpdGVtIHR5cGUuCi0gICAgICogIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpc24ndCBvbmUuCi0gICAgICogIEluIHByYWN0aWNlLCBhbGwgaXRlbSB0eXBlcyBoYXZlIGEgcHJpbWFyeSBkZXNjcmlwdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ICAgICAgQW4gaXRlbSB0eXBlLiBBdCB0aGlzIHBvaW50IGl0IHdpbGwgYWx3YXlzIGJlICJmaWxlIi4KLSAgICAgKiBAcmV0dXJuIFRoZSBzcGVjaWZpZWQgaXRlbSdzIHByaW1hcnkgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHkgZ2V0UHJpbWFyeURlc2NyaXB0b3IoVHlwZSB0KQotICAgIHsKLSAgICAgICAgUHJvcGVydHlbXSBwcm9wZXJ0aWVzID0gdC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUHJvcGVydHkgcCA9IHByb3BlcnRpZXNbaV07Ci0gICAgICAgICAgICBpZiAocC5pc1ByaW1hcnlEZXNjcmlwdG9yKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzZWNvbmRhcnkgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gaXRlbSB0eXBlLgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpc24ndCBvbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHQgICAgICBBbiBpdGVtIHR5cGUuIEF0IHRoaXMgcG9pbnQgaXQgd2lsbCBhbHdheXMgYmUgImZpbGUiLgotICAgICAqIEByZXR1cm4gVGhlIHNwZWNpZmllZCBpdGVtJ3Mgc2Vjb25kYXJ5IGRlc2NyaXB0b3IuIFRoZXJlIG1heSBub3QgYmUKLSAgICAgKiAgICAgICAgIG9uZSBmb3IgZXZlcnkgZmlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHkgZ2V0U2Vjb25kYXJ5RGVzY3JpcHRvcihUeXBlIHQpCi0gICAgewotICAgICAgICBQcm9wZXJ0eVtdIHByb3BlcnRpZXMgPSB0LmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9wZXJ0eSBwID0gcHJvcGVydGllc1tpXTsKLSAgICAgICAgICAgIGlmIChwLmlzRGVzY3JpcHRvcigpICYmICFwLmlzUHJpbWFyeURlc2NyaXB0b3IoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXRzIGEgcHJvcGVydHkgdmFsdWUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHAgICAgICBBbiBpdGVtIHByb3BlcnR5IHRvIGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5LCB3aGljaCBpcyB0cnVuY2F0ZWQgdG8gMzUKLSAgICAgKiAgICAgICAgIGNoYXJhY3RlcnMgZm9yIGRpc3BsYXkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRGb3JEaXNwbGF5KFByb3BlcnR5IHAsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChwLmdldFR5cGVDb2RlKCkgPT0gUHJvcGVydHkuVHlwZXMuVEVYVCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoc3RyLmxlbmd0aCgpID4gMzUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCAzMikgKyAiLi4uIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAiXCIiICsgc3RyICsgIlwiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwLmdldFR5cGVDb2RlKCkgPT0gUHJvcGVydHkuVHlwZXMuRU5VTUVSQVRFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlwiIiArIHAuZ2V0RW51bURpc3BsYXlOYW1lKCgoSW50ZWdlcil2YWx1ZSkuaW50VmFsdWUoKSkgKyAiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9STiBTVFJBSUdIVCBGUk9NIEFOVC5ESVJFQ1RPUllTQ0FOTkVSCi0KLSAgICAvKioKLSAgICAgKiA8Qj5UT1JOIFNUUkFJR0hUIEZST00gQU5ULkRJUkVDVE9SWVNDQU5ORVI8L0I+Ci0gICAgICogCi0gICAgICogTWF0Y2hlcyBhIHN0cmluZyBhZ2FpbnN0IGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gY29udGFpbnMgdHdvIHNwZWNpYWwKLSAgICAgKiBjaGFyYWN0ZXJzOjxCUj4KLSAgICAgKiAnKicgd2hpY2ggbWVhbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMsPEJSPgotICAgICAqICc/JyB3aGljaCBtZWFucyBvbmUgYW5kIG9ubHkgb25lIGNoYXJhY3Rlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgKG5vbi1udWxsKSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gc3RyICAgICB0aGUgKG5vbi1udWxsKSBzdHJpbmcgdGhhdCBtdXN0IGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICBwYXR0ZXJuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZQotICAgICAqICAgICAgICAgcGF0dGVybiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyKQotICAgIHsKLSAgICAgICAgY2hhcltdIHBhdEFyciA9IHBhdHRlcm4udG9DaGFyQXJyYXkoKTsKLSAgICAgICAgY2hhcltdIHN0ckFyciA9IHN0ci50b0NoYXJBcnJheSgpOwotICAgICAgICBpbnQgcGF0SWR4U3RhcnQgPSAwOwotICAgICAgICBpbnQgcGF0SWR4RW5kICAgPSBwYXRBcnIubGVuZ3RoLTE7Ci0gICAgICAgIGludCBzdHJJZHhTdGFydCA9IDA7Ci0gICAgICAgIGludCBzdHJJZHhFbmQgICA9IHN0ckFyci5sZW5ndGgtMTsKLSAgICAgICAgY2hhciBjaDsKLQotICAgICAgICBib29sZWFuIGNvbnRhaW5zU3RhciA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdEFyci5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhdEFycltpXSA9PSAnKicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNTdGFyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29udGFpbnNTdGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBObyAnKidzLCBzbyB3ZSBtYWtlIGEgc2hvcnRjdXQKLSAgICAgICAgICAgIGlmIChwYXRJZHhFbmQgIT0gc3RySWR4RW5kKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgIC8vIFBhdHRlcm4gYW5kIHN0cmluZyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaCA9IHBhdEFycltpXTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz8nICYmIGNoICE9IHN0ckFycltpXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgIC8vIENoYXJhY3RlciBtaXNtYXRjaAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBTdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHBhdHRlcm4KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXRJZHhFbmQgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFBhdHRlcm4gY29udGFpbnMgb25seSAnKicsIHdoaWNoIG1hdGNoZXMgYW55dGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgY2hhcmFjdGVycyBiZWZvcmUgZmlyc3Qgc3RhcgotICAgICAgICB3aGlsZSAoKGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0XSkgIT0gJyonICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNoICE9ICc/JyAmJiBjaCAhPSBzdHJBcnJbc3RySWR4U3RhcnRdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7Ci0gICAgICAgICAgICBzdHJJZHhTdGFydCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXNlZC4gQ2hlY2sgaWYgb25seSAnKidzIGFyZQotICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgcGF0dGVybi4gSWYgc28sIHdlIHN1Y2NlZWRlZC4gT3RoZXJ3aXNlIGZhaWx1cmUuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSAhPSAnKicpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcm9jZXNzIGNoYXJhY3RlcnMgYWZ0ZXIgbGFzdCBzdGFyCi0gICAgICAgIHdoaWxlICgoY2ggPSBwYXRBcnJbcGF0SWR4RW5kXSkgIT0gJyonICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNoICE9ICc/JyAmJiBjaCAhPSBzdHJBcnJbc3RySWR4RW5kXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRJZHhFbmQtLTsKLSAgICAgICAgICAgIHN0cklkeEVuZC0tOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXNlZC4gQ2hlY2sgaWYgb25seSAnKidzIGFyZQotICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgcGF0dGVybi4gSWYgc28sIHdlIHN1Y2NlZWRlZC4gT3RoZXJ3aXNlIGZhaWx1cmUuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSAhPSAnKicpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm9jZXNzIHBhdHRlcm4gYmV0d2VlbiBzdGFycy4gcGFkSWR4U3RhcnQgYW5kIHBhdElkeEVuZCBwb2ludAotICAgICAgICAvLyBhbHdheXMgdG8gYSAnKicuCi0gICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCAhPSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcGF0SWR4VG1wID0gLTE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQrMTsgaSA8PSBwYXRJZHhFbmQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0QXJyW2ldID09ICcqJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdElkeFRtcCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXRJZHhUbXAgPT0gcGF0SWR4U3RhcnQrMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdvIHN0YXJzIG5leHQgdG8gZWFjaCBvdGhlciwgc2tpcCB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSBwYXR0ZXJuIGJldHdlZW4gcGFkSWR4U3RhcnQgJiBwYWRJZHhUbXAgaW4gc3RyIGJldHdlZW4KLSAgICAgICAgICAgIC8vIHN0cklkeFN0YXJ0ICYgc3RySWR4RW5kCi0gICAgICAgICAgICBpbnQgcGF0TGVuZ3RoID0gKHBhdElkeFRtcC1wYXRJZHhTdGFydC0xKTsKLSAgICAgICAgICAgIGludCBzdHJMZW5ndGggPSAoc3RySWR4RW5kLXN0cklkeFN0YXJ0KzEpOwotICAgICAgICAgICAgaW50IGZvdW5kSWR4ICA9IC0xOwotICAgICAgICBzdHJMb29wOgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyTGVuZ3RoIC0gcGF0TGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXRMZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0K2orMV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPycgJiYgY2ggIT0gc3RyQXJyW3N0cklkeFN0YXJ0K2kral0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHN0ckxvb3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3VuZElkeCA9IHN0cklkeFN0YXJ0K2k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3VuZElkeCA9PSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhdElkeFN0YXJ0ID0gcGF0SWR4VG1wOwotICAgICAgICAgICAgc3RySWR4U3RhcnQgPSBmb3VuZElkeCtwYXRMZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlIGxlZnQKLSAgICAgICAgLy8gaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgotICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gIT0gJyonKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBCZWdpbiBTRVQgYW5kIEdFVCBtZXRob2RzICAgICAgICAKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIDxDT0RFPnNlcnZlck5hbWU8L0NPREU+IGF0dHJpYnV0ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcnZlck5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZlciB5b3Ugd2lzaCB0byBjb25uZWN0IHRvLgotICAgICAqIEBzZWUgI2dldFNlcnZlck5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlck5hbWUoU3RyaW5nIHNlcnZlck5hbWUpCi0gICAgewotICAgICAgICB0aGlzLnNlcnZlck5hbWUgPSBzZXJ2ZXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPnNlcnZlck5hbWU8L0NPREU+IGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBTdGFyVGVhbSBzZXJ2ZXIgdG8gbG9nIGluIHRvLgotICAgICAqIEBzZWUgI3NldFNlcnZlck5hbWUoU3RyaW5nIHNlcnZlck5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIDxDT0RFPnNlcnZlclBvcnQ8L0NPREU+IGF0dHJpYnV0ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuIFRoZQotICAgICAqIGdpdmVuIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyLCBidXQgaXQgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcnZlclBvcnQgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgcG9ydCBvbiB0aGUgU3RhclRlYW0gc2VydmVyCi0gICAgICogICAgICAgICAgICAgICAgICAgdG8gdXNlLgotICAgICAqIEBzZWUgI2dldFNlcnZlclBvcnQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHNlcnZlclBvcnQpCi0gICAgewotICAgICAgICB0aGlzLnNlcnZlclBvcnQgPSBzZXJ2ZXJQb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPnNlcnZlclBvcnQ8L0NPREU+IGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBvcnQgb24gdGhlIFN0YXJUZWFtIHNlcnZlciB0byB1c2UuCi0gICAgICogQHNlZSAjZ2V0U2VydmVyUG9ydEFzSW50KCkKLSAgICAgKiBAc2VlICNzZXRTZXJ2ZXJQb3J0KFN0cmluZyBzZXJ2ZXJQb3J0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gc2VydmVyUG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Q09ERT5zZXJ2ZXJQb3J0PC9DT0RFPiBhdHRyaWJ1dGUgYXMgYW4gaW50ZWdlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGludGVnZXIgdmFsdWUgZm9yIHRoZSBwb3J0IG9uIHRoZSBTdGFyVGVhbSBzZXJ2ZXIgdG8gdXNlLgotICAgICAqIEBzZWUgI2dldFNlcnZlclBvcnQoKQotICAgICAqIEBzZWUgI3NldFNlcnZlclBvcnQoU3RyaW5nIHNlcnZlclBvcnQpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0QXNJbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc2VydmVyUG9ydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgPENPREU+cHJvamVjdE5hbWU8L0NPREU+IGF0dHJpYnV0ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lCi0gICAgICogICAgICAgICAgICAgICBUaGUgU3RhclRlYW0gcHJvamVjdCB0byBzZWFyY2guCi0gICAgICogQHNlZSAjZ2V0UHJvamVjdE5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Q09ERT5wcm9qZWN0TmFtZTwvQ09ERT4gYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIFN0YXJUZWFtIHByb2plY3QgdG8gc2VhcmNoLgotICAgICAqIEBzZWUgI3NldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSA8Q09ERT52aWV3TmFtZTwvQ09ERT4gYXR0cmlidXRlIHRvIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmlld05hbWUgVGhlIHZpZXcgdG8gZmluZCB0aGUgc3BlY2lmaWVkIGZvbGRlciBpbi4KLSAgICAgKiBAc2VlICNnZXRWaWV3TmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld05hbWUoU3RyaW5nIHZpZXdOYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy52aWV3TmFtZSA9IHZpZXdOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPnZpZXdOYW1lPC9DT0RFPiBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgdmlldyB0byBmaW5kIHRoZSBzcGVjaWZpZWQgZm9sZGVyIGluLgotICAgICAqIEBzZWUgI3NldFZpZXdOYW1lKFN0cmluZyB2aWV3TmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZpZXdOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2aWV3TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSA8Q09ERT5mb2xkZXJOYW1lPC9DT0RFPiBhdHRyaWJ1dGUgdG8gdGhlIGdpdmVuIHZhbHVlLiBUbwotICAgICAqIHNlYXJjaCB0aGUgcm9vdCBmb2xkZXIsIHVzZSBhIHNsYXNoIG9yIGJhY2tzbGFzaCwgb3Igc2ltcGx5IGRvbid0IHNldAotICAgICAqIGEgZm9sZGVyIGF0IGFsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9sZGVyTmFtZSBUaGUgc3ViZm9sZGVyIGZyb20gd2hpY2ggdG8gY2hlY2sgb3V0IGZpbGVzLgotICAgICAqIEBzZWUgI2dldEZvbGRlck5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvbGRlck5hbWUoU3RyaW5nIGZvbGRlck5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZvbGRlck5hbWUgPSBmb2xkZXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPmZvbGRlck5hbWU8L0NPREU+IGF0dHJpYnV0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN1YmZvbGRlciBmcm9tIHdoaWNoIHRvIGNoZWNrIG91dCBmaWxlcy4gQWxsIHN1YmZvbGRlcnMKLSAgICAgKiB3aWxsIGJlIHNlYXJjaGVkLCBhcyB3ZWxsLgotICAgICAqIEBzZWUgI3NldEZvbGRlck5hbWUoU3RyaW5nIGZvbGRlck5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb2xkZXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIDxDT0RFPnVzZXJuYW1lPC9DT0RFPiBhdHRyaWJ1dGUgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VybmFtZSBZb3VyIHVzZXJuYW1lIGZvciB0aGUgc3BlY2lmaWVkIFN0YXJUZWFtIHNlcnZlci4KLSAgICAgKiBAc2VlICNnZXRVc2VybmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPnVzZXJuYW1lPC9DT0RFPiBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgdXNlcm5hbWUgZ2l2ZW4gYnkgdGhlIHVzZXIuCi0gICAgICogQHNlZSAjc2V0VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVzZXJuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIDxDT0RFPnBhc3N3b3JkPC9DT0RFPiBhdHRyaWJ1dGUgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXNzd29yZCBZb3VyIHBhc3N3b3JkIGZvciB0aGUgc3BlY2lmaWVkIFN0YXJUZWFtIHNlcnZlci4KLSAgICAgKiBAc2VlICNnZXRQYXNzd29yZCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPnBhc3N3b3JkPC9DT0RFPiBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgcGFzc3dvcmQgZ2l2ZW4gYnkgdGhlIHVzZXIuCi0gICAgICogQHNlZSAjc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIDxDT0RFPnRhcmdldEZvbGRlcjwvQ09ERT4gYXR0cmlidXRlIHRvIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgcGF0aCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byBjaGVjayBvdXQgdG8uCi0gICAgICogQHNlZSAjZ2V0VGFyZ2V0Rm9sZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRGb2xkZXIoU3RyaW5nIHRhcmdldEZvbGRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMudGFyZ2V0Rm9sZGVyID0gdGFyZ2V0Rm9sZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPnRhcmdldEZvbGRlcjwvQ09ERT4gYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHRhcmdldCBwYXRoIG9uIHRoZSBsb2NhbCBtYWNoaW5lIHRvIGNoZWNrIG91dCB0by4KLSAgICAgKgotICAgICAqIEBzZWUgI3NldFRhcmdldEZvbGRlcihTdHJpbmcgdGFyZ2V0Rm9sZGVyKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0Rm9sZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0YXJnZXRGb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgPENPREU+Zm9yY2U8L0NPREU+IGF0dHJpYnV0ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvcmNlICBBIHN0cmluZyBjb250YWluaW5nICJ0cnVlIiBvciAiZmFsc2UiIHRoYXQgdGVsbHMgdGhlCi0gICAgICogICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB3aGV0aGVyIHRvIGNvbnRpbnVlIGlmIHRoZSB0YXJnZXQgZGlyZWN0b3J5Ci0gICAgICogICAgICAgICAgICAgICBleGlzdHMuICBJZiA8Q09ERT5mb3JjZTwvQ09ERT4gaXMgdHJ1ZSwKLSAgICAgKiAgICAgICAgICAgICAgIEFudFN0YXJUZWFtQ2hlY2tPdXQgd2lsbCBvdmVyd3JpdGUgZmlsZXMgaW4gdGhlIHRhcmdldAotICAgICAqICAgICAgICAgICAgICAgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCBpdCBzZXQgdG8gZmFsc2UgYXMgYSBzYWZlZ3VhcmQuCi0gICAgICogICAgICAgICAgICAgICBOb3RlIHRoYXQgaWYgdGhlIHRhcmdldCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgIHNldHRpbmcgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiBAc2VlICNERUZBVUxUX0ZPUkNFU0VUVElORwotICAgICAqIEBzZWUgI2dldEZvcmNlKCkKLSAgICAgKiBAc2VlICNnZXRGb3JjZUFzQm9vbGVhbigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yY2UoU3RyaW5nIGZvcmNlKQotICAgIHsKLSAgICAgICAgdGhpcy5mb3JjZSA9IGZvcmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPmZvcmNlPC9DT0RFPiBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nICJ0cnVlIiBvciAiZmFsc2UiIHRlbGxpbmcgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogICAgICAgICB3aGV0aGVyIHRvIGNvbnRpbnVlIGlmIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGV4aXN0cy4gIElmCi0gICAgICogICAgICAgICA8Q09ERT5mb3JjZTwvQ09ERT4gaXMgdHJ1ZSwgQW50U3RhclRlYW1DaGVja091dCB3aWxsCi0gICAgICogICAgICAgICBvdmVyd3JpdGUgZmlsZXMgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkuIElmIGl0IGlzIGZhbHNlIGFuZAotICAgICAqICAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzLCBBbnRTdGFyVGVhbUNoZWNrT3V0IHdpbGwgZXhpdAotICAgICAqICAgICAgICAgd2l0aCBhIHdhcm5pbmcuICBJZiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgdGhpcwotICAgICAqICAgICAgICAgc2V0dGluZyBoYXMgbm8gZWZmZWN0LiBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzIGZhbHNlLgotICAgICAqIEBzZWUgI0RFRkFVTFRfRk9SQ0VTRVRUSU5HCi0gICAgICogQHNlZSAjZ2V0Rm9yY2VBc0Jvb2xlYW4oKQotICAgICAqIEBzZWUgI3NldEZvcmNlKFN0cmluZyBmb3JjZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Q09ERT5mb3JjZTwvQ09ERT4gYXR0cmlidXRlIGFzIGEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZSB0ZWxsaW5nIHdoZXRoZXIgdG8gY29udGludWUgaWYgdGhlIHRhcmdldAotICAgICAqICAgICAgICAgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICAgKiBAc2VlICNERUZBVUxUX0ZPUkNFU0VUVElORwotICAgICAqIEBzZWUgI2dldEZvcmNlKCkKLSAgICAgKiBAc2VlICNzZXRGb3JjZShTdHJpbmcgZm9yY2UpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yY2VBc0Jvb2xlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3QudG9Cb29sZWFuKGZvcmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJucyByZWN1cnNpb24gb24gb3Igb2ZmLgotICAgICAqCi0gICAgICogQHBhcmFtIHZlcmJvc2UgQSBzdHJpbmcgY29udGFpbmluZyAidHJ1ZSIgb3IgImZhbHNlLiIgIElmIGl0IGlzIHRydWUsCi0gICAgICogICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQsIHN1YmZvbGRlcnMgYXJlIHNlYXJjaGVkIHJlY3Vyc2l2ZWx5IGZvcgotICAgICAqICAgICAgICAgICAgICAgIGZpbGVzIHRvIGNoZWNrIG91dC4gIE90aGVyd2lzZSwgb25seSBmaWxlcyBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgICAgICAgICBieSA8Q09ERT5mb2xkZXJOYW1lPC9DT0RFPiBhcmUgc2Nhbm5lZC4KLSAgICAgKiBAc2VlICNERUZBVUxUX1JFQ1VSU0lPTlNFVFRJTkcKLSAgICAgKiBAc2VlICNnZXRSZWN1cnNpb24oKQotICAgICAqIEBzZWUgI2dldFJlY3Vyc2lvbkFzQm9vbGVhbigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVjdXJzaW9uKFN0cmluZyByZWN1cnNpb24pCi0gICAgewotICAgICAgICB0aGlzLnJlY3Vyc2lvbiA9IHJlY3Vyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Q09ERT5yZWN1cnNpb248L0NPREU+IGF0dHJpYnV0ZSwgd2hpY2ggdGVsbHMKLSAgICAgKiBBbnRTdGFyVGVhbUNoZWNrT3V0IHdoZXRoZXIgdG8gc2VhcmNoIHN1YmZvbGRlcnMgd2hlbiBjaGVja2luZyBvdXQKLSAgICAgKiBmaWxlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdGVsbGluZyB3aGV0aGVyIDxDT0RFPnJlY3Vyc2lvbjwvQ09ERT4gaXMgInRydWUiIG9yCi0gICAgICogImZhbHNlLiIKLSAgICAgKgotICAgICAqIEBzZWUgI0RFRkFVTFRfUkVDVVJTSU9OU0VUVElORwotICAgICAqIEBzZWUgI2dldFJlY3Vyc2lvbkFzQm9vbGVhbigpCi0gICAgICogQHNlZSAjc2V0UmVjdXJzaW9uKFN0cmluZyByZWN1cnNpb24pCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWN1cnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlY3Vyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Q09ERT5yZWN1cnNpb248L0NPREU+IGF0dHJpYnV0ZSBhcyBhIGJvb2xlYW4gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZSB0ZWxsaW5nIHdoZXRoZXIgc3ViZm9sZGVycyBvZgotICAgICAqIDxDT0RFPmZvbGRlck5hbWU8L0NPREU+IHdpbGwgYmUgc2Nhbm5lZCBmb3IgZmlsZXMgdG8gY2hlY2sgb3V0LgotICAgICAqCi0gICAgICogQHNlZSAjREVGQVVMVF9SRUNVUlNJT05TRVRUSU5HCi0gICAgICogQHNlZSAjZ2V0UmVjdXJzaW9uKCkKLSAgICAgKiBAc2VlICNzZXRSZWN1cnNpb24oU3RyaW5nIHJlY3Vyc2lvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZWN1cnNpb25Bc0Jvb2xlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3QudG9Cb29sZWFuKHJlY3Vyc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgPENPREU+dmVyYm9zZTwvQ09ERT4gYXR0cmlidXRlIHRvIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyYm9zZSBBIHN0cmluZyBjb250YWluaW5nICJ0cnVlIiBvciAiZmFsc2UiIHRvIHRlbGwKLSAgICAgKiAgICAgICAgICAgICAgICBBbnRTdGFyVGVhbUNoZWNrT3V0IHdoZXRoZXIgdG8gZGlzcGxheSBmaWxlcyBhcyB0aGV5Ci0gICAgICogICAgICAgICAgICAgICAgYXJlIGNoZWNrZWQgb3V0LiAgQnkgZGVmYXVsdCBpdCBpcyBmYWxzZSwgc28gdGhlCi0gICAgICogICAgICAgICAgICAgICAgcHJvZ3JhbSBvbmx5IGRpc3BsYXlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMgdW5sZXNzCi0gICAgICogICAgICAgICAgICAgICAgeW91IG92ZXJyaWRlIHRoaXMgZGVmYXVsdC4KLSAgICAgKiBAc2VlICNERUZBVUxUX0ZPUkNFU0VUVElORwotICAgICAqIEBzZWUgI2dldEZvcmNlKCkKLSAgICAgKiBAc2VlICNnZXRGb3JjZUFzQm9vbGVhbigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShTdHJpbmcgdmVyYm9zZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPnZlcmJvc2U8L0NPREU+IGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGNvbnRhaW5pbmcgInRydWUiIG9yICJmYWxzZSIgdGVsbGluZyB0aGUgYXBwbGljYXRpb24KLSAgICAgKiAgICAgICAgIHRvIGRpc3BsYXkgYWxsIGZpbGVzIGFzIGl0IGNoZWNrcyB0aGVtIG91dC4gIEJ5IGRlZmF1bHQgaXQgaXMKLSAgICAgKiAgICAgICAgIGZhbHNlLCBzbyB0aGUgcHJvZ3JhbSBvbmx5IGRpc3BsYXlzIHRoZSB0b3RhbCBudW1iZXIgb2YKLSAgICAgKiAgICAgICAgIGZpbGVzLgotICAgICAqIEBzZWUgI0RFRkFVTFRfVkVSQk9TRVNFVFRJTkcKLSAgICAgKiBAc2VlICNnZXRWZXJib3NlQXNCb29sZWFuKCkKLSAgICAgKiBAc2VlICNzZXRWZXJib3NlKFN0cmluZyB2ZXJib3NlKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyYm9zZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmVyYm9zZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Q09ERT52ZXJib3NlPC9DT0RFPiBhdHRyaWJ1dGUgYXMgYSBib29sZWFuIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlIHRlbGxpbmcgd2hldGhlciB0byBkaXNwbGF5IGFsbCBmaWxlcyBhcyB0aGV5Ci0gICAgICogICAgICAgICBhcmUgY2hlY2tlZCBvdXQuCi0gICAgICogQHNlZSAjREVGQVVMVF9WRVJCT1NFU0VUVElORwotICAgICAqIEBzZWUgI2dldFZlcmJvc2UoKQotICAgICAqIEBzZWUgI3NldFZlcmJvc2UoU3RyaW5nIHZlcmJvc2UpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0VmVyYm9zZUFzQm9vbGVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvamVjdC50b0Jvb2xlYW4odmVyYm9zZSk7Ci0gICAgfQotCi0gICAgLy8gQmVnaW4gZmlsdGVyIGdldHRlcnMgYW5kIHNldHRlcnMKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluY2x1ZGUgZmlsdGVyLiBXaGVuIGZpbHRlcmluZyBmaWxlcywgQW50U3RhclRlYW1DaGVja091dAotICAgICAqIHVzZXMgYW4gdW5tb2RpZmllZCB2ZXJzaW9uIG9mIDxDT0RFPkRpcmVjdG9yeVNjYW5uZXI8L0NPREU+J3MKLSAgICAgKiA8Q09ERT5tYXRjaDwvQ09ERT4gbWV0aG9kLCBzbyBoZXJlIGFyZSB0aGUgcGF0dGVybnMgc3RyYWlnaHQgZnJvbSB0aGUKLSAgICAgKiBBbnQgc291cmNlIGNvZGU6Ci0gICAgICogPEJSPjxCUj4KLSAgICAgKiBNYXRjaGVzIGEgc3RyaW5nIGFnYWluc3QgYSBwYXR0ZXJuLiBUaGUgcGF0dGVybiBjb250YWlucyB0d28gc3BlY2lhbAotICAgICAqIGNoYXJhY3RlcnM6Ci0gICAgICogPEJSPicqJyB3aGljaCBtZWFucyB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycywKLSAgICAgKiA8QlI+Jz8nIHdoaWNoIG1lYW5zIG9uZSBhbmQgb25seSBvbmUgY2hhcmFjdGVyLgotICAgICAqIDxCUj48QlI+Ci0gICAgICogSSB3b3VsZCBoYXZlIHVzZWQgdGhlIEFudCBtZXRob2QgZGlyZWN0bHkgZnJvbSBpdHMgY2xhc3MsIGJ1dAotICAgICAqIDxDT0RFPm1hdGNoPC9DT0RFPiBpcyBhIHByaXZhdGUgbWVtYmVyLCBzbyBJIGNhbm5vdCBhY2Nlc3MgaXQgZnJvbQotICAgICAqIHRoaXMgcHJvZ3JhbS4KLSAgICAgKiA8QlI+PEJSPgotICAgICAqIFNlcGFyYXRlIG11bHRpcGxlIGlubGN1ZGUgZmlsdGVycyBieSA8ST5zcGFjZXM8L0k+LCBub3QgY29tbWFzIGFzIEFudAotICAgICAqIHVzZXMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBjaGVjayBvdXQgYWxsIC5qYXZhIGFuZCAuY2xhc3NcCi0gICAgICogZmlsZXMsIHlvdSB3b3VsZCBwdXQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgcHJvZ3JhbToKLSAgICAgKiA8Q09ERT5zZXRJbmNsdWRlcygiKi5qYXZhICouY2xhc3MiKTs8L0NPREU+Ci0gICAgICogRmluYWxseSwgbm90ZSB0aGF0IGZpbHRlcnMgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIDxCPmRpcmVjdG9yaWVzPC9CPgotICAgICAqIHRoYXQgYXJlIHNjYW5uZWQ7IHlvdSBjb3VsZCBub3QgY2hlY2sgb3V0IGZpbGVzIGZyb20gZGlyZWN0b3JpZXMgd2l0aAotICAgICAqIG5hbWVzIGJlZ2lubmluZyBvbmx5IHdpdGggImJ1aWxkLCIgZm9yIGluc3RhbmNlLiBPZiBjb3Vyc2UsIHlvdQotICAgICAqIGNvdWxkIGxpbWl0IEFudFN0YXJUZWFtQ2hlY2tPdXQgdG8gYSBwYXJ0aWN1bGFyIGZvbGRlciBhbmQgaXRzCi0gICAgICogc3ViZm9sZGVycyB3aXRoIHRoZSA8Q09ERT5zZXRGb2xkZXJOYW1lKFN0cmluZyBmb2xkZXJOYW1lKTwvQ09ERT4KLSAgICAgKiBjb21tYW5kLgotICAgICAqIDxCUj48QlI+Ci0gICAgICogVHJlYXRtZW50IG9mIG92ZXJsYXBwaW5nIGlubGN1ZGVzIGFuZCBleGNsdWRlczogVG8gZ2l2ZSBhIHNpbXBsaXN0aWMKLSAgICAgKiBleGFtcGxlIHN1cHBvc2UgdGhhdCB5b3Ugc2V0IHlvdXIgaW5jbHVkZSBmaWx0ZXIgdG8gIiouaHRtICouaHRtbCIKLSAgICAgKiBhbmQgeW91ciBleGNsdWRlIGZpbHRlciB0byAiaW5kZXguKiIuIFdoYXQgaGFwcGVucyB0byBpbmRleC5odG1sPwotICAgICAqIEFudFN0YXJUZWFtQ2hlY2tPdXQgd2lsbCBub3QgY2hlY2sgb3V0IGluZGV4Lmh0bWwsIGFzIGl0IG1hdGNoZXMgYW4KLSAgICAgKiBleGNsdWRlIGZpbHRlciAoImluZGV4LioiKSwgZXZlbiB0aG91Z2ggaXQgbWF0Y2hlcyB0aGUgaW5jbHVkZQotICAgICAqIGZpbHRlciwgYXMgd2VsbC4KLSAgICAgKiA8QlI+PEJSPgotICAgICAqIFBsZWFzZSBhbHNvIHJlYWQgdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBiZWZvcmUgdXNpbmcgZmlsdGVyczoKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXMgQSBzdHJpbmcgb2YgZmlsdGVyIHBhdHRlcm5zIHRvIGluY2x1ZGUuIFNlcGFyYXRlIHRoZQotICAgICAqICAgICAgICAgICAgICAgICBwYXR0ZXJucyBieSBzcGFjZXMuCi0gICAgICogQHNlZSAjZ2V0SW5jbHVkZXMoKQotICAgICAqIEBzZWUgI3NldEV4Y2x1ZGVzKFN0cmluZyBleGNsdWRlcykKLSAgICAgKiBAc2VlICNnZXRFeGNsdWRlcygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlcyA9IGluY2x1ZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBhdHRlcm5zIGZyb20gdGhlIGluY2x1ZGUgZmlsdGVyLiBSYXRoZXIgdGhhdCBkdXBsaWNhdGUgdGhlCi0gICAgICogZGV0YWlscyBvZiBBbnRTdGFyVGVhbkNoZWNrT3V0J3MgZmlsdGVyaW5nIGhlcmUsIHJlZmVyIHRvIHRoZXNlCi0gICAgICogbGlua3M6Ci0gICAgICogCi0gICAgICogQHJldHVybiBBIHN0cmluZyBvZiBmaWx0ZXIgcGF0dGVybnMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KLSAgICAgKiBAc2VlICNzZXRJbmNsdWRlcyhTdHJpbmcgaW5jbHVkZXMpCi0gICAgICogQHNlZSAjc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKQotICAgICAqIEBzZWUgI2dldEV4Y2x1ZGVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluY2x1ZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleGNsdWRlIGZpbHRlci4gV2hlbiBmaWx0ZXJpbmcgZmlsZXMsIEFudFN0YXJUZWFtQ2hlY2tPdXQKLSAgICAgKiB1c2VzIGFuIHVubW9kaWZpZWQgdmVyc2lvbiBvZiA8Q09ERT5EaXJlY3RvcnlTY2FubmVyPC9DT0RFPidzCi0gICAgICogPENPREU+bWF0Y2g8L0NPREU+IG1ldGhvZCwgc28gaGVyZSBhcmUgdGhlIHBhdHRlcm5zIHN0cmFpZ2h0IGZyb20gdGhlCi0gICAgICogQW50IHNvdXJjZSBjb2RlOgotICAgICAqIDxCUj48QlI+Ci0gICAgICogTWF0Y2hlcyBhIHN0cmluZyBhZ2FpbnN0IGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gY29udGFpbnMgdHdvIHNwZWNpYWwKLSAgICAgKiBjaGFyYWN0ZXJzOgotICAgICAqIDxCUj4nKicgd2hpY2ggbWVhbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMsCi0gICAgICogPEJSPic/JyB3aGljaCBtZWFucyBvbmUgYW5kIG9ubHkgb25lIGNoYXJhY3Rlci4KLSAgICAgKiA8QlI+PEJSPgotICAgICAqIEkgd291bGQgaGF2ZSB1c2VkIHRoZSBBbnQgbWV0aG9kIGRpcmVjdGx5IGZyb20gaXRzIGNsYXNzLCBidXQKLSAgICAgKiA8Q09ERT5tYXRjaDwvQ09ERT4gaXMgYSBwcml2YXRlIG1lbWJlciwgc28gSSBjYW5ub3QgYWNjZXNzIGl0IGZyb20KLSAgICAgKiB0aGlzIHByb2dyYW0uCi0gICAgICogPEJSPjxCUj4KLSAgICAgKiBTZXBhcmF0ZSBtdWx0aXBsZSBleGxjdWRlIGZpbHRlcnMgYnkgPEk+c3BhY2VzPC9JPiwgbm90IGNvbW1hcyBhcyBBbnQKLSAgICAgKiB1c2VzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gY2hlY2sgb3V0IGFsbCBmaWxlcyBleGNlcHQgLlhNTCBhbmQKLSAgICAgKiAuSFRNTCBmaWxlcywgeW91IHdvdWxkIHB1dCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBwcm9ncmFtOgotICAgICAqIDxDT0RFPnNldEV4Y2x1ZGVzKCIqLlhNTCAqLkhUTUwiKTs8L0NPREU+Ci0gICAgICogRmluYWxseSwgbm90ZSB0aGF0IGZpbHRlcnMgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIDxCPmRpcmVjdG9yaWVzPC9CPgotICAgICAqIHRoYXQgYXJlIHNjYW5uZWQ7IHlvdSBjb3VsZCBub3Qgc2tpcCBvdmVyIGFsbCBmaWxlcyBpbiBkaXJlY3RvcmllcwotICAgICAqIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggInByb2plY3QsIiBmb3IgaW5zdGFuY2UuCi0gICAgICogPEJSPjxCUj4KLSAgICAgKiBUcmVhdG1lbnQgb2Ygb3ZlcmxhcHBpbmcgaW5sY3VkZXMgYW5kIGV4Y2x1ZGVzOiBUbyBnaXZlIGEgc2ltcGxpc3RpYwotICAgICAqIGV4YW1wbGUgc3VwcG9zZSB0aGF0IHlvdSBzZXQgeW91ciBpbmNsdWRlIGZpbHRlciB0byAiKi5odG0gKi5odG1sIgotICAgICAqIGFuZCB5b3VyIGV4Y2x1ZGUgZmlsdGVyIHRvICJpbmRleC4qIi4gV2hhdCBoYXBwZW5zIHRvIGluZGV4Lmh0bWw/Ci0gICAgICogQW50U3RhclRlYW1DaGVja091dCB3aWxsIG5vdCBjaGVjayBvdXQgaW5kZXguaHRtbCwgYXMgaXQgbWF0Y2hlcyBhbgotICAgICAqIGV4Y2x1ZGUgZmlsdGVyICgiaW5kZXguKiIpLCBldmVuIHRob3VnaCBpdCBtYXRjaGVzIHRoZSBpbmNsdWRlCi0gICAgICogZmlsdGVyLCBhcyB3ZWxsLgotICAgICAqIDxCUj48QlI+Ci0gICAgICogUGxlYXNlIGFsc28gcmVhZCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIGJlZm9yZSB1c2luZyBmaWx0ZXJzOgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGNsdWRlcyBBIHN0cmluZyBvZiBmaWx0ZXIgcGF0dGVybnMgdG8gZXhjbHVkZS4gU2VwYXJhdGUgdGhlCi0gICAgICogICAgICAgICAgICAgICAgIHBhdHRlcm5zIGJ5IHNwYWNlcy4KLSAgICAgKiBAc2VlICNzZXRJbmNsdWRlcyhTdHJpbmcgaW5jbHVkZXMpCi0gICAgICogQHNlZSAjZ2V0SW5jbHVkZXMoKQotICAgICAqIEBzZWUgI2dldEV4Y2x1ZGVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmcgZXhjbHVkZXMpCi0gICAgewotICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gZXhjbHVkZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGF0dGVybnMgZnJvbSB0aGUgZXhjbHVkZSBmaWx0ZXIuIFJhdGhlciB0aGF0IGR1cGxpY2F0ZSB0aGUKLSAgICAgKiBkZXRhaWxzIG9mIEFudFN0YXJUZWFuQ2hlY2tPdXQncyBmaWx0ZXJpbmcgaGVyZSwgcmVmZXIgdG8gdGhlc2UKLSAgICAgKiBsaW5rczoKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIG9mIGZpbHRlciBwYXR0ZXJucyBzZXBhcmF0ZWQgYnkgc3BhY2VzLgotICAgICAqIEBzZWUgI3NldEV4Y2x1ZGVzKFN0cmluZyBleGNsdWRlcykKLSAgICAgKiBAc2VlICNzZXRJbmNsdWRlcyhTdHJpbmcgaW5jbHVkZXMpCi0gICAgICogQHNlZSAjZ2V0SW5jbHVkZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4Y2x1ZGVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvQ292TWVyZ2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvQ292TWVyZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmMGRmMi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL0Nvdk1lcmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmVKYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIENvbnZlbmllbnQgdGFzayB0byBydW4gdGhlIHNuYXBzaG90IG1lcmdlIHV0aWxpdHkgZm9yIEpQcm9iZSBDb3ZlcmFnZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb3ZNZXJnZSBleHRlbmRzIFRhc2sgewotCi0JLyoqIGNvdmVyYWdlIGhvbWUsIGl0IGlzIG1hbmRhdG9yeSAqLwotICAgIHByaXZhdGUgRmlsZSBob21lID0gbnVsbDsKLSAgICAKLQkvKiogdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBzbmFwc2hvdCAqLwotICAgIHByaXZhdGUgRmlsZSB0b2ZpbGUgPSBudWxsOwotICAgIAotCS8qKiB0aGUgZmlsZXNldHMgdGhhdCB3aWxsIGdldCBhbGwgc25hcHNob3RzIHRvIG1lcmdlICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0JcHJpdmF0ZSBib29sZWFuIHZlcmJvc2U7Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGNvdmVyYWdlIGhvbWUuIGl0IG11c3QgcG9pbnQgdG8gSlByb2JlIGNvdmVyYWdlCi0JICogZGlyZWN0b3JpZXMgd2hlcmUgYXJlIHN0b3JlZCBuYXRpdmUgbGlicmFpcmllcyBhbmQgamFycwotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhvbWUoRmlsZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmhvbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG91dHB1dCBzbmFwc2hvdCBmaWxlCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9maWxlKEZpbGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy50b2ZpbGUgPSB2YWx1ZTsKLSAgICB9Ci0KLQkvKiogcnVuIHRoZSBtZXJnaW5nIGluIHZlcmJvc2UgbW9kZSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiBmbGFnKXsKLQkJdGhpcy52ZXJib3NlID0gZmxhZzsKLQl9Ci0KLQkvKiogYWRkIGEgZmlsZXNldCBjb250YWluaW5nIHRoZSBzbmFwc2hvdHMgdG8gaW5jbHVkZS9leGNsdWRlICovCi0JcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IGZzKXsKLQkJZmlsZXNldHMuYWRkRWxlbWVudChmcyk7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tIHRoZSB0ZWRpb3VzIGpvYiBiZWdpbnMgaGVyZQotCi0JcHVibGljIENvdk1lcmdlKCkgewotICAgIH0KLQotCS8qKiBleGVjdXRlIHRoZSBqcGNvdm1lcmdlIGJ5IHByb3ZpZGluZyBhIHBhcmFtZXRlciBmaWxlICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCWNoZWNrT3B0aW9ucygpOwotCi0JCUZpbGUgcGFyYW1maWxlID0gY3JlYXRlUGFyYW1GaWxlKCk7Ci0JCXRyeXsKLQkJCUNvbW1hbmRsaW5lIGNtZGwgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLQkJCWNtZGwuc2V0RXhlY3V0YWJsZSggbmV3IEZpbGUoaG9tZSwgImpwY292bWVyZ2UiKS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQljbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi12Iik7Ci0JCQl9Ci0JCQljbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1qcF9wYXJhbWZpbGU9IiArIHBhcmFtZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCi0JCQlMb2dTdHJlYW1IYW5kbGVyIGhhbmRsZXIgPSBuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLFByb2plY3QuTVNHX0lORk8sUHJvamVjdC5NU0dfV0FSTik7Ci0JCQlFeGVjdXRlIGV4ZWMgPSBuZXcgRXhlY3V0ZShoYW5kbGVyKTsKLQkJCWxvZyhjbWRsLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCQkJZXhlYy5zZXRDb21tYW5kbGluZShjbWRsLmdldENvbW1hbmRsaW5lKCkpOwotCi0JCQkvLyBKUHJvYmUgcHJvY2VzcyBhbHdheXMgcmV0dXJuIDAgc28gIHdlIHdpbGwgbm90IGJlCi0JCQkvLyBhYmxlIHRvIGNoZWNrIGZvciBmYWlsdXJlICEgOi0oCi0JCQlpbnQgZXhpdFZhbHVlID0gZXhlYy5leGVjdXRlKCk7Ci0JCQlpZiAoZXhpdFZhbHVlIT0wKSB7Ci0JCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJKUHJvYmUgQ292ZXJhZ2UgTWVyZ2luZyBmYWlsZWQgKCIgKyBleGl0VmFsdWUgKyAiKSIpOwotCQkJfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBydW4gSlByb2JlIENvdmVyYWdlIE1lcmdlOiAiICsgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0JCQkvL0B0b2RvIHNob3VsZCBiZSByZW1vdmVkIG9uY2Ugc3dpdGNoZWQgdG8gSkRLMS4yCi0JCQlwYXJhbWZpbGUuZGVsZXRlKCk7Ci0JCX0KLSAgICB9Ci0KLQkvKiogY2hlY2sgZm9yIG1hbmRhdG9yeSBvcHRpb25zICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tPcHRpb25zKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJaWYgKHRvZmlsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIid0b2ZpbGUnIGF0dHJpYnV0ZSBtdXN0IGJlIHNldC4iKTsKLQkJfQotCQlpZiAoaG9tZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIidob21lJyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgdG8gSlByb2JlIENvdmVyYWdlIGhvbWUgZGlyZWN0b3J5Iik7Ci0JCX0KLQkJRmlsZSBqYXIgPSBuZXcgRmlsZShob21lLCAiY292ZXJhZ2UuamFyIik7Ci0JCWlmICghamFyLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIidob21lJyBhdHRyaWJ1dGUgaXMgbm90IHNldCB0byBDb3ZlcmFnZSBob21lIGRpcmVjdG9yeTogIiArIGhvbWUpOwotCQl9Ci0JCQotCX0KLQotCS8qKiBnZXQgdGhlIHNuYXBzaG90cyBmcm9tIHRoZSBmaWxlc2V0cyAqLwotCXByb3RlY3RlZCBGaWxlW10gZ2V0U25hcHNob3RzKCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJZmluYWwgaW50IHNpemUgPSBmaWxlc2V0cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKLQkJCURpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7Ci0JCQlkcy5zY2FuKCk7Ci0JCQlTdHJpbmdbXSBmID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3RyaW5nIHBhdGhuYW1lID0gZltqXTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkcy5nZXRCYXNlZGlyKCksIHBhdGhuYW1lKTsKLQkJCQlmaWxlID0gcHJvamVjdC5yZXNvbHZlRmlsZShmaWxlLmdldFBhdGgoKSk7Ci0JCQkJdi5hZGRFbGVtZW50KCBmaWxlICk7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVt2LnNpemUoKV07Ci0JCXYuY29weUludG8oZmlsZXMpOwotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIHBhcmFtZXRlcnMgZmlsZSB0aGF0IGNvbnRhaW5zIGFsbCBmaWxlIHRvIG1lcmdlCi0JICogYW5kIHRoZSBvdXRwdXQgZmlsZW5hbWUuCi0JICovCi0JcHJvdGVjdGVkIEZpbGUgY3JlYXRlUGFyYW1GaWxlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJRmlsZVtdIHNuYXBzaG90cyA9IGdldFNuYXBzaG90cygpOwotCQlGaWxlIGZpbGUgPSBjcmVhdGVUbXBGaWxlKCk7Ci0JCUZpbGVXcml0ZXIgZncgPSBudWxsOwotCQl0cnkgewotCQkJZncgPSBuZXcgRmlsZVdyaXRlcihmaWxlKTsKLQkJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKGZ3KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc25hcHNob3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHcucHJpbnRsbihzbmFwc2hvdHNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQkJLy8gbGFzdCBmaWxlIGlzIHRoZSBvdXRwdXQgc25hcHNob3QKLQkJCXB3LnByaW50bG4ocHJvamVjdC5yZXNvbHZlRmlsZSh0b2ZpbGUuZ2V0UGF0aCgpKSk7Ci0JCQlwdy5mbHVzaCgpOwotCQkJcmV0dXJuIGZpbGU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotCQkJaWYgKGZ3ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmdy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpewotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgdG8gIiArIGZpbGUsIGUpOwotCQl9Ci0JfQotCi0JLyoqIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBjdXJyZW50IGRpciAoRm9yIEpESzEuMSBzdXBwb3J0KSAqLwotCXByb3RlY3RlZCBGaWxlIGNyZWF0ZVRtcEZpbGUoKXsKLQkJZmluYWwgbG9uZyByYW5kID0gKG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKS5uZXh0TG9uZygpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgianBjb3ZtZXJnZSIgKyByYW5kICsgIi50bXAiKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9Db3ZSZXBvcnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvQ292UmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OGY0ZmYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9Db3ZSZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2E7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBDb252ZW5pZW50IHRhc2sgdG8gcnVuIHRoZSBzbmFwc2hvdCBtZXJnZSB1dGlsaXR5IGZvciBKUHJvYmUgQ292ZXJhZ2UgMy4wLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIENvdlJlcG9ydCBleHRlbmRzIFRhc2sgewotLyoKLWpwY292ZXJwb3J0IFtvcHRpb25zXSAtb3V0cHV0PWZpbGUgLXNuYXBzaG90PXNuYXBzaG90LmpwYwotanBjb3ZyZXBvcnQgW29wdGlvbnNdIFstcGFyYW1maWxlPWZpbGVdIC1vdXRwdXQ9PGZpbGVOYW1lPiAtc25hcHNob3Q9PGZpbGVOYW1lPgotCi0JCUdlbmVyYXRlIGEgcmVwb3J0IGJhc2VkIG9uIHRoZSBpbmRpY2F0ZWQgc25hcHNob3QKLQotCQktcGFyYW1maWxlPWZpbGUKLQkJCQkJCUEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgdGhlIHJlcG9ydCBnZW5lcmF0aW9uIG9wdGlvbnMuCi0KLQkJLWZvcm1hdD0oaHRtbHx0ZXh0fHhtbCkgZGVmYXVsdHMgdG8gaHRtbAotCQkJCQkJVGhlIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIHJlcG9ydC4KLQotCQktdHlwZT0oZXhlY3V0aXZlfHN1bW1hcnl8ZGV0YWlsZWR8dmVyeWRldGFpbGVkKSBkZWZhdWx0cyB0byBkZXRhaWxlZAotCQkJCQkJVGhlIHR5cGUgb2YgcmVwb3J0IHRvIGJlIGdlbmVyYXRlZC4gRm9yIC1mb3JtYXQ9eG1sLAotCQkJCQkJdXNlIC10eXBlPXZlcnlkZXRhaWxlZCB0byBpbmNsdWRlIHNvdXJjZSBjb2RlIGxpbmVzLgotCi0JCQkJCQlOb3RlOiBBIHZlcnkgZGV0YWlsZWQgcmVwb3J0IGNhbiBiZSBWRVJZIGxhcmdlLgotCi0JCS1wZXJjZW50PW51bSAgICAgICAgICAgIE1pbiAxIE1heCAxMDEgRGVmYXVsdCAxMDEKLQkJCQkJCUFuIGludGVnZXIgcmVwcmVzZW50aW5nIGEgcGVyY2VudGFnZSBvZiBjb3ZlcmFnZS4KLQkJCQkJCU9ubHkgbWV0aG9kcyB3aXRoIHRlc3QgY2FzZSBjb3ZlcmFnZSBsZXNzIHRoYW4gdGhlCi0JCQkJCQlwZXJjZW50YWdlIGFyZSBpbmNsdWRlZCBpbiByZXBvcnRzLgotCi0JCS1maWx0ZXJzPXN0cmluZwotCQkJCQkJQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWx0ZXJzIGluIHRoZSBmb3JtCi0JCQkJCQk8cGFja2FnZT4uPGNsYXNzPjpWLCB3aGVyZSBWIGNhbiBiZSBJIGZvciBJbmNsdWRlIG9yCi0JCQkJCQlFIGZvciBFeGNsdWRlLiBGb3IgdGhlIGRlZmF1bHQgcGFja2FnZSwgb21pdCA8cGFja2FnZT4uCi0KLQkJLWZpbHRlcnNfbWV0aG9kPXN0cmluZwotCQkJCQkJT3B0aW9uYWwuIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWV0aG9kcyB0aGF0Ci0JCQkJCQljb3JyZXNwb25kIG9uZS10by1vbmUgd2l0aCB0aGUgZW50cmllcyBpbiAtZmlsdGVycy4KLQotCQktb3V0cHV0PXN0cmluZyAgTXVzdCBiZSBzcGVjaWZpZWQKLQkJCQkJCVRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBmaWxlIG5hbWUgZm9yIHRoZSBnZW5lcmF0ZWQKLQkJCQkJCXJlcG9ydCBmaWxlLgotCi0JCS1zbmFwc2hvdD1zdHJpbmcgICAgICAgIE11c3QgYmUgc3BlY2lmaWVkCi0JCQkJCQlUaGUgYWJzb2x1dGUgcGF0aCBhbmQgZmlsZSBuYW1lIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgotCi0JCS1pbmNfc3JjX3RleHQ9KG9ufG9mZikgIGRlZmF1bHRzIHRvIG9uCi0JCQkJCQlJbmNsdWRlIHRleHQgb2YgdGhlIHNvdXJjZSBjb2RlIGxpbmVzLgotCQkJCQkJT25seSBhcHBsaWVzIGZvciAtZm9ybWF0PXhtbCBhbmQgLXR5cGU9dmVyeWRldGFpbGVkLgotCi0JCS1zb3VyY2VwYXRoPXN0cmluZyAgICAgIGRlZmF1bHRzIHRvIC4KLQkJCQkJCUEgc2VtaWNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHNvdXJjZSBwYXRocy4KLQotLyoKLQotCS8qKiBjb3ZlcmFnZSBob21lLCAgbWFuZGF0b3J5ICovCi0JcHJpdmF0ZSBGaWxlIGhvbWUgPSBudWxsOwotCi0JLyoqIGZvcm1hdCBvZiBnZW5lcmF0ZWQgcmVwb3J0LCBvcHRpb25hbCAqLwotCXByaXZhdGUgU3RyaW5nIGZvcm1hdCA9IG51bGw7Ci0KLQkvKiogdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBzbmFwc2hvdCwgbWFuZGF0b3J5ICovCi0JcHJpdmF0ZSBGaWxlIHRvZmlsZSA9IG51bGw7Ci0KLQkvKiogdHlwZSBvZiByZXBvcnQsIG9wdGlvbmFsICovCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkvKiogdGhyZXNob2xkIHZhbHVlIGZvciBwcmludGluZyBtZXRob2RzLCBvcHRpb25hbCAqLwotCXByaXZhdGUgSW50ZWdlciBwZXJjZW50ID0gbnVsbDsKLQotCS8qKiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWx0ZXJzICg/Pz8pKi8KLQlwcml2YXRlIFN0cmluZyBmaWx0ZXJzID0gbnVsbDsKLQotCS8qKiBuYW1lIG9mIHRoZSBzbmFwc2hvdCBmaWxlIHRvIGNyZWF0ZSByZXBvcnQgZnJvbSAqLwotCXByaXZhdGUgRmlsZSBzbmFwc2hvdCA9IG51bGw7Ci0KLQkvKiogc291cmNlcGF0aCB0byB1c2UgKi8KLQlwcml2YXRlIFBhdGggc291cmNlUGF0aCA9IG51bGw7Ci0KLQkvKiogaW5jbHVkZSB0aGUgdGV4dCBmb3IgZWFjaCBsaW5lIG9mIGNvZGUgKHhtbCByZXBvcnQgdmVyeWRldGFpbGVkKSovCi0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVTb3VyY2UgPSB0cnVlOwotCi0JcHJpdmF0ZSBQYXRoIGNvdmVyYWdlUGF0aCA9IG51bGw7Ci0KLQkvKiogKi8KLQlwcml2YXRlIFJlZmVyZW5jZSByZWZlcmVuY2UgPSBudWxsOwotCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNvdmVyYWdlIGhvbWUuIGl0IG11c3QgcG9pbnQgdG8gSlByb2JlIGNvdmVyYWdlCi0JICogZGlyZWN0b3JpZXMgd2hlcmUgYXJlIHN0b3JlZCBuYXRpdmUgbGlicmFyaWVzIGFuZCBqYXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvbWUoRmlsZSB2YWx1ZSkgewotCQl0aGlzLmhvbWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJlcG9ydEZvcm1hdCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCl7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJodG1sIiwgInRleHQiLCAieG1sIn07Ci0JCX0KLQl9Ci0JLyoqIHNldCB0aGUgZm9ybWF0IG9mIHRoZSByZXBvcnQgaHRtbHx0ZXh0fHhtbCovCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0KFJlcG9ydEZvcm1hdCB2YWx1ZSl7Ci0JCXRoaXMuZm9ybWF0ID0gdmFsdWUuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJlcG9ydFR5cGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiZXhlY3V0aXZlIiwgInN1bW1hcnkiLCAiZGV0YWlsZWQiLCAidmVyeWRldGFpbGVkIn07Ci0JCX0KLQl9Ci0JLyoqIHNldHMgdGhlIHJlcG9ydCB0eXBlIGV4ZWN1dGl2ZXxzdW1tYXJ5fGRldGFpbGVkfHZlcnlkZXRhaWxlZCAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoUmVwb3J0VHlwZSB2YWx1ZSl7Ci0JCXRoaXMudHlwZSA9ICB2YWx1ZS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKiBpbmNsdWRlIHNvdXJjZSBjb2RlIGxpbmVzLiBYTUwgcmVwb3J0IG9ubHkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc291cmNlKGJvb2xlYW4gdmFsdWUpewotCQl0aGlzLmluY2x1ZGVTb3VyY2UgPSB2YWx1ZTsKLQl9Ci0KLQkvKiogc2V0cyB0aGUgdGhyZXNob2xkIHByaW50aW5nIG1ldGhvZCAwLTEwMCovCi0JcHVibGljIHZvaWQgc2V0UGVyY2VudChJbnRlZ2VyIHZhbHVlKXsKLQkJdGhpcy5wZXJjZW50ID0gdmFsdWU7Ci0JfQotCi0JLyoqIHNldCB0aGUgZmlsdGVycyAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcnMoU3RyaW5nIHZhbHVlcyl7Ci0JCXRoaXMuZmlsdGVycyA9IHZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgUGF0aCBjcmVhdGVTb3VyY2VwYXRoKCl7Ci0JCWlmIChzb3VyY2VQYXRoID09IG51bGwpIHsKLQkJCXNvdXJjZVBhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gc291cmNlUGF0aC5jcmVhdGVQYXRoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U25hcHNob3QoRmlsZSB2YWx1ZSl7Ci0JCXRoaXMuc25hcHNob3QgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG91dHB1dCBzbmFwc2hvdCBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9maWxlKEZpbGUgdmFsdWUpIHsKLQkJdGhpcy50b2ZpbGUgPSB2YWx1ZTsKLQl9Ci0KLQkvL0B0b2RvIHRvIHJlbW92ZQotCXB1YmxpYyBQYXRoIGNyZWF0ZUNvdmVyYWdlcGF0aCgpewotCQlpZiAoY292ZXJhZ2VQYXRoID09IG51bGwpIHsKLQkJCWNvdmVyYWdlUGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBjb3ZlcmFnZVBhdGguY3JlYXRlUGF0aCgpOwotCX0KLQotCXB1YmxpYyBSZWZlcmVuY2UgY3JlYXRlUmVmZXJlbmNlKCl7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCl7Ci0JCQlyZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZTsKLQl9Ci0KLQotCXB1YmxpYyBDb3ZSZXBvcnQoKSB7Ci0JfQotCi0JLyoqIGNoZWNrIGZvciBtYW5kYXRvcnkgb3B0aW9ucyAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrT3B0aW9ucygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCWlmICh0b2ZpbGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIndG9maWxlJyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIik7Ci0JCX0KLQkJaWYgKHNuYXBzaG90ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJ3NuYXBzaG90JyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIik7Ci0JCX0KLQkJaWYgKGhvbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCInaG9tZScgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIEpQcm9iZSBob21lIGRpcmVjdG9yeSIpOwotCQl9Ci0JCWhvbWUgPSBuZXcgRmlsZShob21lLCJDb3ZlcmFnZSIpOwotCQlGaWxlIGphciA9IG5ldyBGaWxlKGhvbWUsICJjb3ZlcmFnZS5qYXIiKTsKLQkJaWYgKCFqYXIuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgQ292ZXJhZ2UgZGlyZWN0b3J5OiAiICsgaG9tZSk7Ci0JCX0KLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsICYmICEieG1sIi5lcXVhbHMoZm9ybWF0KSl7Ci0JCQlsb2coIklnbm9yZWQgcmVmZXJlbmNlLiBJdCBjYW5ub3QgYmUgdXNlZCBpbiBub24gWE1MIHJlcG9ydC4iKTsKLQkJCXJlZmVyZW5jZSA9IG51bGw7IC8vIG51bGxpZnkgaXQgc28gdGhhdCB0aGVyZSBpcyBubyBhbWJpZ3VpdHkKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCWNoZWNrT3B0aW9ucygpOwotCQl0cnkgewotCQkJQ29tbWFuZGxpbmUgY21kbCA9IG5ldyBDb21tYW5kbGluZSgpOwotCQkJLy8gd2UgbmVlZCB0byBydW4gQ292ZXJhZ2UgZnJvbSBoaXMgZGlyZWN0b3J5IGR1ZSB0byBkbGwvamFyIGlzc3VlcwotCQkJY21kbC5zZXRFeGVjdXRhYmxlKCBuZXcgRmlsZShob21lLCAianBjb3ZyZXBvcnQiKS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotCQkJU3RyaW5nW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJCQljbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUocGFyYW1zW2ldKTsKLQkJCX0KLQotCQkJLy8gdXNlIHRoZSBjdXN0b20gaGFuZGxlciBmb3Igc3RkaW4gaXNzdWVzCi0JCQlMb2dTdHJlYW1IYW5kbGVyIGhhbmRsZXIgPSBuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLFByb2plY3QuTVNHX0lORk8sUHJvamVjdC5NU0dfV0FSTik7Ci0JCQlFeGVjdXRlIGV4ZWMgPSBuZXcgRXhlY3V0ZSggaGFuZGxlciApOwotCQkJbG9nKGNtZGwudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0JCQlleGVjLnNldENvbW1hbmRsaW5lKGNtZGwuZ2V0Q29tbWFuZGxpbmUoKSk7Ci0JCQlpbnQgZXhpdFZhbHVlID0gZXhlYy5leGVjdXRlKCk7Ci0JCQlpZiAoZXhpdFZhbHVlICE9IDApIHsKLQkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkpQcm9iZSBDb3ZlcmFnZSBSZXBvcnQgZmFpbGVkICgiICsgZXhpdFZhbHVlICsgIikiKTsKLQkJCX0KLQkJCWxvZygiY292ZXJhZ2VQYXRoOiAiICsgY292ZXJhZ2VQYXRoLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQkJCWxvZygiZm9ybWF0OiAiICsgZm9ybWF0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCAmJiAieG1sIi5lcXVhbHMoZm9ybWF0KSl7Ci0JCQkJcmVmZXJlbmNlLmNyZWF0ZUVuaGFuY2VkWE1MUmVwb3J0KCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBleGVjdXRlIEpQcm9iZSBDb3ZlcmFnZSBSZXBvcnQuIiwgZSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJzKCl7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQlpZiAoZm9ybWF0ICE9IG51bGwpIHsKLQkJCXYuYWRkRWxlbWVudCgiLWZvcm1hdD0iICsgZm9ybWF0KTsKLQkJfQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQl2LmFkZEVsZW1lbnQoIi10eXBlPSIgKyB0eXBlKTsKLQkJfQotCQlpZiAocGVyY2VudCAhPSBudWxsKSB7Ci0JCQl2LmFkZEVsZW1lbnQoIi1wZXJjZW50PSIgKyBwZXJjZW50KTsKLQkJfQotCQlpZiAoZmlsdGVycyAhPSBudWxsKSB7Ci0JCQl2LmFkZEVsZW1lbnQoIi1maWx0ZXJzPSIgKyBmaWx0ZXJzKTsKLQkJfQotCQl2LmFkZEVsZW1lbnQoIi1vdXRwdXQ9IiArIHByb2plY3QucmVzb2x2ZUZpbGUodG9maWxlLmdldFBhdGgoKSkpOwotCQl2LmFkZEVsZW1lbnQoIi1zbmFwc2hvdD0iICsgcHJvamVjdC5yZXNvbHZlRmlsZShzbmFwc2hvdC5nZXRQYXRoKCkpKTsKLQkJLy8gYXMgYSBkZWZhdWx0IC1zb3VyY2VwYXRoIHVzZSAuIGluIEpQcm9iZSwgc28gdXNlIHByb2plY3QgLgotCQlpZiAoc291cmNlUGF0aCA9PSBudWxsKSB7Ci0JCQlzb3VyY2VQYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0JCQlzb3VyY2VQYXRoLmNyZWF0ZVBhdGgoKS5zZXRMb2NhdGlvbihwcm9qZWN0LnJlc29sdmVGaWxlKCIuIikpOwotCQl9Ci0JCXYuYWRkRWxlbWVudCgiLXNvdXJjZXBhdGg9IiArIHNvdXJjZVBhdGgpOwotCi0JCWlmICgidmVyeWRldGFpbGVkIi5lcXVhbHNJZ25vcmVDYXNlKGZvcm1hdCkgJiYgInhtbCIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJdi5hZGRFbGVtZW50KCItaW5jX3NyY190ZXh0PSIgKyAoaW5jbHVkZVNvdXJjZSA/ICJvbiIgOiAib2ZmIikpOwotCQl9Ci0KLQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1t2LnNpemUoKV07Ci0JCXYuY29weUludG8ocGFyYW1zKTsKLQkJcmV0dXJuIHBhcmFtczsKLQl9Ci0KLQotCXB1YmxpYyBjbGFzcyBSZWZlcmVuY2UgewotCQlwcm90ZWN0ZWQgUGF0aCBjbGFzc1BhdGg7Ci0JCXByb3RlY3RlZCBSZXBvcnRGaWx0ZXJzIGZpbHRlcnM7Ci0JCXB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpewotCQkJaWYgKGNsYXNzUGF0aCA9PSBudWxsKSB7Ci0JCQkJY2xhc3NQYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2xhc3NQYXRoLmNyZWF0ZVBhdGgoKTsKLQkJfQotCQlwdWJsaWMgUmVwb3J0RmlsdGVycyBjcmVhdGVGaWx0ZXJzKCl7Ci0JCQlpZiAoZmlsdGVycyA9PSBudWxsKXsKLQkJCQlmaWx0ZXJzID0gbmV3IFJlcG9ydEZpbHRlcnMoKTsKLQkJCX0KLQkJCXJldHVybiBmaWx0ZXJzOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuaGFuY2VkWE1MUmVwb3J0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJCS8vIHdlIG5lZWQgYSBjbGFzc3BhdGggZWxlbWVudAotCQkJaWYgKGNsYXNzUGF0aCA9PSBudWxsKXsKLQkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgYSAnY2xhc3NwYXRoJyBlbGVtZW50LiIpOwotCQkJfQotCQkJLy8gYW5kIGEgdmFsaWQgb25lLi4uCi0JCQlTdHJpbmdbXSBwYXRocyA9IGNsYXNzUGF0aC5saXN0KCk7Ci0JCQlpZiAocGF0aHMubGVuZ3RoID09IDApewotCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ292ZXJhZ2UgcGF0aCBpcyBpbnZhbGlkLiBJdCBkb2VzIG5vdCBjb250YWluIGFueSBleGlzdGluZyBwYXRoLiIpOwotCQkJfQotCQkJLy8gYW5kIHdlIG5lZWQgYXQgbGVhc3Qgb25lIGZpbHRlciBpbmNsdWRlL2V4Y2x1ZGUuCi0JCQlpZiAoZmlsdGVycyA9PSBudWxsIHx8IGZpbHRlcnMuc2l6ZSgpID09IDApewotCQkJCWNyZWF0ZUZpbHRlcnMoKTsKLQkJCQlsb2coIkFkZGluZyBkZWZhdWx0IGluY2x1ZGUgZmlsdGVyIHRvICouKigpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0JCQkJUmVwb3J0RmlsdGVycy5JbmNsdWRlIGluY2x1ZGUgPSBuZXcgUmVwb3J0RmlsdGVycy5JbmNsdWRlKCk7Ci0JCQkJZmlsdGVycy5hZGRJbmNsdWRlKCBpbmNsdWRlICk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWxvZygiQ3JlYXRpbmcgZW5oYW5jZWQgWE1MIHJlcG9ydCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotCQkJCVhNTFJlcG9ydCByZXBvcnQgPSBuZXcgWE1MUmVwb3J0KENvdlJlcG9ydC50aGlzLCB0b2ZpbGUpOwotCQkJCXJlcG9ydC5zZXRSZXBvcnRGaWx0ZXJzKGZpbHRlcnMpOwotCQkJCXJlcG9ydC5zZXRKUHJvYmVob21lKCBuZXcgRmlsZShob21lLmdldFBhcmVudCgpKSApOwotCQkJCURvY3VtZW50IGRvYyA9IHJlcG9ydC5jcmVhdGVEb2N1bWVudChwYXRocyk7Ci0JCQkJVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLQkJCQlTb3VyY2Ugc3JjID0gbmV3IERPTVNvdXJjZShkb2MpOwotCQkJCVJlc3VsdCByZXMgPSBuZXcgU3RyZWFtUmVzdWx0KCAiZmlsZTovLy8iICsgdG9maWxlLnRvU3RyaW5nKCkgKTsKLQkJCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc3JjLCByZXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgcGVyZm9ybWluZyBlbmhhbmNlZCBYTUwgcmVwb3J0IGZyb20gZmlsZSAiICsgdG9maWxlLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvQ292ZXJhZ2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvQ292ZXJhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3ZTc0ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL0NvdmVyYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7Ci0KLS8qKgotICogQ29udmVuaWVudCB0YXNrIHRvIHJ1biBTaXRyYWthIEpQcm9iZSBDb3ZlcmFnZSBmcm9tIEFudC4KLSAqIE9wdGlvbnMgYXJlIHByZXR0eSBudW1lcm91cywgeW91J2QgYmV0dGVyIGNoZWNrIHRoZSBtYW51YWwgZm9yIGEgZnVsbAotICogZGVzY3JpcHRpb25zIG9mIG9wdGlvbnMuIChub3QgdGhhdCBzaW1wbGUgc2luY2UgdGhleSBkaWZmZXIgZnJvbSB0aGUgb25saW5lCi0gKiBoZWxwLCBmcm9tIHRoZSB1c2FnZSBjb21tYW5kIGxpbmUgYW5kIGZyb20gdGhlIGV4YW1wbGVzLi4uKQotICogPHA+Ci0gKiBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgdmlzaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5zaXRyYWthLmNvbSI+d3d3LnNpdHJha2EuY29tPC9hPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIENvdmVyYWdlIGV4dGVuZHMgVGFzayB7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBob21lOwotCi0JcHJvdGVjdGVkIENvbW1hbmRsaW5lIGNtZGwgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLQotCXByb3RlY3RlZCBDb21tYW5kbGluZUphdmEgY21kbEphdmEgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZ1bmN0aW9uID0gImNvdmVyYWdlIjsKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VlZE5hbWU7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBpbnB1dEZpbGU7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBqYXZhRXhlOwotCi0JcHJvdGVjdGVkIFN0cmluZyB2bTsKLQotCXByb3RlY3RlZCBib29sZWFuIGFwcGxldCA9IGZhbHNlOwotCi0JLyoqIHRoaXMgaXMgYSBzb21ld2hhdCBhbm5veWluZyB0aGluZywgc2V0IGl0IHRvIG5ldmVyICovCi0JcHJvdGVjdGVkIFN0cmluZyBleGl0UHJvbXB0ID0gIm5ldmVyIjsKLQotCXByb3RlY3RlZCBGaWx0ZXJzIGZpbHRlcnMgPSBuZXcgRmlsdGVycygpOwotCi0JcHJvdGVjdGVkIFRyaWdnZXJzIHRyaWdnZXJzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBmaW5hbFNuYXBzaG90ID0gImNvdmVyYWdlIjsKLQotCXByb3RlY3RlZCBTdHJpbmcgcmVjb3JkRnJvbVN0YXJ0ID0gImNvdmVyYWdlIjsKLQotCXByb3RlY3RlZCBGaWxlIHNuYXBzaG90RGlyOwotCi0JcHJvdGVjdGVkIEZpbGUgd29ya2luZ0RpcjsKLQotCXByb3RlY3RlZCBib29sZWFuIHRyYWNrTmF0aXZlcyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFNvY2tldCBzb2NrZXQ7Ci0KLQlwcm90ZWN0ZWQgaW50IHdhcm5MZXZlbCA9IDA7Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOwotCi0JLy8tLS0tLS0tLS0gc2V0dGVycyB1c2VkIHZpYSByZWZsZWN0aW9uIC0tCi0KLQkvKiogc2V0IHRoZSBjb3ZlcmFnZSBob21lIGRpcmVjdG9yeSB3aGVyZSBhcmUgbGlicmFyaWVzLCBqYXJzIGFuZCBqcGxhdW5jaGVyICovCi0JcHVibGljIHZvaWQgc2V0SG9tZShGaWxlIHZhbHVlKXsKLQkJaG9tZSA9IHZhbHVlOwotCX0KLQotCS8qKiBzZWVkIG5hbWUgZm9yIHNuYXBzaG90IGZpbGUuIGNhbiBiZSBudWxsLCBkZWZhdWx0IHRvIHNuYXAgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWVkbmFtZShTdHJpbmcgdmFsdWUpewotCQlzZWVkTmFtZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0ZmlsZShGaWxlIHZhbHVlKXsKLQkJaW5wdXRGaWxlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YWV4ZShGaWxlIHZhbHVlKXsKLQkJamF2YUV4ZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSmF2YXZtIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKXsKLQkJCXJldHVybiBuZXcgU3RyaW5nW117ImphdmEyIiwgImpkazExOCIsICJqZGsxMTcifTsKLQkJfQotCX0KLQkvKiogamRrMTE3LCBqZGsxMTggb3IgamF2YTIsIGNhbiBiZSBudWxsLCBkZWZhdWx0IHRvIGphdmEyICovCi0JcHVibGljIHZvaWQgc2V0Vm0oSmF2YXZtIHZhbHVlKSB7Ci0JCXZtID0gdmFsdWUuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKiogZGVmYXVsdCB0byBmYWxzZSB1bmxlc3MgZmlsZSBpcyBodG0gb3IgaHRtbCAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGxldChib29sZWFuIHZhbHVlKXsKLQkJYXBwbGV0ID0gdmFsdWU7Ci0JfQotCi0JLyoqIGFsd2F5cywgZXJyb3IsIG5ldmVyICovCi0JcHVibGljIHZvaWQgc2V0RXhpdHByb21wdChTdHJpbmcgdmFsdWUpewotCQlleGl0UHJvbXB0ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIEZpbHRlcnMgY3JlYXRlRmlsdGVycygpewotCQlyZXR1cm4gZmlsdGVyczsKLQl9Ci0KLQlwdWJsaWMgVHJpZ2dlcnMgY3JlYXRlVHJpZ2dlcnMoKXsKLQkJaWYgKHRyaWdnZXJzID09IG51bGwpIHsKLQkJCXRyaWdnZXJzID0gbmV3IFRyaWdnZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHRyaWdnZXJzOwotCX0KLQotCXB1YmxpYyBTb2NrZXQgY3JlYXRlU29ja2V0KCl7Ci0JCWlmIChzb2NrZXQgPT0gbnVsbCApIHsKLQkJCXNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLQkJfQotCQlyZXR1cm4gc29ja2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmluYWxzbmFwc2hvdCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCl7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJjb3ZlcmFnZSIsICJub25lIiwgImFsbCJ9OwotCQl9Ci0JfQotCi0JLyoqIG5vbmUsIGNvdmVyYWdlLCBhbGwuIGNhbiBiZSBudWxsLCBkZWZhdWx0IHRvIG5vbmUgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbHNuYXBzaG90KFN0cmluZyB2YWx1ZSl7Ci0JCWZpbmFsU25hcHNob3QgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJlY29yZGZyb21zdGFydCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCl7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJjb3ZlcmFnZSIsICJub25lIiwgImFsbCJ9OwotCQl9Ci0JfQotCS8qKiBhbGwsIGNvdmVyYWdlLCBub25lICovCi0JcHVibGljIHZvaWQgc2V0UmVjb3JkZnJvbXN0YXJ0KFJlY29yZGZyb21zdGFydCB2YWx1ZSkgewotCQlyZWNvcmRGcm9tU3RhcnQgPSB2YWx1ZS5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdhcm5sZXZlbChJbnRlZ2VyIHZhbHVlKXsKLQkJd2FybkxldmVsID0gdmFsdWUuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTbmFwc2hvdGRpcihGaWxlIHZhbHVlKXsKLQkJc25hcHNob3REaXIgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXb3JraW5nZGlyKEZpbGUgdmFsdWUpewotCQl3b3JraW5nRGlyID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHJhY2tuYXRpdmVzKGJvb2xlYW4gdmFsdWUpewotCQl0cmFja05hdGl2ZXMgPSB2YWx1ZTsKLQl9Ci0KLQkvLwotCi0JLyoqIHRoZSBqdm0gYXJndW1lbnRzICovCi0gICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUp2bWFyZygpIHsKLSAgICAgICAgcmV0dXJuIGNtZGxKYXZhLmNyZWF0ZVZtQXJndW1lbnQoKTsKLSAgICB9Ci0KLQkvKiogdGhlIGNvbW1hbmQgYXJndW1lbnRzICovCi0gICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUFyZygpIHsKLSAgICAgICAgcmV0dXJuIGNtZGxKYXZhLmNyZWF0ZUFyZ3VtZW50KCk7Ci0gICAgfQotCi0JLyoqIGNsYXNzcGF0aCB0byBydW4gdGhlIGZpbGVzICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICByZXR1cm4gY21kbEphdmEuY3JlYXRlQ2xhc3NwYXRoKHByb2plY3QpLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLQkvKiogY2xhc3NuYW1lIHRvIHJ1biBhcyBzdGFuZGFsb25lIG9yIHJ1bm5lciBmb3IgZmlsZXNldHMgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIHZhbHVlKXsKLQkJY21kbEphdmEuc2V0Q2xhc3NuYW1lKHZhbHVlKTsKLQl9Ci0KLQkvKiogdGhlIGNsYXNzbmFtZXMgdG8gZXhlY3V0ZSAqLwotCXB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBmcyl7Ci0JCWZpbGVzZXRzLmFkZEVsZW1lbnQoZnMpOwotCX0KLQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tIHRoZSB0ZWRpb3VzIGpvYiBiZWdpbnMgaGVyZQotCi0JcHVibGljIENvdmVyYWdlKCl7Ci0JfQotCi0JLyoqIGV4ZWN1dGUgdGhlIGpwbGF1bmNoZXIgYnkgcHJvdmlkaW5nIGEgcGFyYW1ldGVyIGZpbGUgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJRmlsZSBwYXJhbWZpbGUgPSBudWxsOwkKLQkJLy8gaWYgYW4gaW5wdXQgZmlsZSBpcyB1c2VkLCBhbGwgb3RoZXIgb3B0aW9ucyBhcmUgaWdub3JlZC4uLgkKLQkJaWYgKGlucHV0RmlsZSA9PSBudWxsKXsKLQkJCWNoZWNrT3B0aW9ucygpOwotCQkJcGFyYW1maWxlID0gY3JlYXRlUGFyYW1GaWxlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJhbWZpbGUgPSBpbnB1dEZpbGU7Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIHdlIG5lZWQgdG8gcnVuIENvdmVyYWdlIGZyb20gaGlzIGRpcmVjdG9yeSBkdWUgdG8gZGxsL2phciBpc3N1ZXMKLQkJCWNtZGwuc2V0RXhlY3V0YWJsZSggbmV3IEZpbGUoaG9tZSwgImpwbGF1bmNoZXIiKS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotCQkJY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItanBfaW5wdXQ9IiArIHBhcmFtZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCS8vIHVzZSB0aGUgY3VzdG9tIGhhbmRsZXIgZm9yIHN0ZGluIGlzc3VlcwotCQkJTG9nU3RyZWFtSGFuZGxlciBoYW5kbGVyID0gbmV3IENvdmVyYWdlU3RyZWFtSGFuZGxlcih0aGlzKTsKLQkJCUV4ZWN1dGUgZXhlYyA9IG5ldyBFeGVjdXRlKCBoYW5kbGVyICk7Ci0JCQlsb2coY21kbC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQkJCWV4ZWMuc2V0Q29tbWFuZGxpbmUoY21kbC5nZXRDb21tYW5kbGluZSgpKTsKLQkJCWludCBleGl0VmFsdWUgPSBleGVjLmV4ZWN1dGUoKTsKLQkJCWlmIChleGl0VmFsdWUgIT0gMCkgewotCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSlByb2JlIENvdmVyYWdlIGZhaWxlZCAoIiArIGV4aXRWYWx1ZSArICIpIik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSBKUHJvYmUgQ292ZXJhZ2UuIiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL0B0b2RvIHNob3VsZCBiZSByZW1vdmVkIG9uY2Ugc3dpdGNoZWQgdG8gSkRLMS4yCi0JCQlpZiAoaW5wdXRGaWxlID09IG51bGwgJiYgcGFyYW1maWxlICE9IG51bGwpewotCQkJCXBhcmFtZmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKiB3aGVjayB3aGF0IGlzIG5lY2Vzc2FyeSB0byBjaGVjaywgQ292ZXJhZ2Ugd2lsbCBkbyB0aGUgam9iIGZvciB1cyAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrT3B0aW9ucygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCS8vIGNoZWNrIGNvdmVyYWdlIGhvbWUKLQkJaWYgKGhvbWUgPT0gbnVsbCB8fCAhaG9tZS5pc0RpcmVjdG9yeSgpICkgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIGhvbWUgZGlyZWN0b3J5LiBNdXN0IHBvaW50IHRvIEpQcm9iZSBob21lIGRpcmVjdG9yeSIpOwotCQl9Ci0JCWhvbWUgPSBuZXcgRmlsZShob21lLCJDb3ZlcmFnZSIpOwotCQlGaWxlIGphciA9IG5ldyBGaWxlKGhvbWUsICJjb3ZlcmFnZS5qYXIiKTsKLQkJaWYgKCFqYXIuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgQ292ZXJhZ2UgZGlyZWN0b3J5OiAiICsgaG9tZSk7Ci0JCX0KLQotCQkvLyBtYWtlIHN1cmUgc25hcHNob3QgZGlyIGV4aXN0cyBhbmQgaXMgcmVzb2x2ZWQKLQkJaWYgKHNuYXBzaG90RGlyID09IG51bGwpIHsKLQkJCXNuYXBzaG90RGlyID0gbmV3IEZpbGUoIi4iKTsKLQkJfQotCQlzbmFwc2hvdERpciA9IHByb2plY3QucmVzb2x2ZUZpbGUoc25hcHNob3REaXIuZ2V0UGF0aCgpKTsKLQkJaWYgKCFzbmFwc2hvdERpci5pc0RpcmVjdG9yeSgpIHx8ICFzbmFwc2hvdERpci5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTbmFwc2hvdCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3RzIDoiICsgc25hcHNob3REaXIpOwotCQl9Ci0JCWlmICh3b3JraW5nRGlyID09IG51bGwpIHsKLQkJCXdvcmtpbmdEaXIgPSBuZXcgRmlsZSgiLiIpOwotCQl9Ci0JCXdvcmtpbmdEaXIgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHdvcmtpbmdEaXIuZ2V0UGF0aCgpKTsKLQotCQkvLyBjaGVjayBmb3IgaW5mbywgZG8geW91ciBiZXN0IHRvIHNlbGVjdCB0aGUgamF2YSBleGVjdXRhYmxlLgotCQkvLyBKUHJvYmUgMy4wIGZhaWxzIGlmIHRoZXJlIGlzIG5vIGphdmFleGUgb3B0aW9uLiBTbwotCQlpZiAoamF2YUV4ZSA9PSBudWxsICYmICggdm0gPT0gbnVsbCB8fCAiamF2YTIiLmVxdWFscyh2bSkgKSApIHsKLQkJCVN0cmluZyB2ZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkJCS8vIG1ha2Ugd2UgYXJlIHVzaW5nIDEuMissIGlmIGl0IGlzLCB0aGVuIGRvIHlvdXIgYmVzdCB0bwotCQkJLy8gZ2V0IGEgamF2YWV4ZQotCQkJaWYgKCAhdmVyc2lvbi5zdGFydHNXaXRoKCIxLjEiKSApewotCQkJCWlmICh2bSA9PSBudWxsKXsKLQkJCQkJdm0gPSAiamF2YTIiOwotCQkJCX0KLQkJCQkvLyBpZiB3ZSBhcmUgaGVyZSBvYnZpb3VzbHkgaXQgaXMgamF2YTIKLQkJCQlTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0JCQkJYm9vbGVhbiBpc1VuaXggPSBGaWxlLnNlcGFyYXRvckNoYXIgPT0gJy8nOwotCQkJCWphdmFFeGUgPSBpc1VuaXggPyBuZXcgRmlsZShob21lLCAiYmluL2phdmEiKSA6IG5ldyBGaWxlKGhvbWUsIi9iaW4vamF2YS5leGUiKTsKLQkJCX0JCQkKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gUGFyYW1ldGVycyBjYW4gZWl0aGVyIGJlIHBhc3NlZAotCSAqIHRvIHRoZSBjb21tYW5kIGxpbmUgYW5kIHN0b3JlZCB0byBhIGZpbGUgKHRoZW4gdXNlIHRoZSAtanBfaW5wdXQ9PGZpbGVuYW1lPikKLQkgKiBpZiB0aGV5IGFyZSB0b28gbnVtZXJvdXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcmFtZXRlcnMoKXsKLQkJVmVjdG9yIHBhcmFtcyA9IG5ldyBWZWN0b3IoKTsKLQkJcGFyYW1zLmFkZEVsZW1lbnQoIi1qcF9mdW5jdGlvbj0iICsgZnVuY3Rpb24pOwotCQlpZiAodm0gIT0gbnVsbCkgewotCQkJcGFyYW1zLmFkZEVsZW1lbnQoIi1qcF92bT0iICsgdm0pOwotCQl9Ci0JCWlmIChqYXZhRXhlICE9IG51bGwpIHsKLQkJCXBhcmFtcy5hZGRFbGVtZW50KCItanBfamF2YV9leGU9IiArIHByb2plY3QucmVzb2x2ZUZpbGUoamF2YUV4ZS5nZXRQYXRoKCkpKTsKLQkJfQotCQlwYXJhbXMuYWRkRWxlbWVudCgiLWpwX3dvcmtpbmdfZGlyPSIgKyB3b3JraW5nRGlyLmdldFBhdGgoKSApOwotCQlwYXJhbXMuYWRkRWxlbWVudCgiLWpwX3NuYXBzaG90X2Rpcj0iICsgc25hcHNob3REaXIuZ2V0UGF0aCgpICk7Ci0JCXBhcmFtcy5hZGRFbGVtZW50KCItanBfcmVjb3JkX2Zyb21fc3RhcnQ9IiArIHJlY29yZEZyb21TdGFydCk7Ci0JCXBhcmFtcy5hZGRFbGVtZW50KCItanBfd2Fybj0iICsgd2FybkxldmVsKTsKLQkJaWYgKHNlZWROYW1lICE9IG51bGwpIHsKLQkJCXBhcmFtcy5hZGRFbGVtZW50KCItanBfb3V0cHV0X2ZpbGU9IiArIHNlZWROYW1lKTsKLQkJfQotCQlwYXJhbXMuYWRkRWxlbWVudCgiLWpwX2ZpbHRlcj0iICsgZmlsdGVycy50b1N0cmluZygpICk7Ci0JCWlmICh0cmlnZ2VycyAhPSBudWxsKSB7Ci0JCQlwYXJhbXMuYWRkRWxlbWVudCgiLWpwX3RyaWdnZXI9IiArIHRyaWdnZXJzLnRvU3RyaW5nKCkgKTsKLQkJfQotCQlpZiAoZmluYWxTbmFwc2hvdCAhPSBudWxsKSB7Ci0JCQlwYXJhbXMuYWRkRWxlbWVudCgiLWpwX2ZpbmFsX3NuYXBzaG90PSIgKyBmaW5hbFNuYXBzaG90KTsKLQkJfQotICAgICAgICBwYXJhbXMuYWRkRWxlbWVudCgiLWpwX2V4aXRfcHJvbXB0PSIgKyBleGl0UHJvbXB0KTsKLQkJLy9wYXJhbXMuYWRkRWxlbWVudCgiLWpwX2FwcGVuZD0iICsgYXBwZW5kKTsKLQkJcGFyYW1zLmFkZEVsZW1lbnQoIi1qcF90cmFja19uYXRpdmVzPSIgKyB0cmFja05hdGl2ZXMpOwotCQkvLy4uLi4gbm93IHRoZSBqdm0KLQkJLy8gYXJndW1lbnRzCi0JCVN0cmluZ1tdIHZtYXJncyA9IGNtZGxKYXZhLmdldFZtQ29tbWFuZCgpLmdldEFyZ3VtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZtYXJncy5sZW5ndGg7IGkrKykgewotCQkJcGFyYW1zLmFkZEVsZW1lbnQodm1hcmdzW2ldKTsKLQkJfQotCQkvLyBjbGFzc3BhdGgKLQkJUGF0aCBjbGFzc3BhdGggPSBjbWRsSmF2YS5nZXRDbGFzc3BhdGgoKTsKLQkJaWYgKGNsYXNzcGF0aCAhPSBudWxsICYmIGNsYXNzcGF0aC5zaXplKCkgPiAwKSB7Ci0JCQlwYXJhbXMuYWRkRWxlbWVudCgiLWNsYXNzcGF0aCAiICsgY2xhc3NwYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0JCS8vIGNsYXNzbmFtZSAocnVubmVyIG9yIHN0YW5kYWxvbmUpCi0JCWlmIChjbWRsSmF2YS5nZXRDbGFzc25hbWUoKSAhPSBudWxsKSB7Ci0JCQlwYXJhbXMuYWRkRWxlbWVudChjbWRsSmF2YS5nZXRDbGFzc25hbWUoKSk7Ci0JCX0KLQkJLy8gYXJndW1lbnRzIGZvciBjbGFzc25hbWUKLQkJU3RyaW5nW10gYXJncyA9IGNtZGxKYXZhLmdldEphdmFDb21tYW5kKCkuZ2V0QXJndW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJcGFyYW1zLmFkZEVsZW1lbnQoYXJnc1tpXSk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1twYXJhbXMuc2l6ZSgpXTsKLQkJcGFyYW1zLmNvcHlJbnRvKGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQkKLQkKLQkvKioKLQkgKiBjcmVhdGUgdGhlIHBhcmFtZXRlciBmaWxlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuIFRoZSBmaWxlIGlzCi0JICogY3JlYXRlZCB3aXRoIGEgcmFuZG9tIG5hbWUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCSAqIEByZXR1cm4gdGhlIGZpbGUgb2JqZWN0IHdoZXJlIGFyZSB3cml0dGVuIHRoZSBjb25maWd1cmF0aW9uIHRvIHJ1bgotCSAqIEpQcm9iZSBDb3ZlcmFnZQotCSAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdGhyb3duIGlmIHNvbWV0aGluZyBiYWQgaGFwcGVucyB3aGlsZSB3cml0aW5nCi0JICogdGhlIGFyZ3VtZW50cyB0byB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRmlsZSBjcmVhdGVQYXJhbUZpbGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQkvL0B0b2RvIGNoYW5nZSB0aGlzIHdoZW4gc3dpdGNoaW5nIHRvIEpESyAxLjIgYW5kIHVzZSBGaWxlLmNyZWF0ZVRtcEZpbGUoKQotCQlGaWxlIGZpbGUgPSBjcmVhdGVUbXBGaWxlKCk7Ci0JCWxvZygiQ3JlYXRpbmcgcGFyYW1ldGVyIGZpbGU6ICIgKyBmaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQkJCi0JCS8vIG9wdGlvbnMgbmVlZCB0byBiZSBvbmUgcGVyIGxpbmUgaW4gdGhlIHBhcmFtZXRlciBmaWxlCi0JCS8vIHNvIHdyaXRlIHRoZW0gYWxsIGluIGEgc2luZ2xlIHN0cmluZwotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJU3RyaW5nW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKyl7Ci0JCQlwdy5wcmludGxuKHBhcmFtc1tpXSk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQkJbG9nKCJKUHJvYmUgQ292ZXJhZ2UgcGFyYW1ldGVyczpcbiIgKyBzdy50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLQkJCi0JCS8vIG5vdyB3cml0ZSB0aGVtIHRvIHRoZSBmaWxlCi0JCUZpbGVXcml0ZXIgZncgPSBudWxsOwotCQl0cnkgewotCQkJZncgPSBuZXcgRmlsZVdyaXRlcihmaWxlKTsKLQkJCWZ3LndyaXRlKHN3LnRvU3RyaW5nKCkpOwotCQkJZncuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCB3cml0ZSBwYXJhbWV0ZXIgZmlsZSAiICsgZmlsZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZncgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZ3LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCl7fQotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKiBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgY3VycmVudCBkaXIgKEZvciBKREsxLjEgc3VwcG9ydCkgKi8KLQlwcm90ZWN0ZWQgRmlsZSBjcmVhdGVUbXBGaWxlKCl7Ci0JCWZpbmFsIGxvbmcgcmFuZCA9IChuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkubmV4dExvbmcoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoImpwY292ZXJhZ2UiICsgcmFuZCArICIudG1wIik7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKiBzcGVjaWZpYyBwdW1wZXIgdG8gYXZvaWQgdGhvc2UgbmFzdHkgc3RkaW4gaXNzdWVzICovCi0Jc3RhdGljIGNsYXNzIENvdmVyYWdlU3RyZWFtSGFuZGxlciBleHRlbmRzIExvZ1N0cmVhbUhhbmRsZXIgewotCQlDb3ZlcmFnZVN0cmVhbUhhbmRsZXIoVGFzayB0YXNrKXsKLQkJCXN1cGVyKHRhc2ssIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX1dBUk4pOwotCQl9Ci0JCS8qKgotCQkgKiB0aGVyZSBhcmUgc29tZSBpc3N1ZXMgY29uY2VybmluZyBhbGwgSlByb2JlIGV4ZWN1dGFibGUKLQkJICogSW4gb3VyIGNhc2UgYSAnUHJlc3MgRU5URVIgdG8gY2xvc2UgdGhpcyB3aW5kb3cuLi4iIHdpbGwKLQkJICogYmUgZGlzcGxheWVkIGluIHRoZSBjdXJyZW50IHdpbmRvdyB3YWl0aW5nIGZvciBlbnRlci4KLQkJICogU28gSSdtIGNsb3NpbmcgdGhlIHN0cmVhbSByaWdodCBhd2F5IHRvIGF2b2lkIHByb2JsZW1zLgotCQkgKi8KLQkgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0lucHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgewotCSAgICAJdHJ5IHsKLQkgICAgCQlvcy5jbG9zZSgpOwotCSAgICAJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCl7Ci0JICAgIAl9Ci0JICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvRmlsdGVycy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9GaWx0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMmVhZTEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9GaWx0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBGaWx0ZXJzIGluZm9ybWF0aW9uIGZyb20gY292ZXJhZ2UsIHNvbWV3aGF0IHNpbWlsYXIgdG8gYSA8dHQ+RmlsZVNldDwvdHQ+LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJzIHsKLQotICAgIC8qKiBkZWZhdWx0IHJlZ2V4cCB0byBleGNsdWRlIGV2ZXJ5dGhpbmcgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0VYQ0xVREUgPSAiKi4qKCk6RSI7Ci0KLSAgICAvKiogc2F5IHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCBleGNsdWRlcyBvciBub3QgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0RXhjbHVkZSA9IHRydWU7Ci0KLSAgICAvKiogdXNlciBkZWZpbmVkIGZpbHRlcnMgKi8KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgRmlsdGVycygpewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRFeGNsdWRlKGJvb2xlYW4gdmFsdWUpewotICAgICAgICBkZWZhdWx0RXhjbHVkZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEluY2x1ZGUoSW5jbHVkZSBpbmNsKXsKLSAgICAgICAgZmlsdGVycy5hZGRFbGVtZW50KGluY2wpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2x1ZGUoRXhjbHVkZSBleGNsKXsKLSAgICAgICAgZmlsdGVycy5hZGRFbGVtZW50KGV4Y2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBmaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRFeGNsdWRlKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKERFRkFVTFRfRVhDTFVERSk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZmlsdGVycy5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoIGkgPCBzaXplIC0gMSkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaWx0ZXJFbGVtZW50IHsKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBjbGF6ejsKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBtZXRob2QgPSAiKiI7IC8vIGRlZmF1bHQgaXMgYWxsIG1ldGhvZHMKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7IC8vIGRlZmF1bHQgaXMgZW5hYmxlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKXsgLy8gdGhpcyBvbmUgaXMgZGVwcmVjYXRlZC4KLSAgICAgICAgICAgIGNsYXp6ID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3MoU3RyaW5nIHZhbHVlKXsKLSAgICAgICAgICAgIGNsYXp6ICA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgdmFsdWUpewotICAgICAgICAgICAgbWV0aG9kID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHZhbHVlKXsKLSAgICAgICAgICAgIGVuYWJsZWQgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICByZXR1cm4gY2xhenogKyAiLiIgKyBtZXRob2QgKyAiKCkiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmNsdWRlIGV4dGVuZHMgRmlsdGVyRWxlbWVudCB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIjpJIiArIChlbmFibGVkID8gIiIgOiAiIyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNsdWRlIGV4dGVuZHMgRmlsdGVyRWxlbWVudCB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICI6RSIgKyAoZW5hYmxlZCA/ICIiIDogIiMiKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvUmVwb3J0RmlsdGVycy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9SZXBvcnRGaWx0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWQzMzEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9SZXBvcnRGaWx0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuKjsKLQotLyoqCi0gKiBGaWx0ZXJzIGluZm9ybWF0aW9uIGZyb20gY292ZXJhZ2UsIHNvbWV3aGF0IHNpbWlsYXIgdG8gYSA8dHQ+RmlsZVNldDwvdHQ+LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRGaWx0ZXJzIHsKLQotCS8qKiB1c2VyIGRlZmluZWQgZmlsdGVycyAqLwotCXByb3RlY3RlZCBWZWN0b3IgZmlsdGVycyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKiBjYWNoZWQgbWF0Y2hlciBmb3IgZWFjaCBmaWx0ZXIgKi8KLQlwcm90ZWN0ZWQgVmVjdG9yIG1hdGNoZXJzID0gbnVsbDsKLQotCXB1YmxpYyBSZXBvcnRGaWx0ZXJzKCl7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW5jbHVkZShJbmNsdWRlIGluY2wpewotCQlmaWx0ZXJzLmFkZEVsZW1lbnQoaW5jbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXhjbHVkZShFeGNsdWRlIGV4Y2wpewotCQlmaWx0ZXJzLmFkZEVsZW1lbnQoZXhjbCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCl7Ci0JCXJldHVybiBmaWx0ZXJzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIGEgZ2l2ZW4gJmx0O2NsYXNzbmFtZSZndDsmbHQ7bWV0aG9kJmd0OygpIGlzIGFjY2VwdGVkIGJ5IHRoZSBsaXN0Ci0JICogb2YgZmlsdGVycyBvciBub3QuCi0JICogQHBhcmFtIG1ldGhvZG5hbWUgdGhlIGZ1bGwgbWV0aG9kIG5hbWUgaW4gdGhlIGZvcm1hdCAmbHQ7Y2xhc3NuYW1lJmd0OyZsdDttZXRob2QmZ3Q7KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIG1ldGhvZG5hbWUpewotCQkvLyBJJ20gZGVmZXJyaW5nIG1hdGNoZXIgaW5zdGFudGlhdGlvbnMgYXQgcnVudGltZSB0byBhdm9pZCBjb21wdXRpbmcKLQkJLy8gdGhlIGZpbHRlcnMgYXQgcGFyc2luZyB0aW1lCi0JCWlmIChtYXRjaGVycyA9PSBudWxsKXsKLQkJCWNyZWF0ZU1hdGNoZXJzKCk7Ci0JCX0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gYXNzZXJ0IGZpbHRlcnMuc2l6ZSgpID09IG1hdGNoZXJzLnNpemUoKQotCQlmaW5hbCBpbnQgc2l6ZSA9IGZpbHRlcnMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKyl7Ci0JCQlGaWx0ZXJFbGVtZW50IGZpbHRlciA9IChGaWx0ZXJFbGVtZW50KWZpbHRlcnMuZWxlbWVudEF0KGkpOwotCQkJUmVnZXhwTWF0Y2hlciBtYXRjaGVyID0gKFJlZ2V4cE1hdGNoZXIpbWF0Y2hlcnMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIEluY2x1ZGUpewotCQkJCXJlc3VsdCA9IHJlc3VsdCB8fCBtYXRjaGVyLm1hdGNoZXMobWV0aG9kbmFtZSk7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIEV4Y2x1ZGUpewotCQkJCXJlc3VsdCA9IHJlc3VsdCAmJiAhbWF0Y2hlci5tYXRjaGVzKG1ldGhvZG5hbWUpOwotCQkJfSBlbHNlewotCQkJCS8vbm90IHBvc3NpYmxlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmaWx0ZXIgZWxlbWVudDogIiArIGZpbHRlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKiogc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgdG8gY2FjaGUgbWF0Y2hlcnMgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYXRjaGVycygpewotCQlSZWdleHBNYXRjaGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFJlZ2V4cE1hdGNoZXJGYWN0b3J5KCk7Ci0JCWZpbmFsIGludCBzaXplID0gZmlsdGVycy5zaXplKCk7Ci0JCW1hdGNoZXJzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKyl7Ci0JCQlGaWx0ZXJFbGVtZW50IGZpbHRlciA9IChGaWx0ZXJFbGVtZW50KWZpbHRlcnMuZWxlbWVudEF0KGkpOwotCQkJUmVnZXhwTWF0Y2hlciBtYXRjaGVyID0gZmFjdG9yeS5uZXdSZWdleHBNYXRjaGVyKCk7Ci0JCQlTdHJpbmcgcGF0dGVybiA9IGZpbHRlci5nZXRBc1BhdHRlcm4oKTsKLQkJCW1hdGNoZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCW1hdGNoZXJzLmFkZEVsZW1lbnQobWF0Y2hlcik7Ci0JCX0KLQl9Ci0KLQotCS8qKiBkZWZhdWx0IGFic3RyYWN0IGZpbHRlciBlbGVtZW50IGNsYXNzICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaWx0ZXJFbGVtZW50IHsKLQkJcHJvdGVjdGVkIFN0cmluZyBjbGF6eiA9ICIqIjsgLy8gZGVmYXVsdCBpcyBhbGwgY2xhc3NlcwotCQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZCA9ICIqIjsgLy8gZGVmYXVsdCBpcyBhbGwgbWV0aG9kcwotCi0JCXB1YmxpYyB2b2lkIHNldENsYXNzKFN0cmluZyB2YWx1ZSl7Ci0JCQljbGF6eiAgPSB2YWx1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIHZhbHVlKXsKLQkJCW1ldGhvZCA9IHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBc1BhdHRlcm4oKXsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRvU3RyaW5nKCkpOwotCQkJU3RyaW5nVXRpbC5yZXBsYWNlKGJ1ZiwgIi4iLCAiXFwuIik7Ci0JCQlTdHJpbmdVdGlsLnJlcGxhY2UoYnVmLCAiKiIsICIuKiIpOwotCQkJU3RyaW5nVXRpbC5yZXBsYWNlKGJ1ZiwgIigiLCAiXFwoIik7Ci0JCQlTdHJpbmdVdGlsLnJlcGxhY2UoYnVmLCAiKSIsICJcXCkiKTsKLQkJCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJCXJldHVybiBjbGF6eiArICIuIiArIG1ldGhvZCArICIoKSI7Ci0JCX0KLQl9Ci0KLQkvKiogY29uY3JldGUgaW5jbHVkZSBjbGFzcyAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5jbHVkZSBleHRlbmRzIEZpbHRlckVsZW1lbnQge30KLQotCS8qKiBjb25jcmV0ZSBleGNsdWRlIGNsYXNzICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFeGNsdWRlIGV4dGVuZHMgRmlsdGVyRWxlbWVudCB7fQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL1NvY2tldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9Tb2NrZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3OGRmZC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL1NvY2tldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYTsKLQotLyoqCi0gKiBTb2NrZXQgZWxlbWVudCBmb3IgY29ubmVjdGlvbi4KLSAqIDx0dD4mbHQ7c29ja2V0LyZndDs8L3R0PiBkZWZhdWx0cyB0byBob3N0IDEyNy4wLjAuMSBhbmQgcG9ydCA0NDQ0Ci0gKgotICogT3RoZXJ3aXNlIGl0IHJlcXVpcmVzIHRoZSBob3N0IGFuZCBwb3J0IGF0dHJpYnV0ZXMgdG8gYmUgc2V0OgotICogPHR0PgotICogJmx0O3NvY2tldCBob3N0PSZxdW90ZTsxNzUuMzAuMTIuMSZxdW90ZTsgcG9ydD0mcXVvdGU7NDU2NyZxdW90ZTsvJmd0OwotICogPC90dD4KLSAqLwotcHVibGljIGNsYXNzIFNvY2tldCB7Ci0KLQkvKiogZGVmYXVsdCB0byBsb2NhbGhvc3QgKi8KLQlwcml2YXRlIFN0cmluZyBob3N0ID0gIjEyNy4wLjAuMSI7Ci0KLQkvKiogZGVmYXVsdCB0byA0NDQ0ICovCi0JcHJpdmF0ZSBpbnQgcG9ydCA9IDQ0NDQ7Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyB2YWx1ZSl7Ci0JCWhvc3QgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0KEludGVnZXIgdmFsdWUpewotCQlwb3J0ID0gdmFsdWUuaW50VmFsdWUoKTsKLQl9Ci0KLQkvKiogaWYgbm8gaG9zdCBpcyBzZXQsIHJldHVybmluZyAnOjxwb3J0PicsIHdpbGwgdGFrZSBsb2NhbGhvc3QgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCXJldHVybiBob3N0ICsgIjoiICsgcG9ydDsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL1N0cmluZ1V0aWwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvU3RyaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ3M2I5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvU3RyaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYTsKLQotLyoqCi0gKiBTdHJpbmcgdXRpbGl0aWVzIG1ldGhvZC4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdVdGlsIHsKLQkvKiogcHJpdmF0ZSBjb25zdHJ1Y3RvciwgaXQncyBhIHV0aWxpdHkgY2xhc3MgKi8KLQlwcml2YXRlIFN0cmluZ1V0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgYWxsIG9jY3VyZW5jZXMgb2YgPHR0PmZpbmQ8L3R0PiB3aXRoIDx0dD5yZXBsYWNlbWVudDwvdHQ+IGluIHRoZQotCSAqIHNvdXJjZSBTdHJpbmdCdWZmZXIuCi0JICogQHBhcmFtIHNyYyB0aGUgb3JpZ2luYWwgc3RyaW5nIGJ1ZmZlciB0byBtb2RpZnkuCi0JICogQHBhcmFtIGZpbmQgdGhlIHN0cmluZyB0byBiZSByZXBsYWNlZC4KLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnQgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBmb3IgPHR0PmZpbmQ8L3R0PiBtYXRjaGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlKFN0cmluZ0J1ZmZlciBzcmMsIFN0cmluZyBmaW5kLCBTdHJpbmcgcmVwbGFjZW1lbnQpewotCQlpbnQgaW5kZXggPSAwOwotCQl3aGlsZSAoaW5kZXggPCBzcmMubGVuZ3RoKCkgKXsKLQkJCWluZGV4ID0gc3JjLnRvU3RyaW5nKCkuaW5kZXhPZihmaW5kLCBpbmRleCk7Ci0JCQlpZiAoaW5kZXggPT0gLTEpewotCQkJCWJyZWFrOwotCQkJfQotCQkJc3JjLmRlbGV0ZShpbmRleCwgaW5kZXggKyBmaW5kLmxlbmd0aCgpKTsKLQkJCXNyYy5pbnNlcnQoaW5kZXgsIHJlcGxhY2VtZW50KTsKLQkJCWluZGV4ICs9IHJlcGxhY2VtZW50Lmxlbmd0aCgpICsgMTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvVHJpZ2dlcnMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvVHJpZ2dlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmYTJhMi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL1RyaWdnZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi0vKioKLSAqIFRyaWdnZXIgaW5mb3JtYXRpb24uIEl0IHdpbGwgcmV0dXJuIGFzIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGJ5IGNhbGxpbmcKLSAqIHRoZSA8dHQ+dG9TdHJpbmcoKTwvdHQ+IG1ldGhvZC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgVHJpZ2dlcnMgewotCi0JcHJvdGVjdGVkIFZlY3RvciB0cmlnZ2VycyA9IG5ldyBWZWN0b3IoKTsKLQkKLQlwdWJsaWMgVHJpZ2dlcnMoKXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNZXRob2QoTWV0aG9kIG1ldGhvZCl7Ci0JCXRyaWdnZXJzLmFkZEVsZW1lbnQobWV0aG9kKTsKLQl9Ci0KLQkvLyAtanBfdHJpZ2dlcj1DbGFzc05hbWUuKigpOkU6UyxDbGFzc05hbWUuTWV0aG9kTmFtZSgpOlg6WCAKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZpbmFsIGludCBzaXplID0gdHJpZ2dlcnMuc2l6ZSgpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgIGkrKykgewotCQkJYnVmLmFwcGVuZCggdHJpZ2dlcnMuZWxlbWVudEF0KGkpLnRvU3RyaW5nKCkgKTsKLQkJCWlmIChpIDwgc2l6ZSAtIDEpIHsKLQkJCQlidWYuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotICAgIAotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0aG9kIHsKLQkJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCQlwcm90ZWN0ZWQgU3RyaW5nIGV2ZW50OwotCQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGlvbjsKLQkJcHJvdGVjdGVkIFN0cmluZyBwYXJhbTsKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpewotCQkJbmFtZSA9IHZhbHVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV2ZW50KFN0cmluZyB2YWx1ZSl7Ci0JCQlpZiAoZXZlbnRNYXAuZ2V0KHZhbHVlKSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIGV2ZW50LCBtdXN0IGJlIG9uZSBvZiAiICsgZXZlbnRNYXApOwotCQkJfQotCQkJZXZlbnQgPSB2YWx1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIHZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQkJaWYgKGFjdGlvbk1hcC5nZXQodmFsdWUpID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgYWN0aW9uLCBtdXN0IGJlIG9uZSBvZiAiICsgYWN0aW9uTWFwKTsKLQkJCX0KLQkJCWFjdGlvbiA9IHZhbHVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFBhcmFtKFN0cmluZyB2YWx1ZSl7Ci0JCQlwYXJhbSA9IHZhbHVlOwotCQl9Ci0KLQkJLy8gcmV0dXJuIDxuYW1lPjo8ZXZlbnQ+OjxhY3Rpb24+WzpwYXJhbV0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJ1Zi5hcHBlbmQobmFtZSkuYXBwZW5kKCI6Iik7IC8vQHRvZG8gbmFtZSBtdXN0IG5vdCBiZSBudWxsLCBjaGVjayBmb3IgaXQKLQkJCWJ1Zi5hcHBlbmQoZXZlbnRNYXAuZ2V0KGV2ZW50KSkuYXBwZW5kKCI6Iik7Ci0JCQlidWYuYXBwZW5kKGFjdGlvbk1hcC5nZXQoYWN0aW9uKSk7Ci0JCQlpZiAocGFyYW0gIT0gbnVsbCkgewotCQkJCWJ1Zi5hcHBlbmQoIjoiKS5hcHBlbmQocGFyYW0pOwotCQkJfQotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqIG1hcHBpbmcgb2YgYWN0aW9ucyB0byBjcnlwdGljIGNvbW1hbmQgbGluZSBtbmVtb25pY3MgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBIYXNodGFibGUgYWN0aW9uTWFwID0gbmV3IEhhc2h0YWJsZSgzKTsKLQkKLQkvKiogbWFwcGluZyBvZiBldmVudHMgdG8gY3J5cHRpYyBjb21tYW5kIGxpbmUgbW5lbW9uaWNzICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlIGV2ZW50TWFwID0gbmV3IEhhc2h0YWJsZSgzKTsKLQotCXN0YXRpYyB7Ci0JCWFjdGlvbk1hcC5wdXQoImVudGVyIiwgIkUiKTsKLQkJYWN0aW9uTWFwLnB1dCgiZXhpdCIsICJYIik7Ci0JCS8vIGNsZWFyfHBhdXNlfHJlc3VtZXxzbmFwc2hvdHxzdXNwZW5kfGV4aXQKLQkJZXZlbnRNYXAucHV0KCJjbGVhciIsICJDIik7Ci0JCWV2ZW50TWFwLnB1dCgicGF1c2UiLCAiUCIpOwotCQlldmVudE1hcC5wdXQoInJlc3VtZSIsICJSIik7Ci0JCWV2ZW50TWFwLnB1dCgic25hcHNob3QiLCAiUyIpOwotCQlldmVudE1hcC5wdXQoInN1c3BlbmQiLCAiQSIpOwotCQlldmVudE1hcC5wdXQoImV4aXQiLCAiWCIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9YTUxSZXBvcnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvWE1MUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNmViNTYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9YTUxSZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uKjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotLyoqCi0gKiBMaXR0bGUgaGFjayB0byBwcm9jZXNzIFhNTCByZXBvcnQgZnJvbSBKUHJvYmUuIEl0IHdpbGwgZml4Ci0gKiBzb21lIHJlcG9ydGluZyBlcnJvcnMgZnJvbSBKUHJvYmUgMy4wIGFuZCBtYWtlcyB1c2Ugb2YgYSByZWZlcmVuY2UKLSAqIGNsYXNzcGF0aCB0byBhZGQgY2xhc3Nlcy9tZXRob2RzIHRoYXQgd2VyZSBub3QgcmVwb3J0ZWQgYnkgSlByb2JlCi0gKiBhcyBiZWluZyB1c2VkIChpZSBsb2FkZWQpCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgWE1MUmVwb3J0IHsKLQkvKiogdGFzayBjYWxsZXIsIGNhbiBiZSBudWxsLCB1c2VkIGZvciBsb2dnaW5nIHB1cnBvc2UgKi8KLQlwcm90ZWN0ZWQgVGFzayB0YXNrOwotCi0JLyoqIHRoZSBYTUwgZmlsZSB0byBwcm9jZXNzIGp1c3QgZnJvbSBDb3ZSZXBvcnQgKi8KLQlwcm90ZWN0ZWQgRmlsZSBmaWxlOwotCi0JLyoqIGpwcm9iZSBob21lIHBhdGguIEl0IGlzIHVzZWQgdG8gZ2V0IHRoZSBEVEQgKi8KLQlwcm90ZWN0ZWQgRmlsZSBqcHJvYmVIb21lOwotCi0JLyoqIHBhcnNlZCBkb2N1bWVudCAqLwotCXByb3RlY3RlZCBEb2N1bWVudCByZXBvcnQ7Ci0KLQkvKiogbWFwcGluZyBwYWNrYWdlIG5hbWUgLyBwYWNrYWdlIG5vZGUgZm9yIGZhc3RlciBhY2Nlc3MgKi8KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIHBrZ01hcDsKLQotCS8qKiBtYXBwaW5nIGNsYXNzbmFtZSAvIGNsYXNzIG5vZGUgZm9yIGZhc3RlciBhY2Nlc3MgKi8KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGNsYXNzTWFwOwotCi0JLyoqIG1ldGhvZCBmaWx0ZXJzICovCi0JcHJvdGVjdGVkIFJlcG9ydEZpbHRlcnMgZmlsdGVyczsKLQotCS8qKiBjcmVhdGUgYSBuZXcgWE1MIHJlcG9ydCwgbG9nZ2luZyB3aWxsIGJlIG9uIHN0ZG91dCAqLwotCXB1YmxpYyBYTUxSZXBvcnQoRmlsZSBmaWxlKXsKLQkJdGhpcyhudWxsLCBmaWxlKTsKLQl9Ci0KLQkvKiogY3JlYXRlIGEgbmV3IFhNTCByZXBvcnQsIGxvZ2dpbmcgZG9uZSBvbiB0aGUgdGFzayAqLwotCXB1YmxpYyBYTUxSZXBvcnQoVGFzayB0YXNrLCBGaWxlIGZpbGUpewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLnRhc2sgPSB0YXNrOwotCX0KLQotCS8qKiBzZXQgdGhlIEpQcm9iZSBob21lIHBhdGguIFVzZWQgdG8gZ2V0IHRoZSBEVEQgKi8KLQlwdWJsaWMgdm9pZCBzZXRKUHJvYmVob21lKEZpbGUgaG9tZSl7Ci0JCWpwcm9iZUhvbWUgPSBob21lOwotCX0KLQotCS8qKiBzZXQgdGhlICAqLwotCXB1YmxpYyB2b2lkIHNldFJlcG9ydEZpbHRlcnMoUmVwb3J0RmlsdGVycyBmaWx0ZXJzKXsKLQkJdGhpcy5maWx0ZXJzID0gZmlsdGVyczsKLQl9Ci0KLQotCi0JLyoqIGNyZWF0ZSBub2RlIG1hcHMgc28gdGhhdCB3ZSBjYW4gYWNjZXNzIG5vZGUgZmFzdGVyIGJ5IHRoZWlyIG5hbWUgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb2RlTWFwcygpewotCQlwa2dNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWNsYXNzTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQkvLyBjcmVhdGUgYSBtYXAgaW5kZXggb2YgYWxsIHBhY2thZ2VzIGJ5IHRoZWlyIG5hbWUKLQkJLy8gQHRvZG8gY2FuIGJlIGRvbmUgZmFzdGVyIGJ5IGRpcmVjdCBhY2Nlc3MuCi0JCU5vZGVMaXN0IHBhY2thZ2VzID0gcmVwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYWNrYWdlIik7Ci0JCWZpbmFsIGludCBwa2dsZW4gPSBwYWNrYWdlcy5nZXRMZW5ndGgoKTsKLQkJbG9nKCJJbmRleGluZyAiICsgcGtnbGVuICsgIiBwYWNrYWdlcyIpOwotCQlmb3IgKGludCBpID0gcGtnbGVuLTE7IGkgPiAtMSA7IGktLSl7Ci0JCQlFbGVtZW50IHBrZyA9IChFbGVtZW50KXBhY2thZ2VzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgcGtnbmFtZSA9IHBrZy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQotCQkJaW50IG5iY2xhc3NlcyA9IDA7Ci0JCQkvLyBjcmVhdGUgYSBtYXAgaW5kZXggb2YgYWxsIGNsYXNzZXMgYnkgdGhlaXIgZnVsbHkKLQkJCS8vIHF1YWxpZmllZCBuYW1lLgotCQkJTm9kZUxpc3QgY2xhc3NlcyA9IHBrZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY2xhc3MiKTsKLQkJCWZpbmFsIGludCBjbGFzc2xlbiA9IGNsYXNzZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlsb2coIkluZGV4aW5nICIgKyBjbGFzc2xlbiArICIgY2xhc3NlcyBpbiBwYWNrYWdlICIgKyBwa2duYW1lKTsKLQkJCWZvciAoaW50IGogPSBjbGFzc2xlbi0xOyBqID4gLTEgOyBqLS0pewotCQkJCUVsZW1lbnQgY2xhenogPSAoRWxlbWVudCljbGFzc2VzLml0ZW0oaik7Ci0JCQkJU3RyaW5nIGNsYXNzbmFtZSA9IGNsYXp6LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQkJCWlmIChwa2duYW1lICE9IG51bGwgJiYgcGtnbmFtZS5sZW5ndGgoKSAhPSAwKXsKLQkJCQkJY2xhc3NuYW1lID0gcGtnbmFtZSArICIuIiArIGNsYXNzbmFtZTsKLQkJCQl9Ci0KLQkJCQlpbnQgbmJtZXRob2RzID0gMDsKLQkJCQlOb2RlTGlzdCBtZXRob2RzID0gY2xhenouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZCIpOwotCQkJCWZpbmFsIGludCBtZXRob2RsZW4gPSBtZXRob2RzLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGsgPSBtZXRob2RsZW4tMTsgayA+IC0xOyBrLS0pewotCQkJCQlFbGVtZW50IG1ldGggPSAoRWxlbWVudCltZXRob2RzLml0ZW0oayk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBtZXRob2RuYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihtZXRoLmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLQkJCQkJbWV0aG9kbmFtZS5kZWxldGUobWV0aG9kbmFtZS50b1N0cmluZygpLmluZGV4T2YoIigiKSAsIG1ldGhvZG5hbWUudG9TdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCQkJCVN0cmluZyBzaWduYXR1cmUgPSBjbGFzc25hbWUgKyAiLiIgKyBtZXRob2RuYW1lICsgIigpIjsKLQkJCQkJaWYgKGZpbHRlcnMuYWNjZXB0KHNpZ25hdHVyZSkpewotCQkJCQkJbG9nKCJrZWVwZWQgbWV0aG9kOiIgKyBzaWduYXR1cmUpOwotCQkJCQkJbmJtZXRob2RzKys7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljbGF6ei5yZW1vdmVDaGlsZChtZXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBpZiB3ZSBkb24ndCBrZWVwIGFueSBtZXRob2QsIHdlIGRvbid0IGtlZXAgdGhlIGNsYXNzCi0JCQkJaWYgKG5ibWV0aG9kcyAhPSAwKXsKLQkJCQkJbG9nKCJBZGRpbmcgY2xhc3MgJyIgKyBjbGFzc25hbWUgKyAiJyIpOwotCQkJCQljbGFzc01hcC5wdXQoY2xhc3NuYW1lLCBjbGF6eik7Ci0JCQkJCW5iY2xhc3NlcysrOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGtnLnJlbW92ZUNoaWxkKGNsYXp6KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmJjbGFzc2VzICE9IDApewotCQkJCWxvZygiQWRkaW5nIHBhY2thZ2UgJyIgKyBwa2duYW1lICsgIiciKTsKLQkJCQlwa2dNYXAucHV0KHBrZ25hbWUsIHBrZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwa2cuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKHBrZyk7Ci0JCQl9Ci0JCX0KLQkJbG9nKCJJbmRleGVkICIgKyBjbGFzc01hcC5zaXplKCkgKyAiIGNsYXNzZXMgaW4gIiArIHBrZ01hcC5zaXplKCkgKyAiIHBhY2thZ2VzIik7Ci0JfQotCi0JLyoqIGNyZWF0ZSB0aGUgd2hvbGUgbmV3IGRvY3VtZW50ICovCi0JcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFN0cmluZ1tdIGNsYXNzUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJRG9jdW1lbnRCdWlsZGVyIGRidWlsZGVyID0gbmV3QnVpbGRlcigpOwotCQlJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZSggbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSApOwotCQlpZiAoanByb2JlSG9tZSAhPSBudWxsKXsKLQkJCUZpbGUgZHRkRGlyID0gbmV3IEZpbGUoanByb2JlSG9tZSwgIkR0ZC9zbmFwc2hvdC5kdGQiKTsKLQkJCWlzLnNldFN5c3RlbUlkKCAiZmlsZTovLy8iICsgZHRkRGlyLmdldEFic29sdXRlUGF0aCgpICk7Ci0JCX0KLQkJcmVwb3J0ID0gZGJ1aWxkZXIucGFyc2UoIGlzICk7Ci0JCXJlcG9ydC5ub3JtYWxpemUoKTsKLQotCQkvLyBjcmVhdGUgbWFwcyBmb3IgZmFzdGVyIG5vZGUgYWNjZXNzCi0JCWNyZWF0ZU5vZGVNYXBzKCk7Ci0KLQkJLy8gaXRlcmF0ZSBvdmVyIHRoZSBjbGFzc3BhdGguLi4KLQkJQ2xhc3NQYXRoTG9hZGVyIGNwbCA9IG5ldyBDbGFzc1BhdGhMb2FkZXIoY2xhc3NQYXRoKTsKLQkJRW51bWVyYXRpb24gZW51bSA9IGNwbC5sb2FkZXJzKCk7Ci0JCXdoaWxlICggZW51bS5oYXNNb3JlRWxlbWVudHMoKSApewotCQkJQ2xhc3NQYXRoTG9hZGVyLkZpbGVMb2FkZXIgZmwgPSAoQ2xhc3NQYXRoTG9hZGVyLkZpbGVMb2FkZXIpZW51bS5uZXh0RWxlbWVudCgpOwotCQkJQ2xhc3NGaWxlW10gY2xhc3NlcyA9IGZsLmdldENsYXNzZXMoKTsKLQkJCWxvZygiUHJvY2Vzc2luZyAiICsgY2xhc3Nlcy5sZW5ndGggKyAiIGNsYXNzZXMgaW4gIiArIGZsLmdldEZpbGUoKSk7Ci0JCQkvLyBwcm9jZXNzIGFsbCBjbGFzc2VzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspewotCQkJCXNlcmlhbGl6ZUNsYXNzKGNsYXNzZXNbaV0pOwotCQkJfQotCQl9Ci0JCS8vIHVwZGF0ZSB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgc3RhdHMKLQkJdXBkYXRlKCk7Ci0JCXJldHVybiByZXBvcnQ7Ci0JfQotCi0JLyoqCi0JICogSlByb2JlIGRvZXMgbm90IHB1dCB0aGUgamF2YS5sYW5nIHByZWZpeCBmb3IgY2xhc3NlcwotCSAqIGluIHRoaXMgcGFja2FnZSwgc28gdXNlZCB0aGlzIG5pY2UgbWV0aG9kIHNvIHRoYXQKLQkgKiBJIGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlIGZvciBtZXRob2RzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRob2RTaWduYXR1cmUoTWV0aG9kSW5mbyBtZXRob2QpewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihtZXRob2QuZ2V0TmFtZSgpKTsKLQkJYnVmLmFwcGVuZCgiKCIpOwotCQlTdHJpbmdbXSBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyc1R5cGUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspewotCQkJU3RyaW5nIHR5cGUgPSBwYXJhbXNbaV07Ci0JCQlpbnQgcG9zID0gIHR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwb3MgIT0gLTEpewotCQkJCVN0cmluZyBwa2cgPSB0eXBlLnN1YnN0cmluZygwLCBwb3MpOwotCQkJCWlmICgiamF2YS5sYW5nIi5lcXVhbHMocGtnKSl7Ci0JCQkJCXBhcmFtc1tpXSA9IHR5cGUuc3Vic3RyaW5nKHBvcyArIDEpOwotCQkJCX0KLQkJCX0KLQkJCWJ1Zi5hcHBlbmQocGFyYW1zW2ldKTsKLQkJCWlmIChpICE9IHBhcmFtcy5sZW5ndGggLSAxKXsKLQkJCQlidWYuYXBwZW5kKCIsICIpOwotCQkJfQotCQl9Ci0JCWJ1Zi5hcHBlbmQoIikiKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gYSBDb3ZSZXBvcnQtbGlrZSBzaWduYXR1cmUgaWUsIDxjbGFzc25hbWU+LjxtZXRob2Q+KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGhvZFNpZ25hdHVyZShDbGFzc0ZpbGUgY2xhenosIE1ldGhvZEluZm8gbWV0aG9kKXsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoY2xhenouZ2V0RnVsbE5hbWUoKSk7Ci0JCWJ1Zi5hcHBlbmQoIi4iKTsKLQkJYnVmLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpKTsKLQkJYnVmLmFwcGVuZCgiKCkiKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIERvIGFkZGl0aW9uYWwgd29yayBvbiBhbiBlbGVtZW50IHRvIHJlbW92ZSBhYnN0cmFjdCBtZXRob2RzIHRoYXQKLQkgKiBhcmUgcmVwb3J0ZWQgYnkgSlByb2JlIDMuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFic3RyYWN0TWV0aG9kcyhDbGFzc0ZpbGUgY2xhc3NGaWxlLCBFbGVtZW50IGNsYXNzTm9kZSl7Ci0JCU1ldGhvZEluZm9MaXN0IG1ldGhvZHMgPSBjbGFzc0ZpbGUuZ2V0TWV0aG9kcygpOwotCQlIYXNodGFibGUgbWV0aG9kTm9kZUxpc3QgPSBnZXRNZXRob2RzKGNsYXNzTm9kZSk7Ci0JCS8vIGFzc2VydCB4bWxNZXRob2RzLnNpemUoKSA9PSBtZXRob2RzLmxlbmd0aCgpCi0JCWZpbmFsIGludCBzaXplID0gbWV0aG9kcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspewotCQkJTWV0aG9kSW5mbyBtZXRob2QgPSBtZXRob2RzLmdldE1ldGhvZChpKTsKLQkJCVN0cmluZyBtZXRob2RTaWcgPSBnZXRNZXRob2RTaWduYXR1cmUobWV0aG9kKTsKLQkJCUVsZW1lbnQgbWV0aG9kTm9kZSA9IChFbGVtZW50KW1ldGhvZE5vZGVMaXN0LmdldChtZXRob2RTaWcpOwotCQkJaWYgKCBtZXRob2ROb2RlICE9IG51bGwgJiYKLQkJCQlVdGlscy5pc0Fic3RyYWN0KG1ldGhvZC5nZXRBY2Nlc3NGbGFncygpKSkgewotCQkJCWxvZygiXHRSZW1vdmluZyBtZXRob2QgIiArIG1ldGhvZFNpZyk7Ci0JCQkJY2xhc3NOb2RlLnJlbW92ZUNoaWxkKG1ldGhvZE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqIGNyZWF0ZSBhbiBlbXB0eSBtZXRob2QgZWxlbWVudCB3aXRoIGl0cyBjb3YuZGF0YSB2YWx1ZXMgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KE1ldGhvZEluZm8gbWV0aG9kKXsKLQkJU3RyaW5nIG1ldGhvZHNpZyA9IGdldE1ldGhvZFNpZ25hdHVyZShtZXRob2QpOwotCQlFbGVtZW50ICBtZXRob2RFbGVtID0gcmVwb3J0LmNyZWF0ZUVsZW1lbnQoIm1ldGhvZCIpOwotCQltZXRob2RFbGVtLnNldEF0dHJpYnV0ZSgibmFtZSIsIG1ldGhvZHNpZyk7Ci0JCS8vIGNyZWF0ZSB0aGUgbWV0aG9kIGNvdi5kYXRhIGVsZW1lbnQKLQkJRWxlbWVudCBtZXRob2REYXRhID0gcmVwb3J0LmNyZWF0ZUVsZW1lbnQoImNvdi5kYXRhIik7Ci0JCW1ldGhvZEVsZW0uYXBwZW5kQ2hpbGQobWV0aG9kRGF0YSk7Ci0JCW1ldGhvZERhdGEuc2V0QXR0cmlidXRlKCJjYWxscyIsICIwIik7Ci0JCW1ldGhvZERhdGEuc2V0QXR0cmlidXRlKCJoaXRfbGluZXMiLCAiMCIpOwotCQltZXRob2REYXRhLnNldEF0dHJpYnV0ZSgidG90YWxfbGluZXMiLCBTdHJpbmcudmFsdWVPZihtZXRob2QuZ2V0TnVtYmVyT2ZMaW5lcygpKSk7Ci0JCXJldHVybiBtZXRob2RFbGVtOwotCX0KLQotCS8qKiBjcmVhdGUgYW4gZW1wdHkgcGFja2FnZSBlbGVtZW50IHdpdGggaXRzIGRlZmF1bHQgY292LmRhdGEgKDApICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlUGFja2FnZUVsZW1lbnQoU3RyaW5nIHBrZ25hbWUpewotCQlFbGVtZW50IHBrZ0VsZW0gPSByZXBvcnQuY3JlYXRlRWxlbWVudCgicGFja2FnZSIpOwotCQlwa2dFbGVtLnNldEF0dHJpYnV0ZSgibmFtZSIsIHBrZ25hbWUpOwotCQkvLyBjcmVhdGUgdGhlIHBhY2thZ2UgY292LmRhdGEgZWxlbWVudCAvIGRlZmF1bHQKLQkJLy8gbXVzdCBiZSB1cGRhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIHdob2xlIHByb2Nlc3MKLQkJRWxlbWVudCBwa2dEYXRhID0gcmVwb3J0LmNyZWF0ZUVsZW1lbnQoImNvdi5kYXRhIik7Ci0JCXBrZ0VsZW0uYXBwZW5kQ2hpbGQocGtnRGF0YSk7Ci0JCXBrZ0RhdGEuc2V0QXR0cmlidXRlKCJjYWxscyIsICIwIik7Ci0JCXBrZ0RhdGEuc2V0QXR0cmlidXRlKCJoaXRfbWV0aG9kcyIsICIwIik7Ci0JCXBrZ0RhdGEuc2V0QXR0cmlidXRlKCJ0b3RhbF9tZXRob2RzIiwgIjAiKTsKLQkJcGtnRGF0YS5zZXRBdHRyaWJ1dGUoImhpdF9saW5lcyIsICIwIik7Ci0JCXBrZ0RhdGEuc2V0QXR0cmlidXRlKCJ0b3RhbF9saW5lcyIsICIwIik7Ci0JCXJldHVybiBwa2dFbGVtOwotCX0KLQotCS8qKiBjcmVhdGUgYW4gZW1wdHkgY2xhc3MgZWxlbWVudCB3aXRoIGl0cyBkZWZhdWx0IGNvdi5kYXRhICgwKSAqLwotCXByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUNsYXNzRWxlbWVudChDbGFzc0ZpbGUgY2xhc3NGaWxlKXsKLQkJLy8gY3JlYXRlIHRoZSBjbGFzcyBlbGVtZW50Ci0JCUVsZW1lbnQgY2xhc3NFbGVtID0gcmVwb3J0LmNyZWF0ZUVsZW1lbnQoImNsYXNzIik7Ci0JCWNsYXNzRWxlbS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBjbGFzc0ZpbGUuZ2V0TmFtZSgpKTsKLQkJY2xhc3NFbGVtLnNldEF0dHJpYnV0ZSgic291cmNlIiwgY2xhc3NGaWxlLmdldFNvdXJjZUZpbGUoKSk7Ci0JCS8vIGNyZWF0ZSB0aGUgY292LmRhdGEgZWxlbQotCQlFbGVtZW50IGNsYXNzRGF0YSA9IHJlcG9ydC5jcmVhdGVFbGVtZW50KCJjb3YuZGF0YSIpOwotCQljbGFzc0VsZW0uYXBwZW5kQ2hpbGQoY2xhc3NEYXRhKTsKLQkJLy8gY3JlYXRlIHRoZSBjbGFzcyBjb3YuZGF0YSBlbGVtZW50Ci0JCWNsYXNzRGF0YS5zZXRBdHRyaWJ1dGUoImNhbGxzIiwgIjAiKTsKLQkJY2xhc3NEYXRhLnNldEF0dHJpYnV0ZSgiaGl0X21ldGhvZHMiLCAiMCIpOwotCQljbGFzc0RhdGEuc2V0QXR0cmlidXRlKCJ0b3RhbF9tZXRob2RzIiwgIjAiKTsKLQkJY2xhc3NEYXRhLnNldEF0dHJpYnV0ZSgiaGl0X2xpbmVzIiwgIjAiKTsKLQkJY2xhc3NEYXRhLnNldEF0dHJpYnV0ZSgidG90YWxfbGluZXMiLCAiMCIpOwotCQlyZXR1cm4gY2xhc3NFbGVtOwotCX0KLQotCS8qKiBzZXJpYWxpemUgYSBjbGFzc2ZpbGUgaW50byBYTUwgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemVDbGFzcyhDbGFzc0ZpbGUgY2xhc3NGaWxlKXsKLQkJLy8gdGhlIGNsYXNzIGFscmVhZHkgaXMgcmVwb3J0ZWQgc28gaWdub3JlIGl0Ci0JCVN0cmluZyBmdWxsY2xhc3NuYW1lID0gY2xhc3NGaWxlLmdldEZ1bGxOYW1lKCk7Ci0JCWxvZygiTG9va2luZyBmb3IgJyIgKyBmdWxsY2xhc3NuYW1lICsgIiciKTsKLQkJRWxlbWVudCBjbGF6eiA9IChFbGVtZW50KWNsYXNzTWFwLmdldChmdWxsY2xhc3NuYW1lKTsKLQotCQkvLyBpZ25vcmUgY2xhc3NlcyB0aGF0IGFyZSBhbHJlYWR5IHJlcG9ydGVkLCBhbGwgdGhlIGluZm9ybWF0aW9uIGlzCi0JCS8vIGFscmVhZHkgdGhlcmUuCi0JCWlmICggY2xhenogIT0gbnVsbCApewotCQkJbG9nKCJJZ25vcmluZyAiICsgZnVsbGNsYXNzbmFtZSk7Ci0JCQlyZW1vdmVBYnN0cmFjdE1ldGhvZHMoY2xhc3NGaWxlLCBjbGF6eik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZ25vcmUgaW50ZXJmYWNlcyBmaWxlcywgdGhlcmUgaXMgbm8gY29kZSBpbiB0aGVyZSB0byBjb3Zlci4KLQkJaWYgKFV0aWxzLmlzSW50ZXJmYWNlKGNsYXNzRmlsZS5nZXRBY2Nlc3MoKSkpewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVmVjdG9yIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhc3NGaWxlKTsKLQkJLy8gbm8gbmVlZCB0byBwcm9jZXNzLCB0aGVyZSBhcmUgbm8gbWV0aG9kcyB0byBhZGQgZm9yIHRoaXMgY2xhc3MuCi0JCWlmIChtZXRob2RzLnNpemUoKSA9PSAwKXsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBwa2duYW1lID0gY2xhc3NGaWxlLmdldFBhY2thZ2UoKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJMb29raW5nIGZvciBwYWNrYWdlICIgKyBwa2duYW1lKTsKLQkJRWxlbWVudCBwa2dFbGVtID0gKEVsZW1lbnQpcGtnTWFwLmdldChwa2duYW1lKTsKLQkJaWYgKHBrZ0VsZW0gPT0gbnVsbCl7Ci0JCQlwa2dFbGVtID0gY3JlYXRlUGFja2FnZUVsZW1lbnQocGtnbmFtZSk7Ci0JCQlyZXBvcnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQocGtnRWxlbSk7Ci0JCQlwa2dNYXAucHV0KHBrZ25hbWUsIHBrZ0VsZW0pOyAvLyBhZGQgdGhlIHBrZyB0byB0aGUgbWFwCi0JCX0KLQkJLy8gdGhpcyBpcyBhIGJyYW5kIG5ldyBjbGFzcywgc28gd2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgbm9kZQotCi0JCS8vIGNyZWF0ZSB0aGUgY2xhc3MgZWxlbWVudAotCQlFbGVtZW50IGNsYXNzRWxlbSA9IGNyZWF0ZUNsYXNzRWxlbWVudChjbGFzc0ZpbGUpOwotCQlwa2dFbGVtLmFwcGVuZENoaWxkKGNsYXNzRWxlbSk7Ci0KLQkJaW50IHRvdGFsX2xpbmVzID0gMDsKLQkJaW50IHRvdGFsX21ldGhvZHMgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspewotCQkJLy8gY3JlYXRlIHRoZSBtZXRob2QgZWxlbWVudAotCQkJTWV0aG9kSW5mbyBtZXRob2QgPSAoTWV0aG9kSW5mbyltZXRob2RzLmVsZW1lbnRBdChpKTsKLQkJCWlmICggVXRpbHMuaXNBYnN0cmFjdChtZXRob2QuZ2V0QWNjZXNzRmxhZ3MoKSApICl7Ci0JCQkJY29udGludWU7IC8vIG5vIG5lZWQgdG8gcmVwb3J0IGFic3RyYWN0IG1ldGhvZHMKLQkJCX0KLQkJCUVsZW1lbnQgbWV0aG9kRWxlbSA9IGNyZWF0ZU1ldGhvZEVsZW1lbnQobWV0aG9kKTsKLQkJCWNsYXNzRWxlbS5hcHBlbmRDaGlsZChtZXRob2RFbGVtKTsKLQkJCXRvdGFsX2xpbmVzICs9IG1ldGhvZC5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCQl0b3RhbF9tZXRob2RzKys7Ci0JCX0KLQkJLy8gY3JlYXRlIHRoZSBjbGFzcyBjb3YuZGF0YSBlbGVtZW50Ci0JCUVsZW1lbnQgY2xhc3NEYXRhID0gZ2V0Q292RGF0YUNoaWxkKGNsYXNzRWxlbSk7Ci0JCWNsYXNzRGF0YS5zZXRBdHRyaWJ1dGUoInRvdGFsX21ldGhvZHMiLCBTdHJpbmcudmFsdWVPZih0b3RhbF9tZXRob2RzKSk7Ci0JCWNsYXNzRGF0YS5zZXRBdHRyaWJ1dGUoInRvdGFsX2xpbmVzIiwgU3RyaW5nLnZhbHVlT2YodG90YWxfbGluZXMpKTsKLQotCQkvLyBhZGQgaXRzZWxmIHRvIHRoZSBub2RlIG1hcAotCQljbGFzc01hcC5wdXQoZnVsbGNsYXNzbmFtZSwgY2xhc3NFbGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIGdldEZpbHRlcmVkTWV0aG9kcyhDbGFzc0ZpbGUgY2xhc3NGaWxlKXsKLQkJVmVjdG9yIG1ldGhvZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCU1ldGhvZEluZm9MaXN0IG1ldGhvZGxpc3QgPSBjbGFzc0ZpbGUuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZGxpc3QubGVuZ3RoKCk7IGkrKyl7Ci0JCQlNZXRob2RJbmZvIG1ldGhvZCA9IG1ldGhvZGxpc3QuZ2V0TWV0aG9kKGkpOwotCQkJU3RyaW5nIHNpZ25hdHVyZSA9IGdldE1ldGhvZFNpZ25hdHVyZShjbGFzc0ZpbGUsIG1ldGhvZCk7Ci0JCQlpZiAoZmlsdGVycy5hY2NlcHQoc2lnbmF0dXJlKSl7Ci0JCQkJbWV0aG9kcy5hZGRFbGVtZW50KG1ldGhvZCk7Ci0JCQkJbG9nKCJrZWVwaW5nICIgKyBzaWduYXR1cmUpOwotCQkJfSBlbHNlIHsKLS8vCQkJCWxvZygiZGlzY2FyZGluZyAiICsgc2lnbmF0dXJlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0KLQotCS8qKiB1cGRhdGUgdGhlIGNvdW50IG9mIHRoZSBYTUwsIHRoYXQgaXMgYWNjdW11bGF0ZSB0aGUgc3RhdHMgb24KLQkgKiBtZXRob2RzLCBjbGFzc2VzIGFuZCBwYWNrYWdlIHNvIHRoYXQgdGhlIG51bWJlcnMgYXJlIHZhbGlkCi0JICogYWNjb3JkaW5nIHRvIHRoZSBpbmZvIHRoYXQgd2FzIGFwcGVuZGVkIHRvIHRoZSBYTUwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCl7Ci0JCWludCBjYWxscyA9IDA7Ci0JCWludCBoaXRfbWV0aG9kcyA9IDA7Ci0JCWludCB0b3RhbF9tZXRob2RzID0gMDsKLQkJaW50IGhpdF9saW5lcyA9IDA7Ci0JCWludCB0b3RhbF9saW5lcyA9IDA7Ci0KLQkJLy8gdXNlIHRoZSBtYXAgZm9yIGFjY2VzcywgYWxsIG5vZGVzIHNob3VsZCBiZSB0aGVyZQotCQlFbnVtZXJhdGlvbiBlbnVtID0gcGtnTWFwLmVsZW1lbnRzKCk7Ci0JCXdoaWxlICggZW51bS5oYXNNb3JlRWxlbWVudHMoKSApewotCQkJRWxlbWVudCBwa2dFbGVtID0gKEVsZW1lbnQpZW51bS5uZXh0RWxlbWVudCgpOwotCQkJU3RyaW5nIHBrZ25hbWUgPSBwa2dFbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQkJRWxlbWVudFtdIGNsYXNzZXMgPSBnZXRDbGFzc2VzKHBrZ0VsZW0pOwotCQkJaW50IHBrZ19jYWxscyA9IDA7Ci0JCQlpbnQgcGtnX2hpdF9tZXRob2RzID0gMDsKLQkJCWludCBwa2dfdG90YWxfbWV0aG9kcyA9IDA7Ci0JCQlpbnQgcGtnX2hpdF9saW5lcyA9IDA7Ci0JCQlpbnQgcGtnX3RvdGFsX2xpbmVzID0gMDsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIHBhY2thZ2UgJyIgKyBwa2duYW1lICsgIic6ICIgKyBjbGFzc2VzLmxlbmd0aCArICIgY2xhc3NlcyIpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc2VzLmxlbmd0aDsgaisrKXsKLQkJCQlFbGVtZW50IGNsYXp6ID0gY2xhc3Nlc1tqXTsKLQkJCQlTdHJpbmcgY2xhc3NuYW1lID0gY2xhenouZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCQkJaWYgKHBrZ25hbWUgIT0gbnVsbCAmJiBwa2duYW1lLmxlbmd0aCgpICE9IDApewotCQkJCQljbGFzc25hbWUgPSBwa2duYW1lICsgIi4iICsgY2xhc3NuYW1lOwotCQkJCX0KLQkJCQkvLyB0aGVyZSdzIG9ubHkgY292LmRhdGEgYXMgYSBjaGlsZCBzbyBiZXQgb24gaXQKLQkJCQlFbGVtZW50IGNvdmRhdGEgPSBnZXRDb3ZEYXRhQ2hpbGQoY2xhenopOwotCQkJCXRyeSB7Ci0JCQkJCXBrZ19jYWxscyArPSBJbnRlZ2VyLnBhcnNlSW50KGNvdmRhdGEuZ2V0QXR0cmlidXRlKCJjYWxscyIpKTsKLQkJCQkJcGtnX2hpdF9tZXRob2RzICs9IEludGVnZXIucGFyc2VJbnQoY292ZGF0YS5nZXRBdHRyaWJ1dGUoImhpdF9tZXRob2RzIikpOwotCQkJCQlwa2dfdG90YWxfbWV0aG9kcyArPSBJbnRlZ2VyLnBhcnNlSW50KGNvdmRhdGEuZ2V0QXR0cmlidXRlKCJ0b3RhbF9tZXRob2RzIikpOwotCQkJCQlwa2dfaGl0X2xpbmVzICs9IEludGVnZXIucGFyc2VJbnQoY292ZGF0YS5nZXRBdHRyaWJ1dGUoImhpdF9saW5lcyIpKTsKLQkJCQkJcGtnX3RvdGFsX2xpbmVzICs9IEludGVnZXIucGFyc2VJbnQoY292ZGF0YS5nZXRBdHRyaWJ1dGUoInRvdGFsX2xpbmVzIikpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBwYXJzaW5nICciICsgY2xhc3NuYW1lICsgIicgKCIgKyBqICsgIi8iICsgY2xhc3Nlcy5sZW5ndGggKyAiKSBpbiBwYWNrYWdlICciICsgcGtnbmFtZSArICInIik7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJRWxlbWVudCBjb3ZkYXRhID0gZ2V0Q292RGF0YUNoaWxkKHBrZ0VsZW0pOwotCQkJY292ZGF0YS5zZXRBdHRyaWJ1dGUoImNhbGxzIiwgU3RyaW5nLnZhbHVlT2YocGtnX2NhbGxzKSk7Ci0JCQljb3ZkYXRhLnNldEF0dHJpYnV0ZSgiaGl0X21ldGhvZHMiLCBTdHJpbmcudmFsdWVPZihwa2dfaGl0X21ldGhvZHMpKTsKLQkJCWNvdmRhdGEuc2V0QXR0cmlidXRlKCJ0b3RhbF9tZXRob2RzIiwgU3RyaW5nLnZhbHVlT2YocGtnX3RvdGFsX21ldGhvZHMpKTsKLQkJCWNvdmRhdGEuc2V0QXR0cmlidXRlKCJoaXRfbGluZXMiLCBTdHJpbmcudmFsdWVPZihwa2dfaGl0X2xpbmVzKSk7Ci0JCQljb3ZkYXRhLnNldEF0dHJpYnV0ZSgidG90YWxfbGluZXMiLCBTdHJpbmcudmFsdWVPZihwa2dfdG90YWxfbGluZXMpKTsKLQkJCWNhbGxzICs9IHBrZ19jYWxsczsKLQkJCWhpdF9tZXRob2RzICs9IHBrZ19oaXRfbWV0aG9kczsKLQkJCXRvdGFsX21ldGhvZHMgKz0gcGtnX3RvdGFsX21ldGhvZHM7Ci0JCQloaXRfbGluZXMgKz0gcGtnX2hpdF9saW5lczsKLQkJCXRvdGFsX2xpbmVzICs9IHBrZ190b3RhbF9saW5lczsKLQkJfQotCQlFbGVtZW50IGNvdmRhdGEgPSBnZXRDb3ZEYXRhQ2hpbGQocmVwb3J0LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJY292ZGF0YS5zZXRBdHRyaWJ1dGUoImNhbGxzIiwgU3RyaW5nLnZhbHVlT2YoY2FsbHMpKTsKLQkJY292ZGF0YS5zZXRBdHRyaWJ1dGUoImhpdF9tZXRob2RzIiwgU3RyaW5nLnZhbHVlT2YoaGl0X21ldGhvZHMpKTsKLQkJY292ZGF0YS5zZXRBdHRyaWJ1dGUoInRvdGFsX21ldGhvZHMiLCBTdHJpbmcudmFsdWVPZih0b3RhbF9tZXRob2RzKSk7Ci0JCWNvdmRhdGEuc2V0QXR0cmlidXRlKCJoaXRfbGluZXMiLCBTdHJpbmcudmFsdWVPZihoaXRfbGluZXMpKTsKLQkJY292ZGF0YS5zZXRBdHRyaWJ1dGUoInRvdGFsX2xpbmVzIiwgU3RyaW5nLnZhbHVlT2YodG90YWxfbGluZXMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBnZXRDb3ZEYXRhQ2hpbGQoRWxlbWVudCBwYXJlbnQpewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBsZW4gPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyl7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKXsKLQkJCQlFbGVtZW50IGVsZW0gPSAoRWxlbWVudCljaGlsZDsKLQkJCQlpZiAoImNvdi5kYXRhIi5lcXVhbHMoZWxlbS5nZXROb2RlTmFtZSgpKSl7Ci0JCQkJCXJldHVybiBlbGVtOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgJ2Nvdi5kYXRhJyBlbGVtZW50IGluIHBhcmVudCAnIiArIHBhcmVudC5nZXROb2RlTmFtZSgpICsgIiciKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldE1ldGhvZHMoRWxlbWVudCBjbGF6eil7Ci0JCUhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gY2xhenouZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSl7Ci0JCQkJRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpY2hpbGQ7Ci0JCQkJaWYgKCJtZXRob2QiLmVxdWFscyhlbGVtLmdldE5vZGVOYW1lKCkpKXsKLQkJCQkJU3RyaW5nIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQkJCQltYXAucHV0KG5hbWUsIGVsZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXByb3RlY3RlZCBFbGVtZW50W10gZ2V0Q2xhc3NlcyhFbGVtZW50IHBrZyl7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBrZy5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBsZW4gPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyl7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKXsKLQkJCQlFbGVtZW50IGVsZW0gPSAoRWxlbWVudCljaGlsZDsKLQkJCQlpZiAoImNsYXNzIi5lcXVhbHMoZWxlbS5nZXROb2RlTmFtZSgpKSl7Ci0JCQkJCXYuYWRkRWxlbWVudChlbGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJRWxlbWVudFtdIGVsZW1zID0gbmV3IEVsZW1lbnRbdi5zaXplKCldOwotCQl2LmNvcHlJbnRvKGVsZW1zKTsKLQkJcmV0dXJuIGVsZW1zOwotCi0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnRbXSBnZXRQYWNrYWdlcyhFbGVtZW50IHNuYXBzaG90KXsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gc25hcHNob3QuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSl7Ci0JCQkJRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpY2hpbGQ7Ci0JCQkJaWYgKCJwYWNrYWdlIi5lcXVhbHMoZWxlbS5nZXROb2RlTmFtZSgpKSl7Ci0JCQkJCXYuYWRkRWxlbWVudChlbGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJRWxlbWVudFtdIGVsZW1zID0gbmV3IEVsZW1lbnRbdi5zaXplKCldOwotCQl2LmNvcHlJbnRvKGVsZW1zKTsKLQkJcmV0dXJuIGVsZW1zOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlciBuZXdCdWlsZGVyKCkgewotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJZmFjdG9yeS5zZXRJZ25vcmluZ0NvbW1lbnRzKHRydWUpOwotCQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCXJldHVybiBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKXsKLQkJaWYgKHRhc2sgPT0gbnVsbCl7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLQkJfSBlbHNlIHsKLQkJCXRhc2subG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0RFQlVHKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIHJlcG9ydEZpbGUgPSBuZXcgRmlsZSggWE1MUmVwb3J0LmNsYXNzLmdldFJlc291cmNlKCJjb3ZyZXBvcnQtdGVzdC54bWwiKS5nZXRGaWxlKCkgKTsKLQkJWE1MUmVwb3J0IHJlcG9ydCA9IG5ldyBYTUxSZXBvcnQoIHJlcG9ydEZpbGUgKTsKLQkJcmVwb3J0LnNldEpQcm9iZWhvbWUobmV3IEZpbGUoImQ6L1Byb2dyYW0gRmlsZXMvSlByb2JlIikpOwotCQlSZXBvcnRGaWx0ZXJzIGZpbHRlcnMgPSBuZXcgUmVwb3J0RmlsdGVycygpOwotCQlSZXBvcnRGaWx0ZXJzLkluY2x1ZGUgaW5jbCA9IG5ldyBSZXBvcnRGaWx0ZXJzLkluY2x1ZGUoKTsKLQkJaW5jbC5zZXRDbGFzcygiKiIpOwotCQlpbmNsLnNldE1ldGhvZCgic2V0KiIpOwotCQlmaWx0ZXJzLmFkZEluY2x1ZGUoaW5jbCk7Ci0JCXJlcG9ydC5zZXRSZXBvcnRGaWx0ZXJzKGZpbHRlcnMpOwotCQlEb2N1bWVudCBkb2MgPSByZXBvcnQuY3JlYXRlRG9jdW1lbnQoIG5ldyBTdHJpbmdbXXsiWjovaW1lZGlhdGlvbi9pY2hhbm5lbC9zb3VyY2VzL3Rvb2xraXQvbGliL2ltdG9vbGtpdC5qYXIifSApOwotCQlUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOwotCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2MpLCBuZXcgU3RyZWFtUmVzdWx0KCBuZXcgRmlsZU91dHB1dFN0cmVhbSggImQ6L3RtcC9zbmFwc2hvdF9tZXJnZS54bWwiKSkpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL0NsYXNzRmlsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9DbGFzc0ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzNWJlYS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL0NsYXNzRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuYnl0ZWNvZGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sLkNvbnN0YW50UG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sLkNsYXNzQ1BJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuYnl0ZWNvZGUuYXR0cmlidXRlcy4qOwotCi0KLS8qKgotICogT2JqZWN0IHJlcHJlc2VudGluZyBhIGNsYXNzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzRmlsZSB7Ci0JCi0JcHJvdGVjdGVkIENvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7Ci0JCi0JcHJvdGVjdGVkIEludGVyZmFjZUxpc3QgaW50ZXJmYWNlczsKLQkKLQlwcm90ZWN0ZWQgRmllbGRJbmZvTGlzdCBmaWVsZHM7Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZEluZm9MaXN0IG1ldGhvZHM7Ci0JCQotCXByb3RlY3RlZCBTdHJpbmcgc291cmNlRGlyOwotCQotCXByb3RlY3RlZCBTdHJpbmcgc291cmNlRmlsZTsKLQkKLQlwcm90ZWN0ZWQgaW50IGFjY2Vzc19mbGFnczsKLQkKLQlwcm90ZWN0ZWQgaW50IHRoaXNfY2xhc3M7Ci0JCi0JcHJvdGVjdGVkIGludCBzdXBlcl9jbGFzczsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bnRoZXRpYzsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlcHJlY2F0ZWQ7Ci0JCi0JcHVibGljIENsYXNzRmlsZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGF0YUlucHV0U3RyZWFtIGRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaXMpOwotCQljb25zdGFudFBvb2wgPSBuZXcgQ29uc3RhbnRQb29sKCk7Ci0JCQkKLQkJaW50IG1hZ2ljID0gZGlzLnJlYWRJbnQoKTsgLy8gMHhDQUZFQkFCRQotCQlpbnQgbWlub3IgPSBkaXMucmVhZFNob3J0KCk7Ci0JCWludCBtYWpvciA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJCQkKLQkJY29uc3RhbnRQb29sLnJlYWQoZGlzKTsKLQkJY29uc3RhbnRQb29sLnJlc29sdmUoKTsKLQkJCi0JCWFjY2Vzc19mbGFncyA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJdGhpc19jbGFzcyA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJc3VwZXJfY2xhc3MgPSBkaXMucmVhZFNob3J0KCk7Ci0JCQotCQlpbnRlcmZhY2VzID0gbmV3IEludGVyZmFjZUxpc3QoY29uc3RhbnRQb29sKTsKLQkJaW50ZXJmYWNlcy5yZWFkKGRpcyk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKGludGVyZmFjZXMudG9TdHJpbmcoKSk7Ci0JCQotCQlmaWVsZHMgPSBuZXcgRmllbGRJbmZvTGlzdChjb25zdGFudFBvb2wpOwotCQlmaWVsZHMucmVhZChkaXMpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihmaWVsZHMudG9TdHJpbmcoKSk7Ci0JCQotCQltZXRob2RzID0gbmV3IE1ldGhvZEluZm9MaXN0KGNvbnN0YW50UG9vbCk7Ci0JCW1ldGhvZHMucmVhZChkaXMpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihtZXRob2RzLnRvU3RyaW5nKCkpOwotCQkKLQkJQXR0cmlidXRlSW5mb0xpc3QgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVJbmZvTGlzdChjb25zdGFudFBvb2wpOwotCQlhdHRyaWJ1dGVzLnJlYWQoZGlzKTsKLQkJU291cmNlRmlsZSBzcmNGaWxlID0gKFNvdXJjZUZpbGUpYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGUoQXR0cmlidXRlSW5mby5TT1VSQ0VfRklMRSk7Ci0JCWlmIChzcmNGaWxlICE9IG51bGwpewotCQkJc291cmNlRmlsZSA9IHNyY0ZpbGUuZ2V0VmFsdWUoKTsKLQkJfQotCQlTb3VyY2VEaXIgc3JjRGlyID0gKFNvdXJjZURpcilhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGVJbmZvLlNPVVJDRV9ESVIpOwotCQlpZiAoc3JjRGlyICE9IG51bGwpewotCQkJc291cmNlRGlyID0gc3JjRGlyLmdldFZhbHVlKCk7Ci0JCX0KLQkJaXNTeW50aGV0aWMgPSBhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGVJbmZvLlNZTlRIRVRJQykgIT0gbnVsbDsKLQkJaXNEZXByZWNhdGVkID0gYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGUoQXR0cmlidXRlSW5mby5ERVBSRUNBVEVEKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEFjY2VzcygpewotCQlyZXR1cm4gYWNjZXNzX2ZsYWdzOwotCX0KLQlwdWJsaWMgSW50ZXJmYWNlTGlzdCBnZXRJbnRlcmZhY2VzKCl7Ci0JCXJldHVybiBpbnRlcmZhY2VzOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZpbGUoKXsKLQkJcmV0dXJuIHNvdXJjZUZpbGU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlRGlyKCl7Ci0JCXJldHVybiBzb3VyY2VEaXI7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkgewotCQlyZXR1cm4gaXNTeW50aGV0aWM7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKLQkJcmV0dXJuIGlzRGVwcmVjYXRlZDsKLQl9Ci0JcHVibGljIE1ldGhvZEluZm9MaXN0IGdldE1ldGhvZHMoKXsKLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCXB1YmxpYyBGaWVsZEluZm9MaXN0IGdldEZpZWxkcygpewotCQlyZXR1cm4gZmllbGRzOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFN1cGVyTmFtZSgpewotCQlyZXR1cm4gVXRpbHMuZ2V0VVRGOFZhbHVlKGNvbnN0YW50UG9vbCwgc3VwZXJfY2xhc3MpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCl7Ci0JCXJldHVybiAoKENsYXNzQ1BJbmZvKWNvbnN0YW50UG9vbC5nZXRFbnRyeSh0aGlzX2NsYXNzKSkuZ2V0Q2xhc3NOYW1lKCkucmVwbGFjZSgnLycsJy4nKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXROYW1lKCl7Ci0JCVN0cmluZyBuYW1lID0gZ2V0RnVsbE5hbWUoKTsKLQkJaW50IHBvcyA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBvcyA9PSAtMSl7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKHBvcyArIDEpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKXsKLQkJU3RyaW5nIG5hbWUgPSBnZXRGdWxsTmFtZSgpOwotCQlpbnQgcG9zID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAocG9zID09IC0xKXsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKLQl9Ci0JCi0JLyoqIGRpcnR5IHRlc3QgbWV0aG9kLCBtb3ZlIGl0IGludG8gYSB0ZXN0Y2FzZSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvYWRpbmcgY2xhc3NmaWxlLi4uIik7Ci0JCUlucHV0U3RyZWFtIGlzID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbSgiamF2YS91dGlsL1ZlY3Rvci5jbGFzcyIpOwotCQlDbGFzc0ZpbGUgY2xhenpmaWxlID0gbmV3IENsYXNzRmlsZShpcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3MgbmFtZTogIiArIGNsYXp6ZmlsZS5nZXROYW1lKCkpOwotCQlNZXRob2RJbmZvTGlzdCBtZXRob2RzID0gY2xhenpmaWxlLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aCgpOyBpKyspewotCQkJTWV0aG9kSW5mbyBtZXRob2QgPSBtZXRob2RzLmdldE1ldGhvZChpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kOiAiICsgbWV0aG9kLmdldEZ1bGxTaWduYXR1cmUoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIgKyAgbWV0aG9kLmdldE51bWJlck9mTGluZXMoKSk7Ci0JCQlMaW5lTnVtYmVyVGFibGUgbG50ID0gbWV0aG9kLmdldENvZGUoKS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJfQotCX0KLQkKLX0KLQotCi0gCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9DbGFzc1BhdGhMb2FkZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvQ2xhc3NQYXRoTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMjcwZmEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9DbGFzc1BhdGhMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotLyoqCi0gKiBDb3JlIG9mIHRoZSBieXRlY29kZSBhbmFseXplci4gSXQgbG9hZHMgY2xhc3NlcyBmcm9tIGEgZ2l2ZW4gY2xhc3NwYXRoLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzUGF0aExvYWRlciB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBGaWxlTG9hZGVyIE5VTExfTE9BREVSID0gbmV3IE51bGxMb2FkZXIoKTsKLQkKLQkvKiogdGhlIGxpc3Qgb2YgZmlsZXMgdG8gbG9vayBmb3IgKi8KLQlwcm90ZWN0ZWQgRmlsZVtdIGZpbGVzOwotCQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3aXRoIGEgZ2l2ZW4gY2xhc3NwYXRoLiBJdCBtdXN0IGJlIHVybHMKLQkgKiBzZXBhcmF0ZWQgYnkgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBhdGggc2VwYXJhdG9yLgotCSAqIEBwYXJhbSBjbGFzc1BhdGggdGhlIGNsYXNzcGF0aCB0byBsb2FkIGFsbCB0aGUgY2xhc3NlcyBmcm9tLgotCSAqLwotCXB1YmxpYyBDbGFzc1BhdGhMb2FkZXIoU3RyaW5nIGNsYXNzUGF0aCl7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NQYXRoLCBGaWxlLnBhdGhTZXBhcmF0b3IpOwotCQlWZWN0b3IgZW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSl7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzdC5uZXh0VG9rZW4oKSk7Ci0JCQllbnRyaWVzLmFkZEVsZW1lbnQoZmlsZSk7Ci0JCX0KLQkJZmlsZXMgPSBuZXcgRmlsZVtlbnRyaWVzLnNpemUoKV07Ci0JCWVudHJpZXMuY29weUludG8oZmlsZXMpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd2l0aCBhIGdpdmVuIHNldCBvZiB1cmxzLgotCSAqIEBwYXJhbSBlbnRyaWVzIHZhbGlkIGZpbGUgdXJscyAoZWl0aGVyIC5qYXIsIC56aXAgb3IgZGlyZWN0b3J5KQotCSAqLwotCXB1YmxpYyBDbGFzc1BhdGhMb2FkZXIoU3RyaW5nW10gZW50cmllcyl7Ci0JCWZpbGVzID0gbmV3IEZpbGVbZW50cmllcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspewotCQkJZmlsZXNbaV0gPSBuZXcgRmlsZShlbnRyaWVzW2ldKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd2l0aCBhIGdpdmVuIHNldCBvZiB1cmxzCi0JICogQHBhcmFtIGVudHJpZXMgZmlsZSB1cmxzIHRvIGxvb2sgZm9yIGNsYXNzZXMgKC5qYXIsIC56aXAgb3IgZGlyZWN0b3J5KQotCSAqLwotCXB1YmxpYyBDbGFzc1BhdGhMb2FkZXIoRmlsZVtdIGVudHJpZXMpewotCQlmaWxlcyA9IGVudHJpZXM7Ci0JfQotCQotCS8qKiB0aGUgaW50ZXJmYWNlIHRvIGltcGxlbWVudCB0byBsb29rIHVwIGZvciBzcGVjaWZpYyByZXNvdXJjZXMgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEZpbGVMb2FkZXIgewotCQkvKiogdGhlIGZpbGUgdXJsIHRoYXQgaXMgbG9va2VkIGZvciAuY2xhc3MgZmlsZXMgKi8KLQkJcHVibGljIEZpbGUgZ2V0RmlsZSgpOwotCQkvKiogcmV0dXJuIHRoZSBzZXQgb2YgY2xhc3NlcyBmb3VuZCBpbiB0aGUgZmlsZSAqLwotCQlwdWJsaWMgQ2xhc3NGaWxlW10gZ2V0Q2xhc3NlcygpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2V0IG9mIDx0dD5GaWxlTG9hZGVyPC90dD4gbG9hZGVycyBtYXRjaGluZyB0aGUgZ2l2ZW4gY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBsb2FkZXJzKCl7Ci0JCXJldHVybiBuZXcgTG9hZGVyRW51bWVyYXRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRoZSB3aG9sZSBzZXQgb2YgY2xhc3NlcyBpbiB0aGUgY2xhc3NwYXRoLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QKLQkgKiBjYW4gYmUgdmVyeSByZXNvdXJjZSBkZW1hbmRpbmcgc2luY2UgaXQgbXVzdCBsb2FkIGFsbCBieXRlY29kZSBmcm9tCi0JICogYWxsIGNsYXNzZXMgaW4gYWxsIHJlc291cmNlcyBpbiB0aGUgY2xhc3NwYXRoIGF0IGEgdGltZS4KLQkgKiBUbyBwcm9jZXNzIGl0IGluIGEgbGVzcyByZXNvdXJjZSBkZW1hbmRpbmcgd2F5LCBpdCBpcyBtYXliZSBiZXR0ZXIgdG8KLQkgKiB1c2UgdGhlIDx0dD5sb2FkZXJzKCk8L3R0PiB0aGF0IHdpbGwgcmV0dXJuIGxvYWRlciBvbmUgYnkgb25lLgotCSAqCi0JICogQHJldHVybiB0aGUgaGFzaHRhYmxlIGNvbnRhaW5pbmcgQUxMIGNsYXNzZXMgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGdpdmVuCi0JICogY2xhc3NwYXRoLiBOb3RlIHRoYXQgdGhlIGZpcnN0IGVudHJ5IG9mIGEgZ2l2ZW4gY2xhc3NuYW1lIHdpbGwgc2hhZG93Ci0JICogY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgKGFzIGEgY2xhc3Nsb2FkZXIgZG9lcykKLQkgKi8KLQlwdWJsaWMgSGFzaHRhYmxlIGdldENsYXNzZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlIYXNodGFibGUgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlFbnVtZXJhdGlvbiBlbnVtID0gbG9hZGVycygpOwotCQl3aGlsZSAoIGVudW0uaGFzTW9yZUVsZW1lbnRzKCkgKXsKLQkJCUZpbGVMb2FkZXIgbG9hZGVyID0gKEZpbGVMb2FkZXIpZW51bS5uZXh0RWxlbWVudCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nICIgKyBsb2FkZXIuZ2V0RmlsZSgpKTsKLQkJCWxvbmcgdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCUNsYXNzRmlsZVtdIGNsYXNzZXMgPSBsb2FkZXIuZ2V0Q2xhc3NlcygpOwotCQkJbG9uZyBkdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDA7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBjbGFzc2VzLmxlbmd0aCArICIgbG9hZGVkIGluICIgKyBkdCArICJtcyIpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc2VzLmxlbmd0aDsgaisrKXsKLQkJCQlTdHJpbmcgbmFtZSA9IGNsYXNzZXNbal0uZ2V0TmFtZSgpOwotCQkJCS8vIGRvIG5vdCBhbGxvdyBkdXBsaWNhdGVzIGVudHJpZXMgdG8gcHJlc2VydmUgJ2NsYXNzcGF0aCcgYmVoYXZpb3IKLQkJCQkvLyBmaXJzdCBjbGFzcyBpbiB3aW5zCi0JCQkJaWYgKCAhbWFwLmNvbnRhaW5zKG5hbWUpICl7Ci0JCQkJCW1hcC5wdXQobmFtZSwgY2xhc3Nlc1tqXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCS8qKiBkaXJ0eSBsaXR0bGUgdGVzdCwgc2hvdWxkIGJlIG1vdmVkIHRvIGEgdGVzdGNhc2UgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ2xhc3NQYXRoTG9hZGVyIGNsID0gbmV3IENsYXNzUGF0aExvYWRlcigiZTovamRrL2pkazEuMy4xL2xpYi90b29scy5qYXI7ZTovamRrL2pkazEuMy4xL2pyZS9saWIvcnQuamFyIik7Ci0JCUhhc2h0YWJsZSBtYXAgPSBjbC5nZXRDbGFzc2VzKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGVkIGNsYXNzZXM6ICIgKyBtYXAuc2l6ZSgpKTsKLQl9Ci0JCi0JLyoqIHRoZSBsb2FkZXIgZW51bWVyYXRpb24gdGhhdCB3aWxsIHJldHVybiBsb2FkZXJzICovCi0JcHJvdGVjdGVkIGNsYXNzIExvYWRlckVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24gewotCQlwcm90ZWN0ZWQgaW50IGluZGV4ID0gMDsKLQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCl7Ci0JCQlyZXR1cm4gaW5kZXggPCBmaWxlcy5sZW5ndGg7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpewotCQkJaWYgKGluZGV4ID49IGZpbGVzLmxlbmd0aCl7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUZpbGUgZmlsZSA9IGZpbGVzW2luZGV4KytdOwotCQkJaWYgKCAhZmlsZS5leGlzdHMoKSApewotCQkJCXJldHVybiBuZXcgTnVsbExvYWRlcihmaWxlKTsKLQkJCX0KLQkJCWlmICggZmlsZS5pc0RpcmVjdG9yeSgpICl7Ci0JCQkJLy8gaXQncyBhIGRpcmVjdG9yeQotCQkJCXJldHVybiBuZXcgRGlyZWN0b3J5TG9hZGVyKGZpbGUpOwotCQkJfSBlbHNlIGlmICggZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKSB8fCBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpICl7Ci0JCQkJLy8gaXQncyBhIGphci96aXAgZmlsZQotCQkJCXJldHVybiBuZXcgSmFyTG9hZGVyKGZpbGUpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBOdWxsTG9hZGVyKGZpbGUpOwotCQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogdXNlZnVsIG1ldGhvZHMgdG8gcmVhZCB0aGUgd2hvbGUgaW5wdXQgc3RyZWFtIGluIG1lbW9yeSBzbyB0aGF0Ci0JICogaXQgY2FuIGJlIGFjY2Vzc2VkIGZhc3Rlci4gUHJvY2Vzc2luZyBydC5qYXIgYW5kIHRvb2xzLmphciBmcm9tIEpESyAxLjMuMQotCSAqIGJyaW5ncyB0aW1lIGZyb20gNTBzIHRvIDdzLgotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0Q2FjaGVkU3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzKTsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMjA0OCk7Ci0JCWludCBuOwotCQliYW9zLnJlc2V0KCk7Ci0JCXdoaWxlICgobiA9IGlzLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgIT0gLTEpIHsKLQkJCWJhb3Mud3JpdGUoYnVmZmVyLCAwLCBuKTsKLQkJfQotCQlpcy5jbG9zZSgpOwotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotfQotCi0vKiogYSBudWxsIGxvYWRlciB0byByZXR1cm4gd2hlbiB0aGUgZmlsZSBpcyBub3QgdmFsaWQgKi8KLWNsYXNzIE51bGxMb2FkZXIgaW1wbGVtZW50cyBDbGFzc1BhdGhMb2FkZXIuRmlsZUxvYWRlciB7Ci0JcHJpdmF0ZSBGaWxlIGZpbGU7Ci0JTnVsbExvYWRlcigpewotCQl0aGlzKG51bGwpOwotCX0KLQlOdWxsTG9hZGVyKEZpbGUgZmlsZSl7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JfQotCXB1YmxpYyBGaWxlIGdldEZpbGUoKXsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCXB1YmxpYyBDbGFzc0ZpbGVbXSBnZXRDbGFzc2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBDbGFzc0ZpbGVbMF07Ci0JfQotfQotCi0vKioKLSAqIGphciBsb2FkZXIgc3BlY2lmaWVkIGluIGxvb2tpbmcgZm9yIGNsYXNzZXMgaW4gamFyIGFuZCB6aXAKLSAqIEB0b2RvIHJlYWQgdGhlIGphciBtYW5pZmVzdCBpbiBjYXNlIHRoZXJlIGlzIGEgQ2xhc3MtUGF0aAotICogZW50cnkuCi0gKi8KLWNsYXNzIEphckxvYWRlciBpbXBsZW1lbnRzIENsYXNzUGF0aExvYWRlci5GaWxlTG9hZGVyIHsKLQlwcml2YXRlIEZpbGUgZmlsZTsKLQlKYXJMb2FkZXIoRmlsZSBmaWxlKXsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9Ci0JcHVibGljIEZpbGUgZ2V0RmlsZSgpewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JcHVibGljIENsYXNzRmlsZVtdIGdldENsYXNzZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpewotCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpewotCQkJCUlucHV0U3RyZWFtIGlzID0gQ2xhc3NQYXRoTG9hZGVyLmdldENhY2hlZFN0cmVhbSh6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0JCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IG5ldyBDbGFzc0ZpbGUoaXMpOwotCQkJCWlzLmNsb3NlKCk7Ci0JCQkJdi5hZGRFbGVtZW50KGNsYXNzRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJQ2xhc3NGaWxlW10gY2xhc3NlcyA9IG5ldyBDbGFzc0ZpbGVbdi5zaXplKCldOwotCQl2LmNvcHlJbnRvKGNsYXNzZXMpOwotCQlyZXR1cm4gY2xhc3NlczsKLQl9Ci19Ci0KLS8qKgotICogZGlyZWN0b3J5IGxvYWRlciB0aGF0IHdpbGwgbG9vayBhbGwgY2xhc3NlcyByZWN1cnNpdmVseQotICogQHRvZG8gc2hvdWxkIGRpc2NhcmQgY2xhc3NlcyB3aGljaCBwYWNrYWdlIG5hbWUgZG9lcyBub3QKLSAqIG1hdGNoIHRoZSBkaXJlY3RvcnkgPwotICovCi1jbGFzcyBEaXJlY3RvcnlMb2FkZXIgaW1wbGVtZW50cyBDbGFzc1BhdGhMb2FkZXIuRmlsZUxvYWRlciB7Ci0JcHJpdmF0ZSBGaWxlIGRpcmVjdG9yeTsKLQkKLQlEaXJlY3RvcnlMb2FkZXIoRmlsZSBkaXIpewotCQlkaXJlY3RvcnkgPSBkaXI7Ci0JfQotCXB1YmxpYyBGaWxlIGdldEZpbGUoKXsKLQkJcmV0dXJuIGRpcmVjdG9yeTsKLQl9Ci0JcHVibGljIENsYXNzRmlsZVtdIGdldENsYXNzZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJVmVjdG9yIGZpbGVzID0gbGlzdEZpbGVzKCBkaXJlY3RvcnksIG5ldyBDbGFzc0ZpbHRlcigpLCB0cnVlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKyl7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSlmaWxlcy5lbGVtZW50QXQoaSk7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlzID0gQ2xhc3NQYXRoTG9hZGVyLmdldENhY2hlZFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gbmV3IENsYXNzRmlsZShpcyk7Ci0JCQkJaXMuY2xvc2UoKTsKLQkJCQlpcyA9IG51bGw7Ci0JCQkJdi5hZGRFbGVtZW50KGNsYXNzRmlsZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpcyAhPSBudWxsKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpe30KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ2xhc3NGaWxlW10gY2xhc3NlcyA9IG5ldyBDbGFzc0ZpbGVbdi5zaXplKCldOwotCQl2LmNvcHlJbnRvKGNsYXNzZXMpOwotCQlyZXR1cm4gY2xhc3NlczsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0IGZpbGVzIHRoYXQgb2JleXMgdG8gYSBzcGVjaWZpYyBmaWx0ZXIgcmVjdXJzaXZlbHkgZnJvbSBhIGdpdmVuIGJhc2UKLQkgKiBkaXJlY3RvcnkuCi0JICogQHBhcmFtICAgZGlyZWN0b3J5ICAgdGhlIGRpcmVjdG9yeSB3aGVyZSB0byBsaXN0IHRoZSBmaWxlcyBmcm9tLgotCSAqIEBwYXJhbSAgIGZpbHRlciAgICAgIHRoZSBmaWxlIGZpbHRlciB0byBhcHBseQotCSAqIEBwYXJhbSAgIHJlY3Vyc2UgICAgIHRlbGxzIHdoZXRoZXIgb3Igbm90IHRoZSBsaXN0aW5nIGlzIHJlY3Vyc2l2ZS4KLQkgKiBAcmV0dXJuICB0aGUgbGlzdCBvZiA8dHQ+RmlsZTwvdHQ+IG9iamVjdHMgdGhhdCBhcHBsaWVzIHRvIHRoZSBnaXZlbgotCSAqICAgICAgICAgIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBsaXN0RmlsZXMoRmlsZSBkaXJlY3RvcnksIEZpbGVuYW1lRmlsdGVyIGZpbHRlciwgYm9vbGVhbiByZWN1cnNlKXsKLQkJaWYgKCFkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSl7Ci0JCQkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihkaXJlY3RvcnkgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeSIpOwotCQl9Ci0JCVZlY3RvciBsaXN0ID0gbmV3IFZlY3RvcigpOwotCQlsaXN0RmlsZXNUbyhsaXN0LCBkaXJlY3RvcnksIGZpbHRlciwgcmVjdXJzZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIExpc3QgYW5kIGFkZCBmaWxlcyB0byBhIGdpdmVuIGxpc3QuIEFzIGEgY29udmVuaWVuY2UgaXQgc2VuZHMgYmFjayB0aGUKLQkgKiBpbnN0YW5jZSBvZiB0aGUgbGlzdCBnaXZlbiBhcyBhIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gICBsaXN0ICAgIHRoZSBsaXN0IG9mIGZpbGVzIHdoZXJlIHRoZSBmaWx0ZXJlZCBmaWxlcyBzaG91bGQgYmUgYWRkZWQKLQkgKiBAcGFyYW0gICBkaXJlY3RvcnkgICB0aGUgZGlyZWN0b3J5IHdoZXJlIHRvIGxpc3QgdGhlIGZpbGVzIGZyb20uCi0JICogQHBhcmFtICAgZmlsdGVyICAgICAgdGhlIGZpbGUgZmlsdGVyIHRvIGFwcGx5Ci0JICogQHBhcmFtICAgcmVjdXJzZSAgICAgdGVsbHMgd2hldGhlciBvciBub3QgdGhlIGxpc3RpbmcgaXMgcmVjdXJzaXZlLgotCSAqIEByZXR1cm4gIHRoZSBsaXN0IGluc3RhbmNlIHRoYXQgd2FzIHBhc3NlZCBhcyB0aGUgPHR0Pmxpc3Q8L3R0PiBhcmd1bWVudC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgbGlzdEZpbGVzVG8oVmVjdG9yIGxpc3QsIEZpbGUgZGlyZWN0b3J5LCBGaWxlbmFtZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gcmVjdXJzZSl7Ci0JCVN0cmluZ1tdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3QoZmlsdGVyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKyl7Ci0JCQlsaXN0LmFkZEVsZW1lbnQoIG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZXNbaV0pICk7Ci0JCX0KLQkJZmlsZXMgPSBudWxsOyAgIC8vIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZQotCQlpZiAocmVjdXJzZSl7Ci0JCQlTdHJpbmdbXSBzdWJkaXJzID0gZGlyZWN0b3J5Lmxpc3QoIG5ldyBEaXJlY3RvcnlGaWx0ZXIoKSApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJkaXJzLmxlbmd0aDsgaSsrKXsKLQkJCQlsaXN0RmlsZXNUbyhsaXN0LCBuZXcgRmlsZShkaXJlY3RvcnksIHN1YmRpcnNbaV0pLCBmaWx0ZXIsIHJlY3Vyc2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotfQotCi0vKiogQ29udmVuaWVudCBmaWx0ZXIgdGhhdCBhY2NlcHRzIG9ubHkgZGlyZWN0b3J5IDx0dD5GaWxlPC90dD4gKi8KLWNsYXNzIERpcmVjdG9yeUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBuYW1lKXsKLQkJRmlsZSBwYXRobmFtZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgbmFtZSk7Ci0JCXJldHVybiBwYXRobmFtZS5pc0RpcmVjdG9yeSgpOwotCX0KLX0KLS8qKiBjb252ZW5pZW50IGZpbHRlciB0byBhY2NlcHQgb25seSAuY2xhc3MgZmlsZXMgKi8KLWNsYXNzIENsYXNzRmlsdGVyIGltcGxlbWVudHMgRmlsZW5hbWVGaWx0ZXIgewotCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpewotCQlyZXR1cm4gbmFtZS5lbmRzV2l0aCgiLmNsYXNzIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9GaWVsZEluZm8uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvRmllbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTAxNjkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9GaWVsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzLio7Ci0KLS8qKgotICogZmllbGQgc3RydWN0dXJlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgRmllbGRJbmZvIHsKLQkKLQlwcm90ZWN0ZWQgQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbDsKLQlwcm90ZWN0ZWQgaW50IGFjY2Vzc19mbGFnczsKLQlwcm90ZWN0ZWQgaW50IG5hbWVfaW5kZXg7Ci0JcHJvdGVjdGVkIGludCBkZXNjcmlwdG9yX2luZGV4OwotCXByb3RlY3RlZCBBdHRyaWJ1dGVJbmZvTGlzdCBhdHRyaWJ1dGVzOwotCXByb3RlY3RlZCBib29sZWFuIHN5bnRoZXRpYzsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXByZWNhdGVkOwotCXByb3RlY3RlZCBib29sZWFuIGNvbnN0YW50OwotCQotCXB1YmxpYyBGaWVsZEluZm8oQ29uc3RhbnRQb29sIHBvb2wpewotCQljb25zdGFudFBvb2wgPSBwb29sOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWFjY2Vzc19mbGFncyA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJbmFtZV9pbmRleCA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJZGVzY3JpcHRvcl9pbmRleCA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVJbmZvTGlzdChjb25zdGFudFBvb2wpOwotCQlhdHRyaWJ1dGVzLnJlYWQoZGlzKTsKLQkJY29uc3RhbnQgPSBhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGVJbmZvLkNPTlNUQU5UX1ZBTFVFKSAhPSBudWxsOwotCQlkZXByZWNhdGVkID0gYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGUoQXR0cmlidXRlSW5mby5ERVBSRUNBVEVEKSAhPSBudWxsOwotCQlzeW50aGV0aWMgPSBhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGVJbmZvLlNZTlRIRVRJQykgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRBY2Nlc3NGbGFncygpewotCQlyZXR1cm4gYWNjZXNzX2ZsYWdzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKXsKLQkJcmV0dXJuIFV0aWxzLmdldFVURjhWYWx1ZShjb25zdGFudFBvb2wsIG5hbWVfaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3IoKXsKLQkJcmV0dXJuIFV0aWxzLmdldFVURjhWYWx1ZShjb25zdGFudFBvb2wsIGRlc2NyaXB0b3JfaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoKXsKLQkJcmV0dXJuIGRlcHJlY2F0ZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCl7Ci0JCXJldHVybiBzeW50aGV0aWM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RhbnQoKXsKLQkJcmV0dXJuIGNvbnN0YW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzKCl7Ci0JCXJldHVybiBVdGlscy5nZXRGaWVsZEFjY2VzcyhhY2Nlc3NfZmxhZ3MpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJGaWVsZDogIik7Ci0JCXNiLmFwcGVuZChnZXRBY2Nlc3MoKSkuYXBwZW5kKCIgIik7Ci0JCVV0aWxzLmRlc2NyaXB0b3IyamF2YShnZXREZXNjcmlwdG9yKCksMCxzYik7Ci0JCXNiLmFwcGVuZCgiICIpLmFwcGVuZChnZXROYW1lKCkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9GaWVsZEluZm9MaXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL0ZpZWxkSW5mb0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5NjIwZi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL0ZpZWxkSW5mb0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi0vKioKLSAqIGZpZWxkIHN0cnVjdHVyZSBsaXN0Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgRmllbGRJbmZvTGlzdCB7Ci0JCi0JcHJvdGVjdGVkIENvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7Ci0JCi0JcHJvdGVjdGVkIEZpZWxkSW5mb1tdIGZpZWxkczsKLQkKLQlwdWJsaWMgRmllbGRJbmZvTGlzdChDb25zdGFudFBvb2wgcG9vbCl7Ci0JCWNvbnN0YW50UG9vbCA9IHBvb2w7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IG51bUZpZWxkcyA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJZmllbGRzID0gbmV3IEZpZWxkSW5mb1tudW1GaWVsZHNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKyl7Ci0JCQlmaWVsZHNbaV0gPSBuZXcgRmllbGRJbmZvKGNvbnN0YW50UG9vbCk7Ci0JCQlmaWVsZHNbaV0ucmVhZChkaXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKGludCBpbmRleCl7Ci0JCXJldHVybiBnZXRGaWVsZChpbmRleCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgRmllbGRJbmZvIGdldEZpZWxkKGludCBpbmRleCl7Ci0JCXJldHVybiBmaWVsZHNbaW5kZXhdOwotCX0KLQkKLQlwdWJsaWMgaW50IGxlbmd0aCgpewotCQlyZXR1cm4gZmllbGRzLmxlbmd0aDsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiRmllbGRzOiAiKS5hcHBlbmQoZmllbGRzLmxlbmd0aCkuYXBwZW5kKCJcbiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKyl7Ci0JCQlzYi5hcHBlbmQoIlx0Iik7Ci0JCQlzYi5hcHBlbmQoZ2V0RmllbGQoaSkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9JbnRlcmZhY2VMaXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL0ludGVyZmFjZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2OWEzMS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL0ludGVyZmFjZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC4qOwotCi0vKioKLSAqIGxpc3Qgb2YgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBpbiBhIGNsYXNzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIEludGVyZmFjZUxpc3QgewotCXByb3RlY3RlZCBDb25zdGFudFBvb2wgY29uc3RhbnRQb29sOwotCXByb3RlY3RlZCBpbnRbXSBpbnRlcmZhY2VzOwotCQotCXB1YmxpYyBJbnRlcmZhY2VMaXN0KENvbnN0YW50UG9vbCBwb29sKXsKLQkJY29uc3RhbnRQb29sID0gcG9vbDsKLQl9Ci0JcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgY291bnQgPSBkaXMucmVhZFNob3J0KCk7Ci0JCWludGVyZmFjZXMgPSBuZXcgaW50W2NvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKXsKLQkJCWludGVyZmFjZXNbaV0gPSBkaXMucmVhZFNob3J0KCk7Ci0JCX0KLQl9Ci0JcHVibGljIGludCBsZW5ndGgoKXsKLQkJcmV0dXJuIGludGVyZmFjZXMubGVuZ3RoOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZShpbnQgaSl7Ci0JCWludCBpbmRleCA9IGludGVyZmFjZXNbaV07Ci0JCUNsYXNzQ1BJbmZvIGNwID0gKENsYXNzQ1BJbmZvKWNvbnN0YW50UG9vbC5nZXRFbnRyeShpbmRleCk7Ci0JCXJldHVybiBjcC5nZXRDbGFzc05hbWUoKS5yZXBsYWNlKCcvJywnLicpOwotCX0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW50ZXJmYWNlcygpewotCQlTdHJpbmdbXSBjbGFzc2VzID0gbmV3IFN0cmluZ1tpbnRlcmZhY2VzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyl7Ci0JCQljbGFzc2VzW2ldID0gZ2V0SW50ZXJmYWNlKGkpOwotCQl9Ci0JCXJldHVybiBjbGFzc2VzOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkludGVyZmFjZXM6ICIpOwotCQlTdHJpbmdbXSBuYW1lcyA9IGdldEludGVyZmFjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKyl7Ci0JCQlzYi5hcHBlbmQobmFtZXNbaV0pOwotCQkJaWYgKGkgIT0gbmFtZXMubGVuZ3RoIC0gMSl7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvTWV0aG9kSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9NZXRob2RJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGYxYjkuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9NZXRob2RJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlLmF0dHJpYnV0ZXMuKjsKLQotLyoqCi0gKiBNZXRob2QgaW5mbyBzdHJ1Y3R1cmUuCi0gKiBAdG9kbyBnaXZlIGEgbW9yZSBhcHByb3ByaWF0ZSBuYW1lIHRvIG1ldGhvZHMuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kSW5mbyB7Ci0JcHJvdGVjdGVkIENvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7Ci0JcHJvdGVjdGVkIGludCBhY2Nlc3NfZmxhZ3M7Ci0JcHJvdGVjdGVkIGludCBuYW1lX2luZGV4OwotCXByb3RlY3RlZCBpbnQgZGVzY3JpcHRvcl9pbmRleDsKLQlwcm90ZWN0ZWQgQ29kZSBjb2RlOwotCXByb3RlY3RlZCBib29sZWFuIGRlcHJlY2F0ZWQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3ludGhldGljOwotCXByb3RlY3RlZCBFeGNlcHRpb25zIGV4Y2VwdGlvbnM7Ci0JcHVibGljIE1ldGhvZEluZm8oQ29uc3RhbnRQb29sIHBvb2wpewotCQljb25zdGFudFBvb2wgPSBwb29sOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWFjY2Vzc19mbGFncyA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJbmFtZV9pbmRleCA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJZGVzY3JpcHRvcl9pbmRleCA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJQXR0cmlidXRlSW5mb0xpc3QgYXR0cmxpc3QgPSBuZXcgQXR0cmlidXRlSW5mb0xpc3QoY29uc3RhbnRQb29sKTsKLQkJYXR0cmxpc3QucmVhZChkaXMpOwotCQljb2RlID0gKENvZGUpYXR0cmxpc3QuZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZUluZm8uQ09ERSk7Ci0JCXN5bnRoZXRpYyA9IGF0dHJsaXN0LmdldEF0dHJpYnV0ZShBdHRyaWJ1dGVJbmZvLlNZTlRIRVRJQykgIT0gbnVsbDsKLQkJZGVwcmVjYXRlZCA9IGF0dHJsaXN0LmdldEF0dHJpYnV0ZShBdHRyaWJ1dGVJbmZvLkRFUFJFQ0FURUQpICE9IG51bGw7Ci0JCWV4Y2VwdGlvbnMgPSAoRXhjZXB0aW9ucylhdHRybGlzdC5nZXRBdHRyaWJ1dGUoQXR0cmlidXRlSW5mby5FWENFUFRJT05TKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRBY2Nlc3NGbGFncygpewotCQlyZXR1cm4gYWNjZXNzX2ZsYWdzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKXsKLQkJcmV0dXJuIFV0aWxzLmdldFVURjhWYWx1ZShjb25zdGFudFBvb2wsIG5hbWVfaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3IoKXsKLQkJcmV0dXJuIFV0aWxzLmdldFVURjhWYWx1ZShjb25zdGFudFBvb2wsIGRlc2NyaXB0b3JfaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxTaWduYXR1cmUoKXsKLQkJcmV0dXJuIGdldFJldHVyblR5cGUoKSArICIgIiArIGdldFNob3J0U2lnbmF0dXJlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRTaWduYXR1cmUoKXsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TmFtZSgpKTsKLQkJYnVmLmFwcGVuZCgiKCIpOwotCQlTdHJpbmdbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzVHlwZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKyl7Ci0JCQlidWYuYXBwZW5kKHBhcmFtc1tpXSk7Ci0JCQlpZiAoaSAhPSBwYXJhbXMubGVuZ3RoIC0gMSl7Ci0JCQkJYnVmLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJfQotCQlidWYuYXBwZW5kKCIpIik7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKCl7Ci0JCXJldHVybiBVdGlscy5nZXRNZXRob2RSZXR1cm5UeXBlKGdldERlc2NyaXB0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJzVHlwZSgpewotCQlyZXR1cm4gVXRpbHMuZ2V0TWV0aG9kUGFyYW1zKGdldERlc2NyaXB0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyBDb2RlIGdldENvZGUoKXsKLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcygpewotCQlpbnQgbGVuID0gLTE7Ci0JCWlmIChjb2RlICE9IG51bGwpewotCQkJTGluZU51bWJlclRhYmxlIGxudCA9IGNvZGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlpZiAobG50ICE9IG51bGwpewotCQkJCWxlbiA9IGxudC5sZW5ndGgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoKXsKLQkJcmV0dXJuIGRlcHJlY2F0ZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCl7Ci0JCXJldHVybiBzeW50aGV0aWM7Ci0JfQotICAgIAotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzKCl7Ci0JCXJldHVybiBVdGlscy5nZXRNZXRob2RBY2Nlc3MoYWNjZXNzX2ZsYWdzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiTWV0aG9kOiAiKS5hcHBlbmQoZ2V0QWNjZXNzKCkpLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQoZ2V0RnVsbFNpZ25hdHVyZSgpKTsKLQkJc2IuYXBwZW5kKCIgc3ludGhldGljOiIpLmFwcGVuZChzeW50aGV0aWMpOwotCQlzYi5hcHBlbmQoIiBkZXByZWNhdGVkOiIpLmFwcGVuZChkZXByZWNhdGVkKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvTWV0aG9kSW5mb0xpc3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvTWV0aG9kSW5mb0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmZDI1Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL01ldGhvZEluZm9MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuQ29uc3RhbnRQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuVXRmOENQSW5mbzsKLQotLyoqCi0gKiBBIGxpc3Qgb2YgbWV0aG9kX2luZm8gc3RydWN0dXJlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RJbmZvTGlzdCB7Ci0JLyoqIHBvb2wgY29udGFpbmluZyBhbGwgdGhlIGluZm9ybWF0aW9uICovCi0JcHJvdGVjdGVkIENvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7Ci0JCi0JLyoqIG1ldGhvZHMgaW4gdGhpcyBsaXN0ICovCi0JcHJvdGVjdGVkIE1ldGhvZEluZm9bXSBtZXRob2RzOwotCQotCQotCXB1YmxpYyBNZXRob2RJbmZvTGlzdChDb25zdGFudFBvb2wgcG9vbCl7Ci0JCWNvbnN0YW50UG9vbCA9IHBvb2w7Ci0JfQotCQotCS8qKiByZWFkIHRoZSBieXRlY29kZSBmcm9tIHRoZSBzdHJlYW0gKi8KLQlwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjb3VudCA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJbWV0aG9kcyA9IG5ldyBNZXRob2RJbmZvW2NvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKXsKLQkJCW1ldGhvZHNbaV0gPSBuZXcgTWV0aG9kSW5mbyhjb25zdGFudFBvb2wpOwotCQkJbWV0aG9kc1tpXS5yZWFkKGRpcyk7Ci0JCX0KLQl9Ci0JCi0JLyoqIHRoZSBzaXplIG9mIHRoZSBsaXN0ICovCi0JcHVibGljIGludCBsZW5ndGgoKXsKLQkJcmV0dXJuIG1ldGhvZHMubGVuZ3RoOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYSBtZXRob2QgaW4gdGhlIGxpc3QuCi0JICogQHBhcmFtIGkgdGhlIGluZGV4IG9mIHRoZSBtZXRob2QgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgbWF0Y2hpbmcgdGhlIGluZGV4LgotCSAqLwotCXB1YmxpYyBNZXRob2RJbmZvIGdldE1ldGhvZChpbnQgaSl7Ci0JCXJldHVybiBtZXRob2RzW2ldOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gdGhlIHNldCBvZiBtZXRob2RzIGluIHRoaXMgbGlzdC4gTW9zdGx5IGFzIGEgZGVidWdnaW5nIHB1cnBvc2UuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiTWV0aG9kczogIikuYXBwZW5kKG1ldGhvZHMubGVuZ3RoKS5hcHBlbmQoIlxuIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKyl7Ci0JCQlzYi5hcHBlbmQoIlx0Iik7Ci0JCQlzYi5hcHBlbmQoZ2V0TWV0aG9kKGkpLnRvU3RyaW5nKCkpOwotCQkJc2IuYXBwZW5kKCJcbiIpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLX0KLQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhNzcxYi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVXRpbGl0aWVzIG1vc3RseSB0byBtYW5pcHVsYXRlIG1ldGhvZHMgYW5kIGFjY2VzcyBmbGFncy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0JLyoqIHB1YmxpYyBhY2Nlc3MgZmxhZyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUNDX1BVQkxJQyA9IDE7Ci0JLyoqIHByaXZhdGUgYWNjZXNzIGZsYWcgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEFDQ19QUklWQVRFID0gMjsKLQkvKiogcHJvdGVjdGVkIGFjY2VzcyBmbGFnICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBBQ0NfUFJPVEVDVEVEID0gNDsKLQkvKiogc3RhdGljIGFjY2VzcyBmbGFnICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBBQ0NfU1RBVElDID0gODsKLQkvKiogZmluYWwgYWNjZXNzIGZsYWcgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEFDQ19GSU5BTCA9IDE2OwotCS8qKiBzdXBlciBhY2Nlc3MgZmxhZyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUNDX1NVUEVSID0gMzI7Ci0JLyoqIHN5bmNocm9uaXplZCBhY2Nlc3MgZmxhZyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUNDX1NZTkNIUk9OSVpFRCA9IDMyOwotCS8qKiB2b2xhdGlsZSBhY2Nlc3MgZmxhZyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUNDX1ZPTEFUSUxFID0gNjQ7Ci0JLyoqIHRyYW5zaWVudCBhY2Nlc3MgZmxhZyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUNDX1RSQU5TSUVOVCA9IDEyODsKLQkvKiogbmF0aXZlIGFjY2VzcyBmbGFnICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBBQ0NfTkFUSVZFID0gMjU2OwotCS8qKiBpbnRlcmZhY2UgYWNjZXNzIGZsYWcgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEFDQ19JTlRFUkZBQ0UgPSA1MTI7Ci0JLyoqIGFic3RyYWN0IGFjY2VzcyBmbGFnICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBBQ0NfQUJTVFJBQ1QgPSAxMDI0OwotCS8qKiBzdHJpY3QgYWNjZXNzIGZsYWcgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEFDQ19TVFJJQ1QgPSAyMDQ4OwotCi0JLyoqIHByaXZhdGUgY29uc3RydWN0b3IgKi8KLQlwcml2YXRlIFV0aWxzKCl7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBhbiBVVEY4IHZhbHVlIGZyb20gdGhlIHBvb2wgbG9jYXRlZCBhIGEgc3BlY2lmaWMgaW5kZXguCi0JICogQHBhcmFtIHBvb2wgdGhlIGNvbnN0YW50IHBvb2wgdG8gbG9vayBhdAotCSAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgVVRGOCB2YWx1ZSBpbiB0aGUgY29uc3RhbnQgcG9vbAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgaWYgaXQgZXhpc3RzCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG5vdCBhbiBVVEY4IGNvbnN0YW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVURjhWYWx1ZShDb25zdGFudFBvb2wgcG9vbCwgaW50IGluZGV4KXsKLQkJcmV0dXJuICgoVXRmOENQSW5mbylwb29sLmdldEVudHJ5KGluZGV4KSkuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogcGFyc2UgYWxsIHBhcmFtZXRlcnMgZnJvbSBhIGRlc2NyaXRvciBpbnRvIGZpZWxkcyBvZiBqYXZhIG5hbWUuCi0JICogQHBhcmFtIGRlc2NyaXB0b3Igb2YgYSBtZXRob2QuCi0JICogQHJldHVybiB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgYSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvci4gRWFjaCBzdHJpbmcKLQkgKiByZXByZXNlbnQgYSBqYXZhIG9iamVjdCB3aXRoIGl0cyBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9yIHRoZQotCSAqIHByaW1pdGl2ZSBuYW1lIHN1Y2ggYXMgaW50LCBsb25nLCAuLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE1ldGhvZFBhcmFtcyhTdHJpbmcgZGVzY3JpcHRvcil7Ci0JCWludCBpID0gMDsKLQkJaWYgKGRlc2NyaXB0b3IuY2hhckF0KGkpICE9ICcoJyl7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNZXRob2QgZGVzY3JpcHRvciBzaG91bGQgc3RhcnQgd2l0aCBhICcoJyIpOwotCQl9Ci0JCVZlY3RvciBwYXJhbXMgPSBuZXcgVmVjdG9yKCk7Ci0JCVN0cmluZ0J1ZmZlciBwYXJhbSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaSsrOwotICAgICAgICB3aGlsZSAoIChpID0gZGVzY3JpcHRvcjJqYXZhKGRlc2NyaXB0b3IsIGksIHBhcmFtKSkgPCBkZXNjcmlwdG9yLmxlbmd0aCgpICl7Ci0JCQlwYXJhbXMuYWRkKHBhcmFtLnRvU3RyaW5nKCkpOwotCQkJcGFyYW0uc2V0TGVuZ3RoKDApOyAvLyByZXNldAotCQkJaWYgKGRlc2NyaXB0b3IuY2hhckF0KGkpID09ICcpJyl7Ci0JCQkJaSsrOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1twYXJhbXMuc2l6ZSgpXTsKLQkJcGFyYW1zLmNvcHlJbnRvKGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gdGhlIG9iamVjdCB0eXBlIG9mIGEgcmV0dXJuIHR5cGUuCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGdldCB0aGUgcmV0dXJuIHR5cGUgb2JqZXQgb2YgYSBnaXZlbiBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0aG9kUmV0dXJuVHlwZShTdHJpbmcgZGVzY3JpcHRvcil7Ci0JCWludCBwb3MgPSBkZXNjcmlwdG9yLmluZGV4T2YoJyknKTsKLQkJU3RyaW5nQnVmZmVyIHJldHR5cGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWRlc2NyaXB0b3IyamF2YShkZXNjcmlwdG9yLCBwb3MgKyAxLCByZXR0eXBlKTsKLQkJcmV0dXJuIHJldHR5cGUudG9TdHJpbmcoKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogUGFyc2UgYSBzaW5nbGUgZGVzY3JpcHRvciBzeW1ib2wgYW5kIHJldHVybnMgaXQgamF2YSBlcXVpdmFsZW50LgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBkZXNjcmlwdG9yIHN5bWJvbC4KLQkgKiBAcGFyYW0gaSB0aGUgaW5kZXggdG8gbG9vayBhdCB0aGUgc3ltYm9sIGluIHRoZSBkZXNjcmlwdG9yIHN0cmluZwotCSAqIEBwYXJhbSBzYiB0aGUgc3RyaW5nYnVmZmVyIHRvIHJldHVybiB0aGUgamF2YSBlcXVpdmFsZW50IG9mIHRoZSBzeW1ib2wKLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBhZnRlciB0aGUgZGVzY3JpcHRvciBzeW1ib2wKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkZXNjcmlwdG9yMmphdmEoU3RyaW5nIGRlc2NyaXB0b3IsIGludCBpLCBTdHJpbmdCdWZmZXIgc2IpewotCQkvLyBnZXQgdGhlIGRpbWVuc2lvbgotCQlTdHJpbmdCdWZmZXIgZGltID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDtkZXNjcmlwdG9yLmNoYXJBdChpKSA9PSAnWyc7IGkrKyl7Ci0JCQlkaW0uYXBwZW5kKCJbXSIpOwotCQl9Ci0JCS8vIG5vdyBnZXQgdGhlIHR5cGUKLQkJc3dpdGNoIChkZXNjcmlwdG9yLmNoYXJBdChpKSl7Ci0JCQljYXNlICdCJzogc2IuYXBwZW5kKCJieXRlIik7IGJyZWFrOwotCQkJY2FzZSAnQyc6IHNiLmFwcGVuZCgiY2hhciIpOyBicmVhazsKLQkJCWNhc2UgJ0QnOiBzYi5hcHBlbmQoImRvdWJsZSIpOyBicmVhazsKLQkJCWNhc2UgJ0YnOiBzYi5hcHBlbmQoImZsb2F0Iik7IGJyZWFrOwotCQkJY2FzZSAnSSc6IHNiLmFwcGVuZCgiaW50Iik7IGJyZWFrOwotCQkJY2FzZSAnSic6IHNiLmFwcGVuZCgibG9uZyIpOyBicmVhazsKLQkJCWNhc2UgJ1MnOiBzYi5hcHBlbmQoInNob3J0Iik7IGJyZWFrOwotCQkJY2FzZSAnWic6IHNiLmFwcGVuZCgiYm9vbGVhbiIpOyBicmVhazsKLQkJCWNhc2UgJ1YnOiBzYi5hcHBlbmQoInZvaWQiKTsgYnJlYWs7Ci0JCQljYXNlICdMJzoKLQkJCQkvLyBpdCBpcyBhIGNsYXNzCi0JCQkJaW50IHBvcyA9IGRlc2NyaXB0b3IuaW5kZXhPZignOycsIGkgKyAxKTsKLQkJCQlTdHJpbmcgY2xhc3NuYW1lID0gZGVzY3JpcHRvci5zdWJzdHJpbmcoaSArIDEsIHBvcykucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJc2IuYXBwZW5kKGNsYXNzbmFtZSk7Ci0JCQkJaSA9IHBvczsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy9AdG9kbywgeWVhaCB0aGlzIGhhcHBlbnMgYmVjYXVzZSBJIGdvdCB0aGluZ3MgbGlrZToKLQkJCQkvLyAoKUxqYXZhL2xhbmcvT2JqZWN0OyBhbmQgaXQgd2lsbCByZXR1cm4gYW5kICkgd2lsbCBiZSBoZXJlCi0JCQkJLy8gdGhpbmsgYWJvdXQgaXQuCi0JCQkJCi0JCQkJLy9vb29vb3BzIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzY3JpcHRvciBzeW1ib2w6ICciICsgaSArICInIGluICciICsgZGVzY3JpcHRvciArICInIik7Ci0JCX0KLQkJc2IuYXBwZW5kKGRpbS50b1N0cmluZygpKTsKLQkJcmV0dXJuICsraTsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgZm9yIGFic3RyYWN0IGFjY2VzcwotCSAqIEBwYXJhbSBhY2Nlc3NfZmxhZ3MgYWNjZXNzIGZsYWdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWJzdHJhY3QoaW50IGFjY2Vzc19mbGFncykgewotICAgICAgICByZXR1cm4gKGFjY2Vzc19mbGFncyAmIEFDQ19BQlNUUkFDVCkgIT0gMDsKLSAgICB9Ci0JLyoqCi0JICogY2hlY2sgZm9yIHB1YmxpYyBhY2Nlc3MKLQkgKiBAcGFyYW0gYWNjZXNzX2ZsYWdzIGFjY2VzcyBmbGFncwotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmxpYyhpbnQgYWNjZXNzX2ZsYWdzKSB7Ci0gICAgICAgIHJldHVybiAoYWNjZXNzX2ZsYWdzICYgQUNDX1BVQkxJQykgIT0gMDsKLSAgICB9Ci0JLyoqCi0JICogY2hlY2sgZm9yIGEgc3RhdGljIGFjY2VzcwotCSAqIEBwYXJhbSBhY2Nlc3NfZmxhZ3MgYWNjZXNzIGZsYWdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhdGljKGludCBhY2Nlc3NfZmxhZ3MpIHsKLSAgICAgICAgcmV0dXJuIChhY2Nlc3NfZmxhZ3MgJiBBQ0NfU1RBVElDKSAhPSAwOwotICAgIH0KLQkvKioKLQkgKiAgY2hlY2sgZm9yIG5hdGl2ZSBhY2Nlc3MKLQkgKiBAcGFyYW0gYWNjZXNzX2ZsYWdzIGFjY2VzcyBmbGFncwotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hdGl2ZShpbnQgYWNjZXNzX2ZsYWdzKSB7Ci0gICAgICAgIHJldHVybiAoYWNjZXNzX2ZsYWdzICYgQUNDX05BVElWRSkgIT0gMDsKLSAgICB9Ci0JLyoqCi0JICogY2hlY2sgZm9yIGNsYXNzIGFjY2VzcwotCSAqIEBwYXJhbSBhY2Nlc3NfZmxhZ3MgYWNjZXNzIGZsYWdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3MoaW50IGFjY2Vzc19mbGFncykgewotICAgICAgICByZXR1cm4gIWlzSW50ZXJmYWNlKGFjY2Vzc19mbGFncyk7Ci0gICAgfQotCS8qKgotCSAqIGNoZWNrIGZvciBzdHJpY3QgYWNjZXNzCi0JICogQHBhcmFtIGFjY2Vzc19mbGFncyBhY2Nlc3MgZmxhZ3MKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdHJpY3QoaW50IGFjY2Vzc19mbGFncykgewotICAgICAgICByZXR1cm4gKGFjY2Vzc19mbGFncyAmIEFDQ19TVFJJQ1QpICE9IDA7Ci0gICAgfQotCS8qKgotCSAqIGNoZWNrIGZvciBpbnRlcmZhY2UgYWNjZXNzCi0JICogQHBhcmFtIGFjY2Vzc19mbGFncyBhY2Nlc3MgZmxhZ3MKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoaW50IGFjY2Vzc19mbGFncykgewotICAgICAgICByZXR1cm4gKGFjY2Vzc19mbGFncyAmIEFDQ19JTlRFUkZBQ0UpICE9IDA7Ci0gICAgfQotCS8qKgotCSAqIGNoZWNrIGZvciBwcml2YXRlIGFjY2VzcwotCSAqIEBwYXJhbSBhY2Nlc3NfZmxhZ3MgYWNjZXNzIGZsYWdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpdmF0ZShpbnQgYWNjZXNzX2ZsYWdzKSB7Ci0gICAgICAgIHJldHVybiAoYWNjZXNzX2ZsYWdzICYgQUNDX1BSSVZBVEUpICE9IDA7Ci0gICAgfQotCS8qKgotCSAqIGNoZWNrIGZvciB0cmFuc2llbnQgZmxhZwotCSAqIEBwYXJhbSBhY2Nlc3NfZmxhZ3MgYWNjZXNzIGZsYWdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhbnNpZW50KGludCBhY2Nlc3NfZmxhZ3MpIHsKLSAgICAgICAgcmV0dXJuIChhY2Nlc3NfZmxhZ3MgJiBBQ0NfVFJBTlNJRU5UKSAhPSAwOwotICAgIH0KLQkvKioKLQkgKiBjaGVjayBmb3Igdm9sYXRpbGUgZmxhZwotCSAqIEBwYXJhbSBhY2Nlc3NfZmxhZ3MgYWNjZXNzIGZsYWdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVm9sYXRpbGUoaW50IGFjY2Vzc19mbGFncyl7Ci0gICAgICAgIHJldHVybiAoYWNjZXNzX2ZsYWdzICYgQUNDX1ZPTEFUSUxFKSAhPSAwOwotICAgIH0KLQkvKioKLQkgKiBjaGVjayBmb3Igc3VwZXIgZmxhZwotCSAqIEBwYXJhbSBhY2Nlc3NfZmxhZ3MgYWNjZXNzIGZsYWcKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBlcihpbnQgYWNjZXNzX2ZsYWdzKSB7Ci0gICAgICAgIHJldHVybiAoYWNjZXNzX2ZsYWdzICYgQUNDX1NVUEVSKSAhPSAwOwotICAgIH0KLQkvKioKLQkgKiBjaGVjayBmb3IgcHJvdGVjdGVkIGZsYWcKLQkgKiBAcGFyYW0gYWNjZXNzX2ZsYWdzIGFjY2VzcyBmbGFncwotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3RlY3RlZChpbnQgYWNjZXNzX2ZsYWdzKSB7Ci0gICAgICAgIHJldHVybiAoYWNjZXNzX2ZsYWdzICYgQUNDX1BST1RFQ1RFRCkgIT0gMDsKLSAgICB9Ci0JLyoqCi0JICogY2hjayBmb3IgZmluYWwgZmxhZwotCSAqIEBwYXJhbSBhY2Nlc3NfZmxhZ3MgYWNjZXNzIGZsYWdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmluYWwoaW50IGFjY2Vzc19mbGFncykgewotICAgICAgICByZXR1cm4gKGFjY2Vzc19mbGFncyAmIEFDQ19GSU5BTCkgIT0gMDsKLSAgICB9Ci0JLyoqCi0JICogY2hlY2sgZm9yIHN5bmNocm9uaXplZCBmbGFnCi0JICogQHBhcmFtIGFjY2Vzc19mbGFncyBhY2Nlc3MgZmxhZ3MKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoaW50IGFjY2Vzc19mbGFncykgewotICAgICAgICByZXR1cm4gKGFjY2Vzc19mbGFncyAmIEFDQ19TWU5DSFJPTklaRUQpICE9IDA7Ci0gICAgfQotCQotCS8qKgotCSAqIHJldHVybiB0aGUgbWV0aG9kIGFjY2VzcyBmbGFnIGFzIGphdmEgbW9kaWZpZXJzCi0JICogQHBhcmFtIGFjY2Vzc19mbGFncyBhY2Nlc3MgZmxhZ3MKLQkgKiBAcmV0dXJuIHRoZSBhY2Nlc3MgZmxhZ3MgYXMgbW9kaWZpZXIgc3RyaW5ncwotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGhvZEFjY2VzcyhpbnQgYWNjZXNzX2ZsYWdzKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYoaXNQdWJsaWMoYWNjZXNzX2ZsYWdzKSl7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInB1YmxpYyAiKTsKLQkJfSBlbHNlIGlmKGlzUHJpdmF0ZShhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgicHJpdmF0ZSAiKTsKLQkJfSBlbHNlIGlmKGlzUHJvdGVjdGVkKGFjY2Vzc19mbGFncykpewotICAgICAgICAgICAgc2IuYXBwZW5kKCJwcm90ZWN0ZWQgIik7Ci0JCX0KLQkJaWYoaXNGaW5hbChhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiZmluYWwgIik7Ci0JCX0KLSAgICAgICAgaWYoaXNTdGF0aWMoYWNjZXNzX2ZsYWdzKSl7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInN0YXRpYyAiKTsKLQkJfQotICAgICAgICBpZihpc1N5bmNocm9uaXplZChhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgic3luY2hyb25pemVkICIpOwotCQl9Ci0gICAgICAgIGlmKGlzTmF0aXZlKGFjY2Vzc19mbGFncykpewotICAgICAgICAgICAgc2IuYXBwZW5kKCJuYXRpdmUgIik7Ci0JCX0KLSAgICAgICAgaWYoaXNBYnN0cmFjdChhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJzdHJhY3QgIik7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkudHJpbSgpOwotICAgIH0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgZmllbGQgYWNjZXNzIGZsYWcgYXMgamF2YSBtb2RpZmllcnMKLQkgKiBAcGFyYW0gYWNjZXNzX2ZsYWdzIGFjY2VzcyBmbGFncwotCSAqIEByZXR1cm4gdGhlIGFjY2VzcyBmbGFncyBhcyBtb2RpZmllciBzdHJpbmdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmllbGRBY2Nlc3MoaW50IGFjY2Vzc19mbGFncykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmKGlzUHVibGljKGFjY2Vzc19mbGFncykpewotICAgICAgICAgICAgc2IuYXBwZW5kKCJwdWJsaWMgIik7Ci0JCX0gZWxzZSBpZihpc1ByaXZhdGUoYWNjZXNzX2ZsYWdzKSl7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInByaXZhdGUgIik7Ci0JCX0gZWxzZSBpZiAoaXNQcm90ZWN0ZWQoYWNjZXNzX2ZsYWdzKSl7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInByb3RlY3RlZCAiKTsKLQkJfQotICAgICAgICBpZihpc0ZpbmFsKGFjY2Vzc19mbGFncykpewotICAgICAgICAgICAgc2IuYXBwZW5kKCJmaW5hbCAiKTsKLQkJfQotICAgICAgICBpZihpc1N0YXRpYyhhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgic3RhdGljICIpOwotCQl9Ci0gICAgICAgIGlmKGlzVm9sYXRpbGUoYWNjZXNzX2ZsYWdzKSl7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInZvbGF0aWxlICIpOwotCQl9Ci0gICAgICAgIGlmKGlzVHJhbnNpZW50KGFjY2Vzc19mbGFncykpewotICAgICAgICAgICAgc2IuYXBwZW5kKCJ0cmFuc2llbnQgIik7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkudHJpbSgpOwotICAgIH0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY2xhc3MgYWNjZXNzIGZsYWcgYXMgamF2YSBtb2RpZmllcnMKLQkgKiBAcGFyYW0gYWNjZXNzX2ZsYWdzIGFjY2VzcyBmbGFncwotCSAqIEByZXR1cm4gdGhlIGFjY2VzcyBmbGFncyBhcyBtb2RpZmllciBzdHJpbmdzCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NBY2Nlc3MoaW50IGFjY2Vzc19mbGFncykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmKGlzUHVibGljKGFjY2Vzc19mbGFncykpewotICAgICAgICAgICAgc2IuYXBwZW5kKCJwdWJsaWMgIik7Ci0JCX0gZWxzZSBpZiAoaXNQcm90ZWN0ZWQoYWNjZXNzX2ZsYWdzKSl7Ci0JCQlzYi5hcHBlbmQoInByb3RlY3RlZCAiKTsKLQkJfSBlbHNlIGlmIChpc1ByaXZhdGUoYWNjZXNzX2ZsYWdzKSl7Ci0JCQlzYi5hcHBlbmQoInByaXZhdGUgIik7Ci0JCX0KLQkJaWYoaXNGaW5hbChhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiZmluYWwgIik7Ci0JCX0KLSAgICAgICAgaWYoaXNTdXBlcihhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLypzdXBlciovICIpOwotCQl9Ci0gICAgICAgIGlmKGlzSW50ZXJmYWNlKGFjY2Vzc19mbGFncykpewotICAgICAgICAgICAgc2IuYXBwZW5kKCJpbnRlcmZhY2UgIik7Ci0JCX0KLSAgICAgICAgaWYoaXNBYnN0cmFjdChhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJzdHJhY3QgIik7Ci0JCX0KLSAgICAgICAgaWYoaXNDbGFzcyhhY2Nlc3NfZmxhZ3MpKXsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiY2xhc3MgIik7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkudHJpbSgpOwotICAgIH0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9BdHRyaWJ1dGVJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvQXR0cmlidXRlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzVhOTFiLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9BdHRyaWJ1dGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuYnl0ZWNvZGUuKjsKLQotLyoqCi0gKiBBdHRyaWJ1dGUgaW5mbyBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyBiYXNlIG1ldGhvZHMKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdHRyaWJ1dGVJbmZvIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNPVVJDRV9GSUxFID0gIlNvdXJjZUZpbGUiOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OU1RBTlRfVkFMVUUgPSAiQ29uc3RhbnRWYWx1ZSI7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0RFID0gIkNvZGUiOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhDRVBUSU9OUyA9ICJFeGNlcHRpb25zIjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJTkVfTlVNQkVSX1RBQkxFID0gIkxpbmVOdW1iZXJUYWJsZSI7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMT0NBTF9WQVJJQUJMRV9UQUJMRSA9ICJMb2NhbFZhcmlhYmxlVGFibGUiOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5ORVJfQ0xBU1NFUyA9ICJJbm5lckNsYXNzZXMiOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU09VUkNFX0RJUiA9ICJTb3VyY2VEaXIiOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1lOVEhFVElDID0gIlN5bnRoZXRpYyI7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVBSRUNBVEVEID0gIkRlcHJlY2F0ZWQiOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5LTk9XTiA9ICJVbmtub3duIjsKLQkKLQlwcm90ZWN0ZWQgaW50IG5hbWVfaW5kZXg7Ci0JCi0JcHJvdGVjdGVkIENvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7Ci0JCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZUluZm8oaW50IGF0dHJfaW5kZXgsIENvbnN0YW50UG9vbCBwb29sKXsKLQkJbmFtZV9pbmRleCA9IGF0dHJfaW5kZXg7Ci0JCWNvbnN0YW50UG9vbCA9IHBvb2w7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBkaXMKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgbGVuID0gZGlzLnJlYWRJbnQoKTsKLQkJZGlzLnNraXBCeXRlcyhsZW4pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKXsKLQkJcmV0dXJuIFV0aWxzLmdldFVURjhWYWx1ZShjb25zdGFudFBvb2wsIG5hbWVfaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYXR0cl9pbmRleAotCSAqIEBwYXJhbSBkaXMKLQkgKiBAcGFyYW0gcG9vbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlSW5mbyBuZXdBdHRyaWJ1dGUoaW50IGF0dHJfaW5kZXgsIERhdGFJbnB1dFN0cmVhbSBkaXMsIENvbnN0YW50UG9vbCBwb29sKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlBdHRyaWJ1dGVJbmZvIGF0dHIgPSBudWxsOwotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IFV0aWxzLmdldFVURjhWYWx1ZShwb29sLCBhdHRyX2luZGV4KTsKLQkJaWYgKFNPVVJDRV9GSUxFLmVxdWFscyhuYW1lKSl7Ci0JCQlhdHRyID0gbmV3IFNvdXJjZUZpbGUoYXR0cl9pbmRleCwgcG9vbCk7Ci0JCX0gZWxzZSBpZiAoQ09OU1RBTlRfVkFMVUUuZXF1YWxzKG5hbWUpKXsKLQkJCWF0dHIgPSBuZXcgQ29uc3RhbnRWYWx1ZShhdHRyX2luZGV4LCBwb29sKTsKLQkJfSBlbHNlIGlmIChDT0RFLmVxdWFscyhuYW1lKSl7Ci0JCQlhdHRyID0gbmV3IENvZGUoYXR0cl9pbmRleCwgcG9vbCk7Ci0JCX0gZWxzZSBpZiAoRVhDRVBUSU9OUy5lcXVhbHMobmFtZSkpewotCQkJYXR0ciA9IG5ldyBFeGNlcHRpb25zKGF0dHJfaW5kZXgsIHBvb2wpOwotCQl9IGVsc2UgaWYgKExJTkVfTlVNQkVSX1RBQkxFLmVxdWFscyhuYW1lKSl7Ci0JCQlhdHRyID0gbmV3IExpbmVOdW1iZXJUYWJsZShhdHRyX2luZGV4LCBwb29sKTsKLQkJfSBlbHNlIGlmIChMT0NBTF9WQVJJQUJMRV9UQUJMRS5lcXVhbHMobmFtZSkpewotCQkJYXR0ciA9IG5ldyBMb2NhbFZhcmlhYmxlVGFibGUoYXR0cl9pbmRleCwgcG9vbCk7Ci0JCX0gZWxzZSBpZiAoSU5ORVJfQ0xBU1NFUy5lcXVhbHMobmFtZSkpewotCQkJYXR0ciA9IG5ldyBJbm5lckNsYXNzZXMoYXR0cl9pbmRleCwgcG9vbCk7Ci0JCX0gZWxzZSBpZiAoU09VUkNFX0RJUi5lcXVhbHMobmFtZSkpewotCQkJYXR0ciA9IG5ldyBTb3VyY2VEaXIoYXR0cl9pbmRleCwgcG9vbCk7Ci0JCX0gZWxzZSBpZiAoU1lOVEhFVElDLmVxdWFscyhuYW1lKSl7Ci0JCQlhdHRyID0gbmV3IFN5bnRoZXRpYyhhdHRyX2luZGV4LCBwb29sKTsKLQkJfSBlbHNlIGlmIChERVBSRUNBVEVELmVxdWFscyhuYW1lKSl7Ci0JCQlhdHRyID0gbmV3IERlcHJlY2F0ZWQoYXR0cl9pbmRleCwgcG9vbCk7Ci0JCX0gZWxzZSB7Ci0JCQlhdHRyID0gbmV3IFVua25vd24oYXR0cl9pbmRleCwgcG9vbCk7Ci0JCX0KLQkJYXR0ci5yZWFkKGRpcyk7Ci0JCXJldHVybiBhdHRyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9BdHRyaWJ1dGVJbmZvTGlzdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0F0dHJpYnV0ZUluZm9MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTQ4NTQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0F0dHJpYnV0ZUluZm9MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi0vKioKLSAqIGxpc3Qgb2YgYXR0cmlidXRlcwotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUluZm9MaXN0IHsKLQkKLQlwcm90ZWN0ZWQgQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZXM7Ci0JCi0JcHJvdGVjdGVkIENvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7Ci0JCi0JcHVibGljIEF0dHJpYnV0ZUluZm9MaXN0KENvbnN0YW50UG9vbCBwb29sKXsKLQkJY29uc3RhbnRQb29sID0gcG9vbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBpbnQgYXR0cmlidXRlc19jb3VudCA9IGRpcy5yZWFkVW5zaWduZWRTaG9ydCgpOwotCQlhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUluZm9bYXR0cmlidXRlc19jb3VudF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc19jb3VudDsgaSsrKXsKLQkJCWludCBhdHRyX2lkID0gZGlzLnJlYWRTaG9ydCgpOwotCQkJYXR0cmlidXRlc1tpXSA9IEF0dHJpYnV0ZUluZm8ubmV3QXR0cmlidXRlKGF0dHJfaWQsIGRpcywgY29uc3RhbnRQb29sKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQXR0cmlidXRlSW5mb1tdIGdldEF0dHJpYnV0ZXMoKXsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCQotCXB1YmxpYyBBdHRyaWJ1dGVJbmZvIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAobmFtZS5lcXVhbHMoYXR0cmlidXRlc1tpXS5nZXROYW1lKCkpKXsKLQkJCQlyZXR1cm4gYXR0cmlidXRlc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGludCBzaXplKCl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzLmxlbmd0aDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvQ29kZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0NvZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlMGEzNC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvQ29kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuYnl0ZWNvZGUuYXR0cmlidXRlczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuQ29uc3RhbnRQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuVXRmOENQSW5mbzsKLQotLyoqCi0gKiBDb2RlIHN0cnVjdHVyZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlIGV4dGVuZHMgQXR0cmlidXRlSW5mbyB7Ci0JCi0JcHJvdGVjdGVkIGludCBsZW5ndGg7Ci0JCi0JcHJvdGVjdGVkIGludCBtYXhfc3RhY2s7Ci0JCi0JcHJvdGVjdGVkIGludCBtYXhfbG9jYWxzOwotCQotCXByb3RlY3RlZCBieXRlW10gY29kZTsKLQkKLQlwcm90ZWN0ZWQgRXhjZXB0aW9uSW5mb1tdIGV4Y2VwdGlvbnM7Ci0JCQotCXByb3RlY3RlZCBMaW5lTnVtYmVyVGFibGUgbGluZU51bWJlclRhYmxlOwotCQotCXB1YmxpYyBDb2RlKGludCBhdHRyX2luZGV4LCBDb25zdGFudFBvb2wgcG9vbCl7Ci0JCXN1cGVyKGF0dHJfaW5kZXgsIHBvb2wpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWxlbmd0aCA9IGRpcy5yZWFkSW50KCk7Ci0JCW1heF9zdGFjayA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJbWF4X2xvY2FscyA9IGRpcy5yZWFkU2hvcnQoKTsKLQkJCi0JCS8vIHJlYWQgYnl0ZWNvZGUuLi4KLQkJaW50IGJ5dGVjb2RlX2xlbiA9IGRpcy5yZWFkSW50KCk7Ci0JCS8vY29kZSA9IG5ldyBieXRlW2J5dGVjb2RlX2xlbl07Ci0JCS8vZGlzLnJlYWRGdWxseShjb2RlKTsKLQkJZGlzLnNraXAoYnl0ZWNvZGVfbGVuKTsKLQkJCi0JCS8vIHJlYWQgZXhjZXB0aW9ucy4uLgotCQlpbnQgZXhjZXB0aW9uX2NvdW50ID0gZGlzLnJlYWRTaG9ydCgpOwotCQlleGNlcHRpb25zID0gbmV3IEV4Y2VwdGlvbkluZm9bZXhjZXB0aW9uX2NvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25fY291bnQ7IGkrKyl7Ci0JCQlleGNlcHRpb25zW2ldID0gbmV3IEV4Y2VwdGlvbkluZm8oY29uc3RhbnRQb29sKTsKLQkJCWV4Y2VwdGlvbnNbaV0ucmVhZChkaXMpOwotCQl9Ci0JCQotCQkvLyByZWFkIGF0dHJpYnV0ZXMuLi4KLQkJQXR0cmlidXRlSW5mb0xpc3QgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVJbmZvTGlzdChjb25zdGFudFBvb2wpOwotCQlhdHRyaWJ1dGVzLnJlYWQoZGlzKTsKLQkJbGluZU51bWJlclRhYmxlID0gKExpbmVOdW1iZXJUYWJsZSlhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGVJbmZvLkxJTkVfTlVNQkVSX1RBQkxFKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRNYXhTdGFjaygpewotCQlyZXR1cm4gbWF4X3N0YWNrOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE1heExvY2FscygpewotCQlyZXR1cm4gbWF4X2xvY2FsczsKLQl9Ci0JCi0JcHVibGljIGJ5dGVbXSBnZXRDb2RlKCl7Ci0JCXJldHVybiBjb2RlOwotCX0KLQkKLQlwdWJsaWMgRXhjZXB0aW9uSW5mb1tdIGdldEV4Y2VwdGlvbnMoKXsKLQkJcmV0dXJuIGV4Y2VwdGlvbnM7Ci0JfQotCQotCXB1YmxpYyBMaW5lTnVtYmVyVGFibGUgZ2V0TGluZU51bWJlclRhYmxlKCl7Ci0JCXJldHVybiBsaW5lTnVtYmVyVGFibGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uSW5mbyB7Ci0JCXByb3RlY3RlZCBDb25zdGFudFBvb2wgY29uc3RhbnRQb29sOwotCQlwcm90ZWN0ZWQgaW50IHN0YXJ0UEM7Ci0JCXByb3RlY3RlZCBpbnQgZW5kUEM7Ci0JCXByb3RlY3RlZCBpbnQgaGFuZGxlclBDOwotCQlwcm90ZWN0ZWQgaW50IGNhdGNoVHlwZTsKLQkJcHVibGljIEV4Y2VwdGlvbkluZm8oQ29uc3RhbnRQb29sIHBvb2wpewotCQkJY29uc3RhbnRQb29sID0gcG9vbDsKLQkJfQotCQlwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdGFydFBDID0gZGlzLnJlYWRTaG9ydCgpOwotCQkJZW5kUEMgPSBkaXMucmVhZFNob3J0KCk7Ci0JCQloYW5kbGVyUEMgPSBkaXMucmVhZFNob3J0KCk7Ci0JCQljYXRjaFR5cGUgPSBkaXMucmVhZFNob3J0KCk7Ci0JCX0KLQkJcHVibGljIGludCBnZXRTdGFydFBDKCl7Ci0JCQlyZXR1cm4gc3RhcnRQQzsKLQkJfQotCQlwdWJsaWMgaW50IGdldEVuZFBDKCl7Ci0JCQlyZXR1cm4gZW5kUEM7Ci0JCX0KLQkJcHVibGljIGludCBnZXRIYW5kbGVyUEMoKXsKLQkJCXJldHVybiBoYW5kbGVyUEM7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDYXRjaFR5cGUoKXsKLQkJCXJldHVybiBjYXRjaFR5cGU7Ci0JCX0KLQl9Ci0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0NvbnN0YW50VmFsdWUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9Db25zdGFudFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjBiNzQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0NvbnN0YW50VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi0vKioKLSAqIGNvbnN0YW50IHZhbHVlIHN0cnVjdHVyZQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIENvbnN0YW50VmFsdWUgZXh0ZW5kcyBBdHRyaWJ1dGVJbmZvIHsKLQkKLQlwcm90ZWN0ZWQgaW50IG5hbWVfaW5kZXg7Ci0JCi0JcHVibGljIENvbnN0YW50VmFsdWUoaW50IGF0dHJfaW5kZXgsIENvbnN0YW50UG9vbCBwb29sKXsKLQkJc3VwZXIoYXR0cl9pbmRleCwgcG9vbCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGxlbiA9IGRpcy5yZWFkSW50KCk7IC8vIGFzc2VydCAyID09IGxlbiA6IGxlbgotCQlpZiAobGVuICE9IDIpewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29uc3RhbnQgdmFsdWUgbGVuZ3RoIHNob3VsZCBiZSAyIGJ1dCB3YXMgIiArIGxlbik7Ci0JCX0KLQkJbmFtZV9pbmRleCA9IGRpcy5yZWFkU2hvcnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpewotCQlyZXR1cm4gKChVdGY4Q1BJbmZvKWNvbnN0YW50UG9vbC5nZXRFbnRyeShuYW1lX2luZGV4KSkuZ2V0VmFsdWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvRGVwcmVjYXRlZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0RlcHJlY2F0ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NDBiNS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvRGVwcmVjYXRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi0vKioKLSAqIGRlcHJlY2F0ZWQgc3RydWN0dXJlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgRGVwcmVjYXRlZCBleHRlbmRzIEF0dHJpYnV0ZUluZm8gewotCXB1YmxpYyBEZXByZWNhdGVkKGludCBhdHRyX2luZGV4LCBDb25zdGFudFBvb2wgcG9vbCl7Ci0JCXN1cGVyKGF0dHJfaW5kZXgsIHBvb2wpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9FeGNlcHRpb25zLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvRXhjZXB0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjE2NDVlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9FeGNlcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuYnl0ZWNvZGUuYXR0cmlidXRlczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuQ29uc3RhbnRQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuVXRmOENQSW5mbzsKLQotLyoqCi0gKiBleGNlcHRpb25zIHN0cnVjdHVyZQotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbnMgZXh0ZW5kcyBBdHRyaWJ1dGVJbmZvIHsKLQlwdWJsaWMgRXhjZXB0aW9ucyhpbnQgYXR0cl9pbmRleCwgQ29uc3RhbnRQb29sIHBvb2wpewotCQlzdXBlcihhdHRyX2luZGV4LCBwb29sKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvSW5uZXJDbGFzc2VzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvSW5uZXJDbGFzc2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjM2NjcuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0lubmVyQ2xhc3Nlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi0vKioKLSAqIGlubmVyIGNsYXNzZXMgc3RydWN0dXJlCi0gKiBAYXV0aG9yIDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbm5lckNsYXNzZXMgZXh0ZW5kcyBBdHRyaWJ1dGVJbmZvIHsKLQkKLQlwdWJsaWMgSW5uZXJDbGFzc2VzKGludCBhdHRyX2luZGV4LCBDb25zdGFudFBvb2wgcG9vbCl7Ci0JCXN1cGVyKGF0dHJfaW5kZXgsIHBvb2wpOwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0xpbmVOdW1iZXJUYWJsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL0xpbmVOdW1iZXJUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg5ZGU0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9MaW5lTnVtYmVyVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuYnl0ZWNvZGUuYXR0cmlidXRlczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuQ29uc3RhbnRQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuVXRmOENQSW5mbzsKLQotLyoqCi0gKiBsaW5lIG51bWJlciB0YWJsZSBzdHJ1Y3R1cmUKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIExpbmVOdW1iZXJUYWJsZSBleHRlbmRzIEF0dHJpYnV0ZUluZm8gewotCQotCXByb3RlY3RlZCBpbnQgY291bnQ7Ci0JCi0JcHJvdGVjdGVkIGludFtdIHZhclRhYmxlOwotCQotCXB1YmxpYyBMaW5lTnVtYmVyVGFibGUoaW50IGF0dHJfaW5kZXgsIENvbnN0YW50UG9vbCBwb29sKXsKLQkJc3VwZXIoYXR0cl9pbmRleCwgcG9vbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGxlbiA9IGRpcy5yZWFkSW50KCk7Ci0JCWNvdW50ID0gZGlzLnJlYWRTaG9ydCgpOwotCQl2YXJUYWJsZSA9IG5ldyBpbnRbIGNvdW50ICogMiBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhclRhYmxlLmxlbmd0aDsgaSsrKXsKLQkJCXZhclRhYmxlW2ldID0gZGlzLnJlYWRTaG9ydCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRQQyhpbnQgaSl7Ci0JCXJldHVybiB2YXJUYWJsZVsyKmldOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoaW50IGkpewotCQlyZXR1cm4gdmFyVGFibGVbMippICsgMV07Ci0JfQotCQotCXB1YmxpYyBpbnQgbGVuZ3RoKCl7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9Mb2NhbFZhcmlhYmxlVGFibGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9Mb2NhbFZhcmlhYmxlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxMWIyMi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvTG9jYWxWYXJpYWJsZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi0vKioKLSAqIGxvY2FsIHZhcmlhYmxlIHRhYmxlLgotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZVRhYmxlIGV4dGVuZHMgQXR0cmlidXRlSW5mbyB7Ci0JCi0JcHJvdGVjdGVkIGludCBjb3VudDsKLQkKLQlwcm90ZWN0ZWQgaW50W10gdmFyVGFibGU7Ci0JCi0JcHVibGljIExvY2FsVmFyaWFibGVUYWJsZShpbnQgYXR0cl9pbmRleCwgQ29uc3RhbnRQb29sIHBvb2wpewotCQlzdXBlcihhdHRyX2luZGV4LCBwb29sKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgbGVuID0gZGlzLnJlYWRJbnQoKTsKLQkJY291bnQgPSBkaXMucmVhZFNob3J0KCk7Ci0JCXZhclRhYmxlID0gbmV3IGludFtjb3VudCAqIDVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhclRhYmxlLmxlbmd0aDsgaSsrKXsKLQkJCXZhclRhYmxlW2ldID0gZGlzLnJlYWRTaG9ydCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRQQyhpbnQgaW5kZXgpewotCQlyZXR1cm4gdmFyVGFibGVbNSppbmRleF07Ci0JfQotCXB1YmxpYyBpbnQgZ2V0RW5kUEMoaW50IGluZGV4KXsKLQkJcmV0dXJuIHZhclRhYmxlWzUqaW5kZXhdICsgdmFyVGFibGVbNSppbmRleCArIDFdOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlTmFtZShpbnQgaW5kZXgpewotCQlpbnQgaSA9IHZhclRhYmxlWzUqaW5kZXggKyAyXTsKLQkJcmV0dXJuICgoVXRmOENQSW5mbyljb25zdGFudFBvb2wuZ2V0RW50cnkoaSkpLmdldFZhbHVlKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZShpbnQgaW5kZXgpewotCQlpbnQgaSA9IHZhclRhYmxlWzUqaW5kZXggKyAzXTsKLQkJcmV0dXJuICgoVXRmOENQSW5mbyljb25zdGFudFBvb2wuZ2V0RW50cnkoaSkpLmdldFZhbHVlKCk7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0U2xvdChpbnQgaW5kZXgpewotCQlyZXR1cm4gdmFyVGFibGVbNSppbmRleCArIDRdOwotCX0KLQlwdWJsaWMgaW50IGxlbmd0aCgpewotCQlyZXR1cm4gY291bnQ7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvU291cmNlRGlyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvU291cmNlRGlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MGQ4MGMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL1NvdXJjZURpci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi0vKioKLSAqIHNvdXJjZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic2JhaWxsaWV6QGltZWRpYXRpb24uY29tIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZURpciBleHRlbmRzIEF0dHJpYnV0ZUluZm8gewotCQotCXByb3RlY3RlZCBpbnQgbmFtZV9pbmRleDsKLQkKLQlwdWJsaWMgU291cmNlRGlyKGludCBhdHRyX2luZGV4LCBDb25zdGFudFBvb2wgcG9vbCl7Ci0JCXN1cGVyKGF0dHJfaW5kZXgsIHBvb2wpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBsZW4gPSBkaXMucmVhZEludCgpOwotCQkvLyBhc3NlcnQgbGVuID09IDIKLQkJbmFtZV9pbmRleCA9IGRpcy5yZWFkU2hvcnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpewotCQlyZXR1cm4gKChVdGY4Q1BJbmZvKWNvbnN0YW50UG9vbC5nZXRFbnRyeShuYW1lX2luZGV4KSkuZ2V0VmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9Tb3VyY2VGaWxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvU291cmNlRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM0NGIxLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9Tb3VyY2VGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sLkNvbnN0YW50UG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sLlV0ZjhDUEluZm87Ci0KLS8qKgotICogc291cmNlIGZpbGUgc3RydWN0dXJlCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlRmlsZSBleHRlbmRzIEF0dHJpYnV0ZUluZm8gewotCQotCXByb3RlY3RlZCBpbnQgbmFtZV9pbmRleDsKLQkKLQlwdWJsaWMgU291cmNlRmlsZShpbnQgYXR0cl9pbmRleCwgQ29uc3RhbnRQb29sIHBvb2wpewotCQlzdXBlcihhdHRyX2luZGV4LCBwb29sKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgbGVuID0gZGlzLnJlYWRJbnQoKTsKLQkJLy8gYXNzZXJ0IGxlbiA9PSAyCi0JCW5hbWVfaW5kZXggPSBkaXMucmVhZFNob3J0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKXsKLQkJcmV0dXJuICgoVXRmOENQSW5mbyljb25zdGFudFBvb2wuZ2V0RW50cnkobmFtZV9pbmRleCkpLmdldFZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvU3ludGhldGljLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvU3ludGhldGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzc5ZWUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2l0cmFrYS9ieXRlY29kZS9hdHRyaWJ1dGVzL1N5bnRoZXRpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5VdGY4Q1BJbmZvOwotCi0vKioKLSAqIHN5bnRoZXRpYyBzdHJ1Y3R1cmUKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTeW50aGV0aWMgZXh0ZW5kcyBBdHRyaWJ1dGVJbmZvIHsKLQlwdWJsaWMgU3ludGhldGljKGludCBhdHRyX2luZGV4LCBDb25zdGFudFBvb2wgcG9vbCl7Ci0JCXN1cGVyKGF0dHJfaW5kZXgsIHBvb2wpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9Vbmtub3duLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zaXRyYWthL2J5dGVjb2RlL2F0dHJpYnV0ZXMvVW5rbm93bi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTY0OWY0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NpdHJha2EvYnl0ZWNvZGUvYXR0cmlidXRlcy9Vbmtub3duLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sLkNvbnN0YW50UG9vbDsKLQotLyoqCi0gKiB1bmtub3duIHN0cnVjdHVyZSBhdHRyaWJ1dGUKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duIGV4dGVuZHMgQXR0cmlidXRlSW5mbyB7Ci0JcHVibGljIFVua25vd24oaW50IGF0dHJfaW5kZXgsIENvbnN0YW50UG9vbCBwb29sKXsKLQkJc3VwZXIoYXR0cl9pbmRleCwgcG9vbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc291bmQvQW50U291bmRQbGF5ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL0FudFNvdW5kUGxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MzI3YjEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc291bmQvQW50U291bmRQbGF5ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNvdW5kOwotCi0vLyBhbnQgaW5jbHVkZXMKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi0vLyBpbXBvcnRzIGZvciBhbGwgdGhlIHNvdW5kIGNsYXNzZXMgcmVxdWlyZWQKLS8vIG5vdGU6IGNvbWVzIHdpdGggam1mIG9yIGpkazEuMyArCi0vLyB0aGVzZSBjYW4gYmUgb2J0YWluZWQgZnJvbSBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmEtbWVkaWEvc291bmQvCi1pbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGJ5IGFueSBBbnRUYXNrIHRoYXQgcmVxdWlyZXMgYXVkaW8gb3V0cHV0LgotICoKLSAqIEl0IGltcGxlbWVudHMgdGhlIEJ1aWxkTGlzdGVuZXIgaW50ZXJmYWNlIHRvIGxpc3RlbiBmb3IgQnVpbGRFdmVudHMgYW5kIGNvdWxkCi0gKiBiZSBlYXNpbHkgZXh0ZW5kZWQgdG8gcHJvdmlkZSBhdWRpbyBvdXRwdXQgdXBvbiBhbnkgc3BlY2lmaWMgYnVpbGQgZXZlbnRzIG9jY3VyaW5nLgotICoKLSAqIEkgaGF2ZSBvbmx5IHRlc3RlZCB0aGlzIHdpdGggLldBViBhbmQgLkFJRkYgc291bmQgZmlsZSBmb3JtYXRzLiBCb3RoIHNlZW0gdG8gd29yayBmaW5lLgotICoKLSAqIEBhdXRob3IgTmljayBQZWxsb3cKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAotICovCi0KLXB1YmxpYyBjbGFzcyBBbnRTb3VuZFBsYXllciBpbXBsZW1lbnRzIExpbmVMaXN0ZW5lciwgQnVpbGRMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIEZpbGUgZmlsZVN1Y2Nlc3MgPSBudWxsOwotICAgIHByaXZhdGUgaW50IGxvb3BzU3VjY2VzcyA9IDA7Ci0gICAgcHJpdmF0ZSBMb25nIGR1cmF0aW9uU3VjY2VzcyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEZpbGUgZmlsZUZhaWwgPSBudWxsOwotICAgIHByaXZhdGUgaW50IGxvb3BzRmFpbCA9IDA7Ci0gICAgcHJpdmF0ZSBMb25nIGR1cmF0aW9uRmFpbCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgQW50U291bmRQbGF5ZXIoKSB7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXVkaW8gZmlsZSB0byBiZSBwbGF5ZWQgd2hlbiB0aGUgYnVpbGQgaXMgc3VjY2Vzc2Z1bAotICAgICAqIEBwYXJhbSBsb29wcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHNob3VsZCBiZSBwbGF5ZWQgd2hlbiB0aGUgYnVpbGQgaXMgc3VjY2Vzc2Z1bAotICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgZmlsZSBzaG91bGQgYmUgcGxheWVkIHdoZW4gdGhlIGJ1aWxkIGlzIHN1Y2Nlc3NmdWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRCdWlsZFN1Y2Nlc3NmdWxTb3VuZChGaWxlIGZpbGUsIGludCBsb29wcywgTG9uZyBkdXJhdGlvbikgewotICAgICAgICB0aGlzLmZpbGVTdWNjZXNzID0gZmlsZTsKLSAgICAgICAgdGhpcy5sb29wc1N1Y2Nlc3MgPSBsb29wczsKLSAgICAgICAgdGhpcy5kdXJhdGlvblN1Y2Nlc3MgPSBkdXJhdGlvbjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgbG9jYXRpb24gb2YgdGhlIGF1ZGlvIGZpbGUgdG8gYmUgcGxheWVkIHdoZW4gdGhlIGJ1aWxkIGZhaWxzCi0gICAgICogQHBhcmFtIGxvb3BzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc2hvdWxkIGJlIHBsYXllZCB3aGVuIHRoZSBidWlsZCBpcyBmYWlscwotICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgZmlsZSBzaG91bGQgYmUgcGxheWVkIHdoZW4gdGhlIGJ1aWxkIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQnVpbGRGYWlsZWRTb3VuZChGaWxlIGZpbGVGYWlsLCBpbnQgbG9vcHNGYWlsLCBMb25nIGR1cmF0aW9uRmFpbCkgewotICAgICAgICB0aGlzLmZpbGVGYWlsID0gZmlsZUZhaWw7Ci0gICAgICAgIHRoaXMubG9vcHNGYWlsID0gbG9vcHNGYWlsOwotICAgICAgICB0aGlzLmR1cmF0aW9uRmFpbCA9IGR1cmF0aW9uRmFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5cyB0aGUgZmlsZSBmb3IgZHVyYXRpb24gbWlsbGlzZWNvbmRzIG9yIGxvb3BzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwbGF5KFByb2plY3QgcHJvamVjdCwgRmlsZSBmaWxlLCBpbnQgbG9vcHMsIExvbmcgZHVyYXRpb24pIHsKLQotICAgICAgICBDbGlwIGF1ZGlvQ2xpcCA9IG51bGw7Ci0KLSAgICAgICAgQXVkaW9JbnB1dFN0cmVhbSBhdWRpb0lucHV0U3RyZWFtID0gbnVsbDsKLQotCi0JCXRyeSB7Ci0JCQlhdWRpb0lucHV0U3RyZWFtID0gQXVkaW9TeXN0ZW0uZ2V0QXVkaW9JbnB1dFN0cmVhbShmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRBdWRpb0ZpbGVFeGNlcHRpb24gdWFmZSkgewotCQkJcHJvamVjdC5sb2coIkF1ZGlvIGZvcm1hdCBpcyBub3QgeWV0IHN1cHBvcnRlZDogIit1YWZlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLQkJaWYgKGF1ZGlvSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJQXVkaW9Gb3JtYXQJZm9ybWF0ID0gYXVkaW9JbnB1dFN0cmVhbS5nZXRGb3JtYXQoKTsKLQkJCURhdGFMaW5lLkluZm8JaW5mbyA9IG5ldyBEYXRhTGluZS5JbmZvKENsaXAuY2xhc3MsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtLk5PVF9TUEVDSUZJRUQpOwotCQkJdHJ5IHsKLQkJCQlhdWRpb0NsaXAgPSAoQ2xpcCkgQXVkaW9TeXN0ZW0uZ2V0TGluZShpbmZvKTsKLQkJCQlhdWRpb0NsaXAuYWRkTGluZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIGF1ZGlvQ2xpcC5vcGVuKGF1ZGlvSW5wdXRTdHJlYW0pOwotCQkJfQotCQkJY2F0Y2ggKExpbmVVbmF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIlRoZSBzb3VuZCBkZXZpY2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0gICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBsYXlDbGlwKGF1ZGlvQ2xpcCwgZHVyYXRpb24ubG9uZ1ZhbHVlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGF5Q2xpcChhdWRpb0NsaXAsIGxvb3BzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvQ2xpcC5kcmFpbigpOwotICAgICAgICAgICAgYXVkaW9DbGlwLmNsb3NlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcm9qZWN0LmxvZygiQ2FuJ3QgZ2V0IGRhdGEgZnJvbSBmaWxlICIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCX0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGxheUNsaXAoQ2xpcCBjbGlwLCBpbnQgbG9vcHMpIHsKLQotICAgICAgICBjbGlwLmxvb3AobG9vcHMpOwotICAgICAgICB3aGlsZSAoY2xpcC5pc1J1bm5pbmcoKSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlDbGlwKENsaXAgY2xpcCwgbG9uZyBkdXJhdGlvbikgewotCi0gICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgY2xpcC5sb29wKENsaXAuTE9PUF9DT05USU5VT1VTTFkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGR1cmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBpbXBsZW1lbnRlZCB0byBsaXN0ZW4gZm9yIGFueSBsaW5lIGV2ZW50cyBhbmQgY2xvc2VzIHRoZQotICAgICAqIGNsaXAgaWYgcmVxdWlyZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKExpbmVFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaW5lRXZlbnQuVHlwZS5TVE9QKSkgewotICAgICAgICAgICAgTGluZSBsaW5lID0gZXZlbnQuZ2V0TGluZSgpOwotICAgICAgICAgICAgbGluZS5jbG9zZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoTGluZUV2ZW50LlR5cGUuQ0xPU0UpKSB7Ci0JCQkvKgotCQkJICoJVGhlcmUgaXMgYSBidWcgaW4gSmF2YVNvdW5kIDAuOTAgKGpkazEuM2JldGEpLgotCQkJICoJSXQgcHJldmVudHMgY29ycmVjdCB0ZXJtaW5hdGlvbiBvZiB0aGUgVk0uCi0JCQkgKglTbyB3ZSBoYXZlIHRvIGV4aXQgb3Vyc2VsdmVzLgotCQkJICovCi0JCQkvL1N5c3RlbS5leGl0KDApOwotCQl9Ci0JfQotCi0KLSAgICAvKioKLSAgICAgKiAgRmlyZWQgYmVmb3JlIGFueSB0YXJnZXRzIGFyZSBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KXsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIEZpcmVkIGFmdGVyIHRoZSBsYXN0IHRhcmdldCBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQKLSAgICAgKiAgd2lsbCBzdGlsbCBiZSB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGhlIGJ1aWxkLgotICAgICAqCi0gICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRFeGNlcHRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCl7Ci0gICAgICAgIGlmIChldmVudC5nZXRFeGNlcHRpb24oKSA9PSBudWxsICYmIGZpbGVTdWNjZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGJ1aWxkIHN1Y2Nlc3NmdWxsIQotICAgICAgICAgICAgcGxheShldmVudC5nZXRQcm9qZWN0KCksIGZpbGVTdWNjZXNzLCBsb29wc1N1Y2Nlc3MsIGR1cmF0aW9uU3VjY2Vzcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIGV2ZW50LmdldEV4Y2VwdGlvbigpICE9IG51bGwgJiYgZmlsZUZhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheShldmVudC5nZXRQcm9qZWN0KCksIGZpbGVGYWlsLCBsb29wc0ZhaWwsIGR1cmF0aW9uRmFpbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZWQgd2hlbiBhIHRhcmdldCBpcyBzdGFydGVkLgotICAgICAqCi0gICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRUYXJnZXQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCl7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIHdoZW4gYSB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50IHdpbGwKLSAgICAgKiAgc3RpbGwgYmUgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KXsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyZWQgd2hlbiBhIHRhc2sgaXMgc3RhcnRlZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFzaygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCl7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIHdoZW4gYSB0YXNrIGhhcyBmaW5pc2hlZC4gVGhpcyBldmVudCB3aWxsIHN0aWxsCi0gICAgICogIGJlIHRocm93IGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZC4KLSAgICAgKgotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCl7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpcmVkIHdoZW5ldmVyIGEgbWVzc2FnZSBpcyBsb2dnZWQuCi0gICAgICoKLSAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldE1lc3NhZ2UoKQotICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0UHJpb3JpdHkoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCl7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3VuZC9Tb3VuZFRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL1NvdW5kVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTg1MjQwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL1NvdW5kVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhbiBBbnRUYXNrIHRoYXQgbWFrZXMgb2YgdXNlIG9mIHRoZSBBbnRTb3VuZFBsYXllci4KLSAqCi0gKiBUaGVyZSBhcmUgdGhyZWUgYXR0cmlidXRlcyB0byBiZSBzZXQ6Ci0gKgotICogPGNvZGU+c291cmNlPC9jb2RlPjogdGhlIGxvY2F0aW9uIG9mIHRoZSBhdWRpbyBmaWxlIHRvIGJlIHBsYXllZAotICogPGNvZGU+ZHVyYXRpb248L2NvZGU+OiBwbGF5IHRoZSBzb3VuZCBmaWxlIGNvbnRpbnVvdXNseSB1bnRpbCAiZHVyYXRpb24iIG1pbGxpc2Vjb25kcyBoYXMgZXhwaXJlZAotICogPGNvZGU+bG9vcHM8L2NvZGU+OiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzb3VuZCBmaWxlIHNob3VsZCBiZSBwbGF5ZWQgdW50aWwgc3RvcHBlZAotICoKLSAqIEkgaGF2ZSBvbmx5IHRlc3RlZCB0aGlzIHdpdGggLldBViBhbmQgLkFJRkYgc291bmQgZmlsZSBmb3JtYXRzLiBCb3RoIHNlZW0KLSAqIHRvIHdvcmsgZmluZS4KLSAqCi0gKiBwbGFucyBmb3IgdGhlIGZ1dHVyZToKLSAqIC0gdXNlIHRoZSBtaWRpIGFwaSB0byBkZWZpbmUgc291bmRzIChvciBkcnVtIGJlYXQgZXRjKSBpbiB4bWwgYW5kIGhhdmUKLSAqICAgQW50IHBsYXkgdGhlbSBiYWNrCi0gKgotICogQGF1dGhvciBOaWNrIFBlbGxvdwotICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCi0gKi8KLQotcHVibGljIGNsYXNzIFNvdW5kVGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBCdWlsZEFsZXJ0IHN1Y2Nlc3MgPSBudWxsOwotICAgIHByaXZhdGUgQnVpbGRBbGVydCBmYWlsID0gbnVsbDsKLQotICAgIHB1YmxpYyBCdWlsZEFsZXJ0IGNyZWF0ZVN1Y2Nlc3MoKSB7Ci0gICAgICAgIHN1Y2Nlc3MgPSBuZXcgQnVpbGRBbGVydCgpOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRBbGVydCBjcmVhdGVGYWlsKCkgewotICAgICAgICBmYWlsID0gbmV3IEJ1aWxkQWxlcnQoKTsKLSAgICAgICAgcmV0dXJuIGZhaWw7Ci0gICAgIH0KLQotICAgIHB1YmxpYyBTb3VuZFRhc2soKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdCgpewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLSAgICAgICAgQW50U291bmRQbGF5ZXIgc291bmRQbGF5ZXIgPSBuZXcgQW50U291bmRQbGF5ZXIoKTsKLQotICAgICAgICBpZiAoIHN1Y2Nlc3MgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGxvZygiTm8gbmVzdGVkIHN1Y2Nlc3MgZWxlbWVudCBmb3VuZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvdW5kUGxheWVyLmFkZEJ1aWxkU3VjY2Vzc2Z1bFNvdW5kKHN1Y2Nlc3MuZ2V0U291cmNlKCksCi0gICAgICAgICAgICAgIHN1Y2Nlc3MuZ2V0TG9vcHMoKSwgc3VjY2Vzcy5nZXREdXJhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWlsID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZygiTm8gbmVzdGVkIGZhaWx1cmUgZWxlbWVudCBmb3VuZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvdW5kUGxheWVyLmFkZEJ1aWxkRmFpbGVkU291bmQoZmFpbC5nZXRTb3VyY2UoKSwKLSAgICAgICAgICAgICAgZmFpbC5nZXRMb29wcygpLCBmYWlsLmdldER1cmF0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIoc291bmRQbGF5ZXIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB0byBiZSBleHRlbmRlZCBieSBhbnkgQnVpbGRBbGVydCdzIHRoYXQgcmVxdWlyZSB0aGUgb3V0cHV0Ci0gICAgICogb2Ygc291bmQuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIEJ1aWxkQWxlcnQgewotICAgICAgICBwcml2YXRlIEZpbGUgc291cmNlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbG9vcHMgPSAwOwotICAgICAgICBwcml2YXRlIExvbmcgZHVyYXRpb24gPSBudWxsOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdGhlIGZpbGUgc2hvdWxkIGJlIHBsYXllZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKExvbmcgZHVyYXRpb24pIHsKLSAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0byBnZXQgdGhlIGF1ZGlvLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBuYW1lIGEgc291bmQtZmlsZSBkaXJlY3Rvcnkgb3Igb2YgdGhlIGF1ZGlvIGZpbGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShGaWxlIHNvdXJjZSkgewotICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzb3VyY2UgZmlsZSBzaG91bGQgYmUgcGxheWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbG9vcHMgdGhlIG51bWJlciBvZiBsb29wcyB0byBwbGF5IHRoZSBzb3VyY2UgZmlsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TG9vcHMoaW50IGxvb3BzKSB7Ci0gICAgICAgICAgICB0aGlzLmxvb3BzID0gbG9vcHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gZ2V0IHRoZSBhdWRpby4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZSgpIHsKLSAgICAgICAgICAgIEZpbGUgbm9maWxlID0gbnVsbCA7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiBzb3VyY2UgaXMgYSBkaXJlY3RvcnkKLSAgICAgICAgICAgIGlmKCBzb3VyY2UuZXhpc3RzKCkgKSB7Ci0gICAgICAgICAgICAgICAgaWYoIHNvdXJjZS5pc0RpcmVjdG9yeSgpICkgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIGRpcgotICAgICAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBzb3VyY2UubGlzdEZpbGVzKCkgOyAKLSAgICAgICAgICAgICAgICAgICAgaW50IG51bWZpbGVzID0gZmlsZXMubGVuZ3RoIDsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgUmFuZG9tIHJuID0gbmV3IFJhbmRvbSgpIDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBybi5uZXh0SW50KG51bWZpbGVzKSA7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc291cmNlIHRvIHRoZSBmaWxlIGF0IHRoYXQgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBmaWxlc1tpXSA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coc291cmNlICsgIjogaW52YWxpZCBwYXRoLiIsIFByb2plY3QuTVNHX1dBUk4pIDsKLSAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5vZmlsZSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UgOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc291cmNlIGZpbGUgc2hvdWxkIGJlIHBsYXllZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxvb3BzIHRvIHBsYXkgdGhlIHNvdXJjZSBmaWxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldExvb3BzKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9vcHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRoZSBmaWxlIHNob3VsZCBiZSBwbGF5ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTG9uZyBnZXREdXJhdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDgzYzIyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci0KLS8qKgotICogQSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyB0YXNrcyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzIG9uIFZpc3VhbCBTb3VyY2VTYWZlLgotICogPHA+Ci0gKiBUaGUgY2xhc3MgZXh0ZW5kcyB0aGUgJ2V4ZWMnIHRhc2sgYXMgaXQgb3BlcmF0ZXMgYnkgZXhlY3V0aW5nIHRoZSBzcy5leGUgcHJvZ3JhbQotICogc3VwcGxpZWQgd2l0aCBTb3VyY2VTYWZlLiBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgc3MuZXhlIHRvIGJlIGluIHRoZSBwYXRoLAotICogeW91IGNhbiBvdmVycmlkZSB0aGlzIGJlIHNwZWNpZnlpbmcgdGhlIHNzZGlyIGF0dHJpYnV0ZS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzZXQgYW5kIGdldCBtZXRob2RzIGZvciAnbG9naW4nIGFuZCAndnNzcGF0aCcgYXR0cmlidXRlcy4gSXQKLSAqIGFsc28gY29udGFpbnMgY29uc3RhbnRzIGZvciB0aGUgZmxhZ3MgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIFNTLgotICogPC9wPgotICoKLSAqIEBhdXRob3IgQ3JhaWcgQ290dGluZ2hhbQotICogQGF1dGhvciBBbmRyZXcgRXZlcml0dAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTVNWU1MgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1fU1NEaXIgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBtX3Zzc0xvZ2luID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX3Zzc1BhdGggPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIG1fc2VydmVyUGF0aCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSBzcy5leGUgaXMgbG9jYXRlZAotICAgICAqCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc3MuZXhlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U3NkaXIoU3RyaW5nIGRpcikgewotICAgICAgICBtX1NTRGlyID0gcHJvamVjdC50cmFuc2xhdGVQYXRoKGRpcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgY29tbWFuZCBzdHJpbmcgdG8gZXhlY3V0ZSBzcy5leGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNTQ29tbWFuZCgpIHsKLSAgICAgICAgU3RyaW5nIHRvUmV0dXJuID0gbV9TU0RpcjsKLSAgICAgICAgaWYgKCAhdG9SZXR1cm4uZXF1YWxzKCIiKSAmJiAhdG9SZXR1cm4uZW5kc1dpdGgoIlxcIikgKSB7Ci0gICAgICAgICAgICB0b1JldHVybiArPSAiXFwiOwotICAgICAgICB9Ci0gICAgICAgIHRvUmV0dXJuICs9IFNTX0VYRTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0b1JldHVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyB2c3MuCi0gICAgICogPHA+Ci0gICAgICogU2hvdWxkIGJlIGZvcm1hdHRlZCBhcyB1c2VybmFtZSxwYXNzd29yZAotICAgICAqCi0gICAgICogQHBhcmFtIGxvZ2luIHRoZSBsb2dpbiBzdHJpbmcgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TG9naW4oU3RyaW5nIGxvZ2luKSB7Ci0gICAgICAgIG1fdnNzTG9naW4gPSBsb2dpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBsb2dpbiBjb21tYW5kIGlmIHRoZSAnbG9naW4nIGF0dHJpYnV0ZSB3YXMgc3BlY2lmaWVkLCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0TG9naW5Db21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpZiAoIG1fdnNzTG9naW4gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTE9HSU4gKyBtX3Zzc0xvZ2luKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aCB0byB0aGUgaXRlbSBpbiB2c3MgdG8gb3BlcmF0ZSBvbgotICAgICAqIDxwPgotICAgICAqIEFudCBjYW4ndCBjb3BlIHdpdGggYSAnJCcgc2lnbiBpbiBhbiBhdHRyaWJ1dGUgc28gd2UgaGF2ZSB0byBhZGQgaXQgaGVyZS4KLSAgICAgKiBBbHNvIHdlIHN0cmlwIG9mZiBhbnkgJ3ZzczovLycgcHJlZml4IHdoaWNoIGlzIGFuIFhNUyBzcGVjaWFsIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCEKLSAgICAgKgotICAgICAqIEBwYXJhbSB2c3NQYXRoCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VnNzcGF0aChTdHJpbmcgdnNzUGF0aCkgewotICAgICAgICBpZiAoIHZzc1BhdGguc3RhcnRzV2l0aCgidnNzOi8vIikgKSB7Ci0gICAgICAgICAgICBtX3Zzc1BhdGg9IFBST0pFQ1RfUFJFRklYICsgdnNzUGF0aC5zdWJzdHJpbmcoNSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3Zzc1BhdGggPSBQUk9KRUNUX1BSRUZJWCArIHZzc1BhdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIG1fdnNzUGF0aAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VnNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1fdnNzUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzcy5pbmkKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2ZXJQYXRoCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2VydmVycGF0aChTdHJpbmcgc2VydmVyUGF0aCkgewotICAgICAgICBtX3NlcnZlclBhdGggPSBzZXJ2ZXJQYXRoOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgcnVuKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRXhlY3V0ZSBleGUgPSBuZXcgRXhlY3V0ZShuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTikpOwotCi0gICAgICAgICAgICAvLyBJZiBsb2NhdGlvbiBvZiBzcy5pbmkgaXMgc3BlY2lmaWVkIHdlIG5lZWQgdG8gc2V0IHRoZSAKLSAgICAgICAgICAgIC8vIGVudmlyb25tZW50LXZhcmlhYmxlIFNTRElSIHRvIHRoaXMgdmFsdWUKLSAgICAgICAgICAgIGlmIChtX3NlcnZlclBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGVudiA9IGV4ZS5nZXRFbnZpcm9ubWVudCgpOwotICAgICAgICAgICAgICAgIGlmKCBlbnYgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgZW52ID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbmV3RW52ID0gbmV3IFN0cmluZ1tlbnYubGVuZ3RoKzFdOwotICAgICAgICAgICAgICAgIGZvciggaW50IGk9MDtpPGVudi5sZW5ndGg7aSsrICkgewotICAgICAgICAgICAgICAgICAgICBuZXdFbnZbaV0gPSBlbnZbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld0VudltlbnYubGVuZ3RoXSA9ICJTU0RJUj0iICsgbV9zZXJ2ZXJQYXRoOwotCi0gICAgICAgICAgICAgICAgZXhlLnNldEVudmlyb25tZW50KG5ld0Vudik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGV4ZS5zZXRBbnRSdW4ocHJvamVjdCk7Ci0gICAgICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShwcm9qZWN0LmdldEJhc2VEaXIoKSk7Ci0gICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICAgICAgcmV0dXJuIGV4ZS5leGVjdXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IGZvciB0aGUgdGhpbmcgdG8gZXhlY3V0ZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU19FWEUgPSAic3MiOwotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUFJFRklYID0gIiQiOwotCi0gICAgLyoqCi0gICAgICogVGhlICdHZXQnIGNvbW1hbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0dFVCA9ICJHZXQiOwotICAgIC8qKgotICAgICAqIFRoZSAnQ2hlY2tvdXQnIGNvbW1hbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0NIRUNLT1VUID0gIkNoZWNrb3V0IjsKLSAgICAvKioKLSAgICAgKiBUaGUgJ0NoZWNraW4nIGNvbW1hbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0NIRUNLSU4gPSAiQ2hlY2tpbiI7Ci0gICAgLyoqCi0gICAgICogVGhlICdMYWJlbCcgY29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTEFCRUwgPSAiTGFiZWwiOwotICAgIC8qKgotICAgICAqIFRoZSAnSGlzdG9yeScgY29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfSElTVE9SWSA9ICJIaXN0b3J5IjsKLQotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTE9HSU4gPSAiLVkiOwotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfT1ZFUlJJREVfV09SS0lOR19ESVIgPSAiLUdMIjsKLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0FVVE9SRVNQT05TRV9ERUYgPSAiLUktIjsKLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0FVVE9SRVNQT05TRV9ZRVMgPSAiLUktWSI7Ci0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19BVVRPUkVTUE9OU0VfTk8gPSAiLUktTiI7Ci0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRUNVUlNJT04gPSAiLVIiOwotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVkVSU0lPTiA9ICItViI7Ci0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19WRVJTSU9OX0RBVEUgPSAiLVZkIjsKLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1ZFUlNJT05fTEFCRUwgPSAiLVZMIjsKLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1dSSVRBQkxFID0gIi1XIjsKLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OTyA9ICItTiI7Ci0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfWUVTID0gIi1ZIjsKLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1FVSUVUID0gIi1PLSI7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLSU4uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYwNWM4Ny4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDSEVDS0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGFzayB0byBwZXJmb3JtIENoZWNrSW4gY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2UgU2FmZS4KLSAqCi0gKiBAYXV0aG9yIE1hcnRpbiBQb2VzY2hsCi0gKi8KLXB1YmxpYyBjbGFzcyBNU1ZTU0NIRUNLSU4gZXh0ZW5kcyBNU1ZTUyB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtX0xvY2FsUGF0aCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1fUmVjdXJzaXZlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1fV3JpdGFibGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBtX0F1dG9SZXNwb25zZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9Db21tZW50ID0gIi0iOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCi0gICAgICogPHA+Ci0gICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgc3MgYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKLSAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgY29tbWFuZCBhbmQgYSB2c3NkaXIgLi4uCi0gICAgICAgIGlmIChnZXRWc3NwYXRoKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IGxvb2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIG9mIHRoaW5ncyAuLi4KLQotICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcwotICAgICAgICAvLyBzcyBDaGVja2luIFZTUyBpdGVtcyBbLUhdIFstQ10gWy1JLV0gWy1OXSBbLU9dIFstUl0gWy1XXSBbLVldIFstP10KLSAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBTUy5FWEUgaGVscAotICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldFNTQ29tbWFuZCgpKTsKLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX0NIRUNLSU4pOwotCi0gICAgICAgIC8vIFZTUyBpdGVtcwotICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZzc3BhdGgoKSk7Ci0gICAgICAgIC8vIC1HTAotICAgICAgICBnZXRMb2NhbHBhdGhDb21tYW5kKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgLy8gLUktIG9yIC1JLVkgb3IgLUktTgotICAgICAgICBnZXRBdXRvcmVzcG9uc2UoY29tbWFuZExpbmUpOwotICAgICAgICAvLyAtUgotICAgICAgICBnZXRSZWN1cnNpdmVDb21tYW5kKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgLy8gLVcKLSAgICAgICAgZ2V0V3JpdGFibGVDb21tYW5kKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgLy8gLVkKLSAgICAgICAgZ2V0TG9naW5Db21tYW5kKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgLy8gLUMKLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLUMiK2dldENvbW1lbnQoKSk7Ci0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvY2FsIHBhdGguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxwYXRoKFBhdGggbG9jYWxQYXRoKSB7Ci0gICAgICAgIG1fTG9jYWxQYXRoID0gbG9jYWxQYXRoLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuZCByZXR1cm5zIHRoZSAtR0wgZmxhZyBjb21tYW5kIGlmIHJlcXVpcmVkCi0gICAgICogPHA+Ci0gICAgICogVGhlIGxvY2FscGF0aCBpcyBjcmVhdGVkIGlmIGl0IGRpZG4ndCBleGlzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldExvY2FscGF0aENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmIChtX0xvY2FsUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgbV9Mb2NhbERpciBleGlzdHMsIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0Ci0gICAgICAgICAgICBGaWxlIGRpciA9IHByb2plY3QucmVzb2x2ZUZpbGUobV9Mb2NhbFBhdGgpOwotICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRvbmUgPSBkaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvbmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJEaXJlY3RvcnkgIiArIG1fTG9jYWxQYXRoICsgIiBjcmVhdGlvbiB3YXMgbm90ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc2Z1bCBmb3IgYW4gdW5rbm93biByZWFzb24iOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJDcmVhdGVkIGRpcjogIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfT1ZFUlJJREVfV09SS0lOR19ESVIgKyBtX0xvY2FsUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYmVoYXZpb3VyIHJlY3Vyc2l2ZSBvciBub24tcmVjdXJzaXZlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0gICAgICAgIG1fUmVjdXJzaXZlID0gcmVjdXJzaXZlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlICdyZWN1cnNpdmUnIGNvbW1hbmQgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgJ3RydWUnLCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0UmVjdXJzaXZlQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKLSAgICAgICAgaWYgKCAhbV9SZWN1cnNpdmUgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1JFQ1VSU0lPTik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYmVoYXZpb3VyLCB1c2VkIGluIGdldCBjb21tYW5kIHRvIG1ha2UgZmlsZXMgdGhhdCBhcmUgJ2dvdCcgd3JpdGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRXcml0YWJsZShib29sZWFuIGFyZ1dyaXRhYmxlKSB7Ci0gICAgICAgIG1fV3JpdGFibGUgPSBhcmdXcml0YWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSAnbWFrZSB3cml0YWJsZScgY29tbWFuZCBpZiB0aGUgYXR0cmlidXRlIHdhcyAndHJ1ZScsIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRXcml0YWJsZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmICggIW1fV3JpdGFibGUgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1dSSVRBQkxFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9yZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpewotICAgICAgICBpZiAoIHJlc3BvbnNlLmVxdWFscygiIikgfHwgcmVzcG9uc2UuZXF1YWxzKCJudWxsIikgKSB7Ci0gICAgICAgICAgICBtX0F1dG9SZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0F1dG9SZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSB2YWx1ZSBzZXQgZm9yIHRoZSBhdXRvUmVzcG9uc2UuCi0gICAgICogaWYgaXQgZXF1YWxzICJZIiB0aGVuIHdlIHJldHVybiAtSS1ZCi0gICAgICogaWYgaXQgZXF1YWxzICJOIiB0aGVuIHdlIHJldHVybiAtSS1OCi0gICAgICogb3RoZXJ3aXNlIHdlIHJldHVybiAtSQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldEF1dG9yZXNwb25zZShDb21tYW5kbGluZSBjbWQpIHsKLQotICAgICAgICBpZiAoIG1fQXV0b1Jlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQVVUT1JFU1BPTlNFX0RFRik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIG1fQXV0b1Jlc3BvbnNlLmVxdWFsc0lnbm9yZUNhc2UoIlkiKSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19BVVRPUkVTUE9OU0VfWUVTKTsKLQotICAgICAgICB9IGVsc2UgaWYgKCBtX0F1dG9SZXNwb25zZS5lcXVhbHNJZ25vcmVDYXNlKCJOIikpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQVVUT1JFU1BPTlNFX05PKTsKLSAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19BVVRPUkVTUE9OU0VfREVGKTsKLSAgICAgICAgfSAvLyBlbmQgb2YgZWxzZQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb21tZW50IHRvIGFwcGx5IGluIFNvdXJjZVNhZmUKLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIGlzIG51bGwgb3IgZW1wdHksIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAiLSIgd2hpY2gKLSAgICAgKiBpcyB3aGF0IFNvdXJjZVNhZmUgdXNlcyBmb3IgYW4gZW1wdHkgY29tbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7Ci0gICAgICAgIGlmICggY29tbWVudC5lcXVhbHMoIiIpIHx8IGNvbW1lbnQuZXF1YWxzKCJudWxsIikgKSB7Ci0gICAgICAgICAgICBtX0NvbW1lbnQgPSAiLSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0NvbW1lbnQgPSBjb21tZW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29tbWVudCB0byBiZSBhcHBsaWVkLgotICAgICAqIEByZXR1cm4gdGhlIGNvbW1lbnQgdG8gYmUgYXBwbGllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBtX0NvbW1lbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ0hFQ0tPVVQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLT1VULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODFlNGYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ0hFQ0tPVVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUYXNrIHRvIHBlcmZvcm0gQ2hlY2tPdXQgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2UgU2FmZS4KLSAqCi0gKiBAYXV0aG9yIE1hcnRpbiBQb2VzY2hsCi0gKi8KLXB1YmxpYyBjbGFzcyBNU1ZTU0NIRUNLT1VUIGV4dGVuZHMgTVNWU1MgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9Mb2NhbFBhdGggPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBtX1JlY3Vyc2l2ZSA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIG1fVmVyc2lvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9EYXRlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX0xhYmVsID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX0F1dG9SZXNwb25zZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KLSAgICAgKiA8cD4KLSAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBzcyBhbmQgdGhlbiBjYWxscyBFeGVjJ3MgcnVuIG1ldGhvZAotICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICAgICAgLy8gZmlyc3Qgb2ZmLCBtYWtlIHN1cmUgdGhhdCB3ZSd2ZSBnb3QgYSBjb21tYW5kIGFuZCBhIHZzc2RpciAuLi4KLSAgICAgICAgaWYgKGdldFZzc3BhdGgoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gInZzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgbG9vayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgb2YgdGhpbmdzIC4uLgotCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0IGlzCi0gICAgICAgIC8vIHNzIENoZWNrb3V0IFZTUyBpdGVtcyBbLUddIFstQ10gWy1IXSBbLUktXSBbLU5dIFstT10gWy1SXSBbLVZdIFstWV0gWy0/XQotICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIFNTLkVYRSBoZWxwCi0gICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0U1NDb21tYW5kKCkpOwotICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfQ0hFQ0tPVVQpOwotCi0gICAgICAgIC8vIFZTUyBpdGVtcwotICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZzc3BhdGgoKSk7Ci0gICAgICAgIC8vIC1HTAotICAgICAgICBnZXRMb2NhbHBhdGhDb21tYW5kKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgLy8gLUktIG9yIC1JLVkgb3IgLUktTgotICAgICAgICBnZXRBdXRvcmVzcG9uc2UoY29tbWFuZExpbmUpOwotICAgICAgICAvLyAtUgotICAgICAgICBnZXRSZWN1cnNpdmVDb21tYW5kKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgLy8gLVYKLSAgICAgICAgZ2V0VmVyc2lvbkNvbW1hbmQoY29tbWFuZExpbmUpOwotICAgICAgICAvLyAtWQotICAgICAgICBnZXRMb2dpbkNvbW1hbmQoY29tbWFuZExpbmUpOwotCi0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IDAgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsb2NhbCBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2FscGF0aChQYXRoIGxvY2FsUGF0aCkgewotICAgICAgICBtX0xvY2FsUGF0aCA9IGxvY2FsUGF0aC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgLUdMIGZsYWcgY29tbWFuZCBpZiByZXF1aXJlZAotICAgICAqIDxwPgotICAgICAqIFRoZSBsb2NhbHBhdGggaXMgY3JlYXRlZCBpZiBpdCBkaWRuJ3QgZXhpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRMb2NhbHBhdGhDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpZiAobV9Mb2NhbFBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG1fTG9jYWxEaXIgZXhpc3RzLCBjcmVhdGUgaXQgaWYgaXQgZG9lc24ndAotICAgICAgICAgICAgRmlsZSBkaXIgPSBwcm9qZWN0LnJlc29sdmVGaWxlKG1fTG9jYWxQYXRoKTsKLSAgICAgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkb25lID0gZGlyLm1rZGlycygpOwotICAgICAgICAgICAgICAgIGlmIChkb25lID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRGlyZWN0b3J5ICIgKyBtX0xvY2FsUGF0aCArICIgY3JlYXRpb24gd2FzIG5vdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWNjZXNmdWwgZm9yIGFuIHVua25vd24gcmVhc29uIjsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZygiQ3JlYXRlZCBkaXI6ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX09WRVJSSURFX1dPUktJTkdfRElSICsgbV9Mb2NhbFBhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJlaGF2aW91ciByZWN1cnNpdmUgb3Igbm9uLXJlY3Vyc2l2ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShib29sZWFuIHJlY3Vyc2l2ZSkgewotICAgICAgICBtX1JlY3Vyc2l2ZSA9IHJlY3Vyc2l2ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSAncmVjdXJzaXZlJyBjb21tYW5kIGlmIHRoZSBhdHRyaWJ1dGUgd2FzICd0cnVlJywgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldFJlY3Vyc2l2ZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmICggIW1fUmVjdXJzaXZlICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRUNVUlNJT04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzdG9yZWQgdmVyc2lvbiBzdHJpbmcKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHdlIGFzc3VtZSB0aGF0IGlmIHRoZSBzdXBwbGllZCBzdHJpbmcgaGFzIHRoZSB2YWx1ZSAibnVsbCIgdGhhdCBzb21ldGhpbmcKLSAgICAgKiB3ZW50IHdyb25nIGFuZCB0aGF0IHRoZSBzdHJpbmcgdmFsdWUgZ290IHBvcHVsYXRlZCBmcm9tIGEgbnVsbCBvYmplY3QuIFRoaXMKLSAgICAgKiBoYXBwZW5zIGlmIGEgYW50IHZhcmlhYmxlIGlzIHVzZWQgZS5nLiB2ZXJzaW9uPSIke3Zlcl9zZXJ2ZXJ9IiB3aGVuIHZlcl9zZXJ2ZXIKLSAgICAgKiBoYXMgbm90IGJlZW4gZGVmaW5lZCB0byBhbnQhCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotICAgICAgICBpZiAodmVyc2lvbi5lcXVhbHMoIiIpIHx8IHZlcnNpb24uZXF1YWxzKCJudWxsIikgKSB7Ci0gICAgICAgICAgICBtX1ZlcnNpb24gPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9WZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RvcmVkIGRhdGUgc3RyaW5nCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCi0gICAgICogd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCi0gICAgICogaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gZGF0ZT0iJHtkYXRlfSIgd2hlbiBkYXRlCi0gICAgICogaGFzIG5vdCBiZWVuIGRlZmluZWQgdG8gYW50IQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGUoU3RyaW5nIGRhdGUpIHsKLSAgICAgICAgaWYgKGRhdGUuZXF1YWxzKCIiKSB8fCBkYXRlLmVxdWFscygibnVsbCIpICkgewotICAgICAgICAgICAgbV9EYXRlID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fRGF0ZSA9IGRhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxhYmVsZWQgdmVyc2lvbiB0byBvcGVyYXRlIG9uIGluIFNvdXJjZVNhZmUKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHdlIGFzc3VtZSB0aGF0IGlmIHRoZSBzdXBwbGllZCBzdHJpbmcgaGFzIHRoZSB2YWx1ZSAibnVsbCIgdGhhdCBzb21ldGhpbmcKLSAgICAgKiB3ZW50IHdyb25nIGFuZCB0aGF0IHRoZSBzdHJpbmcgdmFsdWUgZ290IHBvcHVsYXRlZCBmcm9tIGEgbnVsbCBvYmplY3QuIFRoaXMKLSAgICAgKiBoYXBwZW5zIGlmIGEgYW50IHZhcmlhYmxlIGlzIHVzZWQgZS5nLiBsYWJlbD0iJHtsYWJlbF9zZXJ2ZXJ9IiB3aGVuIGxhYmVsX3NlcnZlcgotICAgICAqIGhhcyBub3QgYmVlbiBkZWZpbmVkIHRvIGFudCEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKCBsYWJlbC5lcXVhbHMoIiIpIHx8IGxhYmVsLmVxdWFscygibnVsbCIpICkgewotICAgICAgICAgICAgbV9MYWJlbCA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0xhYmVsID0gbGFiZWw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgb3JkZXIgb2YgcHJpb3JpdHkuIFJldHVybnMgdGhlIGZpcnN0IHNwZWNpZmllZCBvZiB2ZXJzaW9uLCBkYXRlLCBsYWJlbAotICAgICAqIElmIG5vbmUgb2YgdGhlc2Ugd2FzIHNwZWNpZmllZCByZXR1cm5zICIiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0VmVyc2lvbkNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0KLSAgICAgICAgaWYgKCBtX1ZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19WRVJTSU9OICsgbV9WZXJzaW9uKTsKLSAgICAgICAgfSBlbHNlIGlmICggbV9EYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSU0lPTl9EQVRFICsgbV9EYXRlKTsKLSAgICAgICAgfSBlbHNlIGlmIChtX0xhYmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSU0lPTl9MQUJFTCArIG1fTGFiZWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b3Jlc3BvbnNlKFN0cmluZyByZXNwb25zZSl7Ci0gICAgICAgIGlmICggcmVzcG9uc2UuZXF1YWxzKCIiKSB8fCByZXNwb25zZS5lcXVhbHMoIm51bGwiKSApIHsKLSAgICAgICAgICAgIG1fQXV0b1Jlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fQXV0b1Jlc3BvbnNlID0gcmVzcG9uc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHZhbHVlIHNldCBmb3IgdGhlIGF1dG9SZXNwb25zZS4KLSAgICAgKiBpZiBpdCBlcXVhbHMgIlkiIHRoZW4gd2UgcmV0dXJuIC1JLVkKLSAgICAgKiBpZiBpdCBlcXVhbHMgIk4iIHRoZW4gd2UgcmV0dXJuIC1JLU4KLSAgICAgKiBvdGhlcndpc2Ugd2UgcmV0dXJuIC1JCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0QXV0b3Jlc3BvbnNlKENvbW1hbmRsaW5lIGNtZCkgewotCi0gICAgICAgIGlmICggbV9BdXRvUmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19BVVRPUkVTUE9OU0VfREVGKTsKLSAgICAgICAgfSBlbHNlIGlmICggbV9BdXRvUmVzcG9uc2UuZXF1YWxzSWdub3JlQ2FzZSgiWSIpKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0FVVE9SRVNQT05TRV9ZRVMpOwotCi0gICAgICAgIH0gZWxzZSBpZiAoIG1fQXV0b1Jlc3BvbnNlLmVxdWFsc0lnbm9yZUNhc2UoIk4iKSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19BVVRPUkVTUE9OU0VfTk8pOwotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0FVVE9SRVNQT05TRV9ERUYpOwotICAgICAgICB9IC8vIGVuZCBvZiBlbHNlCi0KLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTR0VULmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NHRVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlN2Y1ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NHRVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUYXNrIHRvIHBlcmZvcm0gR0VUIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlIFNhZmUuCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0dGVkOgotICogPHRhYmxlIGJvcmRlcj0iMSI+Ci0gKiAgIDx0cj4KLSAqICAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAqICAgICA8dGg+VmFsdWVzPC90aD4KLSAqICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gKiAgICAgIDx0ZD51c2VybmFtZSxwYXNzd29yZDwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPnZzc3BhdGg8L3RkPgotICogICAgICA8dGQ+U291cmNlU2FmZSBwYXRoPC90ZD4KLSAqICAgICAgPHRkPlllczwvdGQ+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPmxvY2FscGF0aDwvdGQ+Ci0gKiAgICAgIDx0ZD5PdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg8L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD53cml0YWJsZTwvdGQ+Ci0gKiAgICAgIDx0ZD50cnVlIG9yIGZhbHNlPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KLSAqICAgICAgPHRkPnRydWUgb3IgZmFsc2U8L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KLSAqICAgICAgPHRkPmEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0PC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+ZGF0ZTwvdGQ+Ci0gKiAgICAgIDx0ZD5hIGRhdGUgc3RhbXAgdG8gZ2V0IGF0PC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+bGFiZWw8L3RkPgotICogICAgICA8dGQ+YSBsYWJlbCB0byBnZXQgZm9yPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+cXVpZXQ8L3RkPgotICogICAgICA8dGQ+c3VwcHJlc3Mgb3V0cHV0IChvZmYgYnkgZGVmYXVsdCk8L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD5hdXRvcmVzcG9uc2U8L3RkPgotICogICAgICA8dGQ+V2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcwotICogICAgICB1c2VkOyB2YWx1ZXMgb2YgWSBvciBOIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcy48L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8L3RyPgotICogPC90YWJsZT4KLSAqIDxwPk5vdGUgdGhhdCBvbmx5IG9uZSBvZiB2ZXJzaW9uLCBkYXRlIG9yIGxhYmVsIHNob3VsZCBiZSBzcGVjaWZpZWQ8L3A+Ci0gKgotICogQGF1dGhvciBDcmFpZyBDb3R0aW5naGFtCi0gKiBAYXV0aG9yIEFuZHJldyBFdmVyaXR0Ci0gKi8KLXB1YmxpYyBjbGFzcyBNU1ZTU0dFVCBleHRlbmRzIE1TVlNTIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1fTG9jYWxQYXRoID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9SZWN1cnNpdmUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9Xcml0YWJsZSA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIG1fVmVyc2lvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9EYXRlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX0xhYmVsID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX0F1dG9SZXNwb25zZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1fUXVpZXQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqIDxwPgotICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIHNzIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCi0gICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgICAgICAvLyBmaXJzdCBvZmYsIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIGNvbW1hbmQgYW5kIGEgdnNzZGlyIC4uLgotICAgICAgICBpZiAoZ2V0VnNzcGF0aCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBsb29rIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBvZiB0aGluZ3MgLi4uCi0KLSAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgaXMKLSAgICAgICAgLy8gc3MgR2V0IFZTUyBpdGVtcyBbLUddIFstSF0gWy1JLV0gWy1OXSBbLU9dIFstUl0gWy1WXSBbLVddIFstWV0gWy0/XQotICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIFNTLkVYRSBoZWxwCi0gICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0U1NDb21tYW5kKCkpOwotICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfR0VUKTsKLQotICAgICAgICAvLyBWU1MgaXRlbXMKLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWc3NwYXRoKCkpOwotICAgICAgICAvLyAtR0wKLSAgICAgICAgZ2V0TG9jYWxwYXRoQ29tbWFuZChjb21tYW5kTGluZSk7Ci0gICAgICAgIC8vIC1JLSBvciAtSS1ZIG9yIC1JLU4KLSAgICAgICAgZ2V0QXV0b3Jlc3BvbnNlKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgLy8gLU8tCi0gICAgICAgIGdldFF1aWV0Q29tbWFuZChjb21tYW5kTGluZSk7Ci0gICAgICAgIC8vIC1SCi0gICAgICAgIGdldFJlY3Vyc2l2ZUNvbW1hbmQoY29tbWFuZExpbmUpOwotICAgICAgICAvLyAtVgotICAgICAgICBnZXRWZXJzaW9uQ29tbWFuZChjb21tYW5kTGluZSk7Ci0gICAgICAgIC8vIC1XCi0gICAgICAgIGdldFdyaXRhYmxlQ29tbWFuZChjb21tYW5kTGluZSk7Ci0gICAgICAgIC8vIC1ZCi0gICAgICAgIGdldExvZ2luQ29tbWFuZChjb21tYW5kTGluZSk7Ci0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvY2FsIHBhdGguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxwYXRoKFBhdGggbG9jYWxQYXRoKSB7Ci0gICAgICAgIG1fTG9jYWxQYXRoID0gbG9jYWxQYXRoLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuZCByZXR1cm5zIHRoZSAtR0wgZmxhZyBjb21tYW5kIGlmIHJlcXVpcmVkCi0gICAgICogPHA+Ci0gICAgICogVGhlIGxvY2FscGF0aCBpcyBjcmVhdGVkIGlmIGl0IGRpZG4ndCBleGlzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldExvY2FscGF0aENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmIChtX0xvY2FsUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgbV9Mb2NhbERpciBleGlzdHMsIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0Ci0gICAgICAgICAgICBGaWxlIGRpciA9IHByb2plY3QucmVzb2x2ZUZpbGUobV9Mb2NhbFBhdGgpOwotICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRvbmUgPSBkaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvbmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJEaXJlY3RvcnkgIiArIG1fTG9jYWxQYXRoICsgIiBjcmVhdGlvbiB3YXMgbm90ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3NmdWwgZm9yIGFuIHVua25vd24gcmVhc29uIjsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZygiQ3JlYXRlZCBkaXI6ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX09WRVJSSURFX1dPUktJTkdfRElSICsgbV9Mb2NhbFBhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJlaGF2aW91ciByZWN1cnNpdmUgb3Igbm9uLXJlY3Vyc2l2ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShib29sZWFuIHJlY3Vyc2l2ZSkgewotICAgICAgICBtX1JlY3Vyc2l2ZSA9IHJlY3Vyc2l2ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSAncmVjdXJzaXZlJyBjb21tYW5kIGlmIHRoZSBhdHRyaWJ1dGUgd2FzICd0cnVlJywgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldFJlY3Vyc2l2ZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmICggIW1fUmVjdXJzaXZlICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRUNVUlNJT04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cy9jbGVhcnMgcXVpZXQgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFF1aWV0IChib29sZWFuIHF1aWV0KSB7Ci0gICAgICAgIHRoaXMubV9RdWlldD1xdWlldDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0UXVpZXRDb21tYW5kIChDb21tYW5kbGluZSBjbWQpIHsKLSAgICAgICAgaWYgKG1fUXVpZXQpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlIChGTEFHX1FVSUVUKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgYmVoYXZpb3VyLCB1c2VkIGluIGdldCBjb21tYW5kIHRvIG1ha2UgZmlsZXMgdGhhdCBhcmUgJ2dvdCcgd3JpdGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRXcml0YWJsZShib29sZWFuIGFyZ1dyaXRhYmxlKSB7Ci0gICAgICAgIG1fV3JpdGFibGUgPSBhcmdXcml0YWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSAnbWFrZSB3cml0YWJsZScgY29tbWFuZCBpZiB0aGUgYXR0cmlidXRlIHdhcyAndHJ1ZScsIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRXcml0YWJsZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmICggIW1fV3JpdGFibGUgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1dSSVRBQkxFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RvcmVkIHZlcnNpb24gc3RyaW5nCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCi0gICAgICogd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCi0gICAgICogaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gdmVyc2lvbj0iJHt2ZXJfc2VydmVyfSIgd2hlbiB2ZXJfc2VydmVyCi0gICAgICogaGFzIG5vdCBiZWVuIGRlZmluZWQgdG8gYW50IQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgaWYgKHZlcnNpb24uZXF1YWxzKCIiKSB8fCB2ZXJzaW9uLmVxdWFscygibnVsbCIpICkgewotICAgICAgICAgICAgbV9WZXJzaW9uID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fVmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN0b3JlZCBkYXRlIHN0cmluZwotICAgICAqIDxwPgotICAgICAqIE5vdGUgd2UgYXNzdW1lIHRoYXQgaWYgdGhlIHN1cHBsaWVkIHN0cmluZyBoYXMgdGhlIHZhbHVlICJudWxsIiB0aGF0IHNvbWV0aGluZwotICAgICAqIHdlbnQgd3JvbmcgYW5kIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBnb3QgcG9wdWxhdGVkIGZyb20gYSBudWxsIG9iamVjdC4gVGhpcwotICAgICAqIGhhcHBlbnMgaWYgYSBhbnQgdmFyaWFibGUgaXMgdXNlZCBlLmcuIGRhdGU9IiR7ZGF0ZX0iIHdoZW4gZGF0ZQotICAgICAqIGhhcyBub3QgYmVlbiBkZWZpbmVkIHRvIGFudCEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlKFN0cmluZyBkYXRlKSB7Ci0gICAgICAgIGlmIChkYXRlLmVxdWFscygiIikgfHwgZGF0ZS5lcXVhbHMoIm51bGwiKSApIHsKLSAgICAgICAgICAgIG1fRGF0ZSA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0RhdGUgPSBkYXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsYWJlbGVkIHZlcnNpb24gdG8gb3BlcmF0ZSBvbiBpbiBTb3VyY2VTYWZlCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCi0gICAgICogd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCi0gICAgICogaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gbGFiZWw9IiR7bGFiZWxfc2VydmVyfSIgd2hlbiBsYWJlbF9zZXJ2ZXIKLSAgICAgKiBoYXMgbm90IGJlZW4gZGVmaW5lZCB0byBhbnQhCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIGlmICggbGFiZWwuZXF1YWxzKCIiKSB8fCBsYWJlbC5lcXVhbHMoIm51bGwiKSApIHsKLSAgICAgICAgICAgIG1fTGFiZWwgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9MYWJlbCA9IGxhYmVsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltcGxlIG9yZGVyIG9mIHByaW9yaXR5LiBSZXR1cm5zIHRoZSBmaXJzdCBzcGVjaWZpZWQgb2YgdmVyc2lvbiwgZGF0ZSwgbGFiZWwKLSAgICAgKiBJZiBub25lIG9mIHRoZXNlIHdhcyBzcGVjaWZpZWQgcmV0dXJucyAiIgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldFZlcnNpb25Db21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotCi0gICAgICAgIGlmICggbV9WZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSU0lPTiArIG1fVmVyc2lvbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIG1fRGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1ZFUlNJT05fREFURSArIG1fRGF0ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9MYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1ZFUlNJT05fTEFCRUwgKyBtX0xhYmVsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9yZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpewotICAgICAgICBpZiAoIHJlc3BvbnNlLmVxdWFscygiIikgfHwgcmVzcG9uc2UuZXF1YWxzKCJudWxsIikgKSB7Ci0gICAgICAgICAgICBtX0F1dG9SZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0F1dG9SZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgdmFsdWUgc2V0IGZvciB0aGUgYXV0b1Jlc3BvbnNlLgotICAgICAqIGlmIGl0IGVxdWFscyAiWSIgdGhlbiB3ZSByZXR1cm4gLUktWQotICAgICAqIGlmIGl0IGVxdWFscyAiTiIgdGhlbiB3ZSByZXR1cm4gLUktTgotICAgICAqIG90aGVyd2lzZSB3ZSByZXR1cm4gLUkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRBdXRvcmVzcG9uc2UoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIAotICAgICAgICBpZiAoIG1fQXV0b1Jlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQVVUT1JFU1BPTlNFX0RFRik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIG1fQXV0b1Jlc3BvbnNlLmVxdWFsc0lnbm9yZUNhc2UoIlkiKSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19BVVRPUkVTUE9OU0VfWUVTKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKCBtX0F1dG9SZXNwb25zZS5lcXVhbHNJZ25vcmVDYXNlKCJOIikpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQVVUT1JFU1BPTlNFX05PKTsKLSAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19BVVRPUkVTUE9OU0VfREVGKTsKLSAgICAgICAgfSAvLyBlbmQgb2YgZWxzZQotCi0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0hJU1RPUlkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0hJU1RPUlkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0Y2FhMC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NISVNUT1JZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotLyoqCi0gKiBUYXNrIHRvIHBlcmZvcm0gSElTVE9SWSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZSBTYWZlLgotICoKLSAqIEBhdXRob3IgQmFsYXpzIEZlamVzIDIKLSAqIEBhdXRob3IgR2xlbm5fVHdpZ2dzQGJtYy5jb20KLSAqLwotCi1wdWJsaWMgY2xhc3MgTVNWU1NISVNUT1JZIGV4dGVuZHMgTVNWU1MgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9Gcm9tRGF0ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9Ub0RhdGUgPSBudWxsOwotICAgIHByaXZhdGUgRGF0ZUZvcm1hdCBtX0RhdGVGb3JtYXQgPQotICAgICAgICBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LlNIT1JUKTsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBtX0Zyb21MYWJlbCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9Ub0xhYmVsID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX091dHB1dEZpbGVOYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX1VzZXIgPSBudWxsOwotICAgIHByaXZhdGUgaW50IG1fTnVtRGF5cyA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgIHByaXZhdGUgU3RyaW5nIG1fU3R5bGUgPSAiIjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbV9SZWN1cnNpdmUgPSBmYWxzZTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9GUk9NREFURSA9ICJ+ZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRlJPTUxBQkVMID0gIn5MIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfT1VUUFVUID0gIi1PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1VTRVIgPSAiLVUiOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCi0gICAgICogPHA+Ci0gICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgc3MgYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKLSAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgY29tbWFuZCBhbmQgYSB2c3NkaXIgYW5kIGEgbGFiZWwgLi4uCi0gICAgICAgIGlmIChnZXRWc3NwYXRoKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IGxvb2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIG9mIHRoaW5ncyAuLi4KLQotICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcwotICAgICAgICAvLyBzcyBIaXN0b3J5IGVsZW1lbnRzIFstSF0gWy1MXSBbLU5dIFstT10gWy1WXSBbLVldIFstI10gWy0/XQotICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIFNTLkVYRSBoZWxwCi0gICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0U1NDb21tYW5kKCkpOwotICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfSElTVE9SWSk7Ci0KLSAgICAgICAgLy8gVlNTIGl0ZW1zCi0gICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VnNzcGF0aCgpKTsKLQotICAgICAgICAvLyAtSS0KLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLUktIik7ICAvLyBpZ25vcmUgYWxsIGVycm9ycwotCi0gICAgICAgIC8vIC1WCi0gICAgICAgIC8vIExhYmVsIGFuIGV4aXN0aW5nIGZpbGUgb3IgcHJvamVjdCB2ZXJzaW9uCi0gICAgICAgIGdldFZlcnNpb25EYXRlQ29tbWFuZChjb21tYW5kTGluZSk7Ci0gICAgICAgIGdldFZlcnNpb25MYWJlbENvbW1hbmQoY29tbWFuZExpbmUpOwotCi0gICAgICAgIC8vIC1SICAgCi0gICAgICAgIGlmIChtX1JlY3Vyc2l2ZSkgewotICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1JFQ1VSU0lPTik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtQiAvIC1EIC8gLUYtCi0gICAgICAgIGlmIChtX1N0eWxlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShtX1N0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC1ZCi0gICAgICAgIGdldExvZ2luQ29tbWFuZChjb21tYW5kTGluZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIC1PCi0gICAgICAgIGdldE91dHB1dENvbW1hbmQoY29tbWFuZExpbmUpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqOiAiICsgY29tbWFuZExpbmUpOwotICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgU3RhcnQgRGF0ZSBmb3IgdGhlIENvbXBhcmlzb24gb2YgdHdvIHZlcnNpb25zIGluIFNvdXJjZVNhZmUgSGlzdG9yeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZyb21EYXRlKFN0cmluZyBmcm9tRGF0ZSkgewotICAgICAgICBpZiAoIGZyb21EYXRlLmVxdWFscygiIikgfHwgZnJvbURhdGUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIG1fRnJvbURhdGUgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Gcm9tRGF0ZSA9IGZyb21EYXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBTdGFydCBMYWJlbCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9tTGFiZWwoU3RyaW5nIGZyb21MYWJlbCkgewotICAgICAgICBpZiAoIGZyb21MYWJlbC5lcXVhbHMoIiIpIHx8IGZyb21MYWJlbCA9PSBudWxsICkgewotICAgICAgICAgICAgbV9Gcm9tTGFiZWwgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Gcm9tTGFiZWwgPSBmcm9tTGFiZWw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEVuZCBMYWJlbCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0xhYmVsKFN0cmluZyB0b0xhYmVsKSB7Ci0gICAgICAgIGlmICggdG9MYWJlbC5lcXVhbHMoIiIpIHx8IHRvTGFiZWwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIG1fVG9MYWJlbCA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1RvTGFiZWwgPSB0b0xhYmVsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBFbmQgRGF0ZSBmb3IgdGhlIENvbXBhcmlzb24gb2YgdHdvIHZlcnNpb25zIGluIFNvdXJjZVNhZmUgSGlzdG9yeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvRGF0ZShTdHJpbmcgdG9EYXRlKSB7Ci0gICAgICAgIGlmICggdG9EYXRlLmVxdWFscygiIikgfHwgdG9EYXRlID09IG51bGwgKSB7Ci0gICAgICAgICAgICBtX1RvRGF0ZSA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1RvRGF0ZSA9IHRvRGF0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGRheXMgdG8gZ28gYmFjayBmb3IgQ29tcGFyaXNvbgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIgZGF5cy4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TnVtZGF5cyhpbnQgbnVtZCkgewotICAgICAgICBtX051bURheXMgPSBudW1kOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgZm9yIFNvdXJjZVNhZmUgb3V0cHV0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KEZpbGUgb3V0ZmlsZSkgewotICAgICAgICBpZiAoIG91dGZpbGUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIG1fT3V0cHV0RmlsZU5hbWUgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9PdXRwdXRGaWxlTmFtZSA9IG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFN0YXJ0IERhdGUgZm9yIHRoZSBDb21wYXJpc29uIG9mIHR3byB2ZXJzaW9ucyBpbiBTb3VyY2VTYWZlIEhpc3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlRm9ybWF0KFN0cmluZyBkYXRlRm9ybWF0KSB7Ci0gICAgICAgIGlmICggIShkYXRlRm9ybWF0LmVxdWFscygiIikgfHwgZGF0ZUZvcm1hdCA9PSBudWxsKSApIHsKLSAgICAgICAgICAgIG1fRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGRhdGVGb3JtYXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSB2ZXJzaW9uIGRhdGUgY29tbWFuZC4KLSAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kbGluZSB0aGUgY29tbWFuZCBpcyB0byBiZSBhZGRlZCB0bwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZXRWZXJzaW9uRGF0ZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIG1fRnJvbURhdGUgPT0gbnVsbCAmJiBtX1RvRGF0ZSA9PSBudWxsICYmIG1fTnVtRGF5cyA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIG1fRnJvbURhdGUgIT0gbnVsbCAmJiBtX1RvRGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1ZFUlNJT05fREFURSArIG1fVG9EYXRlICsgVkFMVUVfRlJPTURBVEUgKyBtX0Zyb21EYXRlKTsKLSAgICAgICAgfSBlbHNlIGlmIChtX1RvRGF0ZSAhPSBudWxsICYmIG1fTnVtRGF5cyAhPSBJbnRlZ2VyLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgU3RyaW5nIHN0YXJ0RGF0ZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IGNhbGNEYXRlKG1fVG9EYXRlLCBtX051bURheXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHBhcnNpbmcgZGF0ZTogIiArIG1fVG9EYXRlOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSU0lPTl9EQVRFICsgbV9Ub0RhdGUgKyBWQUxVRV9GUk9NREFURSArIHN0YXJ0RGF0ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9Gcm9tRGF0ZSAhPSBudWxsICYmIG1fTnVtRGF5cyAhPSBJbnRlZ2VyLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgU3RyaW5nIGVuZERhdGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbmREYXRlID0gY2FsY0RhdGUobV9Gcm9tRGF0ZSwgbV9OdW1EYXlzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFcnJvciBwYXJzaW5nIGRhdGU6ICIgKyBtX0Zyb21EYXRlOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSU0lPTl9EQVRFICsgZW5kRGF0ZSArIFZBTFVFX0ZST01EQVRFICsgbV9Gcm9tRGF0ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9Gcm9tRGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19WRVJTSU9OICsgVkFMVUVfRlJPTURBVEUgKyBtX0Zyb21EYXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19WRVJTSU9OX0RBVEUgKyBtX1RvRGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgdGhlIHZlcnNpb24gZGF0ZSBjb21tYW5kLgotICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmRsaW5lIHRoZSBjb21tYW5kIGlzIHRvIGJlIGFkZGVkIHRvCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldFZlcnNpb25MYWJlbENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIG1fRnJvbUxhYmVsID09IG51bGwgJiYgbV9Ub0xhYmVsID09IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICggbV9Gcm9tTGFiZWwgIT0gbnVsbCAmJiBtX1RvTGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19WRVJTSU9OX0xBQkVMICsgbV9Ub0xhYmVsICsgVkFMVUVfRlJPTUxBQkVMICsgbV9Gcm9tTGFiZWwpOwotICAgICAgICB9IGVsc2UgaWYgKG1fRnJvbUxhYmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSU0lPTiArIFZBTFVFX0ZST01MQUJFTCArIG1fRnJvbUxhYmVsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSU0lPTl9MQUJFTCArIG1fVG9MYWJlbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSB2ZXJzaW9uIGRhdGUgY29tbWFuZC4KLSAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kbGluZSB0aGUgY29tbWFuZCBpcyB0byBiZSBhZGRlZCB0bwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZXRPdXRwdXRDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpZiAoIG1fT3V0cHV0RmlsZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19PVVRQVVQgKyBtX091dHB1dEZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyB0aGUgVXNlciBjb21tYW5kLgotICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmRsaW5lIHRoZSBjb21tYW5kIGlzIHRvIGJlIGFkZGVkIHRvCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldFVzZXJDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBpZiAoIG1fVXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1VTRVIgKyBtX1VzZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIENhbGN1bGF0ZXMgdGhlIHN0YXJ0IGRhdGUgZm9yIHZlcnNpb24gY29tcGFyaXNvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBDYWxjdWxhdGVzIHRoZSBkYXRlIG51bURheSBkYXlzIGVhcmxpZXIgdGhhbiBzdGFydGRhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2FsY0RhdGUoU3RyaW5nIGZyb21EYXRlLCBpbnQgbnVtRGF5cykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRvRGF0ZSA9IG51bGw7Ci0gICAgICAgIERhdGUgY3VycmRhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICBDYWxlbmRhciBjYWxlbmQ9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICBjdXJyZGF0ZSA9IG1fRGF0ZUZvcm1hdC5wYXJzZShmcm9tRGF0ZSk7IAotICAgICAgICBjYWxlbmQuc2V0VGltZShjdXJyZGF0ZSk7Ci0gICAgICAgIGNhbGVuZC5hZGQoQ2FsZW5kYXIuREFURSwgbnVtRGF5cyk7Ci0gICAgICAgIHRvRGF0ZSA9IG1fRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kLmdldFRpbWUoKSk7Ci0gICAgICAgIHJldHVybiB0b0RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJlaGF2aW91ciByZWN1cnNpdmUgb3Igbm9uLXJlY3Vyc2l2ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShib29sZWFuIHJlY3Vyc2l2ZSkgewotICAgICAgICBtX1JlY3Vyc2l2ZSA9IHJlY3Vyc2l2ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFVzZXJuYW1lIG9mIHRoZSB1c2VyIHdob3NlIGNoYW5nZXMgd2Ugd291bGQgbGlrZSB0byBzZWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgdXNlcikgewotICAgICAgICBtX1VzZXIgPSB1c2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlICdyZWN1cnNpdmUnIGNvbW1hbmQgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgJ3RydWUnLCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldFJlY3Vyc2l2ZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGlmICggIW1fUmVjdXJzaXZlICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRUNVUlNJT04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB0aGUgZGV0YWlsIG9mIG91dHB1dAotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbiB2YWxpZCB2YWx1ZXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5icmllZjogICAgLUIgRGlzcGxheSBhIGJyaWVmIGhpc3RvcnkuIAotICAgICAqIDxsaT5jb2RlZGlmZjogLUQgRGlzcGxheSBsaW5lLWJ5LWxpbmUgZmlsZSBjaGFuZ2VzLiAKLSAgICAgKiA8bGk+bm9maWxlOiAgIC1GLSBEbyBub3QgZGlzcGxheSBpbmRpdmlkdWFsIGZpbGUgdXBkYXRlcyBpbiB0aGUgcHJvamVjdCBoaXN0b3J5LiAKLSAgICAgKiA8bGk+ZGVmYXVsdDogIE5vIG9wdGlvbiBzcGVjaWZpZWQuIERpc3BsYXkgaW4gU291cmNlIFNhZmUncyBkZWZhdWx0IGZvcm1hdC4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKEJyaWVmQ29kZWRpZmZOb2ZpbGUgYXR0cikgewotICAgICAgICBTdHJpbmcgb3B0aW9uID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAob3B0aW9uLmVxdWFscygiYnJpZWYiKSkgewotICAgICAgICAgICAgbV9TdHlsZSA9ICItQiI7Ci0gICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiY29kZWRpZmYiKSkgewotICAgICAgICAgICAgbV9TdHlsZSA9ICItRCI7Ci0gICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygiZGVmYXVsdCIpKSB7Ci0gICAgICAgICAgICBtX1N0eWxlID0gIiI7Ci0gICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscygibm9maWxlIikpIHsKLSAgICAgICAgICAgIG1fU3R5bGUgPSAiLUYtIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3R5bGUgIiArIGF0dHIgKyAiIHVua25vd24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJyaWVmQ29kZWRpZmZOb2ZpbGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiYnJpZWYiLCAiY29kZWRpZmYiLCAibm9maWxlIiwgImRlZmF1bHQifTsKLSAgICAgICB9Ci0gICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTTEFCRUwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0xBQkVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTJlYzguLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTTEFCRUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci0KLS8qKgotICogVGFzayB0byBwZXJmb3JtIExBQkVMIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlIFNhZmUuCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6Ci0gKiA8dGFibGUgYm9yZGVyPSIxIj4KLSAqICAgPHRyPgotICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICogICAgIDx0aD5WYWx1ZXM8L3RoPgotICogICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPmxvZ2luPC90ZD4KLSAqICAgICAgPHRkPnVzZXJuYW1lLHBhc3N3b3JkPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+dnNzcGF0aDwvdGQ+Ci0gKiAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhdGg8L3RkPgotICogICAgICA8dGQ+WWVzPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+c3NkaXI8L3RkPgotICogICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUgdGFzawotICogICAgICBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILjwvdGQ+Ci0gKiAgICAgIDx0ZD5ObzwvdGQ+Ci0gKiAgIDwvdHI+Ci0gKiAgIDx0cj4KLSAqICAgICAgPHRkPmxhYmVsPC90ZD4KLSAqICAgICAgPHRkPkEgbGFiZWwgdG8gYXBwbHkgdG8gdGhlIGhpZXJhcmNoeTwvdGQ+Ci0gKiAgICAgIDx0ZD5ZZXM8L3RkPgotICogICA8L3RyPgotICogICA8dHI+Ci0gKiAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KLSAqICAgICAgPHRkPkFuIGV4aXN0aW5nIGZpbGUgb3IgcHJvamVjdCB2ZXJzaW9uIHRvIGxhYmVsPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+YXV0b3Jlc3BvbnNlPC90ZD4KLSAqICAgICAgPHRkPldoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLiBCeSBkZWZhdWx0LCAtSS0gaXMKLSAqICAgICAgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuPC90ZD4KLSAqICAgICAgPHRkPk5vPC90ZD4KLSAqICAgPC90cj4KLSAqICAgPHRyPgotICogICAgICA8dGQ+Y29tbWVudDwvdGQ+Ci0gKiAgICAgIDx0ZD5UaGUgY29tbWVudCB0byB1c2UgZm9yIHRoaXMgbGFiZWwuIEVtcHR5IG9yICctJyBmb3Igbm8gY29tbWVudC48L3RkPgotICogICAgICA8dGQ+Tm88L3RkPgotICogICA8L3RyPgotICogICAgICAKLSAqIDwvdGFibGU+Ci0gKgotICogQGF1dGhvciBQaGlsbGlwIFdlbGxzCi0gKi8KLXB1YmxpYyBjbGFzcyBNU1ZTU0xBQkVMIGV4dGVuZHMgTVNWU1MKLXsKLSAgICBwcml2YXRlIFN0cmluZyBtX0F1dG9SZXNwb25zZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9MYWJlbCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9WZXJzaW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtX0NvbW1lbnQgPSAiLSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0xBQkVMID0gIi1MIjsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqIDxwPgotICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIHNzIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCi0gICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgICAgICAvLyBmaXJzdCBvZmYsIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIGNvbW1hbmQgYW5kIGEgdnNzZGlyIGFuZCBhIGxhYmVsIC4uLgotICAgICAgICBpZiAoZ2V0VnNzcGF0aCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0TGFiZWwoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gImxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IGxvb2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIG9mIHRoaW5ncyAuLi4KLQotICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcwotICAgICAgICAvLyBzcyBMYWJlbCBWU1MgaXRlbXMgWy1DXSAgICAgIFstSF0gWy1JLV0gWy1MbGFiZWxdIFstTl0gWy1PXSAgICAgIFstVl0gICAgICBbLVldIFstP10KLSAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBTUy5FWEUgaGVscAotICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldFNTQ29tbWFuZCgpKTsKLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX0xBQkVMKTsKLQotICAgICAgICAvLyBWU1MgaXRlbXMKLSAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWc3NwYXRoKCkpOwotCi0gICAgICAgIC8vIC1DCi0gICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1DIitnZXRDb21tZW50KCkpOwotCi0gICAgICAgIC8vIC1JLSBvciAtSS1ZIG9yIC1JLU4KLSAgICAgICAgZ2V0QXV0b3Jlc3BvbnNlKGNvbW1hbmRMaW5lKTsKLQotICAgICAgICAvLyAtTAotICAgICAgICAvLyBTcGVjaWZ5IHRoZSBuZXcgbGFiZWwgb24gdGhlIGNvbW1hbmQgbGluZSAoaW5zdGVhZCBvZiBiZWluZyBwcm9tcHRlZCkKLSAgICAgICAgZ2V0TGFiZWxDb21tYW5kKGNvbW1hbmRMaW5lKTsKLQotICAgICAgICAvLyAtVgotICAgICAgICAvLyBMYWJlbCBhbiBleGlzdGluZyBmaWxlIG9yIHByb2plY3QgdmVyc2lvbgotICAgICAgICBnZXRWZXJzaW9uQ29tbWFuZChjb21tYW5kTGluZSk7Ci0KLSAgICAgICAgLy8gLVkKLSAgICAgICAgZ2V0TG9naW5Db21tYW5kKGNvbW1hbmRMaW5lKTsKLQotICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOwotICAgICAgICBpZiAoIHJlc3VsdCAhPSAwICkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsYWJlbCB0byBhcHBseSBpbiBTb3VyY2VTYWZlCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCi0gICAgICogd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCi0gICAgICogaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gbGFiZWw9IiR7bGFiZWxfc2VydmVyfSIgd2hlbiBsYWJlbF9zZXJ2ZXIKLSAgICAgKiBoYXMgbm90IGJlZW4gZGVmaW5lZCB0byBhbnQhCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIGlmICggbGFiZWwuZXF1YWxzKCIiKSB8fCBsYWJlbC5lcXVhbHMoIm51bGwiKSApIHsKLSAgICAgICAgICAgIG1fTGFiZWwgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9MYWJlbCA9IGxhYmVsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSB2ZXJzaW9uIGNvbW1hbmQuCi0gICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZGxpbmUgdGhlIGNvbW1hbmQgaXMgdG8gYmUgYWRkZWQgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRWZXJzaW9uQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKLSAgICAgICAgaWYgKCBtX1ZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19WRVJTSU9OICsgbV9WZXJzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyB0aGUgbGFiZWwgY29tbWFuZC4KLSAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kbGluZSB0aGUgY29tbWFuZCBpcyB0byBiZSBhZGRlZCB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldExhYmVsQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKLSAgICAgICAgaWYgKCBtX0xhYmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTEFCRUwgKyBtX0xhYmVsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RvcmVkIHZlcnNpb24gc3RyaW5nCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCi0gICAgICogd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCi0gICAgICogaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gdmVyc2lvbj0iJHt2ZXJfc2VydmVyfSIgd2hlbiB2ZXJfc2VydmVyCi0gICAgICogaGFzIG5vdCBiZWVuIGRlZmluZWQgdG8gYW50IQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgaWYgKHZlcnNpb24uZXF1YWxzKCIiKSB8fCB2ZXJzaW9uLmVxdWFscygibnVsbCIpICkgewotICAgICAgICAgICAgbV9WZXJzaW9uID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fVmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsYWJlbCB0byBiZSBhcHBsaWVkLgotICAgICAqIEByZXR1cm4gdGhlIGxhYmVsIHRvIGJlIGFwcGxpZWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1fTGFiZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb21tZW50IHRvIGFwcGx5IGluIFNvdXJjZVNhZmUKLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIGlzIG51bGwgb3IgZW1wdHksIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAiLSIgd2hpY2gKLSAgICAgKiBpcyB3aGF0IFNvdXJjZVNhZmUgdXNlcyBmb3IgYW4gZW1wdHkgY29tbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7Ci0gICAgICAgIGlmICggY29tbWVudC5lcXVhbHMoIiIpIHx8IGNvbW1lbnQuZXF1YWxzKCJudWxsIikgKSB7Ci0gICAgICAgICAgICBtX0NvbW1lbnQgPSAiLSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0NvbW1lbnQgPSBjb21tZW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29tbWVudCB0byBiZSBhcHBsaWVkLgotICAgICAqIEByZXR1cm4gdGhlIGNvbW1lbnQgdG8gYmUgYXBwbGllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBtX0NvbW1lbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9yZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpewotICAgICAgICBpZiAoIHJlc3BvbnNlLmVxdWFscygiIikgfHwgcmVzcG9uc2UuZXF1YWxzKCJudWxsIikgKSB7Ci0gICAgICAgICAgICBtX0F1dG9SZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0F1dG9SZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgdmFsdWUgc2V0IGZvciB0aGUgYXV0b1Jlc3BvbnNlLgotICAgICAqIGlmIGl0IGVxdWFscyAiWSIgdGhlbiB3ZSByZXR1cm4gLUktWQotICAgICAqIGlmIGl0IGVxdWFscyAiTiIgdGhlbiB3ZSByZXR1cm4gLUktTgotICAgICAqIG90aGVyd2lzZSB3ZSByZXR1cm4gLUkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRBdXRvcmVzcG9uc2UoQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIAotICAgICAgICBpZiAoIG1fQXV0b1Jlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQVVUT1JFU1BPTlNFX0RFRik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIG1fQXV0b1Jlc3BvbnNlLmVxdWFsc0lnbm9yZUNhc2UoIlkiKSkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19BVVRPUkVTUE9OU0VfWUVTKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKCBtX0F1dG9SZXNwb25zZS5lcXVhbHNJZ25vcmVDYXNlKCJOIikpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQVVUT1JFU1BPTlNFX05PKTsKLSAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19BVVRPUkVTUE9OU0VfREVGKTsKLSAgICAgICAgfSAvLyBlbmQgb2YgZWxzZQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9EZWZhdWx0Um1pY0FkYXB0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvRGVmYXVsdFJtaWNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjhlMzMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9EZWZhdWx0Um1pY0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLio7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBSbWljQWRhcHRlciBpbnRlcmZhY2UuCi0gKiBDdXJyZW50bHksIHRoaXMgaXMgYSBjdXQtYW5kLXBhc3RlIG9mIHRoZSBvcmlnaW5hbCBybWljIHRhc2sgYW5kCi0gKiBEZWZhdWx0Q29wbXBpbGVyQWRhcHRlci4KLSAqCi0gKiBAYXV0aG9yIGR1bmNhbkB4MTgwLmNvbQotICogQGF1dGhvciBsdWRvdmljLmNsYXVkZUB3ZWJzaXRld2F0Y2hlcnMuY28udWsKLSAqIEBhdXRob3IgRGF2aWQgTWFjbGVhbiA8YSBocmVmPSJtYWlsdG86ZGF2aWRAY20uY28uemEiPmRhdmlkQGNtLmNvLnphPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqIEBhdXRob3IgVGFrYXNoaSBPa2Ftb3RvIDx0b2thbW90b0ByZC5udHRkYXRhLmNvLmpwPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVmYXVsdFJtaWNBZGFwdGVyIGltcGxlbWVudHMgUm1pY0FkYXB0ZXIgewotCi0gICAgcHJpdmF0ZSBSbWljIGF0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBGaWxlTmFtZU1hcHBlciBtYXBwZXI7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFJtaWNBZGFwdGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJtaWMoIFJtaWMgYXR0cmlidXRlcyApIHsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICAgICAgbWFwcGVyID0gbmV3IFJtaWNGaWxlTmFtZU1hcHBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSbWljIGdldFJtaWMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3R1YkNsYXNzU3VmZml4KCkgewotICAgICAgICByZXR1cm4gIl9TdHViIjsKLSAgICB9ICAgICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2tlbENsYXNzU3VmZml4KCkgewotICAgICAgICByZXR1cm4gIl9Ta2VsIjsKLSAgICB9ICAgICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGllQ2xhc3NTdWZmaXgoKSB7Ci0gICAgICAgIHJldHVybiAiX1RpZSI7Ci0gICAgfSAgICAgICAgCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG1hcHMgKi5jbGFzcyB0byAqZ2V0U3R1YkNsYXNzU3VmZml4KCkuY2xhc3MgYW5kIC0gaWYKLSAgICAgKiBzdHVidmVyc2lvbiBpcyBub3QgMS4yIC0gdG8gKmdldFNrZWxDbGFzc1N1ZmZpeCgpLmNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlTmFtZU1hcHBlciBnZXRNYXBwZXIoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIENMQVNTUEFUSCB0aGlzIHJtaWMgcHJvY2VzcyB3aWxsIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb21waWxlQ2xhc3NwYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSBjb21waWxhdGlvbiBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBhdGggZ2V0Q29tcGlsZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgLy8gYWRkIGRlc3QgZGlyIHRvIGNsYXNzcGF0aCBzbyB0aGF0IHByZXZpb3VzbHkgY29tcGlsZWQgYW5kCi0gICAgICAgIC8vIHVudG91Y2hlZCBjbGFzc2VzIGFyZSBvbiBjbGFzc3BhdGgKLSAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBuZXcgUGF0aChhdHRyaWJ1dGVzLmdldFByb2plY3QoKSk7Ci0gICAgICAgIGNsYXNzcGF0aC5zZXRMb2NhdGlvbihhdHRyaWJ1dGVzLmdldEJhc2UoKSk7Ci0KLSAgICAgICAgLy8gQ29tYmluZSB0aGUgYnVpbGQgY2xhc3NwYXRoIHdpdGggdGhlIHN5c3RlbSBjbGFzc3BhdGgsIGluIGFuIAotICAgICAgICAvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZSBvZiBidWlsZC5jbGFzc3BhdGgKLQotICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRDbGFzc3BhdGgoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIGF0dHJpYnV0ZXMuZ2V0SW5jbHVkZWFudHJ1bnRpbWUoKSApIHsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGguYWRkRXhpc3RpbmcoUGF0aC5zeXN0ZW1DbGFzc3BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCBhdHRyaWJ1dGVzLmdldEluY2x1ZGVhbnRydW50aW1lKCkgKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKGF0dHJpYnV0ZXMuZ2V0Q2xhc3NwYXRoKCkuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0IikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGguYWRkRXhpc3RpbmcoYXR0cmlidXRlcy5nZXRDbGFzc3BhdGgoKS5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldEluY2x1ZGVqYXZhcnVudGltZSgpKSB7Ci0gICAgICAgICAgICAvLyBYWFggbW92ZSB0aGlzIHN0dWZmIHRvIGEgc2VwYXJhdGUgY2xhc3MsIGNvZGUgaXMgaWRlbnRpY2FsIHRvCi0gICAgICAgICAgICAvLyAgICAgY29kZSBpbiAuLi9jb21waWxlci9EZWZhdWx0Q29tcGlsZXJBZGFwdGVyCi0KLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVuZG9yIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJtaWNyb3NvZnQiKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHVsbCBpbiAqLnppcCBmcm9tIHBhY2thZ2VzIGRpcmVjdG9yeQotICAgICAgICAgICAgICAgIEZpbGVTZXQgbXNaaXBGaWxlcyA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgICAgICAgICAgbXNaaXBGaWxlcy5zZXREaXIobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yICsgIlBhY2thZ2VzIikpOwotICAgICAgICAgICAgICAgIG1zWmlwRmlsZXMuc2V0SW5jbHVkZXMoIiouWklQIik7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEZpbGVzZXQobXNaaXBGaWxlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFByb2plY3QuZ2V0SmF2YVZlcnNpb24oKSA9PSBQcm9qZWN0LkpBVkFfMV8xKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKG5ldyBQYXRoKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjbGFzc2VzLnppcCIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0ubmFtZSIpLmVxdWFscygiS2FmZmUiKSkgewotICAgICAgICAgICAgICAgIEZpbGVTZXQga2FmZmVKYXJGaWxlcyA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgICAgICAgICAga2FmZmVKYXJGaWxlcy5zZXREaXIobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInNoYXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAia2FmZmUiKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAga2FmZmVKYXJGaWxlcy5zZXRJbmNsdWRlcygiKi5qYXIiKTsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGguYWRkRmlsZXNldChrYWZmZUphckZpbGVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSkRLID4gMS4xIHNlZW1zIHRvIHNldCBqYXZhLmhvbWUgdG8gdGhlIEpSRSBkaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKG5ldyBQYXRoKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAicnQuamFyIikpOwotICAgICAgICAgICAgICAgIC8vIEp1c3Qga2VlcCB0aGUgb2xkIHZlcnNpb24gYXMgd2VsbCBhbmQgbGV0IGFkZEV4aXN0aW5nVG9QYXRoCi0gICAgICAgICAgICAgICAgLy8gc29ydCBpdCBvdXQuCi0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKG5ldyBQYXRoKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsianJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInJ0LmphciIpKTsKLQotICAgICAgICAgICAgICAgIC8vIEFkZGVkIGZvciBNYWNPUyBYCi0gICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKG5ldyBQYXRoKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICIuLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJDbGFzc2VzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImNsYXNzZXMuamFyIikpOwotICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiQ2xhc3NlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJ1aS5qYXIiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXR1cCBybWljIGFyZ3VtZW50IGZvciBybWljLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb21tYW5kbGluZSBzZXR1cFJtaWNDb21tYW5kKCkgewotICAgICAgICByZXR1cm4gc2V0dXBSbWljQ29tbWFuZChudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXR1cCBybWljIGFyZ3VtZW50IGZvciBybWljLgotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbnMgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG5lZWRlZCBieSBhIHNwZWNpZmljCi0gICAgICogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIHNldHVwUm1pY0NvbW1hbmQoU3RyaW5nW10gb3B0aW9ucykgewotICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLQotICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8b3B0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKG9wdGlvbnNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBnZXRDb21waWxlQ2xhc3NwYXRoKCk7Ci0KLSAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kIik7Ci0gICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoYXR0cmlidXRlcy5nZXRCYXNlKCkpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldEV4dGRpcnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoUHJvamVjdC5nZXRKYXZhVmVyc2lvbigpLnN0YXJ0c1dpdGgoIjEuMSIpKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBYWFggLSBUaGlzIGRvZXNuJ3QgbWl4IHZlcnkgd2VsbCB3aXRoIGJ1aWxkLnN5c3RlbWNsYXNzcGF0aCwKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBhZGRFeHRkaXJzVG9DbGFzc3BhdGgoY2xhc3NwYXRoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1leHRkaXJzIik7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChhdHRyaWJ1dGVzLmdldEV4dGRpcnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWNsYXNzcGF0aCIpOwotICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGNsYXNzcGF0aCk7Ci0KLSAgICAgICAgU3RyaW5nIHN0dWJWZXJzaW9uID0gYXR0cmlidXRlcy5nZXRTdHViVmVyc2lvbigpOwotICAgICAgICBpZiAobnVsbCAhPSBzdHViVmVyc2lvbikgewotICAgICAgICAgICAgaWYgKCIxLjEiLmVxdWFscyhzdHViVmVyc2lvbikpCi0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi12MS4xIik7Ci0gICAgICAgICAgICBlbHNlIGlmICgiMS4yIi5lcXVhbHMoc3R1YlZlcnNpb24pKQotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdjEuMiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdmNvbXBhdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gYXR0cmlidXRlcy5nZXRTb3VyY2VCYXNlKCkpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCIta2VlcGdlbmVyYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGF0dHJpYnV0ZXMuZ2V0SWlvcCgpICkgewotICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIklJT1AgaGFzIGJlZW4gdHVybmVkIG9uLiIsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1paW9wIik7Ci0gICAgICAgICAgICBpZiggYXR0cmlidXRlcy5nZXRJaW9wb3B0cygpICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIklJT1AgT3B0aW9uczogIiArIGF0dHJpYnV0ZXMuZ2V0SWlvcG9wdHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPICk7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXR0cmlidXRlcy5nZXRJaW9wb3B0cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBhdHRyaWJ1dGVzLmdldElkbCgpICkgIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItaWRsIik7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiSURMIGhhcyBiZWVuIHR1cm5lZCBvbi4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgIGlmKCBhdHRyaWJ1dGVzLmdldElkbG9wdHMoKSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGF0dHJpYnV0ZXMuZ2V0SWRsb3B0cygpKTsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiSURMIE9wdGlvbnM6ICIgKyBhdHRyaWJ1dGVzLmdldElkbG9wdHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggYXR0cmlidXRlcy5nZXREZWJ1ZygpKSAgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1nIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShjbWQpOwotICAgICAgICByZXR1cm4gY21kOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2dzIHRoZSBjb21waWxhdGlvbiBwYXJhbWV0ZXJzLCBhZGRzIHRoZSBmaWxlcyB0byBjb21waWxlIGFuZCBsb2dzIHRoZSAKLSAgICAgKiAmcW91dDtuaWNlU291cmNlTGlzdCZxdW90OwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBWZWN0b3IgY29tcGlsZUxpc3QgPSBhdHRyaWJ1dGVzLmdldENvbXBpbGVMaXN0KCk7Ci0KLSAgICAgICAgYXR0cmlidXRlcy5sb2coIkNvbXBpbGF0aW9uIGFyZ3M6ICIgKyBjbWQudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIG5pY2VTb3VyY2VMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigiRmlsZSIpOwotICAgICAgICBpZiAoY29tcGlsZUxpc3Quc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZCgicyIpOwotICAgICAgICB9Ci0gICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZCgiIHRvIGJlIGNvbXBpbGVkOiIpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNvbXBpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZyljb21waWxlTGlzdC5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShhcmcpOwotICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCIgICAgIiArIGFyZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdHRyaWJ1dGVzLmxvZyhuaWNlU291cmNlTGlzdC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbXVsYXRpb24gb2YgZXh0ZGlycyBmZWF0dXJlIGluIGphdmEgPj0gMS4yLgotICAgICAqIFRoaXMgbWV0aG9kIGFkZHMgYWxsIGZpbGVzIGluIHRoZSBnaXZlbgotICAgICAqIGRpcmVjdG9yaWVzIChidXQgbm90IGluIHN1Yi1kaXJlY3RvcmllcyEpIHRvIHRoZSBjbGFzc3BhdGgsCi0gICAgICogc28gdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byBzcGVjaWZ5IHRoZW0gYWxsIG9uZSBieSBvbmUuCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aCAtIFBhdGggdG8gYXBwZW5kIGZpbGVzIHRvCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZGlyc1RvQ2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7Ci0gICAgICAgIFBhdGggZXh0ZGlycyA9IGF0dHJpYnV0ZXMuZ2V0RXh0ZGlycygpOwotICAgICAgICBpZiAoZXh0ZGlycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0UHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5leHQuZGlycyIpOwotICAgICAgICAgICAgaWYgKGV4dFByb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGV4dGRpcnMgPSBuZXcgUGF0aChhdHRyaWJ1dGVzLmdldFByb2plY3QoKSwgZXh0UHJvcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGRpcnMgPSBleHRkaXJzLmxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGRpcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghZGlyc1tpXS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgICAgICBkaXJzW2ldICs9IEZpbGUuc2VwYXJhdG9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSBkaXIgPSBhdHRyaWJ1dGVzLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZShkaXJzW2ldKTsKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICAgICAgZnMuc2V0RGlyKGRpcik7Ci0gICAgICAgICAgICBmcy5zZXRJbmNsdWRlcygiKiIpOwotICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEZpbGVzZXQoZnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7Ci0KLSAgICAvKioKLSAgICAgKiBNYXBwZXIgdGhhdCBwb3NzaWJseSByZXR1cm5zIHR3byBmaWxlIG5hbWVzLCAqX1N0dWIgYW5kICpfU2tlbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFJtaWNGaWxlTmFtZU1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKLQotICAgICAgICBSbWljRmlsZU5hbWVNYXBwZXIoKSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIHMpIHt9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyBzKSB7fQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8ICFuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKQotICAgICAgICAgICAgICAgIHx8IG5hbWUuZW5kc1dpdGgoZ2V0U3R1YkNsYXNzU3VmZml4KCkrIi5jbGFzcyIpIAotICAgICAgICAgICAgICAgIHx8IG5hbWUuZW5kc1dpdGgoZ2V0U2tlbENsYXNzU3VmZml4KCkrIi5jbGFzcyIpIAotICAgICAgICAgICAgICAgIHx8IG5hbWUuZW5kc1dpdGgoZ2V0VGllQ2xhc3NTdWZmaXgoKSsiLmNsYXNzIikpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3QgYSAuY2xhc3MgZmlsZSBvciB0aGUgb25lIHdlJ2QgZ2VuZXJhdGUKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoIi5jbGFzcyIpKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBiYXNlLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0VmVyaWZ5KCkgJiYKLSAgICAgICAgICAgICAgICAhYXR0cmlidXRlcy5pc1ZhbGlkUm1pUmVtb3RlKGNsYXNzbmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIGZhbGxiYWNrIGluIGNhc2Ugd2UgaGF2ZSB0cm91YmxlIGxvYWRpbmcgdGhlIGNsYXNzIG9yCi0gICAgICAgICAgICAgKiBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgaXQgKHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvCi0gICAgICAgICAgICAgKiBrbm93IHdoYXQgSURMIG1vZGUgd291bGQgZ2VuZXJhdGUuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogVGhpcyBpcyBzdXBwb3NlZCB0byBtYWtlIEFudCBhbHdheXMgcmVjb21waWxlIHRoZQotICAgICAgICAgICAgICogY2xhc3MsIGFzIGEgZmlsZSBvZiB0aGF0IG5hbWUgc2hvdWxkIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nW10gdGFyZ2V0ID0gbmV3IFN0cmluZ1tdIHtuYW1lKyIudG1wLiIrcmFuZC5uZXh0TG9uZygpfTsKLQotICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmdldElpb3AoKSAmJiAhYXR0cmlidXRlcy5nZXRJZGwoKSkgewotICAgICAgICAgICAgICAgIC8vIEpSTVAgd2l0aCBzaW1wbGUgbmFtaW5nIGNvbnZlbnRpb24KLSAgICAgICAgICAgICAgICBpZiAoIjEuMiIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0U3R1YlZlcnNpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBnZXRTdHViQ2xhc3NTdWZmaXgoKSArICIuY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBnZXRTdHViQ2xhc3NTdWZmaXgoKSArICIuY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIGdldFNrZWxDbGFzc1N1ZmZpeCgpICsgIi5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghYXR0cmlidXRlcy5nZXRJZGwoKSkgewotICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSBiYXNlLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGlybmFtZSA9ICIiOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSSBrbm93LCB0aGlzIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBJIHByZWZlciBpdCBleHBsaWNpdCAoU0IpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBubyBwYWNrYWdlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGxhc3RTbGFzaCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBiYXNlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gYmFzZS5zdWJzdHJpbmcoaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYyA9IGF0dHJpYnV0ZXMuZ2V0TG9hZGVyKCkubG9hZENsYXNzKGNsYXNzbmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGMuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBzdHViLCBubyB0aWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlybmFtZSArICJfIiArIGZpbGVuYW1lICsgZ2V0U3R1YkNsYXNzU3VmZml4KCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHViIGlzIGRlcml2ZWQgZnJvbSBpbXBsZW1lbnRhdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aWUgZnJvbSBpbnRlcmZhY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaW50ZXJmID0gYXR0cmlidXRlcy5nZXRSZW1vdGVJbnRlcmZhY2UoYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaU5hbWUgPSBpbnRlcmYuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlEaXIgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0RG90ID0gaU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RG90ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcGFja2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbmRleCA9IGxhc3REb3QgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEaXIgPSBpTmFtZS5zdWJzdHJpbmcoMCwgaUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGlyID0gaURpci5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lICsgIl8iICsgZmlsZW5hbWUgKyBnZXRUaWVDbGFzc1N1ZmZpeCgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaURpciArICJfIiArIGlOYW1lLnN1YnN0cmluZyhpSW5kZXgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0U3R1YkNsYXNzU3VmZml4KCkgKyAiLmNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVW5hYmxlIHRvIHZlcmlmeSBjbGFzcyAiICsgY2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi4gSXQgY291bGQgbm90IGJlIGZvdW5kLiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVbmFibGUgdG8gdmVyaWZ5IGNsYXNzICIgKyBjbGFzc25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBJdCBpcyBub3QgZGVmaW5lZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVW5hYmxlIHRvIHZlcmlmeSBjbGFzcyAiICsgY2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi4gTG9hZGluZyBjYXVzZWQgRXhjZXB0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdC5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvS2FmZmVSbWljLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0thZmZlUm1pYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM4NTU0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvS2FmZmVSbWljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5ybWljOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcm1pYyBmb3IgS2FmZmUKLSAqCi0gKiBAYXV0aG9yIFRha2FzaGkgT2thbW90byA8dG9rYW1vdG9AcmQubnR0ZGF0YS5jby5qcD4KLSAqLwotcHVibGljIGNsYXNzIEthZmZlUm1pYyBleHRlbmRzIERlZmF1bHRSbWljQWRhcHRlciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0Um1pYygpLmxvZygiVXNpbmcgS2FmZmUgcm1pYyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBzZXR1cFJtaWNDb21tYW5kKCk7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoImthZmZlLnJtaS5ybWljLlJNSUMiKTsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnMgPSBjLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgU3RyaW5nW10uY2xhc3MgfSk7Ci0gICAgICAgICAgICBPYmplY3Qgcm1pYyA9IGNvbnMubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgY21kLmdldEFyZ3VtZW50cygpIH0pOwotICAgICAgICAgICAgTWV0aG9kIGRvUm1pYyA9IGMuZ2V0TWV0aG9kKCJydW4iLCBudWxsKTsKLSAgICAgICAgICAgIFN0cmluZyBzdHJbXSA9IGNtZC5nZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIEJvb2xlYW4gb2sgPSAoQm9vbGVhbilkb1JtaWMuaW52b2tlKHJtaWMsIG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gb2suYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHVzZSBLYWZmZSBybWljLCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEEgY29tbW9uIHNvbHV0aW9uIGlzIHRvIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgSkFWQV9IT01FIG9yIENMQVNTUEFUSC4iLCBnZXRSbWljKCkuZ2V0TG9jYXRpb24oKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSBleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBzdGFydGluZyBLYWZmZSBybWljOiAiLCBleCwgZ2V0Um1pYygpLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9SbWljQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9SbWljQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTA0NGIwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvUm1pY0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SbWljOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHRoYXQgYWxsIHJtaWMgYWRhcHRlcnMgbXVzdCBhZGhlciB0by4gIAotICoKLSAqIDxwPkEgcm1pYyBhZGFwdGVyIGlzIGFuIGFkYXB0ZXIgdGhhdCBpbnRlcnByZXRzIHRoZSBybWljJ3MKLSAqIHBhcmFtZXRlcnMgaW4gcHJlcGVyYXRpb24gdG8gYmUgcGFzc2VkIG9mZiB0byB0aGUgY29tcGlsZXIgdGhpcwotICogYWRhcHRlciByZXByZXNlbnRzLiAgQXMgYWxsIHRoZSBuZWNlc3NhcnkgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlCi0gKiBSbWljIHRhc2sgaXRzZWxmLCB0aGUgb25seSB0aGluZyBhbGwgYWRhcHRlcnMgbmVlZCBpcyB0aGUgcm1pYwotICogdGFzaywgdGhlIGV4ZWN1dGUgY29tbWFuZCBhbmQgYSBwYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yIChmb3IKLSAqIHJlZmxlY3Rpb24pLjwvcD4KLSAqCi0gKiBAYXV0aG9yIFRha2FzaGkgT2thbW90byA8dG9rYW1vdG9AcmQubnR0ZGF0YS5jby5qcD4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBSbWljQWRhcHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBybWljIGF0dHJpYnV0ZXMsIHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIFJtaWMgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSbWljKCBSbWljIGF0dHJpYnV0ZXMgKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqCi0gICAgICogQHJldHVybiBoYXMgdGhlIGNvbXBpbGF0aW9uIGJlZW4gc3VjY2Vzc2Z1bAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIHNvdXJjZSBjbGFzcyBmaWxlcyB0byB0aGUgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoaXMgcm1pYwotICAgICAqIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlTmFtZU1hcHBlciBnZXRNYXBwZXIoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBDTEFTU1BBVEggdGhpcyBybWljIHByb2Nlc3Mgd2lsbCB1c2UuCi0gICAgICovCi0gICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1JtaWNBZGFwdGVyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9SbWljQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2OTQ3Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1JtaWNBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotLyoqCi0gKiBDcmVhdGVzIHRoZSBuZWNlc3Nhcnkgcm1pYyBhZGFwdGVyLCBnaXZlbiBiYXNpYyBjcml0ZXJpYS4KLSAqCi0gKiBAYXV0aG9yIFRha2FzaGkgT2thbW90byA8dG9rYW1vdG9AcmQubnR0ZGF0YS5jby5qcD4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpheWdsYW52aWxsZUBob21lLmNvbSI+SiBEIEdsYW52aWxsZTwvYT4KLSAqLwotcHVibGljIGNsYXNzIFJtaWNBZGFwdGVyRmFjdG9yeSB7Ci0KLSAgICAvKiogVGhpcyBpcyBhIHNpbmdsdG9uIC0tIGNhbid0IGNyZWF0ZSBpbnN0YW5jZXMhISAqLwotICAgIHByaXZhdGUgUm1pY0FkYXB0ZXJGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJhc2VkIG9uIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluLCB0aGlzIG1ldGhvZCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkKLSAgICAgKiBmYWN0b3J5IGRlc2lyZWQuCi0gICAgICoKLSAgICAgKiBUaGUgY3VycmVudCBtYXBwaW5nIGZvciBybWljIG5hbWVzIGFyZSBhcyBmb2xsb3dzOgotICAgICAqIDx1bD48bGk+c3VuID0gU1VOJ3Mgcm1pYwotICAgICAqIDxsaT5rYWZmZSA9IEthZmZlJ3Mgcm1pYwotICAgICAqIDxsaT48aT5hIGZ1bGx5IHF1YWxsaWZpZWQgY2xhc3NuYW1lPC9pPiA9IHRoZSBuYW1lIG9mIGEgcm1pYwotICAgICAqIGFkYXB0ZXIKLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIHJtaWNUeXBlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBybWljLCBvciB0aGUKLSAgICAgKiBmdWxsIGNsYXNzbmFtZSBvZiB0aGUgcm1pYydzIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIHRhc2sgYSB0YXNrIHRvIGxvZyB0aHJvdWdoLgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHJtaWMgdHlwZSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW50bwotICAgICAqIGEgcm1pYyBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUm1pY0FkYXB0ZXIgZ2V0Um1pYyggU3RyaW5nIHJtaWNUeXBlLCBUYXNrIHRhc2sgKSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYoIHJtaWNUeXBlID09IG51bGwpewotICAgICAgICAgICAgLyogCi0gICAgICAgICAgICAgKiBXaGVuIG5vdCBzcGVjaWZpZWQgcm1pY1R5cGUsIHNlYXJjaCBTVU4ncyBybWljIGFuZAotICAgICAgICAgICAgICogS2FmZmUncyBybWljLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoInN1bi5ybWkucm1pYy5NYWluIik7Ci0gICAgICAgICAgICAgICAgcm1pY1R5cGUgPSAic3VuIjsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImthZmZlLnJtaS5ybWljLlJNSUMiKTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgia2FmZmUudG9vbHMuY29tcGlsZXIuQ29tcGlsZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgcm1pY1R5cGUgPSAia2FmZmUiOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25maykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkblwndCBndWVzcyBybWljIGltcGxlbWVudGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBybWljVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJzdW4iKSApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3VuUm1pYygpOwotICAgICAgICB9IGVsc2UgaWYgKCBybWljVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJrYWZmZSIpICkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBLYWZmZVJtaWMoKTsKLSAgICAgICAgfSBlbHNlIGlmICggcm1pY1R5cGUuZXF1YWxzSWdub3JlQ2FzZSgid2VibG9naWMiKSApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgV0xSbWljKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzc05hbWUoIHJtaWNUeXBlICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gcmVzb2x2ZSB0aGUgZ2l2ZW4gY2xhc3NuYW1lIGludG8gYSBybWljIGFkYXB0ZXIuCi0gICAgICogVGhyb3dzIGEgZml0IGlmIGl0IGNhbid0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSB0byBiZSBjcmVhdGVkLgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gVGhpcyBpcyB0aGUgZml0IHRoYXQgaXMgdGhyb3duIGlmIGNsYXNzTmFtZQotICAgICAqIGlzbid0IGFuIGluc3RhbmNlIG9mIFJtaWNBZGFwdGVyLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFJtaWNBZGFwdGVyIHJlc29sdmVDbGFzc05hbWUoIFN0cmluZyBjbGFzc05hbWUgKQotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoIGNsYXNzTmFtZSApOwotICAgICAgICAgICAgT2JqZWN0IG8gPSBjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gKFJtaWNBZGFwdGVyKSBvOwotICAgICAgICB9IGNhdGNoICggQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCBjbGFzc05hbWUgKyAiIGNhblwndCBiZSBmb3VuZC4iLCBjbmZlICk7Ci0gICAgICAgIH0gY2F0Y2ggKCBDbGFzc0Nhc3RFeGNlcHRpb24gY2NlICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzTmFtZSArICIgaXNuXCd0IHRoZSBjbGFzc25hbWUgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImEgcm1pYyBhZGFwdGVyLiIsIGNjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKCBUaHJvd2FibGUgdCApIHsKLSAgICAgICAgICAgIC8vIGZvciBhbGwgb3RoZXIgcG9zc2liaWxpdGllcwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzTmFtZSArICIgY2F1c2VkIGFuIGludGVyZXN0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJleGNlcHRpb24uIiwgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1N1blJtaWMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvU3VuUm1pYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWVhYTdlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvU3VuUm1pYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJtaWMgZm9yIFNVTidzIEpESy4KLSAqCi0gKiBAYXV0aG9yIFRha2FzaGkgT2thbW90byA8dG9rYW1vdG9AcmQubnR0ZGF0YS5jby5qcD4KLSAqLwotcHVibGljIGNsYXNzIFN1blJtaWMgZXh0ZW5kcyBEZWZhdWx0Um1pY0FkYXB0ZXIgewotCi0gICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFJtaWMoKS5sb2coIlVzaW5nIFNVTiBybWljIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwUm1pY0NvbW1hbmQoKTsKLQotICAgICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJtaWMsIHJlZGlyZWN0aW5nIG91dHB1dCB0bwotICAgICAgICAvLyB0aGUgcHJvamVjdCBsb2cKLSAgICAgICAgTG9nT3V0cHV0U3RyZWFtIGxvZ3N0ciA9IG5ldyBMb2dPdXRwdXRTdHJlYW0oZ2V0Um1pYygpLCBQcm9qZWN0Lk1TR19XQVJOKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoInN1bi5ybWkucm1pYy5NYWluIik7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zID0gYy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSAKLSAgICAgICAgICAgICAgICB7IE91dHB1dFN0cmVhbS5jbGFzcywgU3RyaW5nLmNsYXNzIH0pOwotICAgICAgICAgICAgT2JqZWN0IHJtaWMgPSBjb25zLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IGxvZ3N0ciwgInJtaWMiIH0pOwotCi0gICAgICAgICAgICBNZXRob2QgZG9SbWljID0gYy5nZXRNZXRob2QoImNvbXBpbGUiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3MgW10geyBTdHJpbmdbXS5jbGFzcyB9KTsKLSAgICAgICAgICAgIEJvb2xlYW4gb2sgPSAoQm9vbGVhbilkb1JtaWMuaW52b2tlKHJtaWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBPYmplY3RbXSB7Y21kLmdldEFyZ3VtZW50cygpfSApKTsKLSAgICAgICAgICAgIHJldHVybiBvay5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgdXNlIFNVTiBybWljLCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEEgY29tbW9uIHNvbHV0aW9uIGlzIHRvIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgSkFWQV9IT01FIG9yIENMQVNTUEFUSC4iLCBnZXRSbWljKCkuZ2V0TG9jYXRpb24oKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSBleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBzdGFydGluZyBTVU4gcm1pYzogIiwgZXgsIGdldFJtaWMoKS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nc3RyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9XTFJtaWMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvV0xSbWljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Y2FhOWMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9XTFJtaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJtaWMgZm9yIFdlYkxvZ2ljCi0gKgotICogQGF1dGhvciBUYWthc2hpIE9rYW1vdG8gPHRva2Ftb3RvQHJkLm50dGRhdGEuY28uanA+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXTFJtaWMgZXh0ZW5kcyBEZWZhdWx0Um1pY0FkYXB0ZXIgewotCi0gICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFJtaWMoKS5sb2coIlVzaW5nIFdlYkxvZ2ljIHJtaWMiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBSbWljQ29tbWFuZChuZXcgU3RyaW5nW10geyItbm9leGl0In0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJtaWMKLSAgICAgICAgICAgIENsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKCJ3ZWJsb2dpYy5ybWljIik7Ci0gICAgICAgICAgICBNZXRob2QgZG9SbWljID0gYy5nZXRNZXRob2QoIm1haW4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3MgW10geyBTdHJpbmdbXS5jbGFzcyB9KTsKLSAgICAgICAgICAgIGRvUm1pYy5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgIH0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHVzZSBXZWJMb2dpYyBybWljLCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEEgY29tbW9uIHNvbHV0aW9uIGlzIHRvIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ0xBU1NQQVRILiIsIGdldFJtaWMoKS5nZXRMb2NhdGlvbigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHN0YXJ0aW5nIFdlYkxvZ2ljIHJtaWM6ICIsIGV4LCBnZXRSbWljKCkuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN1ZmZpeCBmb3IgdGhlIHJtaWMgc3R1YiBjbGFzc2VzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHViQ2xhc3NTdWZmaXgoKSB7Ci0gICAgICAgIHJldHVybiAiX1dMU3R1YiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdWZmaXggZm9yIHRoZSBybWljIHNrZWxldG9uIGNsYXNzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNrZWxDbGFzc1N1ZmZpeCgpIHsKLSAgICAgICAgcmV0dXJuICJfV0xTa2VsIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmNjViYy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogQ29tbWFuZGxpbmUgb2JqZWN0cyBoZWxwIGhhbmRsaW5nIGNvbW1hbmQgbGluZXMgc3BlY2lmeWluZyBwcm9jZXNzZXMgdG8KLSAqIGV4ZWN1dGUuCi0gKgotICogVGhlIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGNvbW1hbmQgbGluZSBhcyBuZXN0ZWQgZWxlbWVudHMgb3IgYXMgYQotICogaGVscGVyIHRvIGRlZmluZSBhIGNvbW1hbmQgbGluZSBieSBhbiBhcHBsaWNhdGlvbi4KLSAqIDxwPgotICogPGNvZGU+Ci0gKiAmbHQ7c29tZWVsZW1lbnQmZ3Q7PGJyPgotICogJm5ic3A7Jm5ic3A7Jmx0O2Fjb21tYW5kbGluZSBleGVjdXRhYmxlPSIvZXhlY3V0YWJsZS90by9ydW4iJmd0Ozxicj4KLSAqICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthcmd1bWVudCB2YWx1ZT0iYXJndW1lbnQgMSIgLyZndDs8YnI+Ci0gKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YXJndW1lbnQgbGluZT0iYXJndW1lbnRfMSBhcmd1bWVudF8yIGFyZ3VtZW50XzMiIC8mZ3Q7PGJyPgotICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2FyZ3VtZW50IHZhbHVlPSJhcmd1bWVudCA0IiAvJmd0Ozxicj4KLSAqICZuYnNwOyZuYnNwOyZsdDsvYWNvbW1hbmRsaW5lJmd0Ozxicj4KLSAqICZsdDsvc29tZWVsZW1lbnQmZ3Q7PGJyPgotICogPC9jb2RlPgotICogVGhlIGVsZW1lbnQgPGNvZGU+c29tZWVsZW1lbnQ8L2NvZGU+IG11c3QgcHJvdmlkZSBhIG1ldGhvZAotICogPGNvZGU+Y3JlYXRlQWNvbW1hbmRsaW5lPC9jb2RlPiB3aGljaCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gKgotICogQGF1dGhvciB0aG9tYXMuaGFhc0Bzb2Z0d2lyZWQtaW5jLmNvbQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRsaW5lIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotICAgIHByaXZhdGUgVmVjdG9yIGFyZ3VtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcml2YXRlIFN0cmluZyBleGVjdXRhYmxlID0gbnVsbDsKLQotICAgIHB1YmxpYyBDb21tYW5kbGluZShTdHJpbmcgdG9fcHJvY2VzcykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBTdHJpbmdbXSB0bXAgPSB0cmFuc2xhdGVDb21tYW5kbGluZSh0b19wcm9jZXNzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBudWxsICYmIHRtcC5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBzZXRFeGVjdXRhYmxlKHRtcFswXSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTE7IGk8dG1wLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSh0bXBbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1hbmRsaW5lKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgZm9yIG5lc3RlZCB4bWwgY29tbWFuZCBsaW5lIGRlZmluaXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBBcmd1bWVudCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJ0czsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIHNpbmdsZSBjb21tYW5kbGluZSBhcmd1bWVudC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZhbHVlIGEgc2luZ2xlIGNvbW1hbmRsaW5lIGFyZ3VtZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBwYXJ0cyA9IG5ldyBTdHJpbmdbXSB7dmFsdWV9OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExpbmUgdG8gc3BsaXQgaW50byBzZXZlcmFsIGNvbW1hbmRsaW5lIGFyZ3VtZW50cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGxpbmUgbGluZSB0byBzcGxpdCBpbnRvIHNldmVyYWwgY29tbWFuZGxpbmUgYXJndW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaW5lKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICBwYXJ0cyA9IHRyYW5zbGF0ZUNvbW1hbmRsaW5lKGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBzaW5nbGUgY29tbWFuZGxpbmUgYXJndW1lbnQgYW5kIHRyZWF0cyBpdCBsaWtlIGEKLSAgICAgICAgICogUEFUSCAtIGVuc3VyZXMgdGhlIHJpZ2h0IHNlcGFyYXRvciBmb3IgdGhlIGxvY2FsIHBsYXRmb3JtCi0gICAgICAgICAqIGlzIHVzZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSBhIHNpbmdsZSBjb21tYW5kbGluZSBhcmd1bWVudC4gIAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGF0aChQYXRoIHZhbHVlKSB7Ci0gICAgICAgICAgICBwYXJ0cyA9IG5ldyBTdHJpbmdbXSB7dmFsdWUudG9TdHJpbmcoKX07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIHNpbmdsZSBjb21tYW5kbGluZSBhcmd1bWVudCB0byB0aGUgYWJzb2x1dGUgZmlsZW5hbWUKLSAgICAgICAgICogb2YgdGhlIGdpdmVuIGZpbGUuICAKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZhbHVlIGEgc2luZ2xlIGNvbW1hbmRsaW5lIGFyZ3VtZW50LiAgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgdmFsdWUpIHsKLSAgICAgICAgICAgIHBhcnRzID0gbmV3IFN0cmluZ1tdIHt2YWx1ZS5nZXRBYnNvbHV0ZVBhdGgoKX07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcGFydHMgdGhpcyBBcmd1bWVudCBjb25zaXN0cyBvZi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0cygpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJ0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsYXNzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHBvc2l0aW9uIG9mIGFuIEFyZ3VtZW50LgotICAgICAqLwotICAgIC8vIDxwPlRoaXMgY2xhc3MgaXMgdGhlcmUgdG8gc3VwcG9ydCB0aGUgc3JjZmlsZSBhbmQgdGFyZ2V0ZmlsZQotICAgIC8vIGVsZW1lbnRzIG9mICZsdDtleGVjb24mZ3Q7IGFuZCAmbHQ7dHJhbnNmb3JtJmd0OyAtIGRvbid0IGtub3cKLSAgICAvLyB3aGV0aGVyIHRoZXJlIG1pZ2h0IGJlIGFkZGl0aW9uYWwgdXNlIGNhc2VzLjwvcD4gLS1TQgotICAgIHB1YmxpYyBjbGFzcyBNYXJrZXIgewotCi0gICAgICAgIHByaXZhdGUgaW50IHBvc2l0aW9uOwotICAgICAgICBwcml2YXRlIGludCByZWFsUG9zID0gLTE7Ci0KLSAgICAgICAgTWFya2VyKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHByZWNlZWRlZCB0aGlzIG1hcmtlci4KLSAgICAgICAgICoKLSAgICAgICAgICogPHA+VGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgLSBpZiBzZXQgLSBpcyBjb3VudGVkIGFzIHRoZQotICAgICAgICAgKiB2ZXJ5IGZpcnN0IGFyZ3VtZW50LjwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0gICAgICAgICAgICBpZiAocmVhbFBvcyA9PSAtMSkgewotICAgICAgICAgICAgICAgIHJlYWxQb3MgPSAoZXhlY3V0YWJsZSA9PSBudWxsID8gMCA6IDEpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxwb3NpdGlvbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50IGFyZyA9IChBcmd1bWVudCkgYXJndW1lbnRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVhbFBvcyArPSBhcmcuZ2V0UGFydHMoKS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlYWxQb3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGFyZ3VtZW50IG9iamVjdC4KLSAgICAgKiBFYWNoIGNvbW1hbmRsaW5lIG9iamVjdCBoYXMgYXQgbW9zdCBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFyZ3VtZW50IGNsYXNzLgotICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJndW1lbnQgY3JlYXRlQXJndW1lbnQoKSB7Ci0gICAgICAgIEFyZ3VtZW50IGFyZ3VtZW50ID0gbmV3IEFyZ3VtZW50KCk7Ci0gICAgICAgIGFyZ3VtZW50cy5hZGRFbGVtZW50KGFyZ3VtZW50KTsKLSAgICAgICAgcmV0dXJuIGFyZ3VtZW50OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXhlY3V0YWJsZSB0byBydW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZXhlY3V0YWJsZSkgewotICAgICAgICBpZiAoZXhlY3V0YWJsZSA9PSBudWxsIHx8IGV4ZWN1dGFibGUubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotICAgICAgICB0aGlzLmV4ZWN1dGFibGUgPSBleGVjdXRhYmxlLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpCi0gICAgICAgICAgICAucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGVjdXRhYmxlKCkgewotICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50cyhTdHJpbmdbXSBsaW5lKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobGluZVtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleGVjdXRhYmxlIGFuZCBhbGwgZGVmaW5lZCBhcmd1bWVudHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENvbW1hbmRsaW5lKCkgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgIGlmIChleGVjdXRhYmxlID09IG51bGwpIHJldHVybiBhcmdzOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoKzFdOwotICAgICAgICByZXN1bHRbMF0gPSBleGVjdXRhYmxlOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIHJlc3VsdCwgMSwgYXJncy5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgYXJndW1lbnRzIGRlZmluZWQgYnkgPGNvZGU+YWRkTGluZTwvY29kZT4sCi0gICAgICogPGNvZGU+YWRkVmFsdWU8L2NvZGU+IG9yIHRoZSBhcmd1bWVudCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEFyZ3VtZW50cygpIHsKLSAgICAgICAgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoYXJndW1lbnRzLnNpemUoKSoyKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFyZ3VtZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQXJndW1lbnQgYXJnID0gKEFyZ3VtZW50KSBhcmd1bWVudHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgU3RyaW5nW10gcyA9IGFyZy5nZXRQYXJ0cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkRWxlbWVudChzW2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIFtdIHJlcyA9IG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV07Ci0gICAgICAgIHJlc3VsdC5jb3B5SW50byhyZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nKGdldENvbW1hbmRsaW5lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1dCBxdW90ZXMgYXJvdW5kIHRoZSBnaXZlbiBTdHJpbmcgaWYgbmVjZXNzYXJ5LgotICAgICAqCi0gICAgICogPHA+SWYgdGhlIGFyZ3VtZW50IGRvZXNuJ3QgaW5jbHVkZSBzcGFjZXMgb3IgcXVvdGVzLCByZXR1cm4gaXQKLSAgICAgKiBhcyBpcy4gSWYgaXQgY29udGFpbnMgZG91YmxlIHF1b3RlcywgdXNlIHNpbmdsZSBxdW90ZXMgLSBlbHNlCi0gICAgICogc3Vycm91bmQgdGhlIGFyZ3VtZW50IGJ5IGRvdWJsZSBxdW90ZXMuPC9wPgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnQgY29udGFpbnMgYm90aCwgc2luZ2xlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZG91YmxlIHF1b3Rlcy4gIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlQXJndW1lbnQoU3RyaW5nIGFyZ3VtZW50KSB7Ci0gICAgICAgIGlmIChhcmd1bWVudC5pbmRleE9mKCJcIiIpID4gLTEpIHsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudC5pbmRleE9mKCJcJyIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhblwndCBoYW5kbGUgc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzIGluIHNhbWUgYXJndW1lbnQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICdcJycrYXJndW1lbnQrJ1wnJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudC5pbmRleE9mKCJcJyIpID4gLTEgfHwgYXJndW1lbnQuaW5kZXhPZigiICIpID4gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAnXCInK2FyZ3VtZW50KydcIic7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJndW1lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgW10gbGluZSkgewotICAgICAgICAvLyBlbXB0eSBwYXRoIHJldHVybiBlbXB0eSBzdHJpbmcKLSAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLmxlbmd0aCA9PSAwKSByZXR1cm4gIiI7Ci0KLSAgICAgICAgLy8gcGF0aCBjb250YWluaW5nIG9uZSBvciBtb3JlIGVsZW1lbnRzCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocXVvdGVBcmd1bWVudChsaW5lW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdHJhbnNsYXRlQ29tbWFuZGxpbmUoU3RyaW5nIHRvX3Byb2Nlc3MpIHsKLSAgICAgICAgaWYgKHRvX3Byb2Nlc3MgPT0gbnVsbCB8fCB0b19wcm9jZXNzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGFyc2Ugd2l0aCBhIHNpbXBsZSBmaW5pdGUgc3RhdGUgbWFjaGluZQotICAgICAgICAKLSAgICAgICAgZmluYWwgaW50IG5vcm1hbCA9IDA7Ci0gICAgICAgIGZpbmFsIGludCBpblF1b3RlID0gMTsKLSAgICAgICAgZmluYWwgaW50IGluRG91YmxlUXVvdGUgPSAyOwotICAgICAgICBpbnQgc3RhdGUgPSBub3JtYWw7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRvX3Byb2Nlc3MsICJcIlwnICIsIHRydWUpOwotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGN1cnJlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuZXh0VG9rID0gdG9rLm5leHRUb2tlbigpOwotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBpblF1b3RlOgotICAgICAgICAgICAgICAgIGlmICgiXCciLmVxdWFscyhuZXh0VG9rKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG5vcm1hbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFwcGVuZChuZXh0VG9rKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGluRG91YmxlUXVvdGU6Ci0gICAgICAgICAgICAgICAgaWYgKCJcIiIuZXF1YWxzKG5leHRUb2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gbm9ybWFsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYXBwZW5kKG5leHRUb2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKCJcJyIuZXF1YWxzKG5leHRUb2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gaW5RdW90ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJcIiIuZXF1YWxzKG5leHRUb2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gaW5Eb3VibGVRdW90ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCIgIi5lcXVhbHMobmV4dFRvaykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KGN1cnJlbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYXBwZW5kKG5leHRUb2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIHYuYWRkRWxlbWVudChjdXJyZW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0YXRlID09IGluUXVvdGUgfHwgc3RhdGUgPT0gaW5Eb3VibGVRdW90ZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ1bmJhbGFuY2VkIHF1b3RlcyBpbiAiICsgdG9fcHJvY2Vzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1t2LnNpemUoKV07Ci0gICAgICAgIHYuY29weUludG8oYXJncyk7Ci0gICAgICAgIHJldHVybiBhcmdzOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbW1hbmRsaW5lKCkubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGMgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgYy5zZXRFeGVjdXRhYmxlKGV4ZWN1dGFibGUpOwotICAgICAgICBjLmFkZEFyZ3VtZW50cyhnZXRBcmd1bWVudHMoKSk7Ci0gICAgICAgIHJldHVybiBjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIG91dCB0aGUgd2hvbGUgY29tbWFuZCBsaW5lLiAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZXhlY3V0YWJsZSA9IG51bGw7Ci0gICAgICAgIGFyZ3VtZW50cy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIG91dCB0aGUgYXJndW1lbnRzIGJ1dCBsZWF2ZSB0aGUgZXhlY3V0YWJsZSBpbiBwbGFjZSBmb3IgYW5vdGhlciBvcGVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJBcmdzKCkgewotICAgICAgICBhcmd1bWVudHMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBhIG1hcmtlci4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgbWFya2VyIGNhbiBiZSB1c2VkIHRvIGxvY2F0ZSBhIHBvc2l0aW9uIG9uIHRoZQotICAgICAqIGNvbW1hbmRsaW5lIC0gdG8gaW5zZXJ0IHNvbWV0aGluZyBmb3IgZXhhbXBsZSAtIHdoZW4gYWxsCi0gICAgICogcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0LjwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFya2VyIGNyZWF0ZU1hcmtlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNYXJrZXIoYXJndW1lbnRzLnNpemUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZUphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNzFjMS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZUphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgSmF2YSBjb21tYW5kIGxpbmUgdGhhdCBpcyBub3RoaW5nIG1vcmUKLSAqIHRoYW4gYSBjb21wb3NpdGUgb2YgMiA8dHQ+Q29tbWFuZGxpbmU8L3R0Pi4gMSBmb3IgdGhlIHZtL29wdGlvbnMgYW5kCi0gKiAxIGZvciB0aGUgY2xhc3NuYW1lL2FyZ3VtZW50cy4gSXQgcHJvdmlkZXMgc3BlY2lmaWMgbWV0aG9kcyBmb3IKLSAqIGEgamF2YSBjb21tYW5kIGxpbmUuCi0gKgotICogQGF1dGhvciB0aG9tYXMuaGFhc0Bzb2Z0d2lyZWQtaW5jLmNvbQotICogQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAYXBhY2hlLm9yZz5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRsaW5lSmF2YSBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLSAgICBwcml2YXRlIENvbW1hbmRsaW5lIHZtQ29tbWFuZCA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgamF2YUNvbW1hbmQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICBwcml2YXRlIFN5c1Byb3BlcnRpZXMgc3lzUHJvcGVydGllcyA9IG5ldyBTeXNQcm9wZXJ0aWVzKCk7Ci0gICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdm1WZXJzaW9uOwotICAgIHByaXZhdGUgU3RyaW5nIG1heE1lbW9yeSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIGl0IHdpbGwgZXhlY3V0ZSBhIGphciBmaWxlIG9yIG5vdCwgaW4gdGhpcyBjYXNlCi0gICAgICogdGhlIGZpcnN0IHZtIG9wdGlvbiBtdXN0IGJlIGEgLWphciBhbmQgdGhlICdleGVjdXRhYmxlJyBpcyBhIGphciBmaWxlLgotICAgICAqLwotICAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUphciAgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFNwZWNpYWxpemVkIEVudmlyb25tZW50IGNsYXNzIGZvciBTeXN0ZW0gcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3lzUHJvcGVydGllcyBleHRlbmRzIEVudmlyb25tZW50IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICAgICAgUHJvcGVydGllcyBzeXMgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYXJpYWJsZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIHByb3BzW10gPSBzdXBlci5nZXRWYXJpYWJsZXMoKTsKLSAgICAgIAotICAgICAgICAgICAgaWYgKHByb3BzID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHJvcHNbaV0gPSAiLUQiICsgcHJvcHNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFyaWFibGVzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKHN5cyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSB2YXJpYWJsZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LlZhcmlhYmxlIHYgPSAoRW52aXJvbm1lbnQuVmFyaWFibGUpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgcC5wdXQodi5nZXRLZXkoKSwgdi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMocCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgbW9kaWZ5IHN5c3RlbSBwcm9wZXJ0aWVzIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3lzdGVtKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChzeXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYmFsYW5jZWQgbmVzdGluZyBvZiBTeXNQcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMoc3lzKTsKLSAgICAgICAgICAgICAgICBzeXMgPSBudWxsOwotICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IG1vZGlmeSBzeXN0ZW0gcHJvcGVydGllcyIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzUHJvcGVydGllcyBjID0gKFN5c1Byb3BlcnRpZXMpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgYy52YXJpYWJsZXMgPSAoVmVjdG9yKSB2YXJpYWJsZXMuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0gY2F0Y2goQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSl7cmV0dXJuIG51bGw7fQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbWFuZGxpbmVKYXZhKCkgewotICAgICAgICBzZXRWbShnZXRKYXZhRXhlY3V0YWJsZU5hbWUoKSk7Ci0gICAgICAgIHNldFZtdmVyc2lvbihQcm9qZWN0LmdldEphdmFWZXJzaW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tYW5kbGluZS5Bcmd1bWVudCBjcmVhdGVBcmd1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGphdmFDb21tYW5kLmNyZWF0ZUFyZ3VtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZVZtQXJndW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiB2bUNvbW1hbmQuY3JlYXRlQXJndW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTeXNwcm9wZXJ0eShFbnZpcm9ubWVudC5WYXJpYWJsZSBzeXNwKSB7Ci0gICAgICAgIHN5c1Byb3BlcnRpZXMuYWRkVmFyaWFibGUoc3lzcCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Vm0oU3RyaW5nIHZtKSB7Ci0gICAgICAgIHZtQ29tbWFuZC5zZXRFeGVjdXRhYmxlKHZtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWbXZlcnNpb24oU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHZtVmVyc2lvbiA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCBhIGphciBmaWxlIHRvIGV4ZWN1dGUgdmlhIHRoZSAtamFyIG9wdGlvbi4KLSAgICAgKiBAcGFyYW0gdGhlIHBhdGhuYW1lIG9mIHRoZSBqYXIgdG8gZXhlY3V0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEphcihTdHJpbmcgamFycGF0aG5hbWUpewotICAgICAgICBqYXZhQ29tbWFuZC5zZXRFeGVjdXRhYmxlKGphcnBhdGhuYW1lKTsKLSAgICAgICAgZXhlY3V0ZUphciA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcGF0aG5hbWUgb2YgdGhlIGphciBmaWxlIHRvIHJ1biB2aWEgLWphciBvcHRpb24KLSAgICAgKiBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIG5vIGphciB0byBydW4uCi0gICAgICogQHNlZSAjZ2V0Q2xhc3NuYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphcigpewotICAgICAgICBpZiAoZXhlY3V0ZUphcil7Ci0gICAgICAgICAgICByZXR1cm4gamF2YUNvbW1hbmQuZ2V0RXhlY3V0YWJsZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgY2xhc3NuYW1lIHRvIGV4ZWN1dGUKLSAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7Ci0gICAgICAgIGphdmFDb21tYW5kLnNldEV4ZWN1dGFibGUoY2xhc3NuYW1lKTsKLSAgICAgICAgZXhlY3V0ZUphciA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHJ1biBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIG5vIGNsYXNzLgotICAgICAqIEBzZWUgI2dldEphcigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0gICAgICAgIGlmICghZXhlY3V0ZUphcikgewotICAgICAgICAgICAgcmV0dXJuIGphdmFDb21tYW5kLmdldEV4ZWN1dGFibGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgocCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZtdmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHZtVmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIGNvbW1hbmQgbGluZSB0byBydW4gYSBqYXZhIHZtLgotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIGFyZ3VtZW50cyBuZWNlc3NhcnkgdG8gcnVuIHRoZSB2bS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWFuZGxpbmUoKSB7Ci0gICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzaXplKCldOwotICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgU3RyaW5nW10gdm1BcmdzID0gZ2V0QWN0dWFsVk1Db21tYW5kKCkuZ2V0Q29tbWFuZGxpbmUoKTsKLSAgICAgICAgLy8gZmlyc3QgYXJndW1lbnQgaXMgdGhlIGphdmEuZXhlIHBhdGguLi4KLSAgICAgICAgcmVzdWx0W3BvcysrXSA9IHZtQXJnc1swXTsKLSAgICAgICAgCi0gICAgICAgIC8vIC1qYXIgbXVzdCBiZSB0aGUgZmlyc3Qgb3B0aW9uIGluIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgIGlmIChleGVjdXRlSmFyKXsKLSAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAiLWphciI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbmV4dCBmb2xsb3dzIHRoZSB2bSBvcHRpb25zCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodm1BcmdzLCAxLCByZXN1bHQsIHBvcywgdm1BcmdzLmxlbmd0aCAtIDEpOwotICAgICAgICBwb3MgKz0gdm1BcmdzLmxlbmd0aCAtIDE7Ci0gICAgICAgIC8vIHByb3BlcnRpZXMgYXJlIHBhcnQgb2YgdGhlIHZtIG9wdGlvbnMuLi4KLSAgICAgICAgaWYgKHN5c1Byb3BlcnRpZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzeXNQcm9wZXJ0aWVzLmdldFZhcmlhYmxlcygpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIHBvcywgc3lzUHJvcGVydGllcy5zaXplKCkpOwotICAgICAgICAgICAgcG9zICs9IHN5c1Byb3BlcnRpZXMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNsYXNzcGF0aCBpcyBhIHZtIG9wdGlvbiB0b28uLgotICAgICAgICBQYXRoIGZ1bGxDbGFzc3BhdGggPSBjbGFzc3BhdGggIT0gbnVsbCA/IGNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpIDogbnVsbDsKLSAgICAgICAgaWYgKGZ1bGxDbGFzc3BhdGggIT0gbnVsbCAmJiBmdWxsQ2xhc3NwYXRoLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmVzdWx0W3BvcysrXSA9ICItY2xhc3NwYXRoIjsKLSAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSBmdWxsQ2xhc3NwYXRoLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2xhc3NuYW1lIHRvIHJ1biBhcyB3ZWxsIGFzIGl0cyBhcmd1bWVudHMuCi0gICAgICAgIC8vIGluIGNhc2Ugb2YgJ2V4ZWN1dGVKYXInLCB0aGUgZXhlY3V0YWJsZSBpcyBhIGphciBmaWxlLgotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGphdmFDb21tYW5kLmdldENvbW1hbmRsaW5lKCksIDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgcG9zLCBqYXZhQ29tbWFuZC5zaXplKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIC1teCBvciAtWG14IGRlcGVuZGluZyBvbiBWTSB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWF4bWVtb3J5KFN0cmluZyBtYXgpewotICAgICAgICB0aGlzLm1heE1lbW9yeSA9IG1heDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBDb21tYW5kbGluZS50b1N0cmluZyhnZXRDb21tYW5kbGluZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbW1hbmRsaW5lIGdldEFjdHVhbFZNQ29tbWFuZCgpIHsKLSAgICAgICAgQ29tbWFuZGxpbmUgYWN0dWFsVk1Db21tYW5kID0gKENvbW1hbmRsaW5lKXZtQ29tbWFuZC5jbG9uZSgpOwotICAgICAgICBpZiAobWF4TWVtb3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh2bVZlcnNpb24uc3RhcnRzV2l0aCgiMS4xIikpIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxWTUNvbW1hbmQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW14IiArIG1heE1lbW9yeSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFjdHVhbFZNQ29tbWFuZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItWG14IiArIG1heE1lbW9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFjdHVhbFZNQ29tbWFuZDsKLSAgICB9ICAgICAgICAKLQotICAgIC8qKgotICAgICAqIFRoZSBzaXplIG9mIHRoZSBqYXZhIGNvbW1hbmQgbGluZS4KLSAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBqYXZhIGNvbW1hbmQgbGluZS4KLSAgICAgKiBAc2VlICNnZXRDb21tYW5kbGluZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICBpbnQgc2l6ZSA9IGdldEFjdHVhbFZNQ29tbWFuZCgpLnNpemUoKSArIGphdmFDb21tYW5kLnNpemUoKSArIHN5c1Byb3BlcnRpZXMuc2l6ZSgpOwotICAgICAgICAvLyBjbGFzc3BhdGggaXMgIi1jbGFzc3BhdGggPGNsYXNzcGF0aD4iIC0+IDIgYXJncwotICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwgJiYgY2xhc3NwYXRoLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHNpemUgKz0gMjsKLSAgICAgICAgfQotICAgICAgICAvLyBqYXIgZXhlY3V0aW9uIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgLWphciBvcHRpb24KLSAgICAgICAgaWYgKGV4ZWN1dGVKYXIpewotICAgICAgICAgICAgc2l6ZSsrIDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbWFuZGxpbmUgZ2V0SmF2YUNvbW1hbmQoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhQ29tbWFuZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbWFuZGxpbmUgZ2V0Vm1Db21tYW5kKCkgewotICAgICAgICByZXR1cm4gZ2V0QWN0dWFsVk1Db21tYW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgewotICAgICAgICByZXR1cm4gY2xhc3NwYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbVByb3BlcnRpZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBzeXNQcm9wZXJ0aWVzLnNldFN5c3RlbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVTeXN0ZW1Qcm9wZXJ0aWVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgc3lzUHJvcGVydGllcy5yZXN0b3JlU3lzdGVtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN5c1Byb3BlcnRpZXMgZ2V0U3lzdGVtUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHN5c1Byb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGMgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7Ci0gICAgICAgIGMudm1Db21tYW5kID0gKENvbW1hbmRsaW5lKSB2bUNvbW1hbmQuY2xvbmUoKTsKLSAgICAgICAgYy5qYXZhQ29tbWFuZCA9IChDb21tYW5kbGluZSkgamF2YUNvbW1hbmQuY2xvbmUoKTsKLSAgICAgICAgYy5zeXNQcm9wZXJ0aWVzID0gKFN5c1Byb3BlcnRpZXMpIHN5c1Byb3BlcnRpZXMuY2xvbmUoKTsKLSAgICAgICAgYy5tYXhNZW1vcnkgPSBtYXhNZW1vcnk7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgYy5jbGFzc3BhdGggPSAoUGF0aCkgY2xhc3NwYXRoLmNsb25lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYy52bVZlcnNpb24gPSB2bVZlcnNpb247Ci0gICAgICAgIGMuZXhlY3V0ZUphciA9IGV4ZWN1dGVKYXI7Ci0gICAgICAgIHJldHVybiBjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIG91dCB0aGUgamF2YSBhcmd1bWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJKYXZhQXJncygpIHsKLSAgICAgICAgamF2YUNvbW1hbmQuY2xlYXJBcmdzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SmF2YUV4ZWN1dGFibGVOYW1lKCkgewotCS8vIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGV4dGVuc2lvbiBjYXNlIC0gZXhlIGZvciB3aW5kb3dzIGFuZCBPUy8yLCAKLSAgICAgICAgLy8gbm90aGluZyBmb3IgKm5peC4KLSAgICAgICAgU3RyaW5nIG9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgYm9vbGVhbiBkb3NCYXNlZCA9IAotICAgICAgICAgICAgb3MuaW5kZXhPZigid2luZG93cyIpID49IDAgfHwgb3MuaW5kZXhPZigib3MvMiIpID49IDA7Ci0JU3RyaW5nIGV4dGVuc2lvbiA9ICBkb3NCYXNlZD8gIi5leGUiIDogIiI7Ci0KLQkvLyBMb29rIGZvciBqYXZhIGluIHRoZSBqYXZhLmhvbWUvLi4vYmluIGRpcmVjdG9yeS4gIFVuZm9ydHVuYXRlbHkKLQkvLyBvbiBXaW5kb3dzIGphdmEuaG9tZSBkb2Vzbid0IGFsd2F5cyByZWZlciB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiwgCi0JLy8gc28gd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gYXNzdW1pbmcgamF2YSBpcyBzb21ld2hlcmUgb24gdGhlCi0JLy8gUEFUSC4KLQlqYXZhLmlvLkZpbGUgakV4ZWN1dGFibGUgPSAKLSAgICAgICAgICAgIG5ldyBqYXZhLmlvLkZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLi4vYmluL2phdmEiICsgZXh0ZW5zaW9uICk7Ci0KLQlpZiAoakV4ZWN1dGFibGUuZXhpc3RzKCkpIHsKLQkgICAgcmV0dXJuIGpFeGVjdXRhYmxlLmdldEFic29sdXRlUGF0aCgpOwotCX0gZWxzZSB7Ci0JICAgIHJldHVybiAiamF2YSI7Ci0JfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RhdGFUeXBlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EYXRhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM3NjM4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKLQotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciB0aG9zZSBjbGFzc2VzIHRoYXQgY2FuIGFwcGVhciBpbnNpZGUgdGhlIGJ1aWxkIGZpbGUKLSAqIGFzIHN0YW5kIGFsb25lIGRhdGEgdHlwZXMuICAKLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGhhbmRsZXMgdGhlIGNvbW1vbiBkZXNjcmlwdGlvbiBhdHRyaWJ1dGUgYW5kIHByb3ZpZGVzCi0gKiBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHJlZmVyZW5jZSBoYW5kbGluZyBhbmQgY2hlY2tpbmcgZm9yCi0gKiBjaXJjdWxhciByZWZlcmVuY2VzIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHR5cGVzIHRoYXQgY2FuIG5vdCBiZQotICogbmVzdGVkIGluc2lkZSBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIChpLmUuICZsdDtwYXR0ZXJuc2V0Jmd0OwotICogYnV0IG5vdCAmbHQ7cGF0aCZndDspLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YVR5cGUgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IHsKLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpcHRpbiB0aGUgdXNlciBoYXMgc2V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotICAgIC8qKgotICAgICAqIFZhbHVlIHRvIHRoZSByZWZpZCBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlZmVyZW5jZSByZWYgPSBudWxsOwotICAgIC8qKgotICAgICAqIEFyZSB3ZSBzdXJlIHdlIGRvbid0IGhvbGQgY2lyY3VsYXIgcmVmZXJlbmNlcz8KLSAgICAgKgotICAgICAqIDxwPlN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gZmFsc2UKLSAgICAgKiBpZiB3ZSdkIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhpcyBjb25kaXRpb24gKHVzdWFsbHkgYmVjYXVzZSBhCi0gICAgICogY2hpbGQgZWxlbWVudCBoYXMgYmVlbiBhZGRlZCB0aGF0IGlzIGEgc3ViY2xhc3Mgb2YKLSAgICAgKiBEYXRhVHlwZSkuPC9wPiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja2VkID0gdHJ1ZTsKLSAgICAKLSAgICAvKiogCi0gICAgICogU2V0cyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGRhdGEgdHlwZS4gSXQgd2lsbCBiZSB1c2VmdWwKLSAgICAgKiBpbiBjb21tZW50aW5nIHdoYXQgd2UgYXJlIGRvaW5nLiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oIFN0cmluZyBkZXNjICkgewotICAgICAgICBkZXNjcmlwdGlvbj1kZXNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBjdXJyZW50IGRhdGEgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFzIHRoZSByZWZpZCBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50IGJlZW4gc2V0PwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkgewotICAgICAgICByZXR1cm4gcmVmICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgcmVmaWQgYXR0cmlidXRlLgotICAgICAqCi0gICAgICogPHA+U3ViY2xhc3NlcyBtYXkgbmVlZCB0byBjaGVjayB3aGV0aGVyIGFueSBvdGhlciBhdHRyaWJ1dGVzCi0gICAgICogaGF2ZSBiZWVuIHNldCBhcyB3ZWxsIG9yIGNoaWxkIGVsZW1lbnRzIGhhdmUgYmVlbiBjcmVhdGVkIGFuZAotICAgICAqIHRodXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIGlmIHRoZXkgZG8gdGhlIG11c3QgY2FsbAotICAgICAqIDxjb2RlPnN1cGVyLnNldFJlZmlkPC9jb2RlPi48L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgdGhpcy5yZWYgPSByZWY7Ci0gICAgICAgIGNoZWNrZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgd2hldGhlciBhbnkgRGF0YVR5cGUgd2UgaG9sZCByZWZlcmVuY2VzIHRvIGlzCi0gICAgICogaW5jbHVkZWQgaW4gdGhlIFN0YWNrICh3aGljaCBob2xkcyBhbGwgRGF0YVR5cGUgaW5zdGFuY2VzIHRoYXQKLSAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHJlZmVyZW5jZSB0aGlzIGluc3RhbmNlLCBpbmNsdWRpbmcgdGhpcwotICAgICAqIGluc3RhbmNlIGl0c2VsZikuCi0gICAgICoKLSAgICAgKiA8cD5JZiBvbmUgaXMgaW5jbHVkZWQsIHRocm93IGEgQnVpbGRFeGNlcHRpb24gY3JlYXRlZCBieSB7QGxpbmsKLSAgICAgKiAjY2lyY3VsYXJSZWZlcmVuY2UgY2lyY3VsYXJSZWZlcmVuY2V9LjwvcD4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gaXMgYXBwcm9wcmlhdGUgb25seSBmb3IgYSBEYXRhVHlwZSB0aGF0Ci0gICAgICogY2Fubm90IGhvbGQgb3RoZXIgRGF0YVR5cGVzIGFzIGNoaWxkcmVuLjwvcD4gCi0gICAgICoKLSAgICAgKiA8cD5UaGUgZ2VuZXJhbCBjb250cmFjdCBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IGl0IHNob3VsZG4ndCBkbwotICAgICAqIGFueXRoaW5nIGlmIHtAbGluayAjY2hlY2tlZCA8Y29kZT5jaGVja2VkPC9jb2RlPn0gaXMgdHJ1ZSBhbmQKLSAgICAgKiBzZXQgaXQgdG8gdHJ1ZSBvbiBleGl0LjwvcD4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjayBzdGssIFByb2plY3QgcCkgCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGNoZWNrZWQgfHwgIWlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBPYmplY3QgbyA9IHJlZi5nZXRSZWZlcmVuY2VkT2JqZWN0KHApOwotICAgICAgICAKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRhVHlwZSkgewotICAgICAgICAgICAgaWYgKHN0ay5jb250YWlucyhvKSkgewotICAgICAgICAgICAgICAgIHRocm93IGNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0ay5wdXNoKG8pOwotICAgICAgICAgICAgICAgICgoRGF0YVR5cGUpIG8pLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKLSAgICAgICAgICAgICAgICBzdGsucG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlZmVyZW5jZWQgb2JqZWN0LiAgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRDaGVja2VkUmVmKENsYXNzIHJlcXVpcmVkQ2xhc3MsIFN0cmluZyBkYXRhVHlwZU5hbWUpIHsKLSAgICAgICAgaWYgKCFjaGVja2VkKSB7Ci0gICAgICAgICAgICBTdGFjayBzdGsgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgICAgIHN0ay5wdXNoKHRoaXMpOwotICAgICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZShzdGssIGdldFByb2plY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBvID0gcmVmLmdldFJlZmVyZW5jZWRPYmplY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgaWYgKCEocmVxdWlyZWRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG8uZ2V0Q2xhc3MoKSkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gcmVmLmdldFJlZklkKCkrIiBkb2VzblwndCBkZW5vdGUgYSAiICsgZGF0YVR5cGVOYW1lOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZXhjZXB0aW9uIHRoYXQgaW5kaWNhdGVzIHRoYXQgcmVmaWQgaGFzIHRvIGJlIHRoZQotICAgICAqIG9ubHkgYXR0cmlidXRlIGlmIGl0IGlzIHNldC4gIAotICAgICAqLwotICAgIHByb3RlY3RlZCBCdWlsZEV4Y2VwdGlvbiB0b29NYW55QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWlsZEV4Y2VwdGlvbiggIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hlbiB1c2luZyByZWZpZCIgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGV4Y2VwdGlvbiB0aGF0IGluZGljYXRlcyB0aGF0IHRoaXMgWE1MIGVsZW1lbnQgbXVzdAotICAgICAqIG5vdCBoYXZlIGNoaWxkIGVsZW1lbnRzIGlmIHRoZSByZWZpZCBhdHRyaWJ1dGUgaXMgc2V0LiAgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJ1aWxkRXhjZXB0aW9uIG5vQ2hpbGRyZW5BbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZXhjZXB0aW9uIHRoYXQgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBnZW5lcmF0ZWQgYQotICAgICAqIGxvb3Agb2YgZGF0YSB0eXBlcyByZWZlcmVuY2luZyBlYWNoIG90aGVyLiAgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJ1aWxkRXhjZXB0aW9uIGNpcmN1bGFyUmVmZXJlbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EZXNjcmlwdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0M2I0Ny4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci0KLS8qKgotICogRGVzY3JpcHRpb24gaXMgdXNlZCB0byBwcm92aWRlIGEgcHJvamVjdC13aWRlIGRlc2NyaXB0aW9uIGVsZW1lbnQKLSAqICh0aGF0IGlzLCBhIGRlc2NyaXB0aW9uIHRoYXQgYXBwbGllcyB0byBhIGJ1aWxkZmlsZSBhcyBhIHdob2xlKS4KLSAqIElmIHByZXNlbnQsIHRoZSA8ZGVzY3JpcHRpb24+IGVsZW1lbnQgaXMgcHJpbnRlZCBvdXQgYmVmb3JlIHRoZQotICogdGFyZ2V0IGRlc2NyaXB0aW9ucy4KLSAqIAotICogRGVzY3JpcHRpb24gaGFzIG5vIGF0dHJpYnV0ZXMsIG9ubHkgdGV4dC4gIFRoZXJlIGNhbiBvbmx5IGJlIG9uZQotICogcHJvamVjdCBkZXNjcmlwdGlvbiBwZXIgcHJvamVjdC4gIEEgc2Vjb25kIGRlc2NyaXB0aW9uIGVsZW1lbnQgd2lsbAotICogb3ZlcndyaXRlIHRoZSBmaXJzdC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjc3Ryb25nQGFyaWVscGFydG5lcnMuY29tIj5DcmFlZyBTdHJvbmc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb24gZXh0ZW5kcyBEYXRhVHlwZSB7Ci0gICAKLSAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotICAgCi0gICBwdWJsaWMgRGVzY3JpcHRpb24oUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBkZXNjcmlwdGl2ZSB0ZXh0IHRvIHRoZSBwcm9qZWN0LgotICAgICAqLwotICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjYTAyOS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnVtZXJhdGVkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgYXR0cmlidXRlcyB0aGF0IGNhbiBvbmx5IHRha2Ugb25lIG9mIGEgZml4ZWQgbGlzdAotICogb2YgdmFsdWVzLgotICoKLSAqIDxwPlNlZSB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRml4Q1JMRiBGaXhDUkxGfSBmb3IgYW4KLSAqIGV4YW1wbGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIG9ubHkgbWV0aG9kIGEgc3ViY2xhc3MgbmVlZHMgdG8gaW1wbGVtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBhcnJheSBob2xkaW5nIGFsbCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGVudW1lcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWx1ZXMoKTsKLQotICAgIHB1YmxpYyBFbnVtZXJhdGVkQXR0cmlidXRlKCkge30KLQotICAgIC8qKgotICAgICAqIEludm9rZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUudG9vbHMuYW50LkludHJvc3BlY3Rpb25IZWxwZXIgSW50cm9zcGVjdGlvbkhlbHBlcn0uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNvbnRhaW5zVmFsdWUodmFsdWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odmFsdWUrIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhpcyB2YWx1ZSBpbmNsdWRlZCBpbiB0aGUgZW51bWVyYXRpb24/Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnNWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gZ2V0VmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTx2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHModmFsdWVzW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnZpcm9ubWVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0NjMzZS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFdyYXBwZXIgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudCB7Ci0KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIHZhcmlhYmxlczsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFyaWFibGUgewotICAgICAgICBwcml2YXRlIFN0cmluZyBrZXksIHZhbHVlOwotCi0gICAgICAgIHB1YmxpYyBWYXJpYWJsZSgpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkgewotICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmtleTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFBhdGggcGF0aCkgewotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhdGgudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoamF2YS5pby5GaWxlIGZpbGUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJrZXkgYW5kIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGtleS50cmltKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCI9IikuYXBwZW5kKHZhbHVlLnRyaW0oKSk7Ci0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBFbnZpcm9ubWVudCgpIHsKLSAgICAgICAgdmFyaWFibGVzID0gbmV3IFZlY3RvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFZhcmlhYmxlKFZhcmlhYmxlIHZhcikgewotICAgICAgICB2YXJpYWJsZXMuYWRkRWxlbWVudCh2YXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYXJpYWJsZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAodmFyaWFibGVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3ZhcmlhYmxlcy5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8cmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSAoKFZhcmlhYmxlKSB2YXJpYWJsZXMuZWxlbWVudEF0KGkpKS5nZXRDb250ZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5Yjc3ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogRmlsZUxpc3QgcmVwcmVzZW50cyBhbiBleHBsaWNpdGx5IG5hbWVkIGxpc3Qgb2YgZmlsZXMuICBGaWxlTGlzdHMKLSAqIGFyZSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBjYXB0dXJlIGEgbGlzdCBvZiBmaWxlcyByZWdhcmRsZXNzIG9mCi0gKiB3aGV0aGVyIHRoZXkgY3VycmVudGx5IGV4aXN0LiAgQnkgY29udHJhc3QsIEZpbGVTZXQgb3BlcmF0ZXMgYXMgYQotICogZmlsdGVyLCBvbmx5IHJldHVybmluZyB0aGUgbmFtZSBvZiBhIG1hdGNoZWQgZmlsZSBpZiBpdCBjdXJyZW50bHkKLSAqIGV4aXN0cyBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNzdHJvbmdAYXJpZWxwYXJ0bmVycy5jb20iPkNyYWVnIFN0cm9uZzwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlTGlzdCBleHRlbmRzIERhdGFUeXBlIHsKLSAgICAKLSAgICBwcml2YXRlIFZlY3RvciBmaWxlbmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBGaWxlIGRpcjsKLQotICAgIHB1YmxpYyBGaWxlTGlzdCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZUxpc3QoRmlsZUxpc3QgZmlsZWxpc3QpIHsKLSAgICAgICAgdGhpcy5kaXIgICAgICAgPSBmaWxlbGlzdC5kaXI7Ci0gICAgICAgIHRoaXMuZmlsZW5hbWVzID0gZmlsZWxpc3QuZmlsZW5hbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgRmlsZUxpc3QKLSAgICAgKiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIDxwPllvdSBtdXN0IG5vdCBzZXQgYW5vdGhlciBhdHRyaWJ1dGUgb3IgbmVzdCBlbGVtZW50cyBpbnNpZGUKLSAgICAgKiB0aGlzIGVsZW1lbnQgaWYgeW91IG1ha2UgaXQgYSByZWZlcmVuY2UuPC9wPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChkaXIgIT0gbnVsbCkgfHwgKGZpbGVuYW1lcy5zaXplKCkgIT0gMCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0UmVmaWQocik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZGlyKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmRpciA9IGRpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXREaXIoUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmdldERpcihwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVzKFN0cmluZyBmaWxlbmFtZXMpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbGVuYW1lcyAhPSBudWxsICYmIGZpbGVuYW1lcy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbGVuYW1lcywgIiwgXHRcblxyXGYiLCBmYWxzZSk7Ci0gICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgdGhpcy5maWxlbmFtZXMuYWRkRWxlbWVudCh0b2submV4dFRva2VuKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmaWxlcyByZXByZXNlbnRlZCBieSB0aGlzIEZpbGVMaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGaWxlcyhQcm9qZWN0IHApIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkuZ2V0RmlsZXMocCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gZGlyZWN0b3J5IHNwZWNpZmllZCBmb3IgZmlsZWxpc3QuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlsZW5hbWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGZpbGVzIHNwZWNpZmllZCBmb3IgZmlsZWxpc3QuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVzdWx0W10gPSBuZXcgU3RyaW5nW2ZpbGVuYW1lcy5zaXplKCldOwotICAgICAgICBmaWxlbmFtZXMuY29weUludG8ocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlZmVyZW5jZWQgRmlsZUxpc3QuICAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZUxpc3QgZ2V0UmVmKFByb2plY3QgcCkgewotICAgICAgICBpZiAoIWNoZWNrZWQpIHsKLSAgICAgICAgICAgIFN0YWNrIHN0ayA9IG5ldyBTdGFjaygpOwotICAgICAgICAgICAgc3RrLnB1c2godGhpcyk7Ci0gICAgICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBvID0gcmVmLmdldFJlZmVyZW5jZWRPYmplY3QocCk7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBGaWxlTGlzdCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZWYuZ2V0UmVmSWQoKSsiIGRvZXNuXCd0IGRlbm90ZSBhIGZpbGVsaXN0IjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChGaWxlTGlzdCkgbzsKLSAgICAgICAgfQotICAgIH0KLQotfSAvLy0tIEZpbGVMaXN0LmphdmEKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU4NjhlNC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkZpbGVTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBNb3ZlZCBvdXQgb2YgTWF0Y2hpbmdUYXNrIHRvIG1ha2UgaXQgYSBzdGFuZGFsb25lIG9iamVjdCB0aGF0IGNvdWxkCi0gKiBiZSByZWZlcmVuY2VkIChieSBzY3JpcHRzIGZvciBleGFtcGxlKS4KLSAqCi0gKiBAYXV0aG9yIEFybm91dCBKLiBLdWlwZXIgPGEgaHJlZj0ibWFpbHRvOmFqa3VpcGVyQHd4cy5ubCI+YWprdWlwZXJAd3hzLm5sPC9hPiAKLSAqIEBhdXRob3IgU3RlZmFubyBNYXp6b2NjaGkgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbm9AYXBhY2hlLm9yZyI+c3RlZmFub0BhcGFjaGUub3JnPC9hPgotICogQGF1dGhvciBTYW0gUnVieSA8YSBocmVmPSJtYWlsdG86cnVieXNAdXMuaWJtLmNvbSI+cnVieXNAdXMuaWJtLmNvbTwvYT4KLSAqIEBhdXRob3IgSm9uIFMuIFN0ZXZlbnMgPGEgaHJlZj0ibWFpbHRvOmpvbkBjbGVhcmluay5jb20iPmpvbkBjbGVhcmluay5jb208L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU2V0IGV4dGVuZHMgRGF0YVR5cGUgewotICAgIAotICAgIHByaXZhdGUgUGF0dGVyblNldCBkZWZhdWx0UGF0dGVybnMgPSBuZXcgUGF0dGVyblNldCgpOwotICAgIHByaXZhdGUgVmVjdG9yIGFkZGl0aW9uYWxQYXR0ZXJucyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHByaXZhdGUgRmlsZSBkaXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlcyA9IHRydWU7Ci0KLSAgICBwdWJsaWMgRmlsZVNldCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZVNldChGaWxlU2V0IGZpbGVzZXQpIHsKLSAgICAgICAgdGhpcy5kaXIgPSBmaWxlc2V0LmRpcjsKLSAgICAgICAgdGhpcy5kZWZhdWx0UGF0dGVybnMgPSBmaWxlc2V0LmRlZmF1bHRQYXR0ZXJuczsKLSAgICAgICAgdGhpcy5hZGRpdGlvbmFsUGF0dGVybnMgPSBmaWxlc2V0LmFkZGl0aW9uYWxQYXR0ZXJuczsKLSAgICAgICAgdGhpcy51c2VEZWZhdWx0RXhjbHVkZXMgPSBmaWxlc2V0LnVzZURlZmF1bHRFeGNsdWRlczsKLSAgICB9Ci0gICAgCi0gICAgCi0KLSAgICAvKioKLSAgICAgKiBNYWtlcyB0aGlzIGluc3RhbmNlIGluIGVmZmVjdCBhIHJlZmVyZW5jZSB0byBhbm90aGVyIFBhdHRlcm5TZXQKLSAgICAgKiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIDxwPllvdSBtdXN0IG5vdCBzZXQgYW5vdGhlciBhdHRyaWJ1dGUgb3IgbmVzdCBlbGVtZW50cyBpbnNpZGUKLSAgICAgKiB0aGlzIGVsZW1lbnQgaWYgeW91IG1ha2UgaXQgYSByZWZlcmVuY2UuPC9wPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRpciAhPSBudWxsIHx8IGRlZmF1bHRQYXR0ZXJucy5oYXNQYXR0ZXJucygpKSB7Ci0gICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYWRkaXRpb25hbFBhdHRlcm5zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkaXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kaXIgPSBkaXI7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0RGlyKFByb2plY3QgcCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXREaXIocCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGF0dGVyblNldCBjcmVhdGVQYXR0ZXJuU2V0KCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBQYXR0ZXJuU2V0IHBhdHRlcm5zID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgYWRkaXRpb25hbFBhdHRlcm5zLmFkZEVsZW1lbnQocGF0dGVybnMpOwotICAgICAgICByZXR1cm4gcGF0dGVybnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGUoKSB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZhdWx0UGF0dGVybnMuY3JlYXRlSW5jbHVkZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZXNGaWxlKCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUluY2x1ZGVzRmlsZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBleGNsdWRlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlRXhjbHVkZSgpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRQYXR0ZXJucy5jcmVhdGVFeGNsdWRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBmaWxlcyBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUV4Y2x1ZGVzRmlsZSgpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRQYXR0ZXJucy5jcmVhdGVFeGNsdWRlc0ZpbGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdFBhdHRlcm5zLnNldEluY2x1ZGVzKGluY2x1ZGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXQgb2YgZXhjbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCi0gICAgICogb3IgYSBzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGNsdWRlcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGUgcGF0dGVybnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmcgZXhjbHVkZXMpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0UGF0dGVybnMuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW5jbHVkZXMgcGF0dGVybnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5jbCBUaGUgZmlsZSB0byBmZXRjaCB0aGUgaW5jbHVkZSBwYXR0ZXJucyBmcm9tLiAgCi0gICAgICovCi0gICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzZmlsZShGaWxlIGluY2wpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGRlZmF1bHRQYXR0ZXJucy5zZXRJbmNsdWRlc2ZpbGUoaW5jbCk7Ci0gICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW5jbHVkZXMgcGF0dGVybnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjbCBUaGUgZmlsZSB0byBmZXRjaCB0aGUgZXhjbHVkZSBwYXR0ZXJucyBmcm9tLiAgCi0gICAgICovCi0gICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzZmlsZShGaWxlIGV4Y2wpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGRlZmF1bHRQYXR0ZXJucy5zZXRFeGNsdWRlc2ZpbGUoZXhjbCk7Ci0gICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIHVzZURlZmF1bHRFeGNsdWRlcyAidHJ1ZSJ8Im9uInwieWVzIiB3aGVuIGRlZmF1bHQgZXhjbHVzaW9ucyAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkLCAiZmFsc2UifCJvZmYifCJubyIgd2hlbiB0aGV5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRuJ3QgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0ZXhjbHVkZXMoYm9vbGVhbiB1c2VEZWZhdWx0RXhjbHVkZXMpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnVzZURlZmF1bHRFeGNsdWRlcyA9IHVzZURlZmF1bHRFeGNsdWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXJlY3Rvcnkgc2Nhbm5lciBuZWVkZWQgdG8gYWNjZXNzIHRoZSBmaWxlcyB0byBwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBEaXJlY3RvcnlTY2FubmVyIGdldERpcmVjdG9yeVNjYW5uZXIoUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmdldERpcmVjdG9yeVNjYW5uZXIocCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gZGlyZWN0b3J5IHNwZWNpZmllZCBmb3IgZmlsZXNldC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZGlyLmdldEFic29sdXRlUGF0aCgpKyIgbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkaXIuZ2V0QWJzb2x1dGVQYXRoKCkrIiBpcyBub3QgYSBkaXJlY3RvcnkuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgICAgc2V0dXBEaXJlY3RvcnlTY2FubmVyKGRzLCBwKTsKLSAgICAgICAgZHMuc2NhbigpOwotICAgICAgICByZXR1cm4gZHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldHVwRGlyZWN0b3J5U2Nhbm5lcihGaWxlU2Nhbm5lciBkcywgUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmIChkcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkcyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBkcy5zZXRCYXNlZGlyKGRpcik7Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFkZGl0aW9uYWxQYXR0ZXJucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBhZGRpdGlvbmFsUGF0dGVybnMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgZGVmYXVsdFBhdHRlcm5zLmFwcGVuZCgoUGF0dGVyblNldCkgbywgcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwLmxvZyggIkZpbGVTZXQ6IFNldHVwIGZpbGUgc2Nhbm5lciBpbiBkaXIgIiArIGRpciArIAotICAgICAgICAgICAgIiB3aXRoICIgKyBkZWZhdWx0UGF0dGVybnMsIHAuTVNHX0RFQlVHICk7Ci0gICAgICAgIAotICAgICAgICBkcy5zZXRJbmNsdWRlcyhkZWZhdWx0UGF0dGVybnMuZ2V0SW5jbHVkZVBhdHRlcm5zKHApKTsKLSAgICAgICAgZHMuc2V0RXhjbHVkZXMoZGVmYXVsdFBhdHRlcm5zLmdldEV4Y2x1ZGVQYXR0ZXJucyhwKSk7Ci0gICAgICAgIGlmICh1c2VEZWZhdWx0RXhjbHVkZXMpIGRzLmFkZERlZmF1bHRFeGNsdWRlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZWZlcmVuY2VkIEZpbGVTZXQuICAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZVNldCBnZXRSZWYoUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmICghY2hlY2tlZCkgewotICAgICAgICAgICAgU3RhY2sgc3RrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgICAgICBzdGsucHVzaCh0aGlzKTsKLSAgICAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgT2JqZWN0IG8gPSByZWYuZ2V0UmVmZXJlbmNlZE9iamVjdChwKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEZpbGVTZXQpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gcmVmLmdldFJlZklkKCkrIiBkb2VzblwndCBkZW5vdGUgYSBmaWxlc2V0IjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChGaWxlU2V0KSBvOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg3ZGI3Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwotCi0vLyBqYXZhIGlvIGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLy8gamF2YSB1dGlsIGNsYXNzZXMKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBhbnQgY2xhc3NlcwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLQotLyoqCi0gKiBBIHNldCBvZiBmaWx0ZXJzIHRvIGJlIGFwcGxpZWQgdG8gc29tZXRoaW5nLgotICoKLSAqIEEgZmlsdGVyIHNldCBtYXkgaGF2ZSBzdGFydHRva2VuIGFuZCBlbmR0b2tlbnMgZGVmaW5lZC4KLSAqCi0gKiBAYXV0aG9yICAgICA8QSBocmVmPSJtYWlsdG86Z2hvbGFtQHh0cmEuY28ubnoiPiAgTWljaGFlbCBNY0NhbGx1bSAgPC9BPgotICogQGNyZWF0ZWQgICAxNCBNYXJjaCAyMDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJTZXQgZXh0ZW5kcyBEYXRhVHlwZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaXZpZHVhbCBmaWx0ZXIgY29tcG9uZW50IG9mIGZpbHRlcnNldAotICAgICAqCi0gICAgICogQGF1dGhvciAgICBNaWNoYWVsIE1jQ2FsbHVtCi0gICAgICogQGNyZWF0ZWQgICAxNCBNYXJjaCAyMDAxCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXIgewotICAgICAgICAvKiogVG9rZW4gd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBpbiB0aGUgZmlsdGVyIG9wZXJhdGlvbiAqLwotICAgICAgICBTdHJpbmcgdG9rZW47Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHZhbHVlIHdoaWNoIHdpbGwgcmVwbGFjZSB0aGUgdG9rZW4gaW4gdGhlIGZpbHRlcmluZyBvcGVyYXRpb24gKi8KLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgRmlsdGVyIG9iamVjdAotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdG9rZW4gIFRoZSB0b2tlbiB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIHdoZW4gZmlsdGVyaW5nCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSAgVGhlIHZhbHVlIHdoaWNoIHdpbGwgcmVwbGFjZSB0aGUgdG9rZW4gd2hlbiBmaWx0ZXJpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGaWx0ZXIoU3RyaW5nIHRva2VuLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuOwotICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBObyBhcmd1bWVudCBjb25tc3RydWN0b3IKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGaWx0ZXIoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBUb2tlbiBhdHRyaWJ1dGUgb2YgdGhlIEZpbHRlciBvYmplY3QKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRva2VuICBUaGUgbmV3IFRva2VuIHZhbHVlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUb2tlbiggU3RyaW5nIHRva2VuICkgewotICAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBWYWx1ZSBhdHRyaWJ1dGUgb2YgdGhlIEZpbHRlciBvYmplY3QKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZhbHVlICBUaGUgbmV3IFZhbHVlIHZhbHVlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZSggU3RyaW5nIHZhbHVlICkgewotICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBUb2tlbiBhdHRyaWJ1dGUgb2YgdGhlIEZpbHRlciBvYmplY3QKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiAgIFRoZSBUb2tlbiB2YWx1ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUb2tlbigpIHsKLSAgICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgVmFsdWUgYXR0cmlidXRlIG9mIHRoZSBGaWx0ZXIgb2JqZWN0Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gICBUaGUgVmFsdWUgdmFsdWUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGZpbHRlcnNmaWxlIG5lc3RlZCBlbGVtZW50LgotICAgICAqCi0gICAgICogQGF1dGhvciAgICBNaWNoYWVsIE1jQ2FsbHVtCi0gICAgICogQGNyZWF0ZWQgICBUaHVyc2RheSwgQXByaWwgMTksIDIwMDEKLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRmlsdGVyc0ZpbGUgewotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgRmlsdGVyIG9iamVjdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZpbHRlcnNGaWxlKCkgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgZmlsZSBmcm9tIHdoaWNoIGZpbHRlcnMgd2lsbCBiZSByZWFkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBmcm9tIHdoaWNoIGZpbHRlcnMgd2lsbCBiZSByZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgICAgcmVhZEZpbHRlcnNGcm9tRmlsZShmaWxlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiogVGhlIGRlZmF1bHQgdG9rZW4gc3RhcnQgc3RyaW5nICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UT0tFTl9TVEFSVCA9ICJAIjsKLSAgICAKLSAgICAvKiogVGhlIGRlZmF1bHQgdG9rZW4gZW5kIHN0cmluZyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVE9LRU5fRU5EID0gIkAiOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHN0YXJ0T2ZUb2tlbiA9IERFRkFVTFRfVE9LRU5fU1RBUlQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kT2ZUb2tlbiA9IERFRkFVTFRfVE9LRU5fRU5EOwotICAgIAotICAgIC8qKgotICAgICAqIExpc3Qgb2Ygb3JkZXJlZCBmaWx0ZXJzIGFuZCBmaWx0ZXIgZmlsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsdGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICBwdWJsaWMgRmlsdGVyU2V0KCkgewotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBGaWx0ZXJzZXQgZnJvbSBhbm90aGVyIGZpbHRlcnNldAotICAgICAqCi0gICAgICogQHBhcmFtIGZpbHRlcnNldCB0aGUgZmlsdGVyc2V0IHVwb24gd2hpY2ggdGhpcyBmaWx0ZXJzZXQgd2lsbCBiZSBiYXNlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsdGVyU2V0KEZpbHRlclNldCBmaWx0ZXJzZXQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5maWx0ZXJzID0gKFZlY3RvcilmaWx0ZXJzZXQuZ2V0RmlsdGVycygpLmNsb25lKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFZlY3RvciBnZXRGaWx0ZXJzKCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldEZpbHRlcnMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsdGVyczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmlsdGVyU2V0IGdldFJlZigpIHsKLSAgICAgICAgcmV0dXJuIChGaWx0ZXJTZXQpZ2V0Q2hlY2tlZFJlZihGaWx0ZXJTZXQuY2xhc3MsICJmaWx0ZXJzZXQiKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmlsdGVyIGhhc2ggb2YgdGhlIEZpbHRlclNldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gICBUaGUgaGFzaCBvZiB0aGUgdG9rZW5zIGFuZCB2YWx1ZXMgZm9yIHF1aWNrIGxvb2t1cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEZpbHRlckhhc2goKSB7Ci0gICAgICAgIGludCBmaWx0ZXJTaXplID0gZ2V0RmlsdGVycygpLnNpemUoKTsKLSAgICAgICAgSGFzaHRhYmxlIGZpbHRlckhhc2ggPSBuZXcgSGFzaHRhYmxlKGZpbHRlclNpemUpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBnZXRGaWx0ZXJzKCkuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgRmlsdGVyIGZpbHRlciA9IChGaWx0ZXIpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgZmlsdGVySGFzaC5wdXQoZmlsdGVyLmdldFRva2VuKCksIGZpbHRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsdGVySGFzaDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogc2V0IHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZpbHRlcnMgZm9yIHRoaXMgZmlsdGVyc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbHRlcnNGaWxlIHNldHMgdGhlIGZpbHRlciBmaWwgdG8gcmVhZCBmaWx0ZXJzIGZvciB0aGlzIGZpbHRlciBzZXQgZnJvbS4KLSAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBmaWx0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsdGVyc2ZpbGUoRmlsZSBmaWx0ZXJzRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVhZEZpbHRlcnNGcm9tRmlsZShmaWx0ZXJzRmlsZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBzdHJpbmcgdXNlZCB0byBpZCB0aGUgYmVnaW5uaW5nIG9mIGEgdG9rZW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRPZlRva2VuICBUaGUgbmV3IEJlZ2ludG9rZW4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWdpblRva2VuKFN0cmluZyBzdGFydE9mVG9rZW4pIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zdGFydE9mVG9rZW4gPSBzdGFydE9mVG9rZW47Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCZWdpblRva2VuKCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldEJlZ2luVG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhcnRPZlRva2VuOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgc3RyaW5nIHVzZWQgdG8gaWQgdGhlIGVuZCBvZiBhIHRva2VuLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuZE9mVG9rZW4gIFRoZSBuZXcgRW5kdG9rZW4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRUb2tlbiggU3RyaW5nIGVuZE9mVG9rZW4gKSB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZW5kT2ZUb2tlbiA9IGVuZE9mVG9rZW47Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmRUb2tlbigpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRFbmRUb2tlbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmRPZlRva2VuOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBmaWx0ZXJzIGZyb20gdGhlIGdpdmVuIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsdGVyc0ZpbGUgICAgICAgICB0aGUgZmlsZSBmcm9tIHdoaWNoIGZpbHRlcnMgYXJlIHJlYWQKLSAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uICBUaHJvdyBhIGJ1aWxkIGV4Y2VwdGlvbiB3aGVuIHVuYWJsZSB0byByZWFkIHRoZQotICAgICAqIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZEZpbHRlcnNGcm9tRmlsZShGaWxlIGZpbHRlcnNGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWx0ZXJzRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICBsb2coIlJlYWRpbmcgZmlsdGVycyBmcm9tICIgKyBmaWx0ZXJzRmlsZSwgUHJvamVjdC5NU0dfVkVSQk9TRSApOwotICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbHRlcnNGaWxlKTsKLSAgICAgICAgICAgICAgcHJvcHMubG9hZChpbik7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gcHJvcHMucHJvcGVydHlOYW1lcygpOwotICAgICAgICAgICAgICBWZWN0b3IgZmlsdGVycyA9IGdldEZpbHRlcnMoKTsKLSAgICAgICAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHN0clByb3BOYW1lID0gKFN0cmluZykgZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShzdHJQcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgIGZpbHRlcnMuYWRkRWxlbWVudChuZXcgRmlsdGVyKHN0clByb3BOYW1lLCBzdHJWYWx1ZSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIkNvdWxkIG5vdCByZWFkIGZpbHRlcnMgZnJvbSBmaWxlOiAiICsgZmlsdGVyc0ZpbGUgKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgaWYgKCBpbiAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4KSB7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggIk11c3Qgc3BlY2lmeSBhIGZpbGUgbm90IGEgZGlyZWN0b3J5IGluIHRoZSBmaWx0ZXJzZmlsZSBhdHRyaWJ1dGU6IiArIGZpbHRlcnNGaWxlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRG9lcyByZXBsYWNlbWVudCBvbiB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggdG9rZW4gbWF0Y2hpbmcuCi0gICAgICogVGhpcyB1c2VzIHRoZSBkZWZpbmVkIHN0YXJ0dG9rZW4gYW5kIGVuZHRva2VuIHZhbHVlcyB3aGljaCBkZWZhdWx0IHRvIEAgZm9yIGJvdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGluZSAgVGhlIGxpbmUgdG8gcHJvY2VzcyB0aGUgdG9rZW5zIGluLgotICAgICAqIEByZXR1cm4gICAgICBUaGUgc3RyaW5nIHdpdGggdGhlIHRva2VucyByZXBsYWNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlcGxhY2VUb2tlbnMoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgU3RyaW5nIGJlZ2luVG9rZW4gPSBnZXRCZWdpblRva2VuKCk7Ci0gICAgICAgIFN0cmluZyBlbmRUb2tlbiA9IGdldEVuZFRva2VuKCk7Ci0gICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZihiZWdpblRva2VuKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChpbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICBIYXNodGFibGUgdG9rZW5zID0gZ2V0RmlsdGVySGFzaCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gbGluZS5pbmRleE9mKGVuZFRva2VuLCBpbmRleCArIGJlZ2luVG9rZW4ubGVuZ3RoKCkgKyAxICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBsaW5lLnN1YnN0cmluZyhpbmRleCArIGJlZ2luVG9rZW4ubGVuZ3RoKCksIGVuZEluZGV4ICk7Ci0gICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKGksIGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnNLZXkodG9rZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpdG9rZW5zLmdldCh0b2tlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coICJSZXBsYWNpbmc6ICIgKyBiZWdpblRva2VuICsgdG9rZW4gKyBlbmRUb2tlbiArICIgLT4gIiArIHZhbHVlLCBQcm9qZWN0Lk1TR19WRVJCT1NFICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpID0gaW5kZXggKyBiZWdpblRva2VuLmxlbmd0aCgpICsgdG9rZW4ubGVuZ3RoKCkgKyBlbmRUb2tlbi5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYXBwZW5kIGJlZ2luVG9rZW4gYW5kIHNlYXJjaCBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZChiZWdpblRva2VuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpbmRleCArIGJlZ2luVG9rZW4ubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlICgoaW5kZXggPSBsaW5lLmluZGV4T2YoIGJlZ2luVG9rZW4sIGkgKSkgPiAtMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKGkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICByZXR1cm4gbGluZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgZmlsdGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIHRoZSBmaWx0ZXIgdG8gYmUgYWRkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoRmlsdGVyIGZpbHRlcikgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBmaWx0ZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEZpbHRlcnNGaWxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgVGhlIGZpbHRlciB0aGF0IHdhcyBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWx0ZXJzRmlsZSBjcmVhdGVGaWx0ZXJzZmlsZSgpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJzRmlsZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAqIEFkZCBhIG5ldyBmaWx0ZXIgbWFkZSBmcm9tIHRoZSBnaXZlbiB0b2tlbiBhbmQgdmFsdWUuCi0gICAgKgotICAgICogQHBhcmFtIHRva2VuICBUaGUgdG9rZW4gZm9yIHRoZSBuZXcgZmlsdGVyLgotICAgICogQHBhcmFtIHZhbHVlICBUaGUgdmFsdWUgZm9yIHRoZSBuZXcgZmlsdGVyLgotICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsdGVyKFN0cmluZyB0b2tlbiwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbHRlcnMuYWRkRWxlbWVudChuZXcgRmlsdGVyKHRva2VuLCB2YWx1ZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAqIEFkZCBhIEZpbHRlcnNldCB0byB0aGlzIGZpbHRlciBzZXQKLSAgICAqCi0gICAgKiBAcGFyYW0gZmlsdGVyU2V0IHRoZSBmaWx0ZXJzZXQgdG8gYmUgYWRkZWQgdG8gdGhpcyBmaWx0ZXJzZXQKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbHRlclNldChGaWx0ZXJTZXQgZmlsdGVyU2V0KSB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGZpbHRlclNldC5nZXRGaWx0ZXJzKCkuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIGZpbHRlcnMuYWRkRWxlbWVudCgoRmlsdGVyKWUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgKiBUZXN0IHRvIHNlZSBpZiB0aGlzIGZpbHRlciBzZXQgaXQgZW1wdHkuCi0gICAgKgotICAgICogQHJldHVybiAgIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBmaWx0ZXIgaW4gdGhpcyBzZXQgb3RoZXJ3aXNlIGZhbHNlLgotICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRmlsdGVycygpIHsKLSAgICAgICAgcmV0dXJuIGdldEZpbHRlcnMoKS5zaXplKCkgPiAwOwotICAgIH0KLX0KLSAKLQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJTZXRDb2xsZWN0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJTZXRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjhiZjAuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwotCi0vLyBqYXZhIGlvIGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLy8gamF2YSB1dGlsIGNsYXNzZXMKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBhbnQgY2xhc3NlcwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLQotLyoqCi0gKiBBIEZpbHRlclNldENvbGxlY3Rpb24gaXMgYSBjb2xsZWN0aW9uIG9mIGZpbHRlcnNldHMgZWFjaCBvZiB3aGljaCBtYXkgaGF2ZQotICogYSBkaWZmZXJlbnQgc3RhcnQvZW5kIHRva2VuIHNldHRpbmdzLgotICoKLSAqIEBhdXRob3IgICAgIDxBIGhyZWY9Im1haWx0bzpjb25vckBhcGFjaGUub3JnIj5Db25vciBNYWNOZWlsbDwvQT4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclNldENvbGxlY3Rpb24gewotICAgIAotICAgIHByaXZhdGUgVmVjdG9yIGZpbHRlclNldHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgRmlsdGVyU2V0Q29sbGVjdGlvbigpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZpbHRlclNldENvbGxlY3Rpb24oRmlsdGVyU2V0IGZpbHRlclNldCkgewotICAgICAgICBhZGRGaWx0ZXJTZXQoZmlsdGVyU2V0KTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkRmlsdGVyU2V0KEZpbHRlclNldCBmaWx0ZXJTZXQpIHsKLSAgICAgICAgZmlsdGVyU2V0cy5hZGRFbGVtZW50KGZpbHRlclNldCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERvZXMgcmVwbGFjZW1lbnQgb24gdGhlIGdpdmVuIHN0cmluZyB3aXRoIHRva2VuIG1hdGNoaW5nLgotICAgICAqIFRoaXMgdXNlcyB0aGUgZGVmaW5lZCBzdGFydHRva2VuIGFuZCBlbmR0b2tlbiB2YWx1ZXMgd2hpY2ggZGVmYXVsdCB0byBAIGZvciBib3RoLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpbmUgIFRoZSBsaW5lIHRvIHByb2Nlc3MgdGhlIHRva2VucyBpbi4KLSAgICAgKiBAcmV0dXJuICAgICAgVGhlIHN0cmluZyB3aXRoIHRoZSB0b2tlbnMgcmVwbGFjZWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZXBsYWNlVG9rZW5zKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIFN0cmluZyByZXBsYWNlZExpbmUgPSBsaW5lOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWx0ZXJTZXRzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBGaWx0ZXJTZXQgZmlsdGVyU2V0ID0gKEZpbHRlclNldCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICByZXBsYWNlZExpbmUgPSBmaWx0ZXJTZXQucmVwbGFjZVRva2VucyhyZXBsYWNlZExpbmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBsYWNlZExpbmU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICogVGVzdCB0byBzZWUgaWYgdGhpcyBmaWx0ZXIgc2V0IGl0IGVtcHR5LgotICAgICoKLSAgICAqIEByZXR1cm4gICBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgZmlsdGVyIGluIHRoaXMgc2V0IG90aGVyd2lzZSBmYWxzZS4KLSAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpbHRlcnMoKSB7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGZpbHRlclNldHMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIEZpbHRlclNldCBmaWx0ZXJTZXQgPSAoRmlsdGVyU2V0KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJTZXQuaGFzRmlsdGVycygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLSAKLQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9NYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjEwN2RkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBFbGVtZW50IHRvIGRlZmluZSBhIEZpbGVOYW1lTWFwcGVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBwZXIgZXh0ZW5kcyBEYXRhVHlwZSB7Ci0KLSAgICBwcm90ZWN0ZWQgUHJvamVjdCBwOwotCi0gICAgcHJvdGVjdGVkIE1hcHBlclR5cGUgdHlwZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgTWFwcGVyKFByb2plY3QgcCkgewotICAgICAgICB0aGlzLnAgPSBwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdHlwZSBvZiBGaWxlTmFtZU1hcHBlciB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShNYXBwZXJUeXBlIHR5cGUpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzbmFtZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIEZpbGVOYW1lTWFwcGVyIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUGF0aCBjbGFzc3BhdGggPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gbG9hZCB0aGUgRmlsZU5hbWVNYXBwZXIgdGhyb3VnaCAoYXR0cmlidXRlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBsb2FkIHRoZSBGaWxlTmFtZU1hcHBlciB0aHJvdWdoIChuZXN0ZWQgZWxlbWVudCkuCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5jbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGxvYWQgdGhlIEZpbGVOYW1lTWFwcGVyIHRocm91Z2ggdmlhCi0gICAgICogcmVmZXJlbmNlIChhdHRyaWJ1dGUpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZyb20gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBhcmd1bWVudCB0byBGaWxlTmFtZU1hcHBlci5zZXRGcm9tCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmZyb20gPSBmcm9tOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgdG8gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBhcmd1bWVudCB0byBGaWxlTmFtZU1hcHBlci5zZXRUbwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnRvID0gdG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZSB0aGlzIE1hcHBlciBpbnN0YW5jZSBhIHJlZmVyZW5jZSB0byBhbm90aGVyIE1hcHBlci4KLSAgICAgKgotICAgICAqIDxwPllvdSBtdXN0IG5vdCBzZXQgYW55IG90aGVyIGF0dHJpYnV0ZSBpZiB5b3UgbWFrZSBpdCBhCi0gICAgICogcmVmZXJlbmNlLjwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCB8fCBmcm9tICE9IG51bGwgfHwgdG8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZnVsbHkgY29uZmlndXJlZCBGaWxlTmFtZU1hcHBlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZU5hbWVNYXBwZXIgZ2V0SW1wbGVtZW50YXRpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldEltcGxlbWVudGF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IG51bGwgJiYgY2xhc3NuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25lIG9mIHRoZSBhdHRyaWJ1dGVzIHR5cGUgb3IgY2xhc3NuYW1lIGlzIHJlcXVpcmVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIGNsYXNzbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm11c3Qgbm90IHNwZWNpZnkgYm90aCB0eXBlIGFuZCBjbGFzc25hbWUgYXR0cmlidXRlIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IHR5cGUuZ2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2xhc3MgYyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBhbCA9IG5ldyBBbnRDbGFzc0xvYWRlcihwLCBjbGFzc3BhdGgpOwotICAgICAgICAgICAgICAgIGMgPSBhbC5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICBBbnRDbGFzc0xvYWRlci5pbml0aWFsaXplQ2xhc3MoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG0gPSAoRmlsZU5hbWVNYXBwZXIpIGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIG0uc2V0RnJvbShmcm9tKTsKLSAgICAgICAgICAgIG0uc2V0VG8odG8pOwotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICB0aHJvdyBiZTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgY2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVmZXJlbmNlZCBNYXBwZXIuICAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwcGVyIGdldFJlZigpIHsKLSAgICAgICAgaWYgKCFjaGVja2VkKSB7Ci0gICAgICAgICAgICBTdGFjayBzdGsgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgICAgIHN0ay5wdXNoKHRoaXMpOwotICAgICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZShzdGssIHApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgbyA9IHJlZi5nZXRSZWZlcmVuY2VkT2JqZWN0KHApOwotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwcGVyKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHJlZi5nZXRSZWZJZCgpKyIgZG9lc25cJ3QgZGVub3RlIGEgbWFwcGVyIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChNYXBwZXIpIG87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzcyBhcyBBcmd1bWVudCB0byBGaWxlTmFtZU1hcHBlci5zZXRUeXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwcGVyVHlwZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotICAgICAgICBwcml2YXRlIFByb3BlcnRpZXMgaW1wbGVtZW50YXRpb25zOwotCi0gICAgICAgIHB1YmxpYyBNYXBwZXJUeXBlKCkgewotICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy5wdXQoImlkZW50aXR5IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLklkZW50aXR5TWFwcGVyIik7Ci0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMucHV0KCJmbGF0dGVuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZsYXRGaWxlTmFtZU1hcHBlciIpOwotICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLnB1dCgiZ2xvYiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5HbG9iUGF0dGVybk1hcHBlciIpOwotICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLnB1dCgibWVyZ2UiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTWVyZ2luZ01hcHBlciIpOwotICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLnB1dCgicmVnZXhwIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlZ2V4cFBhdHRlcm5NYXBwZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiaWRlbnRpdHkiLCAiZmxhdHRlbiIsICJnbG9iIiwgIm1lcmdlIiwgInJlZ2V4cCJ9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbnMuZ2V0UHJvcGVydHkoZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTg0MmIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUGF0aFRva2VuaXplcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgcmVwcmVzZW50cyBhIHBhdGggYXMgdXNlZCBieSBDTEFTU1BBVEggb3IgUEFUSAotICogZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gKiA8cD4KLSAqIDxjb2RlPgotICogJmx0O3NvbWV0YXNrJmd0Ozxicj4KLSAqICZuYnNwOyZuYnNwOyZsdDtzb21lcGF0aCZndDs8YnI+Ci0gKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249Ii9wYXRoL3RvL2ZpbGUuamFyIiAvJmd0Ozxicj4KLSAqICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwYXRoZWxlbWVudCBwYXRoPSIvcGF0aC90by9maWxlMi5qYXI6L3BhdGgvdG8vY2xhc3MyOy9wYXRoL3RvL2NsYXNzMyIgLyZndDs8YnI+Ci0gKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249Ii9wYXRoL3RvL2ZpbGUzLmphciIgLyZndDs8YnI+Ci0gKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249Ii9wYXRoL3RvL2ZpbGU0LmphciIgLyZndDs8YnI+Ci0gKiAmbmJzcDsmbmJzcDsmbHQ7L3NvbWVwYXRoJmd0Ozxicj4KLSAqICZsdDsvc29tZXRhc2smZ3Q7PGJyPgotICogPC9jb2RlPgotICogPHA+Ci0gKiBUaGUgb2JqZWN0IGltcGxlbWVudGlvbiA8Y29kZT5zb21ldGFzazwvY29kZT4gbXVzdCBwcm92aWRlIGEgbWV0aG9kIGNhbGxlZAotICogPGNvZGU+Y3JlYXRlU29tZXBhdGg8L2NvZGU+IHdoaWNoIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+UGF0aDwvY29kZT4uCi0gKiBOZXN0ZWQgcGF0aCBkZWZpbml0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUgUGF0aCBvYmplY3QgYW5kIG11c3QgYmUgbGFiZWxlZAotICogPGNvZGU+cGF0aGVsZW1lbnQ8L2NvZGU+LjxwPgotICoKLSAqIFRoZSBwYXRoIGVsZW1lbnQgdGFrZXMgYSBwYXJhbWV0ZXIgPGNvZGU+cGF0aDwvY29kZT4gd2hpY2ggd2lsbCBiZSBwYXJzZWQKLSAqIGFuZCBzcGxpdCBpbnRvIHNpbmdsZSBlbGVtZW50cy4gSXQgd2lsbCB1c3VhbGx5IGJlIHVzZWQKLSAqIHRvIGRlZmluZSBhIHBhdGggZnJvbSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSAqCi0gKiBAYXV0aG9yIFRob21hcy5IYWFzQHNvZnR3aXJlZC1pbmMuY29tCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFBhdGggZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLSAgICBwcml2YXRlIFZlY3RvciBlbGVtZW50czsKLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBzeXN0ZW1DbGFzc3BhdGggPSAKLSAgICAgICAgbmV3IFBhdGgobnVsbCwgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7Ci0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBjbGFzcywgaG9sZHMgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7cGF0aGVsZW1lbnQmZ3Q7PC9jb2RlPiB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFBhdGhFbGVtZW50IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJ0czsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihGaWxlIGxvYykgewotICAgICAgICAgICAgcGFydHMgPSBuZXcgU3RyaW5nW10ge3RyYW5zbGF0ZUZpbGUobG9jLmdldEFic29sdXRlUGF0aCgpKX07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgICAgICBwYXJ0cyA9IFBhdGgudHJhbnNsYXRlUGF0aChwcm9qZWN0LCBwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0cygpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJ0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZWQgYnkgSW50cm9zcGVjdGlvbkhlbHBlciBmb3IgPGNvZGU+c2V0WFhYKFBhdGggcCk8L2NvZGU+Ci0gICAgICogYXR0cmlidXRlIHNldHRlcnMuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aChQcm9qZWN0IHAsIFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHRoaXMocCk7Ci0gICAgICAgIGNyZWF0ZVBhdGhFbGVtZW50KCkuc2V0UGF0aChwYXRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGF0aChQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgZWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHApIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcDsKLSAgICB9Ci0gICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHtyZXR1cm4gcHJvamVjdDt9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZWxlbWVudCBkZWZpbml0aW9uIHRvIHRoZSBwYXRoLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgdG8gYWRkIChtdXN0IG5vdCBiZQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG5vciBlbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihGaWxlIGxvY2F0aW9uKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBjcmVhdGVQYXRoRWxlbWVudCgpLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIHBhdGggZGVmaW5pdGlvbiBhbmQgY3JlYXRlcyBzaW5nbGUgUGF0aEVsZW1lbnRzLgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlUGF0aEVsZW1lbnQoKS5zZXRQYXRoKHBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUGF0aCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIDxwPllvdSBtdXN0IG5vdCBzZXQgYW5vdGhlciBhdHRyaWJ1dGUgb3IgbmVzdCBlbGVtZW50cyBpbnNpZGUKLSAgICAgKiB0aGlzIGVsZW1lbnQgaWYgeW91IG1ha2UgaXQgYSByZWZlcmVuY2UuPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtZW50cy5hZGRFbGVtZW50KHIpOwotICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O3BhdGhlbGVtZW50Jmd0OzwvY29kZT4gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aEVsZW1lbnQgY3JlYXRlUGF0aEVsZW1lbnQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBQYXRoRWxlbWVudCBwZSA9IG5ldyBQYXRoRWxlbWVudCgpOwotICAgICAgICBlbGVtZW50cy5hZGRFbGVtZW50KHBlKTsKLSAgICAgICAgcmV0dXJuIHBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBmcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudHMuYWRkRWxlbWVudChmcyk7Ci0gICAgICAgIGNoZWNrZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVQYXRoKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIGVsZW1lbnRzLmFkZEVsZW1lbnQocCk7Ci0gICAgICAgIGNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kIHRoZSBjb250ZW50cyBvZiB0aGUgb3RoZXIgUGF0aCBpbnN0YW5jZSB0byB0aGlzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZChQYXRoIG90aGVyKSB7Ci0gICAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgIFN0cmluZ1tdIGwgPSBvdGhlci5saXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxsLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudHMuaW5kZXhPZihsW2ldKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZEVsZW1lbnQobFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAgLyoqCi0gICAgICogQWRkcyB0aGUgY29tcG9uZW50cyBvbiB0aGUgZ2l2ZW4gcGF0aCB3aGljaCBleGlzdCB0byB0aGlzCi0gICAgICogUGF0aC4gQ29tcG9uZW50cyB0aGF0IGRvbid0IGV4aXN0LCBhcmVuJ3QgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlIC0gc291cmNlIHBhdGggd2hvc2UgY29tcG9uZW50cyBhcmUgZXhhbWluZWQgZm9yIGV4aXN0ZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEV4aXN0aW5nKFBhdGggc291cmNlKSB7Ci0gICAgICAgIFN0cmluZ1tdIGxpc3QgPSBzb3VyY2UubGlzdCgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBmID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmID0gcHJvamVjdC5yZXNvbHZlRmlsZShsaXN0W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShsaXN0W2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRMb2NhdGlvbihmKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBwYXRoIGVsZW1lbnRzIGRlZmluZWQgYnkgdGhpcyBhbmQgbmVzdGVkIHBhdGggb2JqZWN0cy4KLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgcGF0aCBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gbGlzdCgpIHsKLSAgICAgICAgaWYgKCFjaGVja2VkKSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhIGNpcmN1bGFyIHJlZmVyZW5jZSBoZXJlCi0gICAgICAgICAgICBTdGFjayBzdGsgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgICAgIHN0ay5wdXNoKHRoaXMpOwotICAgICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZShzdGssIHByb2plY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoMiplbGVtZW50cy5zaXplKCkpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gZWxlbWVudHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICBSZWZlcmVuY2UgciA9IChSZWZlcmVuY2UpIG87Ci0gICAgICAgICAgICAgICAgbyA9IHIuZ2V0UmVmZXJlbmNlZE9iamVjdChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgcmVmZXJlbmNlcyB0byBwYXRocyByaWdodCBub3cKLSAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHIuZ2V0UmVmSWQoKSsiIGRvZXNuXCd0IGRlbm90ZSBhIHBhdGgiOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgLy8gb2J0YWluZWQgdmlhIGFwcGVuZAotICAgICAgICAgICAgICAgIGFkZFVubGVzc1ByZXNlbnQocmVzdWx0LCAoU3RyaW5nKSBvKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFBhdGhFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSAoKFBhdGhFbGVtZW50KSBvKS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3QgZWl0aGVyIHNldCBsb2NhdGlvbiBvciBwYXRoIG9uIDxwYXRoZWxlbWVudD4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFVubGVzc1ByZXNlbnQocmVzdWx0LCBwYXJ0c1tqXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgUGF0aCkgewotICAgICAgICAgICAgICAgIFBhdGggcCA9IChQYXRoKSBvOwotICAgICAgICAgICAgICAgIGlmIChwLmdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAuc2V0UHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBwLmxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8cGFydHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkVW5sZXNzUHJlc2VudChyZXN1bHQsIHBhcnRzW2pdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGaWxlU2V0KSB7Ci0gICAgICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBvOwotICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBkaXIgPSBmcy5nZXREaXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlUGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFVubGVzc1ByZXNlbnQocmVzdWx0LCB0cmFuc2xhdGVGaWxlKGFic29sdXRlUGF0aCkpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gcmVzID0gbmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXTsKLSAgICAgICAgcmVzdWx0LmNvcHlJbnRvKHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aCwgd2hpY2ggY2FuIGJlIHVzZWQgYXMKLSAgICAgKiBDTEFTU1BBVEggb3IgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZWZpbml0aW9uLgotICAgICAqIEByZXR1cm4gYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpc3QgPSBsaXN0KCk7Ci0KLSAgICAgICAgLy8gZW1wdHkgcGF0aCByZXR1cm4gZW1wdHkgc3RyaW5nCi0gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PSAwKSByZXR1cm4gIiI7Ci0KLSAgICAgICAgLy8gcGF0aCBjb250YWluaW5nIG9uZSBvciBtb3JlIGVsZW1lbnRzCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGxpc3RbMF0udG9TdHJpbmcoKSk7Ci0gICAgICAgIGZvciAoaW50IGk9MTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpc3RbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwbGl0cyBhIFBBVEggKHdpdGggOiBvciA7IGFzIHNlcGFyYXRvcnMpIGludG8gaXRzIHBhcnRzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdHJhbnNsYXRlUGF0aChQcm9qZWN0IHByb2plY3QsIFN0cmluZyBzb3VyY2UpIHsKLSAgICAgICAgZmluYWwgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKLQotICAgICAgICBQYXRoVG9rZW5pemVyIHRvayA9IG5ldyBQYXRoVG9rZW5pemVyKHNvdXJjZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBlbGVtZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgZWxlbWVudC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aEVsZW1lbnQgPSB0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kKHJlc29sdmVGaWxlKHByb2plY3QsIHBhdGhFbGVtZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJEcm9wcGluZyBwYXRoIGVsZW1lbnQgIiArIHBhdGhFbGVtZW50ICsgIiBhcyBpdCBpcyBub3QgdmFsaWQgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxlbGVtZW50Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0cmFuc2xhdGVGaWxlU2VwKGVsZW1lbnQsIGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFkZEVsZW1lbnQoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSByZXMgPSBuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldOwotICAgICAgICByZXN1bHQuY29weUludG8ocmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGl0cyBhcmd1bWVudCB3aXRoIGFsbCBmaWxlIHNlcGFyYXRvciBjaGFyYWN0ZXJzCi0gICAgICogcmVwbGFjZWQgc28gdGhhdCB0aGV5IG1hdGNoIHRoZSBsb2NhbCBPUyBjb252ZW50aW9ucy4gIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYW5zbGF0ZUZpbGUoU3RyaW5nIHNvdXJjZSkgewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiAiIjsKLQotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2UpOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCByZXN1bHQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgdHJhbnNsYXRlRmlsZVNlcChyZXN1bHQsIGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgYWxsIG9jY3VycmVuY2VzIG9mIC8gb3IgXCB0byBjb3JyZWN0IHNlcGFyYXRvciBvZiB0aGUKLSAgICAgKiBjdXJyZW50IHBsYXRmb3JtIGFuZCByZXR1cm5zIHdoZXRoZXIgaXQgaGFkIHRvIGRvIGFueQotICAgICAqIHJlcGxhY2VtZW50cy4gIAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB0cmFuc2xhdGVGaWxlU2VwKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3MpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5jaGFyQXQocG9zKSA9PSAnLycgfHwgYnVmZmVyLmNoYXJBdChwb3MpID09ICdcXCcpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5zZXRDaGFyQXQocG9zLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhvdyBtYW55IHBhcnRzIGRvZXMgdGhpcyBQYXRoIGluc3RhbmNlIGNvbnNpc3Qgb2YuCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gbGlzdCgpLmxlbmd0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBQYXRoIHRoYXQgaG9sZHMgdGhlIHNhbWUgZWxlbWVudHMgYXMgdGhpcyBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgcC5hcHBlbmQodGhpcyk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyB0aGUgdmVyc2lvbiBvZiBEYXRhVHlwZSB0byByZWN1cnNlIG9uIGFsbCBEYXRhVHlwZQotICAgICAqIGNoaWxkIGVsZW1lbnRzIHRoYXQgbWF5IGhhdmUgYmVlbiBhZGRlZC4gIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoU3RhY2sgc3RrLCBQcm9qZWN0IHApIAotICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChjaGVja2VkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gZWxlbWVudHMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICBvID0gKChSZWZlcmVuY2UpIG8pLmdldFJlZmVyZW5jZWRPYmplY3QocCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YVR5cGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RrLmNvbnRhaW5zKG8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RrLnB1c2gobyk7Ci0gICAgICAgICAgICAgICAgICAgICgoRGF0YVR5cGUpIG8pLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKLSAgICAgICAgICAgICAgICAgICAgc3RrLnBvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIGEgZmlsZW5hbWUgd2l0aCBQcm9qZWN0J3MgaGVscCAtIGlmIHdlIGtub3cgb25lIHRoYXQgaXMuCi0gICAgICoKLSAgICAgKiA8cD5Bc3N1bWUgdGhlIGZpbGVuYW1lIGlzIGFic29sdXRlIGlmIHByb2plY3QgaXMgbnVsbC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc29sdmVGaWxlKFByb2plY3QgcHJvamVjdCwgU3RyaW5nIHJlbGF0aXZlTmFtZSkgewotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHJlbGF0aXZlTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVsYXRpdmVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBTdHJpbmcgdG8gdGhlIFZlY3RvciBpZiBpdCBpc24ndCBhbHJlYWR5IGluY2x1ZGVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkVW5sZXNzUHJlc2VudChWZWN0b3IgdiwgU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHYuaW5kZXhPZihzKSA9PSAtMSkgewotICAgICAgICAgICAgdi5hZGRFbGVtZW50KHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uY2F0ZW5hdGVzIHRoZSBzeXN0ZW0gY2xhc3MgcGF0aCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5Ci0gICAgICogdGhlICR7YnVpbGQuc3lzY2xhc3NwYXRofSBwcm9wZXJ0eSAtIHVzaW5nICZxdW90O2xhc3QmcXVvdDsgYXMKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNvbmNhdFN5c3RlbUNsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbmNhdFN5c3RlbUNsYXNzcGF0aCgibGFzdCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmNhdGVuYXRlcyB0aGUgc3lzdGVtIGNsYXNzIHBhdGggaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieQotICAgICAqIHRoZSAke2J1aWxkLnN5c2NsYXNzcGF0aH0gcHJvcGVydHkgLSB1c2luZyB0aGUgc3VwcGxpZWQgdmFsdWUKLSAgICAgKiBpZiAke2J1aWxkLnN5c2NsYXNzcGF0aH0gaGFzIG5vdCBiZWVuIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjb25jYXRTeXN0ZW1DbGFzc3BhdGgoU3RyaW5nIGRlZlZhbHVlKSB7Ci0KLSAgICAgICAgUGF0aCByZXN1bHQgPSBuZXcgUGF0aChwcm9qZWN0KTsKLQotICAgICAgICBTdHJpbmcgb3JkZXIgPSBkZWZWYWx1ZTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG8gPSBwcm9qZWN0LmdldFByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcmRlciA9IG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChvcmRlci5lcXVhbHMoIm9ubHkiKSkgewotICAgICAgICAgICAgLy8gb25seTogdGhlIGRldmVsb3BlciBrbm93cyB3aGF0IChzKWhlIGlzIGRvaW5nCi0gICAgICAgICAgICByZXN1bHQuYWRkRXhpc3RpbmcoUGF0aC5zeXN0ZW1DbGFzc3BhdGgpOwotICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmIChvcmRlci5lcXVhbHMoImZpcnN0IikpIHsKLSAgICAgICAgICAgIC8vIGZpcnN0OiBkZXZlbG9wZXIgY291bGQgdXNlIGEgbGl0dGxlIGhlbHAKLSAgICAgICAgICAgIHJlc3VsdC5hZGRFeGlzdGluZyhQYXRoLnN5c3RlbUNsYXNzcGF0aCk7Ci0gICAgICAgICAgICByZXN1bHQuYWRkRXhpc3RpbmcodGhpcyk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChvcmRlci5lcXVhbHMoImlnbm9yZSIpKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmU6IGRvbid0IHRydXN0IGFueW9uZQotICAgICAgICAgICAgcmVzdWx0LmFkZEV4aXN0aW5nKHRoaXMpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBsYXN0OiBkb24ndCB0cnVzdCB0aGUgZGV2ZWxvcGVyCi0gICAgICAgICAgICBpZiAoIW9yZGVyLmVxdWFscygibGFzdCIpKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5sb2coImludmFsaWQgdmFsdWUgZm9yIGJ1aWxkLnN5c2NsYXNzcGF0aDogIiArIG9yZGVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LmFkZEV4aXN0aW5nKHRoaXMpOwotICAgICAgICAgICAgcmVzdWx0LmFkZEV4aXN0aW5nKFBhdGguc3lzdGVtQ2xhc3NwYXRoKTsKLSAgICAgICAgfQotICAgICAgICAKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MjkxMGMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0dGVyblNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogTmFtZWQgY29sbGVjdGlvbiBvZiBpbmNsdWRlL2V4Y2x1ZGUgdGFncy4KLSAqCi0gKiA8cD5Nb3ZlZCBvdXQgb2YgTWF0Y2hpbmdUYXNrIHRvIG1ha2UgaXQgYSBzdGFuZGFsb25lIG9iamVjdCB0aGF0Ci0gKiBjb3VsZCBiZSByZWZlcmVuY2VkIChieSBzY3JpcHRzIGZvciBleGFtcGxlKS4KLSAqCi0gKiBAYXV0aG9yIEFybm91dCBKLiBLdWlwZXIgPGEgaHJlZj0ibWFpbHRvOmFqa3VpcGVyQHd4cy5ubCI+YWprdWlwZXJAd3hzLm5sPC9hPiAKLSAqIEBhdXRob3IgU3RlZmFubyBNYXp6b2NjaGkgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbm9AYXBhY2hlLm9yZyI+c3RlZmFub0BhcGFjaGUub3JnPC9hPgotICogQGF1dGhvciBTYW0gUnVieSA8YSBocmVmPSJtYWlsdG86cnVieXNAdXMuaWJtLmNvbSI+cnVieXNAdXMuaWJtLmNvbTwvYT4KLSAqIEBhdXRob3IgSm9uIFMuIFN0ZXZlbnMgPGEgaHJlZj0ibWFpbHRvOmpvbkBjbGVhcmluay5jb20iPmpvbkBjbGVhcmluay5jb208L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuU2V0IGV4dGVuZHMgRGF0YVR5cGUgewotICAgIHByaXZhdGUgVmVjdG9yIGluY2x1ZGVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgVmVjdG9yIGV4Y2x1ZGVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgVmVjdG9yIGluY2x1ZGVzRmlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZXhjbHVkZXNGaWxlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8qKgotICAgICAqIGlubmVyIGNsYXNzIHRvIGhvbGQgYSBuYW1lIG9uIGxpc3QuICAiSWYiIGFuZCAiVW5sZXNzIiBhdHRyaWJ1dGVzCi0gICAgICogbWF5IGJlIHVzZWQgdG8gaW52YWxpZGF0ZSB0aGUgZW50cnkgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiBhIAotICAgICAqIHByb3BlcnR5ICh0eXBpY2FsbHkgc2V0IHRocnUgdGhlIHVzZSBvZiB0aGUgQXZhaWxhYmxlIHRhc2spLgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBOYW1lRW50cnkgewotICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBpZkNvbmQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc0NvbmQ7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SWYoU3RyaW5nIGNvbmQpIHsKLSAgICAgICAgICAgIGlmQ29uZCA9IGNvbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoU3RyaW5nIGNvbmQpIHsKLSAgICAgICAgICAgIHVubGVzc0NvbmQgPSBjb25kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGV2YWxOYW1lKFByb2plY3QgcCkgeyAKLSAgICAgICAgICAgIHJldHVybiB2YWxpZChwKSA/IG5hbWUgOiBudWxsOyAKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZChQcm9qZWN0IHApIHsKLSAgICAgICAgICAgIGlmIChpZkNvbmQgIT0gbnVsbCAmJiBwLmdldFByb3BlcnR5KGlmQ29uZCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodW5sZXNzQ29uZCAhPSBudWxsICYmIHAuZ2V0UHJvcGVydHkodW5sZXNzQ29uZCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotICAgICAgICAgICAgaWYgKChpZkNvbmQgIT0gbnVsbCkgfHwgKHVubGVzc0NvbmQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCI6Iik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3RvciA9ICIiOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChpZkNvbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJpZi0+Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaWZDb25kKTsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gIjsiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodW5sZXNzQ29uZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29ubmVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgidW5sZXNzLT4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh1bmxlc3NDb25kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQYXR0ZXJuU2V0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUGF0dGVyblNldAotICAgICAqIGluc3RhbmNlLgotICAgICAqCi0gICAgICogPHA+WW91IG11c3Qgbm90IHNldCBhbm90aGVyIGF0dHJpYnV0ZSBvciBuZXN0IGVsZW1lbnRzIGluc2lkZQotICAgICAqIHRoaXMgZWxlbWVudCBpZiB5b3UgbWFrZSBpdCBhIHJlZmVyZW5jZS48L3A+IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWluY2x1ZGVMaXN0LmlzRW1wdHkoKSB8fCAhZXhjbHVkZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldFJlZmlkKHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBOYW1lRW50cnkgY3JlYXRlSW5jbHVkZSgpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFkZFBhdHRlcm5Ub0xpc3QoaW5jbHVkZUxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgZmlsZXMgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBOYW1lRW50cnkgY3JlYXRlSW5jbHVkZXNGaWxlKCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWRkUGF0dGVyblRvTGlzdChpbmNsdWRlc0ZpbGVMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIE5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWRkUGF0dGVyblRvTGlzdChleGNsdWRlTGlzdCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgZmlsZXMgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBOYW1lRW50cnkgY3JlYXRlRXhjbHVkZXNGaWxlKCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWRkUGF0dGVyblRvTGlzdChleGNsdWRlc0ZpbGVMaXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCi0gICAgICogb3IgYSBzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmNsdWRlcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGUgcGF0dGVybnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmcgaW5jbHVkZXMpIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluY2x1ZGVzICE9IG51bGwgJiYgaW5jbHVkZXMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmNsdWRlcywgIiwgIiwgZmFsc2UpOwotICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICBjcmVhdGVJbmNsdWRlKCkuc2V0TmFtZSh0b2submV4dFRva2VuKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotICAgICAqIG9yIGEgc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKSB7Ci0gICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleGNsdWRlcyAhPSBudWxsICYmIGV4Y2x1ZGVzLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZXhjbHVkZXMsICIsICIsIGZhbHNlKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlRXhjbHVkZSgpLnNldE5hbWUodG9rLm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBhIG5hbWUgZW50cnkgdG8gdGhlIGdpdmVuIGxpc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIE5hbWVFbnRyeSBhZGRQYXR0ZXJuVG9MaXN0KFZlY3RvciBsaXN0KSB7Ci0gICAgICAgIE5hbWVFbnRyeSByZXN1bHQgPSBuZXcgTmFtZUVudHJ5KCk7Ci0gICAgICAgIGxpc3QuYWRkRWxlbWVudChyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW5jbHVkZXMgcGF0dGVybnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXNGaWxlIFRoZSBmaWxlIHRvIGZldGNoIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uICAKLSAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXNmaWxlKEZpbGUgaW5jbHVkZXNGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwotICAgICAgICAgfQotICAgICAgICAgY3JlYXRlSW5jbHVkZXNGaWxlKCkuc2V0TmFtZShpbmNsdWRlc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGVzIHBhdHRlcm5zLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVzRmlsZSBUaGUgZmlsZSB0byBmZXRjaCB0aGUgZXhjbHVkZSBwYXR0ZXJucyBmcm9tLiAgCi0gICAgICovCi0gICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzZmlsZShGaWxlIGV4Y2x1ZGVzRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGNyZWF0ZUV4Y2x1ZGVzRmlsZSgpLnNldE5hbWUoZXhjbHVkZXNGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBSZWFkcyBwYXRoIG1hdGNoaW5nIHBhdHRlcm5zIGZyb20gYSBmaWxlIGFuZCBhZGRzIHRoZW0gdG8gdGhlCi0gICAgICogIGluY2x1ZGVzIG9yIGV4Y2x1ZGVzIGxpc3QgKGFzIGFwcHJvcHJpYXRlKS4gIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkUGF0dGVybnMoRmlsZSBwYXR0ZXJuZmlsZSwgVmVjdG9yIHBhdHRlcm5saXN0LCBQcm9qZWN0IHApCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gR2V0IGEgRmlsZVJlYWRlcgotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcGF0dGVyblJlYWRlciA9IAotICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihwYXR0ZXJuZmlsZSkpOyAKLSAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgb25lIE5hbWVFbnRyeSBpbiB0aGUgYXBwcm9wcmlhdGUgcGF0dGVybiBsaXN0IGZvciBlYWNoIAotICAgICAgICAgICAgLy8gbGluZSBpbiB0aGUgZmlsZS4KLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcGF0dGVyblJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBsaW5lID0gUHJvamVjdEhlbHBlci5yZXBsYWNlUHJvcGVydGllcyhwLCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm5Ub0xpc3QocGF0dGVybmxpc3QpLnNldE5hbWUobGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUgPSBwYXR0ZXJuUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSAgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHJlYWRpbmcgZnJvbSBwYXR0ZXJuIGZpbGU6ICIgCi0gICAgICAgICAgICAgICAgKyBwYXR0ZXJuZmlsZTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBwYXR0ZXJucyBvZiB0aGUgb3RoZXIgaW5zdGFuY2UgdG8gdGhpcyBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kKFBhdHRlcm5TZXQgb3RoZXIsIFByb2plY3QgcCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgYXBwZW5kIHRvIGEgcmVmZXJlbmNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBpbmNsID0gb3RoZXIuZ2V0SW5jbHVkZVBhdHRlcm5zKHApOwotICAgICAgICBpZiAoaW5jbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8aW5jbC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKGluY2xbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBleGNsID0gb3RoZXIuZ2V0RXhjbHVkZVBhdHRlcm5zKHApOwotICAgICAgICBpZiAoZXhjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXhjbC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKGV4Y2xbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsdGVyZWQgaW5jbHVkZSBwYXR0ZXJucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZVBhdHRlcm5zKFByb2plY3QgcCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXRJbmNsdWRlUGF0dGVybnMocCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWFkRmlsZXMocCk7Ci0gICAgICAgICAgICByZXR1cm4gbWFrZUFycmF5KGluY2x1ZGVMaXN0LCBwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmVkIGluY2x1ZGUgcGF0dGVybnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVQYXR0ZXJucyhQcm9qZWN0IHApIHsKLSAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkuZ2V0RXhjbHVkZVBhdHRlcm5zKHApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZEZpbGVzKHApOwotICAgICAgICAgICAgcmV0dXJuIG1ha2VBcnJheShleGNsdWRlTGlzdCwgcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBoZWxwZXIgZm9yIEZpbGVTZXQuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNQYXR0ZXJucygpIHsKLSAgICAgICAgcmV0dXJuIGluY2x1ZGVzRmlsZUxpc3Quc2l6ZSgpID4gMCB8fCBleGNsdWRlc0ZpbGVMaXN0LnNpemUoKSA+IDAgCi0gICAgICAgICAgICB8fCBpbmNsdWRlTGlzdC5zaXplKCkgPiAwIHx8IGV4Y2x1ZGVMaXN0LnNpemUoKSA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlZmVyZW5jZWQgUGF0dGVyblNldC4gIAotICAgICAqLwotICAgIHByaXZhdGUgUGF0dGVyblNldCBnZXRSZWYoUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmICghY2hlY2tlZCkgewotICAgICAgICAgICAgU3RhY2sgc3RrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgICAgICBzdGsucHVzaCh0aGlzKTsKLSAgICAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgT2JqZWN0IG8gPSByZWYuZ2V0UmVmZXJlbmNlZE9iamVjdChwKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFBhdHRlcm5TZXQpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gcmVmLmdldFJlZklkKCkrIiBkb2VzblwndCBkZW5vdGUgYSBwYXR0ZXJuc2V0IjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChQYXR0ZXJuU2V0KSBvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIHZlY3RvciBvZiBOYW1lRW50cnkgZWxlbWVudHMgaW50byBhbiBhcnJheSBvZiBTdHJpbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gbWFrZUFycmF5KFZlY3RvciBsaXN0LCBQcm9qZWN0IHApIHsKLSAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID09IDApIHJldHVybiBudWxsOwotCi0gICAgICAgIFZlY3RvciB0bXBOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gbGlzdC5lbGVtZW50cygpIDsgZS5oYXNNb3JlRWxlbWVudHMoKSA7KSB7Ci0gICAgICAgICAgICBOYW1lRW50cnkgbmUgPSAoTmFtZUVudHJ5KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbmUuZXZhbE5hbWUocCk7Ci0gICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsICYmIHBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdG1wTmFtZXMuYWRkRWxlbWVudChwYXR0ZXJuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbdG1wTmFtZXMuc2l6ZSgpXTsKLSAgICAgICAgdG1wTmFtZXMuY29weUludG8ocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFJlYWQgaW5jbHVkZXNmaWxlIG90IGV4Y2x1ZGVzZmlsZSBpZiBub3QgYWxyZWFkeSBkb25lIHNvLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkRmlsZXMoUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmIChpbmNsdWRlc0ZpbGVMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBpbmNsdWRlc0ZpbGVMaXN0LmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIE5hbWVFbnRyeSBuZSA9IChOYW1lRW50cnkpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG5lLmV2YWxOYW1lKHApOwotICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgaW5jbEZpbGUgPSBwLnJlc29sdmVGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsRmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW5jbHVkZXNmaWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluY2xGaWxlLmdldEFic29sdXRlUGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmVhZFBhdHRlcm5zKGluY2xGaWxlLCBpbmNsdWRlTGlzdCwgcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5jbHVkZXNGaWxlTGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4Y2x1ZGVzRmlsZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGV4Y2x1ZGVzRmlsZUxpc3QuZWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgTmFtZUVudHJ5IG5lID0gKE5hbWVFbnRyeSllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbmUuZXZhbE5hbWUocCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBleGNsRmlsZSA9IHAucmVzb2x2ZUZpbGUoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWV4Y2xGaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGNsdWRlc2ZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhjbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgICAgICAgICByZWFkUGF0dGVybnMoZXhjbEZpbGUsIGV4Y2x1ZGVMaXN0LCBwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGNsdWRlc0ZpbGVMaXN0LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAicGF0dGVyblNldHsgaW5jbHVkZXM6ICIgKyBpbmNsdWRlTGlzdCArIAotICAgICAgICAgICAgIiBleGNsdWRlczogIiArIGV4Y2x1ZGVMaXN0ICsgIiB9IjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZmVyZW5jZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDEzYTUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyB0byBob2xkIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgb2JqZWN0IGluIHRoZSBwcm9qZWN0LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWZpZDsKLQotICAgIHB1YmxpYyBSZWZlcmVuY2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBzZXRSZWZJZChpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVmSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJlZmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWZJZCgpIHsKLSAgICAgICAgcmV0dXJuIHJlZmlkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlZE9iamVjdChQcm9qZWN0IHByb2plY3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZWZpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHJlZmVyZW5jZSBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgT2JqZWN0IG8gPSBwcm9qZWN0LmdldFJlZmVyZW5jZXMoKS5nZXQocmVmaWQpOwotICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlZmVyZW5jZSAiK3JlZmlkKyIgbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMDc0Yy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBGaWxlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotLyoqCi0gKiBBIFppcEZpbGVTZXQgaXMgYSBGaWxlU2V0IHdpdGggZXh0cmEgYXR0cmlidXRlcyB1c2VmdWwgaW4gdGhlIGNvbnRleHQgb2YgCi0gKiBaaXAvSmFyIHRhc2tzLgotICoKLSAqIEEgWmlwRmlsZVNldCBleHRlbmRzIEZpbGVTZXRzIHdpdGggdGhlIGFiaWxpdHkgdG8gZXh0cmFjdCBhIHN1YnNldCBvZiB0aGUKLSAqIGVudHJpZXMgb2YgYSBaaXAgZmlsZSBmb3IgaW5jbHVzaW9uIGluIGFub3RoZXIgWmlwIGZpbGUuICBJdCBhbHNvIGluY2x1ZGVzCi0gKiBhIHByZWZpeCBhdHRyaWJ1dGUgd2hpY2ggaXMgcHJlcGVuZGVkIHRvIGVhY2ggZW50cnkgaW4gdGhlIG91dHB1dCBaaXAgZmlsZS4KLSAqCi0gKiBBdCBwcmVzZW50LCBaaXBGaWxlU2V0cyBhcmUgbm90IHN1cmZhY2VkIGluIHRoZSBwdWJsaWMgQVBJLiAgRmlsZVNldHMKLSAqIG5lc3RlZCBpbiBhIFppcCB0YXNrIGFyZSBpbnN0YW50aWF0ZWQgYXMgWmlwRmlsZVNldHMsIGFuZCB0aGVpciBhdHRyaWJ1dGVzCi0gKiBhcmUgb25seSByZWNvZ25pemVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aGUgWmlwIHRhc2suCi0gKiBJdCBpcyBub3QgcG9zc2libGUgdG8gZGVmaW5lIGEgWmlwRmlsZVNldCBvdXRzaWRlIG9mIHRoZSBaaXAgdGFzayBhbmQKLSAqIHJlZmVyIHRvIGl0IHZpYSBhIHJlZmlkLiAgSG93ZXZlciBhIHN0YW5kYXJkIEZpbGVTZXQgbWF5IGJlIGluY2x1ZGVkIGJ5Ci0gKiByZWZlcmVuY2UgaW4gdGhlIFppcCB0YXNrLCBhbmQgYXR0cmlidXRlcyBpbiB0aGUgcmVmZXJpbmcgWmlwRmlsZVNldAotICogY2FuIGF1Z21lbnQgRmlsZVNldCBkZWZpbml0aW9uLgotICoKLSAqIEBhdXRob3IgRG9uIEZlcmd1c29uIDxhIGhyZWY9Im1haWx0bzpkb25AYmVhLmNvbSI+ZG9uQGJlYS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBaaXBGaWxlU2V0IGV4dGVuZHMgRmlsZVNldCB7Ci0KLSAgICBwcml2YXRlIEZpbGUgc3JjRmlsZSAgICAgICAgICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4ICAgICAgICAgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBmdWxscGF0aCAgICAgICA9ICIiOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEaXIgICAgICAgID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIGZpbGVzZXQuICBQcmV2ZW50cyBib3RoICJkaXIiIGFuZCAic3JjIgotICAgICAqIGZyb20gYmVpbmcgc3BlY2lmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNyY0ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGJvdGggZGlyIGFuZCBzcmMgYXR0cmlidXRlcyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2V0RGlyKGRpcik7Ci0gICAgICAgICAgICBoYXNEaXIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzb3VyY2UgWmlwIGZpbGUgZm9yIHRoZSB6aXBmaWxlc2V0LiAgUHJldmVudHMgYm90aAotICAgICAqICJkaXIiIGFuZCAic3JjIiBmcm9tIGJlaW5nIHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcmNGaWxlIFRoZSB6aXAgZmlsZSBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgZW50cmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmNGaWxlKSB7Ci0gICAgICAgIGlmIChoYXNEaXIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHNldCBib3RoIGRpciBhbmQgc3JjIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgemlwIGZpbGUgZnJvbSB3aGljaCBlbnRyaWVzIHdpbGwgYmUgZXh0cmFjdGVkLgotICAgICAqIFJlZmVyZW5jZXMgYXJlIG5vdCBmb2xsb3dlZCwgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlCi0gICAgICogdG8gaGF2ZSBhIHJlZmVyZW5jZSB0byBhIFppcEZpbGVTZXQsIG9ubHkgdG8gYSBGaWxlU2V0LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFNyYygpIHsKLSAgICAgICAgcmV0dXJuIHNyY0ZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJlcGVuZCB0aGlzIHByZWZpeCB0byB0aGUgcGF0aCBmb3IgZWFjaCB6aXAgZW50cnkuCi0gICAgICogRG9lcyBub3QgcGVyZm9ybSByZWZlcmVuY2UgdGVzdDsgdGhlIHJlZmVyZW5jZWQgZmlsZSBzZXQKLSAgICAgKiBjYW4gYmUgYXVnbWVudGVkIHdpdGggYSBwcmVmaXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXggdG8gcHJlcGVuZCB0byBlbnRyaWVzIGluIHRoZSB6aXAgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHByZWZpeCBwcmVwZW5kZWQgdG8gZW50cmllcyBpbiB0aGUgemlwIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBzaW5nbGUgZW50cnkgaW4gdGhpcyBmaWxlc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIHByZXBlbmQgdG8gZW50cmllcyBpbiB0aGUgemlwIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbHBhdGgoU3RyaW5nIGZ1bGxwYXRoKSB7Ci0gICAgICAgIHRoaXMuZnVsbHBhdGggPSBmdWxscGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHNpbmdsZSBlbnRyeSBpbiB0aGlzIGZpbGVzZXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxscGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZ1bGxwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgRGlyZWN0b3J5U2Nhbm5lciBhc3NvY2lhdGVkIHdpdGggdGhpcyBGaWxlU2V0LgotICAgICAqIElmIHRoZSBaaXBGaWxlU2V0IGRlZmluZXMgYSBzb3VyY2UgWmlwIGZpbGUsIHRoZW4gYSBaaXBTY2FubmVyCi0gICAgICogaXMgcmV0dXJuZWQgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGlyZWN0b3J5U2Nhbm5lciBnZXREaXJlY3RvcnlTY2FubmVyKFByb2plY3QgcCkgewotICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXREaXJlY3RvcnlTY2FubmVyKHApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFppcFNjYW5uZXIgenMgPSBuZXcgWmlwU2Nhbm5lcigpOwotICAgICAgICAgICAgenMuc2V0U3JjKHNyY0ZpbGUpOwotICAgICAgICAgICAgc3VwZXIuc2V0RGlyKHAuZ2V0QmFzZURpcigpKTsKLSAgICAgICAgICAgIHNldHVwRGlyZWN0b3J5U2Nhbm5lcih6cywgcCk7Ci0gICAgICAgICAgICB6cy5pbml0KCk7Ci0gICAgICAgICAgICByZXR1cm4genM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKLSAgICAgICAgfQotICAgIH0gICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWmlwU2Nhbm5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWmlwU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE3OGYxLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcFNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogWmlwU2Nhbm5lciBhY2Nlc3NlcyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gaW4gRGlyZWN0b3J5U2Nhbm5lciwKLSAqIHdoaWNoIGFyZSBwcm90ZWN0ZWQgbWV0aG9kcyB0aGF0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5IHN1YmNsYXNzaW5nLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgRmlsZVNjYW5uZXIgZGVmaW5lcyBnZXRJbmNsdWRlZEZpbGVzIHRvIHJldHVybgotICogb25seSB0aGUgWmlwIEZpbGUgd2hpY2ggaXMgYmVpbmcgc2Nhbm5lZCwgbm90IHRoZSBtYXRjaGluZyBaaXAgZW50cmllcy4KLSAqIEFyZ3VhYmx5LCBpdCBzaG91bGQgcmV0dXJuIHRoZSBtYXRjaGluZyBlbnRyaWVzLCBob3dldmVyIHRoaXMgd291bGQKLSAqIGNvbXBsaWNhdGUgZXhpc3RpbmcgY29kZSB3aGljaCBhc3N1bWVzIHRoYXQgRmlsZVNjYW5uZXJzIHJldHVybiBhCi0gKiBzZXQgb2YgZmlsZSBzeXN0ZW0gZmlsZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkuCi0gKiAKLSAqIEBhdXRob3IgRG9uIEZlcmd1c29uIDxhIGhyZWY9Im1haWx0bzpkb25AYmVhLmNvbSI+ZG9uQGJlYS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBaaXBTY2FubmVyIGV4dGVuZHMgRGlyZWN0b3J5U2Nhbm5lciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgemlwIGZpbGUgd2hpY2ggc2hvdWxkIGJlIHNjYW5uZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgc3JjRmlsZTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNyY0ZpbGUgZm9yIHNjYW5uaW5nLiBUaGlzIGlzIHRoZSBqYXIgb3IgemlwIGZpbGUgdGhhdCBpcyBzY2FubmVkCi0gICAgICogZm9yIG1hdGNoaW5nIGVudHJpZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3JjRmlsZSB0aGUgKG5vbi1udWxsKSB6aXAgZmlsZSBuYW1lIGZvciBzY2FubmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIHNyY0ZpbGUpIHsKLSAgICAgICAgdGhpcy5zcmNGaWxlID0gc3JjRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB6aXAgZmlsZSBpdHNlbGYsIG5vdCB0aGUgbWF0Y2hpbmcgZW50cmllcyB3aXRoaW4gdGhlIHppcCBmaWxlLgotICAgICAqIFRoaXMga2VlcHMgdGhlIHVwdG9kYXRlIHRlc3QgaW4gdGhlIFppcCB0YXNrIHNpbXBsZTsgb3RoZXJ3aXNlIHdlJ2QgbmVlZAotICAgICAqIHRvIHRyZWF0IHppcCBmaWxlc2V0cyBzcGVjaWFsbHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHdoaWNoIGVudHJpZXMgd2lsbCBiZSBleHRyYWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkRmlsZXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgIHJlc3VsdFswXSA9IHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBlbXB0eSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBEaXJlY3RvcnlTY2FubmVyIGRhdGEgc3RydWN0dXJlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICBpZiAoaW5jbHVkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTm8gaW5jbHVkZXMgc3VwcGxpZWQsIHNvIHNldCBpdCB0byAnbWF0Y2hlcyBhbGwnCi0gICAgICAgICAgICBpbmNsdWRlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgICAgICBpbmNsdWRlc1swXSA9ICIqKiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4Y2x1ZGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4Y2x1ZGVzID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hdGNoZXMgYSBqYXIgZW50cnkgYWdhaW5zdCB0aGUgaW5jbHVkZXMvZXhjbHVkZXMgbGlzdCwKLSAgICAgKiBub3JtYWxpemluZyB0aGUgcGF0aCBzZXBhcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgKG5vbi1udWxsKSBwYXRoIG5hbWUgdG8gdGVzdCBmb3IgaW5jbHVzaW9uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXRoIHNob3VsZCBiZSBpbmNsdWRlZAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgcGF0aCkgewotICAgICAgICBTdHJpbmcgdnBhdGggPSBwYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpLgotICAgICAgICAgICAgcmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICByZXR1cm4gaXNJbmNsdWRlZCh2cGF0aCkgJiYgIWlzRXhjbHVkZWQodnBhdGgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdHMucHJvcGVydGllcyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2RlZmF1bHRzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNjgxMjguLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGF0aD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoCi1maWxlc2V0PW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQKLWZpbGVsaXN0PW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0Ci1wYXR0ZXJuc2V0PW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQKLW1hcHBlcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXIKLWZpbHRlcnNldD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJTZXQKLWRlc2NyaXB0aW9uPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRlc2NyaXB0aW9uCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9ET01FbGVtZW50V3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTIwZTguLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9ET01FbGVtZW50V3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0KLS8qKgotICogV3JpdGVzIGEgRE9NIHRyZWUgdG8gYSBnaXZlbiBXcml0ZXIuCi0gKgotICogPHA+VXRpbGl0eSBjbGFzcyB1c2VkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRvb2xzLmFudC5YbWxMb2dnZXIKLSAqIFhtbExvZ2dlcn0gYW5kCi0gKiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5YTUxKVW5pdFJlc3VsdEZvcm1hdHRlcgotICogWE1MSlVuaXRSZXN1bHRGb3JtYXR0ZXJ9LjwvcD4KLSAqCi0gKiBAYXV0aG9yIFRoZSBvcmlnaW5hbCBhdXRob3Igb2YgWG1sTG9nZ2VyCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAaW1lZGlhdGlvbi5jb20iPlN0ZXBoYW5lIEJhaWxsaWV6PC90dD4KLSAqLwotcHVibGljIGNsYXNzIERPTUVsZW1lbnRXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEb24ndCB0cnkgdG8gYmUgdG9vIHNtYXJ0IGJ1dCBhdCBsZWFzdCByZWNvZ25pemUgdGhlIHByZWRlZmluZWQKLSAgICAgKiBlbnRpdGllcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10ga25vd25FbnRpdGllcyA9IHsiZ3QiLCAiYW1wIiwgImx0IiwgImFwb3MiLCAicXVvdCJ9OwotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIERPTSB0cmVlIHRvIGEgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIFJvb3QgRE9NIGVsZW1lbnQgb2YgdGhlIHRyZWUKLSAgICAgKiBAcGFyYW0gb3V0IHdoZXJlIHRvIHNlbmQgdGhlIG91dHB1dAotICAgICAqIEBwYXJhbSBpbmRlbnQgbnVtYmVyIG9mIAotICAgICAqIEBwYXJhbSBpbmRlbnRXaXRoIHN0cmluZ3MsIAotICAgICAqICAgICAgIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gaW5kZW50IHRoZSBjb3JyZXNwb25kaW5nIHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShFbGVtZW50IGVsZW1lbnQsIFdyaXRlciBvdXQsIGludCBpbmRlbnQsIAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmRlbnRXaXRoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIC8vIFdyaXRlIGluZGVudCBjaGFyYWN0ZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC53cml0ZShpbmRlbnRXaXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdyaXRlIGVsZW1lbnQKLSAgICAgICAgb3V0LndyaXRlKCI8Iik7Ci0gICAgICAgIG91dC53cml0ZShlbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0KLSAgICAgICAgLy8gV3JpdGUgYXR0cmlidXRlcwotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiICIpOwotICAgICAgICAgICAgb3V0LndyaXRlKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPVwiIik7Ci0gICAgICAgICAgICBvdXQud3JpdGUoZW5jb2RlKGF0dHIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgb3V0LndyaXRlKCJcIiIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZSgiPiIpOwotCi0gICAgICAgIC8vIFdyaXRlIGNoaWxkIGVsZW1lbnRzIGFuZCB0ZXh0Ci0gICAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW4gPSBmYWxzZTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQotICAgICAgICAgICAgc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotICAgICAgICAgICAgICAgIGlmICghaGFzQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGxTZXApOwotICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdyaXRlKChFbGVtZW50KWNoaWxkLCBvdXQsIGluZGVudCArIDEsIGluZGVudFdpdGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoZW5jb2RlKGNoaWxkLmdldE5vZGVWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPCFbQ0RBVEFbIik7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCgoVGV4dCljaGlsZCkuZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIl1dPiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgICAgIG91dC53cml0ZSgnJicpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShjaGlsZC5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoJzsnKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjw/Iik7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGNoaWxkLmdldE5vZGVOYW1lKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhID0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCBkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgnICcpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPz4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIGhhZCBjaGlsZCBlbGVtZW50cywgd2UgbmVlZCB0byBpbmRlbnQgYmVmb3JlIHdlIGNsb3NlCi0gICAgICAgIC8vIHRoZSBlbGVtZW50LCBvdGhlcndpc2Ugd2UncmUgb24gdGhlIHNhbWUgbGluZSBhbmQgZG9uJ3QgbmVlZAotICAgICAgICAvLyB0byBpbmRlbnQKLSAgICAgICAgaWYgKGhhc0NoaWxkcmVuKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGluZGVudFdpdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV3JpdGUgZWxlbWVudCBjbG9zZQotICAgICAgICBvdXQud3JpdGUoIjwvIik7Ci0gICAgICAgIG91dC53cml0ZShlbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0gICAgICAgIG91dC53cml0ZSgiPiIpOwotICAgICAgICBvdXQud3JpdGUobFNlcCk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzY2FwZSAmbHQ7LCAmZ3Q7ICZhbXA7ICZhcG9zOyBhbmQgJnF1b3Q7IGFzIHRoZWlyIGVudGl0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTx2YWx1ZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmx0OyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnPic6Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImZ3Q7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImYXBvczsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZxdW90OyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnJic6Ci0gICAgICAgICAgICAgICAgaW50IG5leHRTZW1pID0gdmFsdWUuaW5kZXhPZigiOyIsIGkpOwotICAgICAgICAgICAgICAgIGlmIChuZXh0U2VtaSA8IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgIWlzUmVmZXJlbmNlKHZhbHVlLnN1YnN0cmluZyhpLCBuZXh0U2VtaSsxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImYW1wOyIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzIHRoZSBnaXZlbiBhcmd1bWVudCBhIGNoYXJhY3RlciBvciBlbnRpdHkgcmVmZXJlbmNlPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKFN0cmluZyBlbnQpIHsKLSAgICAgICAgaWYgKCEoZW50LmNoYXJBdCgwKSA9PSAnJicpIHx8ICFlbnQuZW5kc1dpdGgoIjsiKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVudC5jaGFyQXQoMSkgPT0gJyMnKSB7Ci0gICAgICAgICAgICBpZiAoZW50LmNoYXJBdCgyKSA9PSAneCcpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGVudC5zdWJzdHJpbmcoMywgZW50Lmxlbmd0aCgpLTEpLCAxNik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChlbnQuc3Vic3RyaW5nKDIsIGVudC5sZW5ndGgoKS0xKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZW50LnN1YnN0cmluZygxLCBlbnQubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGtub3duRW50aXRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhrbm93bkVudGl0aWVzW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVOYW1lTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzMyYWMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBiZSB1c2VkIGJ5IFNvdXJjZUZpbGVTY2FubmVyLgotICoKLSAqIDxwPlVzZWQgdG8gZmluZCB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUocykgY29ycmVzcG9uZGluZyB0byBhCi0gKiBzb3VyY2UgZmlsZS48L3A+Ci0gKgotICogPHA+VGhlIHJ1bGUgYnkgd2hpY2ggdGhlIGZpbGUgbmFtZXMgYXJlIHRyYW5zZm9ybWVkIGlzIHNwZWNpZmllZAotICogdmlhIHRoZSBzZXRGcm9tIGFuZCBzZXRUbyBtZXRob2RzLiBUaGUgZXhhY3QgbWVhbmluZyBvZiB0aGVzZSBpcwotICogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsZU5hbWVNYXBwZXIgewotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZnJvbSBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBydWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdG8gcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gcnVsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB0YXJnZXQgZmlsZW5hbWUocykgZm9yIHRoZQotICAgICAqIGdpdmVuIHNvdXJjZSBmaWxlLgotICAgICAqCi0gICAgICogPHA+aWYgdGhlIGdpdmVuIHJ1bGUgZG9lc24ndCBhcHBseSB0byB0aGUgc291cmNlIGZpbGUsCi0gICAgICogaW1wbGVtZW50YXRpb24gbXVzdCByZXR1cm4gbnVsbC4gU291cmNlRmlsZVNjYW5uZXIgd2lsbCB0aGVuCi0gICAgICogb21pdCB0aGUgc291cmNlIGZpbGUgaW4gcXVlc3Rpb24uPC9wPiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgcmVsYXRpdmUgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgc29tZSBnaXZlbiBiYXNlZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgc291cmNlRmlsZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDFiZGEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247IAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7IAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldENvbGxlY3Rpb247IAotCi0vKioKLSAqIFRoaXMgY2xhc3MgYWxzbyBlbmNhcHN1bGF0ZXMgbWV0aG9kcyB3aGljaCBhbGxvdyBGaWxlcyB0byBiZQotICogcmVmZXJlZCB0byB1c2luZyBhYnN0cmFjdCBwYXRoIG5hbWVzIHdoaWNoIGFyZSB0cmFuc2xhdGVkIHRvIG5hdGl2ZQotICogc3lzdGVtIGZpbGUgcGF0aHMgYXQgcnVudGltZSBhcyB3ZWxsIGFzIGNvcHlpbmcgZmlsZXMgb3Igc2V0dGluZwotICogdGhlcmUgbGFzdCBtb2RpZmljYXRpb24gdGltZS4KLSAqCi0gKiBAYXV0aG9yIGR1bmNhbkB4MTgwLmNvbQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi0gCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbG9ja1JlZmxlY3Rpb24gPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHNldExhc3RNb2RpZmllZCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZpbGVVdGlscyBuZXdGaWxlVXRpbHMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZVV0aWxzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW1wdHkgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGVVdGlscygpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uLgotICAgICAqIE5vIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNvdXJjZUZpbGUsIFN0cmluZyBkZXN0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY29weUZpbGUobmV3IEZpbGUoc291cmNlRmlsZSksIG5ldyBGaWxlKGRlc3RGaWxlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uCi0gICAgICogc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgZGVzdEZpbGUsIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjb3B5RmlsZShuZXcgRmlsZShzb3VyY2VGaWxlKSwgbmV3IEZpbGUoZGVzdEZpbGUpLCBmaWx0ZXJzLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZpZW5lbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEKLSAgICAgKiBkZXN0aW5hdGlvbiBzcGVjaWZ5aW5nIGlmIHRva2VuIGZpbHRlcmluZyBtdXN0IGJlIHVzZWQgYW5kIGlmCi0gICAgICogc291cmNlIGZpbGVzIG1heSBvdmVyd3JpdGUgbmV3ZXIgZGVzdGluYXRpb24gZmlsZXMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgZGVzdEZpbGUsIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY29weUZpbGUobmV3IEZpbGUoc291cmNlRmlsZSksIG5ldyBGaWxlKGRlc3RGaWxlKSwgZmlsdGVycywgCi0gICAgICAgICAgICAgICAgIG92ZXJ3cml0ZSwgZmFsc2UpOwotICAgIH0KLQotICAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhCi0gICAgICogZGVzdGluYXRpb24gc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLCBpZgotICAgICAqIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzIGFuZCB0aGUKLSAgICAgKiBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgPGNvZGU+ZGVzdEZpbGU8L2NvZGU+IGZpbGUgc2hvdWxkIGJlIG1hZGUgZXF1YWwKLSAgICAgKiB0byB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIDxjb2RlPnNvdXJjZUZpbGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlLCBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUsIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNvcHlGaWxlKG5ldyBGaWxlKHNvdXJjZUZpbGUpLCBuZXcgRmlsZShkZXN0RmlsZSksIGZpbHRlcnMsIAotICAgICAgICAgICAgICAgICBvdmVyd3JpdGUsIHByZXNlcnZlTGFzdE1vZGlmaWVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uLgotICAgICAqIE5vIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjb3B5RmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uCi0gICAgICogc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjb3B5RmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSwgZmlsdGVycywgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhCi0gICAgICogZGVzdGluYXRpb24gc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkIGFuZCBpZgotICAgICAqIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUsIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsIGZpbHRlcnMsIG92ZXJ3cml0ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZpZW5lbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEKLSAgICAgKiBkZXN0aW5hdGlvbiBzcGVjaWZ5aW5nIGlmIHRva2VuIGZpbHRlcmluZyBtdXN0IGJlIHVzZWQsIGlmCi0gICAgICogc291cmNlIGZpbGVzIG1heSBvdmVyd3JpdGUgbmV3ZXIgZGVzdGluYXRpb24gZmlsZXMgYW5kIHRoZQotICAgICAqIGxhc3QgbW9kaWZpZWQgdGltZSBvZiA8Y29kZT5kZXN0RmlsZTwvY29kZT4gZmlsZSBzaG91bGQgYmUgbWFkZSBlcXVhbAotICAgICAqIHRvIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgPGNvZGU+c291cmNlRmlsZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3ZlcndyaXRlLCBib29sZWFuIHByZXNlcnZlTGFzdE1vZGlmaWVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgaWYgKG92ZXJ3cml0ZSB8fCAhZGVzdEZpbGUuZXhpc3RzKCkgfHwKLSAgICAgICAgICAgIGRlc3RGaWxlLmxhc3RNb2RpZmllZCgpIDwgc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKSkgewotCi0gICAgICAgICAgICBpZiAoZGVzdEZpbGUuZXhpc3RzKCkgJiYgZGVzdEZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBkZXN0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgcGFyZW50IGRpciBvZiBkZXN0IGZpbGUgZXhpc3RzIQotICAgICAgICAgICAgLy8gbm90IHVzaW5nIGdldFBhcmVudEZpbGUgbWV0aG9kIHRvIHN0YXkgMS4xIGNvbXBhdAotICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBuZXcgRmlsZShkZXN0RmlsZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICBpZiAoIXBhcmVudC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCAmJiBmaWx0ZXJzLmhhc0ZpbHRlcnMoKSkgewotICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHNvdXJjZUZpbGUpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZGVzdEZpbGUpKTsKLQotICAgICAgICAgICAgICAgIGludCBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld2xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gaW4ucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5uZXdMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lID0gZmlsdGVycy5yZXBsYWNlVG9rZW5zKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsaW5lID0gaW4ucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpOwotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOwotCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzggKiAxMDI0XTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAtMSk7Ci0KLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMYXN0TW9kaWZpZWQpIHsKLSAgICAgICAgICAgICAgICBzZXRGaWxlTGFzdE1vZGlmaWVkKGRlc3RGaWxlLCBzb3VyY2VGaWxlLmxhc3RNb2RpZmllZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB3aGV0aGVyIHdlIGhhdmUgYSBzZXRMYXN0TW9kaWZpZWQgbWV0aG9kIGluIEZpbGUgYW5kIHJldHVybiBpdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldFNldExhc3RNb2RpZmllZCgpIHsKLSAgICAgICAgaWYgKFByb2plY3QuZ2V0SmF2YVZlcnNpb24oKSA9PSBQcm9qZWN0LkpBVkFfMV8xKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2V0TGFzdE1vZGlmaWVkID09IG51bGwpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobG9ja1JlZmxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0TGFzdE1vZGlmaWVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldExhc3RNb2RpZmllZCA9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uRmlsZS5jbGFzcy5nZXRNZXRob2QoInNldExhc3RNb2RpZmllZCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge0xvbmcuVFlQRX0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZpbGUuc2V0bGFzdE1vZGlmaWVkIG5vdCBpbiBKREsgPiAxLjE/IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXRMYXN0TW9kaWZpZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgRmlsZS5zZXRMYXN0TW9kaWZpZWQobG9uZyB0aW1lKSBpbiBhIEphdmEgMS4xIGNvbXBhdGlibGUgd2F5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVMYXN0TW9kaWZpZWQoRmlsZSBmaWxlLCBsb25nIHRpbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChQcm9qZWN0LmdldEphdmFWZXJzaW9uKCkgPT0gUHJvamVjdC5KQVZBXzFfMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExvbmdbXSB0aW1lcyA9IG5ldyBMb25nWzFdOwotICAgICAgICBpZiAodGltZSA8IDApIHsKLSAgICAgICAgICAgIHRpbWVzWzBdID0gbmV3IExvbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGltZXNbMF0gPSBuZXcgTG9uZyh0aW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRTZXRMYXN0TW9kaWZpZWQoKS5pbnZva2UoZmlsZSwgdGltZXMpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIG5lc3RlZCA9IGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhjZXB0aW9uIHNldHRpbmcgdGhlIG1vZGlmaWNhdGlvbiB0aW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvZiAiICsgZmlsZSwgbmVzdGVkKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIG90aGVyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4Y2VwdGlvbiBzZXR0aW5nIHRoZSBtb2RpZmljYXRpb24gdGltZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib2YgIiArIGZpbGUsIG90aGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVycHJldCB0aGUgZmlsZW5hbWUgYXMgYSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBmaWxlIC0KLSAgICAgKiB1bmxlc3MgdGhlIGZpbGVuYW1lIGFscmVhZHkgcmVwcmVzZW50cyBhbiBhYnNvbHV0ZSBmaWxlbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSAicmVmZXJlbmNlIiBmaWxlIGZvciByZWxhdGl2ZSBwYXRocy4gVGhpcwotICAgICAqIGluc3RhbmNlIG11c3QgYmUgYW4gYWJzb2x1dGUgZmlsZSBhbmQgbXVzdCBub3QgY29udGFpbgotICAgICAqICZxdW90Oy4vJnF1b3Q7IG9yICZxdW90Oy4uLyZxdW90OyBzZXF1ZW5jZXMgKHNhbWUgZm9yIFwgaW5zdGVhZAotICAgICAqIG9mIC8pLgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSBhIGZpbGUgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBhbiBhYnNvbHV0ZSBmaWxlIHRoYXQgZG9lc24ndCBjb250YWluICZxdW90Oy4vJnF1b3Q7IG9yCi0gICAgICogJnF1b3Q7Li4vJnF1b3Q7IHNlcXVlbmNlcyBhbmQgdXNlcyB0aGUgY29ycmVjdCBzZXBhcmF0b3IgZm9yCi0gICAgICogdGhlIGN1cnJlbnQgcGxhdGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgcmVzb2x2ZUZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKQotICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotICAgICAgICAvLyBkZWFsIHdpdGggYWJzb2x1dGUgZmlsZXMKLSAgICAgICAgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpIHx8Ci0KLSAgICAgICAgICAgIChmaWxlbmFtZS5sZW5ndGgoKSA+PSAyICYmCi0gICAgICAgICAgICAgQ2hhcmFjdGVyLmlzTGV0dGVyKGZpbGVuYW1lLmNoYXJBdCgwKSkgJiYKLSAgICAgICAgICAgICBmaWxlbmFtZS5jaGFyQXQoMSkgPT0gJzonKQotCi0gICAgICAgICAgICApIHsKLSAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoZmlsZW5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGVuYW1lLmxlbmd0aCgpID49IDIgJiYKLSAgICAgICAgICAgIENoYXJhY3Rlci5pc0xldHRlcihmaWxlbmFtZS5jaGFyQXQoMCkpICYmCi0gICAgICAgICAgICBmaWxlbmFtZS5jaGFyQXQoMSkgPT0gJzonKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKGZpbGVuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgaGVscEZpbGUgPSBuZXcgRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZmlsZW5hbWUsIEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0ID0gdG9rLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaWYgKHBhcnQuZXF1YWxzKCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudEZpbGUgPSBoZWxwRmlsZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50RmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGhlIGZpbGUgb3IgcGF0aCB5b3Ugc3BlY2lmaWVkICgiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVuYW1lICsgIikgaXMgaW52YWxpZCByZWxhdGl2ZSB0byAiIAotICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhlbHBGaWxlID0gbmV3IEZpbGUocGFyZW50RmlsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuZXF1YWxzKCIuIikpIHsKLSAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGhlcmUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVscEZpbGUgPSBuZXcgRmlsZShoZWxwRmlsZSwgcGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEZpbGUoaGVscEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICZxdW90O25vcm1hbGl6ZSZxdW90OyB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgaW5jbHVkZXM6Ci0gICAgICogPHVsPgotICAgICAqICAgPGxpPlVwcGVyY2FzZSB0aGUgZHJpdmUgbGV0dGVyIGlmIHRoZXJlIGlzIG9uZS48L2xpPgotICAgICAqICAgPGxpPlJlbW92ZSByZWR1bmRhbnQgc2xhc2hlcyBhZnRlciB0aGUgZHJpdmUgc3BlYy48L2xpPgotICAgICAqICAgPGxpPnJlc29sdmUgYWxsIC4vLCAuXCwgLi4vIGFuZCAuLlwgc2VxdWVuY2VzLjwvbGk+Ci0gICAgICogICA8bGk+RE9TIHN0eWxlIHBhdGhzIHRoYXQgc3RhcnQgd2l0aCBhIGRyaXZlIGxldHRlciB3aWxsIGhhdmUKLSAgICAgKiAgICAgXCBhcyB0aGUgc2VwYXJhdG9yLjwvbGk+IAotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIEZpbGUgbm9ybWFsaXplKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIFN0cmluZyBvcmlnID0gcGF0aDsKLQotICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKQotICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYXJlIGRlYWxpbmcgd2l0aCBhbiBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSAmJgotICAgICAgICAgICAgISAocGF0aC5sZW5ndGgoKSA+PSAyICYmCi0gICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNMZXR0ZXIocGF0aC5jaGFyQXQoMCkpICYmCi0gICAgICAgICAgICAgICBwYXRoLmNoYXJBdCgxKSA9PSAnOicpCi0gICAgICAgICAgICApIHsgICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gcGF0aCArICIgaXMgbm90IGFuIGFic29sdXRlIHBhdGgiOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBib29sZWFuIGRvc1dpdGhEcml2ZSA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgcm9vdCA9IG51bGw7Ci0gICAgICAgIC8vIEVsaW1pbmF0ZSBjb25zZWN1dGl2ZSBzbGFzaGVzIGFmdGVyIHRoZSBkcml2ZSBzcGVjCi0gICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID49IDIgJiYKLSAgICAgICAgICAgIENoYXJhY3Rlci5pc0xldHRlcihwYXRoLmNoYXJBdCgwKSkgJiYKLSAgICAgICAgICAgIHBhdGguY2hhckF0KDEpID09ICc6JykgewotCi0gICAgICAgICAgICBkb3NXaXRoRHJpdmUgPSB0cnVlOwotCi0gICAgICAgICAgICBjaGFyW10gY2EgPSBwYXRoLnJlcGxhY2UoJy8nLCAnXFwnKS50b0NoYXJBcnJheSgpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjYVswXSkpLmFwcGVuZCgnOicpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChjYVtpXSAhPSAnXFwnKSB8fAotICAgICAgICAgICAgICAgICAgICAoY2FbaV0gPT0gJ1xcJyAmJiBjYVtpIC0gMV0gIT0gJ1xcJykKLSAgICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjYVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYXRoID0gc2IudG9TdHJpbmcoKS5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IHBhdGg7Ci0gICAgICAgICAgICAgICAgcGF0aCA9ICIiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb290ID0gcGF0aC5zdWJzdHJpbmcoMCwgMyk7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IEZpbGUuc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgIHBhdGggPSAiIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5jaGFyQXQoMSkgPT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7Ci0gICAgICAgICAgICAgICAgLy8gVU5DIGRyaXZlCi0gICAgICAgICAgICAgICAgcm9vdCA9IEZpbGUuc2VwYXJhdG9yK0ZpbGUuc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IEZpbGUuc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0YWNrIHMgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgcy5wdXNoKHJvb3QpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCBGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGhpc1Rva2VuID0gdG9rLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaWYgKCIuIi5lcXVhbHModGhpc1Rva2VuKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiLi4iLmVxdWFscyh0aGlzVG9rZW4pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHMuc2l6ZSgpIDwgMikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCByZXNvbHZlIHBhdGggIitvcmlnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzLnBvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIHBsYWluIGNvbXBvbmVudAotICAgICAgICAgICAgICAgIHMucHVzaCh0aGlzVG9rZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90IGJlZm9yZSB0aGUgZmlsZXN5c3RlbSByb290IGFuZCBub3QgYWZ0ZXIgaXQsIHNpbmNlIHJvb3QKLSAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGNvbnRhaW5zIG9uZQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKHMuZWxlbWVudEF0KGkpKTsKLSAgICAgICAgfQotICAgICAgICAKLQotICAgICAgICBwYXRoID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKGRvc1dpdGhEcml2ZSkgewotICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnLycsICdcXCcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShwYXRoKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmxhdEZpbGVOYW1lTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZsYXRGaWxlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDEyZDE3Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmxhdEZpbGVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgRmlsZU5hbWVNYXBwZXIgdGhhdCBhbHdheXMgcmV0dXJucyB0aGUgc291cmNlCi0gKiBmaWxlIG5hbWUgd2l0aG91dCBhbnkgbGVhZGluZyBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gKgotICogPHA+VGhpcyBpcyB0aGUgZGVmYXVsdCBGaWxlTmFtZU1hcHBlciBmb3IgdGhlIGNvcHkgYW5kIG1vdmUKLSAqIHRhc2tzIGlmIHRoZSBmbGF0dGVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIEZsYXRGaWxlTmFtZU1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKLQotICAgIC8qKgotICAgICAqIElnbm9yZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkge30KLQotICAgIC8qKgotICAgICAqIElnbm9yZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VG8oU3RyaW5nIHRvKSB7fQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvbmUtZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZSBzb3VyY2UgZmlsZSBuYW1lCi0gICAgICogd2l0aG91dCBhbnkgbGVhZGluZyBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtuZXcgamF2YS5pby5GaWxlKHNvdXJjZUZpbGVOYW1lKS5nZXROYW1lKCl9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvR2xvYlBhdHRlcm5NYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvR2xvYlBhdHRlcm5NYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjYTIyYS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0dsb2JQYXR0ZXJuTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIEZpbGVOYW1lTWFwcGVyIHRoYXQgZG9lcyBzaW1wbGUgd2lsZGNhcmQgcGF0dGVybgotICogcmVwbGFjZW1lbnRzLgotICoKLSAqIDxwPlRoaXMgZG9lcyBzaW1wbGUgdHJhbnNsYXRpb25zIGxpa2UgKi5mb28gLT4gKi5iYXIgd2hlcmUgdGhlCi0gKiBwcmVmaXggdG8gLmZvbyB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkLiBJdCBvbmx5IGhhbmRsZXMgYSBzaW5nbGUgKgotICogY2hhcmFjdGVyLCB1c2UgcmVndWxhciBleHByZXNzaW9ucyBmb3IgbW9yZSBjb21wbGljYXRlZAotICogc2l0dWF0aW9ucy48L3A+Ci0gKgotICogPHA+VGhpcyBpcyBvbmUgb2YgdGhlIG1vcmUgdXNlZnVsIE1hcHBlcnMsIGl0IGlzIHVzZWQgYnkgamF2YWMgZm9yCi0gKiBleGFtcGxlLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBHbG9iUGF0dGVybk1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKLSAgICAvKioKLSAgICAgKiBQYXJ0IG9mICZxdW90O2Zyb20mcXVvdDsgcGF0dGVybiBiZWZvcmUgdGhlICouCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmcm9tUHJlZml4ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFBhcnQgb2YgJnF1b3Q7ZnJvbSZxdW90OyBwYXR0ZXJuIGFmdGVyIHRoZSAqLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZnJvbVBvc3RmaXggPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIExlbmd0aCBvZiB0aGUgcHJlZml4ICgmcXVvdDtmcm9tJnF1b3Q7IHBhdHRlcm4pLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgcHJlZml4TGVuZ3RoOwotCi0gICAgLyoqCi0gICAgICogTGVuZ3RoIG9mIHRoZSBwb3N0Zml4ICgmcXVvdDtmcm9tJnF1b3Q7IHBhdHRlcm4pLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgcG9zdGZpeExlbmd0aDsKLQotICAgIC8qKgotICAgICAqIFBhcnQgb2YgJnF1b3Q7dG8mcXVvdDsgcGF0dGVybiBiZWZvcmUgdGhlICouCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0b1ByZWZpeCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJ0IG9mICZxdW90O3RvJnF1b3Q7IHBhdHRlcm4gYWZ0ZXIgdGhlICouCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0b1Bvc3RmaXggPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlICZxdW90O2Zyb20mcXVvdDsgcGF0dGVybi4gUmVxdWlyZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgewotICAgICAgICBpbnQgaW5kZXggPSBmcm9tLmxhc3RJbmRleE9mKCIqIik7Ci0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgZnJvbVByZWZpeCA9IGZyb207Ci0gICAgICAgICAgICBmcm9tUG9zdGZpeCA9ICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnJvbVByZWZpeCA9IGZyb20uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgIGZyb21Qb3N0Zml4ID0gZnJvbS5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZml4TGVuZ3RoID0gZnJvbVByZWZpeC5sZW5ndGgoKTsKLSAgICAgICAgcG9zdGZpeExlbmd0aCA9IGZyb21Qb3N0Zml4Lmxlbmd0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlICZxdW90O3RvJnF1b3Q7IHBhdHRlcm4uIFJlcXVpcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgewotICAgICAgICBpbnQgaW5kZXggPSB0by5sYXN0SW5kZXhPZigiKiIpOwotICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgIHRvUHJlZml4ID0gdG87Ci0gICAgICAgICAgICB0b1Bvc3RmaXggPSAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRvUHJlZml4ID0gdG8uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgIHRvUG9zdGZpeCA9IHRvLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgc291cmNlIGZpbGUgbmFtZSBkb2Vzbid0IG1hdGNoIHRoZQotICAgICAqICZxdW90O2Zyb20mcXVvdDsgcGF0dGVybiwgYW4gb25lLWVsZW1lbnQgYXJyYXkgY29udGFpbmluZyB0aGUKLSAgICAgKiB0cmFuc2xhdGVkIGZpbGUgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgc291cmNlRmlsZU5hbWUpIHsKLSAgICAgICAgaWYgKGZyb21QcmVmaXggPT0gbnVsbCAKLSAgICAgICAgICAgIHx8ICFzb3VyY2VGaWxlTmFtZS5zdGFydHNXaXRoKGZyb21QcmVmaXgpIAotICAgICAgICAgICAgfHwgIXNvdXJjZUZpbGVOYW1lLmVuZHNXaXRoKGZyb21Qb3N0Zml4KSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7dG9QcmVmaXggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4dHJhY3RWYXJpYWJsZVBhcnQoc291cmNlRmlsZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRvUG9zdGZpeH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFydCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgKiBpbiB0aGUKLSAgICAgKiAmcXVvdDtmcm9tJnF1b3Q7IHBhdHRlcm4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0VmFyaWFibGVQYXJ0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhwcmVmaXhMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmxlbmd0aCgpIC0gcG9zdGZpeExlbmd0aCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9JZGVudGl0eU1hcHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9JZGVudGl0eU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODcxNTBhLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSWRlbnRpdHlNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBGaWxlTmFtZU1hcHBlciB0aGF0IGFsd2F5cyByZXR1cm5zIHRoZSBzb3VyY2UgZmlsZSBuYW1lLgotICoKLSAqIDxwPlRoaXMgaXMgdGhlIGRlZmF1bHQgRmlsZU5hbWVNYXBwZXIgZm9yIHRoZSBjb3B5IGFuZCBtb3ZlCi0gKiB0YXNrcy48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlNYXBwZXIgaW1wbGVtZW50cyBGaWxlTmFtZU1hcHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBJZ25vcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHt9Ci0KLSAgICAvKioKLSAgICAgKiBJZ25vcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykge30KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gb25lLWVsZW1lbnQgYXJyYXkgY29udGFpbmluZyB0aGUgc291cmNlIGZpbGUgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge3NvdXJjZUZpbGVOYW1lfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL01lcmdpbmdNYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTWVyZ2luZ01hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjRiN2FkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTWVyZ2luZ01hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIEZpbGVOYW1lTWFwcGVyIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUKLSAqIHRhcmdldCBmaWxlIG5hbWUuCi0gKgotICogPHA+VGhpcyBpcyB0aGUgZGVmYXVsdCBGaWxlTmFtZU1hcHBlciBmb3IgdGhlIGFyY2hpdmluZyB0YXNrcyBhbmQKLSAqIHVwdG9kYXRlLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnaW5nTWFwcGVyIGltcGxlbWVudHMgRmlsZU5hbWVNYXBwZXIgewotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtZXJnZWRGaWxlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIElnbm9yZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkge30KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG1lcmdlZCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgewotICAgICAgICBtZXJnZWRGaWxlID0gbmV3IFN0cmluZ1tdIHt0b307Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvbmUtZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUgc2V0IHZpYSBzZXRUby4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiBtZXJnZWRGaWxlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWdleHBQYXR0ZXJuTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZ2V4cFBhdHRlcm5NYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjNGY0ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZ2V4cFBhdHRlcm5NYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cE1hdGNoZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgRmlsZU5hbWVNYXBwZXIgdGhhdCBkb2VzIHJlZ3VsYXIgZXhwcmVzc2lvbgotICogcmVwbGFjZW1lbnRzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIFJlZ2V4cFBhdHRlcm5NYXBwZXIgaW1wbGVtZW50cyBGaWxlTmFtZU1hcHBlciB7Ci0gICAgcHJvdGVjdGVkIFJlZ2V4cE1hdGNoZXIgcmVnID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgY2hhcltdIHRvID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHB1YmxpYyBSZWdleHBQYXR0ZXJuTWFwcGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmVnID0gKG5ldyBSZWdleHBNYXRjaGVyRmFjdG9yeSgpKS5uZXdSZWdleHBNYXRjaGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlICZxdW90O2Zyb20mcXVvdDsgcGF0dGVybi4gUmVxdWlyZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKGZyb20pOwotICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0gICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIHRoZSBhY3R1YWwgUkUgd29uJ3QKLSAgICAgICAgICAgIC8vIGdldCBpbnN0YW50aWF0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSAmcXVvdDt0byZxdW90OyBwYXR0ZXJuLiBSZXF1aXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKLSAgICAgICAgdGhpcy50byA9IHRvLnRvQ2hhckFycmF5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBzb3VyY2UgZmlsZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgICogJnF1b3Q7ZnJvbSZxdW90OyBwYXR0ZXJuLCBhbiBvbmUtZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZQotICAgICAqIHRyYW5zbGF0ZWQgZmlsZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgewotICAgICAgICBpZiAocmVnID09IG51bGwgIHx8IHRvID09IG51bGwKLSAgICAgICAgICAgIHx8ICFyZWcubWF0Y2hlcyhzb3VyY2VGaWxlTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge3JlcGxhY2VSZWZlcmVuY2VzKHNvdXJjZUZpbGVOYW1lKX07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSBhbGwgYmFja3JlZmVyZW5jZXMgaW4gdGhlIHRvIHBhdHRlcm4gd2l0aCB0aGUgbWF0Y2hlZAotICAgICAqIGdyb3VwcyBvZiB0aGUgc291cmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVwbGFjZVJlZmVyZW5jZXMoU3RyaW5nIHNvdXJjZSkgewotICAgICAgICBWZWN0b3IgdiA9IHJlZy5nZXRHcm91cHMoc291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTx0by5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHRvW2ldID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoKytpIDwgdG8ubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IENoYXJhY3Rlci5kaWdpdCh0b1tpXSwgMTApOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoU3RyaW5nKSB2LmVsZW1lbnRBdCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBYWFggLSBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGluc3RlYWQ/Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRvW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NvdXJjZUZpbGVTY2FubmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NvdXJjZUZpbGVTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDc3NzEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Tb3VyY2VGaWxlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBjb2xsZWN0cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdmFyaW91cwotICogc2NhbkRpciBtZXRob2RzIHRoYXQgaGF2ZSBiZWVuIHNjYXR0ZXJlZCBpbiBzZXZlcmFsIHRhc2tzIGJlZm9yZS4KLSAqCi0gKiA8cD5UaGUgb25seSBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBzb3VyY2UgZmlsZXMuIFRoZSBhcnJheSBpcyBhCi0gKiBzdWJzZXQgb2YgdGhlIGZpbGVzIGdpdmVuIGFzIGEgcGFyYW1ldGVyIGFuZCBob2xkcyBvbmx5IHRob3NlIHRoYXQKLSAqIGFyZSBuZXdlciB0aGFuIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IGZpbGVzLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VGaWxlU2Nhbm5lciB7Ci0KLSAgICBwcm90ZWN0ZWQgVGFzayB0YXNrOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgd2Ugc2hvdWxkIGxvZyBtZXNzYWdlcyB0aHJvdWdoCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZUZpbGVTY2FubmVyKFRhc2sgdGFzaykgewotICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RyaWN0IHRoZSBnaXZlbiBzZXQgb2YgZmlsZXMgdG8gdGhvc2UgdGhhdCBhcmUgbmV3ZXIgdGhhbgotICAgICAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IGZpbGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVzICAgdGhlIG9yaWdpbmFsIHNldCBvZiBmaWxlcwotICAgICAqIEBwYXJhbSBzcmNEaXIgIGFsbCBmaWxlcyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gZGVzdERpciB0YXJnZXQgZmlsZXMgbGl2ZSBoZXJlLiBpZiBudWxsIGZpbGUgbmFtZXMKLSAgICAgKiAgICAgICAgICAgICAgICByZXR1cm5lZCBieSB0aGUgbWFwcGVyIGFyZSBhc3N1bWVkIHRvIGJlIGFic29sdXRlLgotICAgICAqIEBwYXJhbSBtYXBwZXIgIGtub3dzIGhvdyB0byBjb25zdHJ1Y3QgYSB0YXJnZXQgZmlsZSBuYW1lcyBmcm9tCi0gICAgICogICAgICAgICAgICAgICAgc291cmNlIGZpbGUgbmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIHJlc3RyaWN0KFN0cmluZ1tdIGZpbGVzLCBGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIpIHsKLQotICAgICAgICBsb25nIG5vdyA9IChuZXcgamF2YS51dGlsLkRhdGUoKSkuZ2V0VGltZSgpOwotICAgICAgICBTdHJpbmdCdWZmZXIgdGFyZ2V0TGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAvKgotICAgICAgICAgIElmIHdlJ3JlIG9uIFdpbmRvd3MsIHdlIGhhdmUgdG8gbXVuZ2UgdGhlIHRpbWUgdXAgdG8gMiBzZWNzIHRvCi0gICAgICAgICAgYmUgYWJsZSB0byBjaGVjayBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcy4KLSAgICAgICAgICAoV2luZG93cyBoYXMgYSBtYXggcmVzb2x1dGlvbiBvZiB0d28gc2VjcyBmb3IgbW9kaWZpY2F0aW9uIHRpbWVzKQotICAgICAgICAqLwotICAgICAgICBTdHJpbmcgb3NuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYgKCBvc25hbWUuaW5kZXhPZigid2luZG93cyIpID49IDAgKSB7Ci0gICAgICAgICAgICBub3cgKz0gMjAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHRhcmdldHMgPSBtYXBwZXIubWFwRmlsZU5hbWUoZmlsZXNbaV0pOwotICAgICAgICAgICAgaWYgKHRhcmdldHMgPT0gbnVsbCB8fCB0YXJnZXRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGFzay5sb2coZmlsZXNbaV0rIiBza2lwcGVkIC0gZG9uXCd0IGtub3cgaG93IHRvIGhhbmRsZSBpdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZpbGUgc3JjID0gbmV3IEZpbGUoc3JjRGlyLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBpZiAoc3JjLmxhc3RNb2RpZmllZCgpID4gbm93KSB7Ci0gICAgICAgICAgICAgICAgdGFzay5sb2coIldhcm5pbmc6ICIrZmlsZXNbaV0rIiBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB0YXJnZXRMaXN0LnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgIGZvciAoaW50IGo9MDsgIWFkZGVkICYmIGo8dGFyZ2V0cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIEZpbGUgZGVzdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc3REaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0ID0gbmV3IEZpbGUodGFyZ2V0c1tqXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdCA9IG5ldyBGaWxlKGRlc3REaXIsIHRhcmdldHNbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIWRlc3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFzay5sb2coZmlsZXNbaV0rIiBhZGRlZCBhcyAiK2Rlc3QuZ2V0QWJzb2x1dGVQYXRoKCkrIiBkb2VzblwndCBleGlzdC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjLmxhc3RNb2RpZmllZCgpID4gZGVzdC5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICB0YXNrLmxvZyhmaWxlc1tpXSsiIGFkZGVkIGFzICIrZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSsiIGlzIG91dGRhdGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICB2LmFkZEVsZW1lbnQoZmlsZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldExpc3QubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRMaXN0LmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0YXJnZXRMaXN0LmFwcGVuZChkZXN0LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYWRkZWQpIHsKLSAgICAgICAgICAgICAgICB0YXNrLmxvZyhmaWxlc1tpXSsiIG9taXR0ZWQgYXMgIit0YXJnZXRMaXN0LnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICh0YXJnZXRzLmxlbmd0aCA9PSAxID8gIiBpcyIgOiAiIGFyZSAiKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB1cCB0byBkYXRlLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t2LnNpemUoKV07Ci0gICAgICAgIHYuY29weUludG8ocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252aW5pZW5jZSBsYXllciBvbiB0b3Agb2YgcmVzdHJpY3QgdGhhdCByZXR1cm5zIHRoZSBzb3VyY2UKLSAgICAgKiBmaWxlcyBhcyBGaWxlIG9iamVjdHMgKGNvbnRhaW5pbmcgYWJzb2x1dGUgcGF0aHMgaWYgc3JjRGlyIGlzCi0gICAgICogYWJzb2x1dGUpLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlW10gcmVzdHJpY3RBc0ZpbGVzKFN0cmluZ1tdIGZpbGVzLCBGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlcikgewotICAgICAgICBTdHJpbmdbXSByZXMgPSByZXN0cmljdChmaWxlcywgc3JjRGlyLCBkZXN0RGlyLCBtYXBwZXIpOwotICAgICAgICBGaWxlW10gcmVzdWx0ID0gbmV3IEZpbGVbcmVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxyZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ldyBGaWxlKHNyY0RpciwgcmVzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJhZjI0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgUmVnZXhwTWF0Y2hlciBmb3IgSmFrYXJ0YS1PUk8uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIEpha2FydGFPcm9NYXRjaGVyIGltcGxlbWVudHMgUmVnZXhwTWF0Y2hlciB7Ci0KLSAgICBwcm90ZWN0ZWQgUGVybDVNYXRjaGVyIHJlZyA9IG5ldyBQZXJsNU1hdGNoZXIoKTsKLSAgICBwcm90ZWN0ZWQgUGVybDVDb21waWxlciBjb21wID0gbmV3IFBlcmw1Q29tcGlsZXIoKTsKLSAgICBwcml2YXRlIFBhdHRlcm4gcGF0dGVybjsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcmVnZXhwIHBhdHRlcm4gZnJvbSB0aGUgU3RyaW5nIGRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnBhdHRlcm4gPSBjb21wLmNvbXBpbGUocGF0dGVybik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFBhdHRlcm5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWdleHAgcGF0dGVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm4uZ2V0UGF0dGVybigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvZXMgdGhlIGdpdmVuIGFyZ3VtZW50IG1hdGNoIHRoZSBwYXR0ZXJuPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGFyZ3VtZW50KSB7Ci0gICAgICAgIHJldHVybiByZWcuY29udGFpbnMoYXJndW1lbnQsIHBhdHRlcm4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBWZWN0b3Igb2YgbWF0Y2hlZCBncm91cHMgZm91bmQgaW4gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogPHA+R3JvdXAgMCB3aWxsIGJlIHRoZSBmdWxsIG1hdGNoLCB0aGUgcmVzdCBhcmUgdGhlCi0gICAgICogcGFyZW50aGVzaXplZCBzdWJleHByZXNzaW9uczwvcD4uCi0gICAgICovCi0gICAgcHVibGljIFZlY3RvciBnZXRHcm91cHMoU3RyaW5nIGFyZ3VtZW50KSB7Ci0gICAgICAgIGlmICghbWF0Y2hlcyhhcmd1bWVudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBNYXRjaFJlc3VsdCBtciA9IHJlZy5nZXRNYXRjaCgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bXIuZ3JvdXBzKCk7IGkrKykgewotICAgICAgICAgICAgdi5hZGRFbGVtZW50KG1yLmdyb3VwKGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA3ZTBjLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUucmVnZXhwLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIFJlZ2V4cE1hdGNoZXIgZm9yIEpha2FydGEtUmVnZXhwLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKYWthcnRhUmVnZXhwTWF0Y2hlciBpbXBsZW1lbnRzIFJlZ2V4cE1hdGNoZXIgewotCi0gICAgcHJvdGVjdGVkIFJFIHJlZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcmVnZXhwIHBhdHRlcm4gZnJvbSB0aGUgU3RyaW5nIGRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotICAgICAgICAgICAgcmVnID0gbmV3IFJFKHBhdHRlcm4pOwotICAgICAgICB9IGNhdGNoIChSRVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4cCBwYXR0ZXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgewotICAgICAgICByZXR1cm4gcGF0dGVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIHRoZSBnaXZlbiBhcmd1bWVudCBtYXRjaCB0aGUgcGF0dGVybj8KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhcmd1bWVudCkgewotICAgICAgICByZXR1cm4gcmVnLm1hdGNoKGFyZ3VtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIG9mIG1hdGNoZWQgZ3JvdXBzIGZvdW5kIGluIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIDxwPkdyb3VwIDAgd2lsbCBiZSB0aGUgZnVsbCBtYXRjaCwgdGhlIHJlc3QgYXJlIHRoZQotICAgICAqIHBhcmVudGhlc2l6ZWQgc3ViZXhwcmVzc2lvbnM8L3A+LgotICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBzKFN0cmluZyBhcmd1bWVudCkgewotICAgICAgICBpZiAoIW1hdGNoZXMoYXJndW1lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJlZy5nZXRQYXJlbkNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgdi5hZGRFbGVtZW50KHJlZy5nZXRQYXJlbihpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDI1ODA5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgUmVnZXhwTWF0Y2hlciBmb3IgdGhlIGJ1aWx0LWluIHJlZ2V4cCBtYXRjaGVyIG9mCi0gKiBKREsgMS40LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGsxNFJlZ2V4cE1hdGNoZXIgaW1wbGVtZW50cyBSZWdleHBNYXRjaGVyIHsKLQotICAgIHByaXZhdGUgUGF0dGVybiBwYXR0ZXJuOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSByZWdleHAgcGF0dGVybiBmcm9tIHRoZSBTdHJpbmcgZGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMucGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKTsKLSAgICAgICAgfSBjYXRjaCAoUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4cCBwYXR0ZXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgewotICAgICAgICByZXR1cm4gcGF0dGVybi5wYXR0ZXJuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgZ2l2ZW4gYXJndW1lbnQgbWF0Y2ggdGhlIHBhdHRlcm4/Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgYXJndW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm4ubWF0Y2hlcihhcmd1bWVudCkuZmluZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBWZWN0b3Igb2YgbWF0Y2hlZCBncm91cHMgZm91bmQgaW4gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogPHA+R3JvdXAgMCB3aWxsIGJlIHRoZSBmdWxsIG1hdGNoLCB0aGUgcmVzdCBhcmUgdGhlCi0gICAgICogcGFyZW50aGVzaXplZCBzdWJleHByZXNzaW9uczwvcD4uCi0gICAgICovCi0gICAgcHVibGljIFZlY3RvciBnZXRHcm91cHMoU3RyaW5nIGFyZ3VtZW50KSB7Ci0gICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihhcmd1bWVudCk7Ci0gICAgICAgIGlmICghbWF0Y2hlci5maW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8PW1hdGNoZXIuZ3JvdXBDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIHYuYWRkRWxlbWVudChtYXRjaGVyLmdyb3VwKGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5MWY4My4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVzY3JpYmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVnZXhwTWF0Y2hlciB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHJlZ2V4cCBwYXR0ZXJuIGZyb20gdGhlIFN0cmluZyBkZXNjcmlwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4cCBwYXR0ZXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIHRoZSBnaXZlbiBhcmd1bWVudCBtYXRjaCB0aGUgcGF0dGVybj8KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhcmd1bWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIG9mIG1hdGNoZWQgZ3JvdXBzIGZvdW5kIGluIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIDxwPkdyb3VwIDAgd2lsbCBiZSB0aGUgZnVsbCBtYXRjaCwgdGhlIHJlc3QgYXJlIHRoZQotICAgICAqIHBhcmVudGhlc2l6ZWQgc3ViZXhwcmVzc2lvbnM8L3A+LgotICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBzKFN0cmluZyBhcmd1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmOTA5My4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaW1wbGUgRmFjdG9yeSBDbGFzcyB0aGF0IHByb2R1Y2VzIGFuIGltcGxlbWVudGF0aW9uIG9mCi0gKiBSZWdleHBNYXRjaGVyIGJhc2VkIG9uIHRoZSBzeXN0ZW0gcHJvcGVydHkKLSAqIDxjb2RlPmFudC5yZWdleHAubWF0Y2hlcmltcGw8L2NvZGU+IGFuZCB0aGUgY2xhc3NlcwotICogYXZhaWxhYmxlLgotICogCi0gKiA8cD5JbiBhIG1vcmUgZ2VuZXJhbCBmcmFtZXdvcmsgdGhpcyBjbGFzcyB3b3VsZCBiZSBhYnN0cmFjdCBhbmQKLSAqIGhhdmUgYSBzdGF0aWMgbmV3SW5zdGFuY2UgbWV0aG9kLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi1wdWJsaWMgY2xhc3MgUmVnZXhwTWF0Y2hlckZhY3RvcnkgewotCi0gICAgcHVibGljIFJlZ2V4cE1hdGNoZXJGYWN0b3J5KCkge30KLQotICAgIHB1YmxpYyBSZWdleHBNYXRjaGVyIG5ld1JlZ2V4cE1hdGNoZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3lzdGVtRGVmYXVsdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LnJlZ2V4cC5tYXRjaGVyaW1wbCIpOwotICAgICAgICBpZiAoc3lzdGVtRGVmYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2Uoc3lzdGVtRGVmYXVsdCk7Ci0gICAgICAgICAgICAvLyBYWFggICAgIHNob3VsZCB3ZSBzaWxlbnRseSBwb3NzaWJsZSBleGNlcHRpb25zIGFuZCB0cnkgdG8gCi0gICAgICAgICAgICAvLyAgICAgICAgIGxvYWQgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24/Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKCJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KZGsxNFJlZ2V4cE1hdGNoZXIiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHt9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKCJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhT3JvTWF0Y2hlciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkge30KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UoIm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLkpha2FydGFSZWdleHBNYXRjaGVyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7fQotCi0gICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gc3VwcG9ydGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVyIGZvdW5kIik7Ci0gICB9Ci0KLSAgICBwcm90ZWN0ZWQgUmVnZXhwTWF0Y2hlciBjcmVhdGVJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lKSAKLSAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGltcGxDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAoUmVnZXhwTWF0Y2hlcikgaW1wbENsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC92ZXJzaW9uLnR4dCBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3ZlcnNpb24udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmIyZjhkLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3ZlcnNpb24udHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1WRVJTSU9OPUBWRVJTSU9OQAotREFURT1AREFURUAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvbWFpbC9NYWlsTWVzc2FnZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL01haWxNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NTg1YzEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL01haWxNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICovCi0KLS8qCi0gKiBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIGNsYXNzIHdhcyBkb25hdGVkIGJ5IEphc29uIEh1bnRlciwKLSAqIHdobyB3cm90ZSB0aGUgY2xhc3MgYXMgcGFydCBvZiB0aGUgY29tLm9yZWlsbHkuc2VydmxldAotICogcGFja2FnZSBmb3IgaGlzIGJvb2sgIkphdmEgU2VydmxldCBQcm9ncmFtbWluZyIgKE8nUmVpbGx5KS4KLSAqIFNlZSBodHRwOi8vd3d3LnNlcnZsZXRzLmNvbS4KLSAqIAotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5tYWlsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKiAKLSAqIEEgY2xhc3MgdG8gaGVscCBzZW5kIFNNVFAgZW1haWwuCi0gKiBUaGlzIGNsYXNzIGlzIGFuIGltcHJvdmVtZW50IG9uIHRoZSBzdW4ubmV0LnNtdHAuU210cENsaWVudCBjbGFzcyAKLSAqIGZvdW5kIGluIHRoZSBKREsuICBUaGlzIHZlcnNpb24gaGFzIGV4dHJhIGZ1bmN0aW9uYWxpdHksIGFuZCBjYW4gYmUgdXNlZAotICogd2l0aCBKVk1zIHRoYXQgZGlkIG5vdCBleHRlbmQgZnJvbSB0aGUgSkRLLiAgSXQncyBub3QgYXMgcm9idXN0IGFzCi0gKiB0aGUgSmF2YU1haWwgU3RhbmRhcmQgRXh0ZW5zaW9uIGNsYXNzZXMsIGJ1dCBpdCdzIGVhc2llciB0byB1c2UgYW5kIAotICogZWFzaWVyIHRvIGluc3RhbGwsIGFuZCBoYXMgYW4gT3BlbiBTb3VyY2UgbGljZW5zZS4KLSAqIDxwPgotICogSXQgY2FuIGJlIHVzZWQgbGlrZSB0aGlzOgotICogPGJsb2NrcXVvdGU+PHByZT4KLSAqIFN0cmluZyBtYWlsaG9zdCA9ICJsb2NhbGhvc3QiOyAgLy8gb3IgYW5vdGhlciBtYWlsIGhvc3QKLSAqIFN0cmluZyBmcm9tID0gIk1haWwgTWVzc2FnZSBTZXJ2bGV0ICZsdDtNYWlsTWVzc2FnZUBzZXJ2ZXIuY29tJmd0OyI7Ci0gKiBTdHJpbmcgdG8gPSAidG9AeW91LmNvbSI7Ci0gKiBTdHJpbmcgY2MxID0gImNjMUB5b3UuY29tIjsKLSAqIFN0cmluZyBjYzIgPSAiY2MyQHlvdS5jb20iOwotICogU3RyaW5nIGJjYyA9ICJiY2NAeW91LmNvbSI7Ci0gKiAmbmJzcDsKLSAqIE1haWxNZXNzYWdlIG1zZyA9IG5ldyBNYWlsTWVzc2FnZShtYWlsaG9zdCk7Ci0gKiBtc2cuZnJvbShmcm9tKTsKLSAqIG1zZy50byh0byk7Ci0gKiBtc2cuY2MoY2MxKTsKLSAqIG1zZy5jYyhjYzIpOwotICogbXNnLmJjYyhiY2MpOwotICogbXNnLnNldFN1YmplY3QoIlRlc3Qgc3ViamVjdCIpOwotICogUHJpbnRTdHJlYW0gb3V0ID0gbXNnLmdldFByaW50U3RyZWFtKCk7Ci0gKiAmbmJzcDsKLSAqIEVudW1lcmF0aW9uIGVudW0gPSByZXEuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAqIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gKiAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllbnVtLm5leHRFbGVtZW50KCk7Ci0gKiAgIFN0cmluZyB2YWx1ZSA9IHJlcS5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gKiAgIG91dC5wcmludGxuKG5hbWUgKyAiID0gIiArIHZhbHVlKTsKLSAqIH0KLSAqICZuYnNwOwotICogbXNnLnNlbmRBbmRDbG9zZSgpOwotICogPC9wcmU+PC9ibG9ja3F1b3RlPgotICogPHA+Ci0gKiBCZSBzdXJlIHRvIHNldCB0aGUgZnJvbSBhZGRyZXNzLCB0aGVuIHNldCB0aGUgcmVjZXBpZW50IAotICogYWRkcmVzc2VzLCB0aGVuIHNldCB0aGUgc3ViamVjdCBhbmQgb3RoZXIgaGVhZGVycywgdGhlbiBnZXQgdGhlIAotICogUHJpbnRTdHJlYW0sIHRoZW4gd3JpdGUgdGhlIG1lc3NhZ2UsIGFuZCBmaW5hbGx5IHNlbmQgYW5kIGNsb3NlLgotICogVGhlIGNsYXNzIGRvZXMgbWluaW1hbCBlcnJvciBjaGVja2luZyBpbnRlcm5hbGx5OyBpdCBjb3VudHMgb24gdGhlIG1haWwKLSAqIGhvc3QgdG8gY29tcGxhaW4gaWYgdGhlcmUncyBhbnkgbWFsZm9ybWF0dGVkIGlucHV0IG9yIG91dCBvZiBvcmRlciAKLSAqIGV4ZWN1dGlvbi4gIAotICogPHA+Ci0gKiBBbiBhdHRhY2htZW50IG1lY2hhbmlzbSBiYXNlZCBvbiBSRkMgMTUyMSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YKLSAqIHRoaXMgY2xhc3MuICBJbiB0aGUgbWVhbndoaWxlLCBKYXZhTWFpbCBpcyB0aGUgYmVzdCBzb2x1dGlvbiBmb3Igc2VuZGluZwotICogZW1haWwgd2l0aCBhdHRhY2htZW50cy4KLSAqIDxwPgotICogU3RpbGwgdG8gZG86Ci0gKiA8dWw+Ci0gKiA8bGk+RmlndXJlIG91dCBob3cgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW4gY2FzZSBvZiBlcnJvcgotICogPC91bD4KLSAqCi0gKiBAYXV0aG9yIEphc29uIEh1bnRlcgotICogQHZlcnNpb24gMS4xLCAyMDAwLzAzLzE5LCBhZGRlZCBhbmdsZSBicmFja2V0cyB0byBhZGRyZXNzLCBoZWxwcyBzb21lIHNlcnZlcnMKLSAqIHZlcnNpb24gMS4wLCAxOTk5LzEyLzI5Ci0gKi8KLXB1YmxpYyBjbGFzcyBNYWlsTWVzc2FnZSB7Ci0KLSAgU3RyaW5nIGhvc3Q7Ci0gIFN0cmluZyBmcm9tOwotICBWZWN0b3IgdG8sIGNjOwotICBIYXNodGFibGUgaGVhZGVyczsKLSAgTWFpbFByaW50U3RyZWFtIG91dDsKLSAgU210cFJlc3BvbnNlUmVhZGVyIGluOwotICBTb2NrZXQgc29ja2V0OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE1haWxNZXNzYWdlIHRvIHNlbmQgYW4gZW1haWwuCi0gICAqIFVzZSBsb2NhbGhvc3QgYXMgdGhlIG1haWwgc2VydmVyLgotICAgKgotICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gY29udGFjdGluZyB0aGUgbWFpbCBzZXJ2ZXIKLSAgICovCi0gIHB1YmxpYyBNYWlsTWVzc2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdGhpcygibG9jYWxob3N0Iik7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBNYWlsTWVzc2FnZSB0byBzZW5kIGFuIGVtYWlsLgotICAgKiBVc2UgdGhlIGdpdmVuIGhvc3QgYXMgdGhlIG1haWwgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gaG9zdCB0aGUgbWFpbCBzZXJ2ZXIgdG8gdXNlCi0gICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUncyBhbnkgcHJvYmxlbSBjb250YWN0aW5nIHRoZSBtYWlsIHNlcnZlcgotICAgKi8KLSAgcHVibGljIE1haWxNZXNzYWdlKFN0cmluZyBob3N0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHRoaXMuaG9zdCA9IGhvc3Q7Ci0gICAgdG8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgY2MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaGVhZGVycyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBzZXRIZWFkZXIoIlgtTWFpbGVyIiwgIm9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZSAoamFrYXJ0YS5hcGFjaGUub3JnKSIpOwotICAgIGNvbm5lY3QoKTsKLSAgICBzZW5kSGVsbygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGZyb20gYWRkcmVzcy4gIEFsc28gc2V0cyB0aGUgIkZyb20iIGhlYWRlci4gIFRoaXMgbWV0aG9kIHNob3VsZAotICAgKiBiZSBjYWxsZWQgb25seSBvbmNlLgotICAgKgotICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVwb3J0ZWQgYnkgdGhlIG1haWwgc2VydmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBmcm9tKFN0cmluZyBmcm9tKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHNlbmRGcm9tKGZyb20pOwotICAgIHRoaXMuZnJvbSA9IGZyb207Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdG8gYWRkcmVzcy4gIEFsc28gc2V0cyB0aGUgIlRvIiBoZWFkZXIuICBUaGlzIG1ldGhvZCBtYXkgYmUKLSAgICogY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotICAgKgotICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVwb3J0ZWQgYnkgdGhlIG1haWwgc2VydmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCB0byhTdHJpbmcgdG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc2VuZFJjcHQodG8pOwotICAgIHRoaXMudG8uYWRkRWxlbWVudCh0byk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY2MgYWRkcmVzcy4gIEFsc28gc2V0cyB0aGUgIkNjIiBoZWFkZXIuICBUaGlzIG1ldGhvZCBtYXkgYmUKLSAgICogY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotICAgKgotICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVwb3J0ZWQgYnkgdGhlIG1haWwgc2VydmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYyhTdHJpbmcgY2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc2VuZFJjcHQoY2MpOwotICAgIHRoaXMuY2MuYWRkRWxlbWVudChjYyk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYmNjIGFkZHJlc3MuICBEb2VzIE5PVCBzZXQgYW55IGhlYWRlciBzaW5jZSBpdCdzIGEgKmJsaW5kKiBjb3B5LgotICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotICAgKgotICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVwb3J0ZWQgYnkgdGhlIG1haWwgc2VydmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBiY2MoU3RyaW5nIGJjYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBzZW5kUmNwdChiY2MpOwotICAgIC8vIE5vIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBCY2MnZCBhZGRyZXNzZXMKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzdWJqZWN0IG9mIHRoZSBtYWlsIG1lc3NhZ2UuICBBY3R1YWxseSBzZXRzIHRoZSAiU3ViamVjdCIgCi0gICAqIGhlYWRlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN1YmplY3QoU3RyaW5nIHN1YmopIHsKLSAgICBoZWFkZXJzLnB1dCgiU3ViamVjdCIsIHN1YmopOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWVkIGhlYWRlciB0byB0aGUgZ2l2ZW4gdmFsdWUuICBSRkMgODIyIHByb3ZpZGVzIHRoZSBydWxlcyBmb3IKLSAgICogd2hhdCB0ZXh0IG1heSBjb25zdGl0dXRlIGEgaGVhZGVyIG5hbWUgYW5kIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAvLyBCbGluZGx5IHRydXN0IHRoZSB1c2VyIGRvZXNuJ3Qgc2V0IGFueSBpbnZhbGlkIGhlYWRlcnMKLSAgICBoZWFkZXJzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIFByaW50U3RyZWFtIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEEgc3RyZWFtIGlzIHVzZWQgc2luY2UgZW1haWwgYm9kaWVzIGFyZSBieXRlLW9yaWVudGVkLiAgQSB3cml0ZXIgY291bGQgCi0gICAqIGJlIHdyYXBwZWQgb24gdG9wIGlmIG5lY2Vzc2FyeSBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gICAqCi0gICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUncyBhbnkgcHJvYmxlbSByZXBvcnRlZCBieSB0aGUgbWFpbCBzZXJ2ZXIKLSAgICovCi0gIHB1YmxpYyBQcmludFN0cmVhbSBnZXRQcmludFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc2V0RnJvbUhlYWRlcigpOwotICAgIHNldFRvSGVhZGVyKCk7Ci0gICAgc2V0Q2NIZWFkZXIoKTsKLSAgICBzZW5kRGF0YSgpOwotICAgIGZsdXNoSGVhZGVycygpOwotICAgIHJldHVybiBvdXQ7Ci0gIH0KLQotICB2b2lkIHNldEZyb21IZWFkZXIoKSB7Ci0gICAgc2V0SGVhZGVyKCJGcm9tIiwgZnJvbSk7Ci0gIH0KLQotICB2b2lkIHNldFRvSGVhZGVyKCkgewotICAgIHNldEhlYWRlcigiVG8iLCB2ZWN0b3JUb0xpc3QodG8pKTsKLSAgfQotCi0gIHZvaWQgc2V0Q2NIZWFkZXIoKSB7Ci0gICAgc2V0SGVhZGVyKCJDYyIsIHZlY3RvclRvTGlzdChjYykpOwotICB9Ci0KLSAgU3RyaW5nIHZlY3RvclRvTGlzdChWZWN0b3IgdikgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IHYuZWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgYnVmLmFwcGVuZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICB9Ci0KLSAgdm9pZCBmbHVzaEhlYWRlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIFhYWCBTaG91bGQgSSBjYXJlIGFib3V0IG9yZGVyIGhlcmU/Ci0gICAgRW51bWVyYXRpb24gZSA9IGhlYWRlcnMua2V5cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KG5hbWUpOwotICAgICAgb3V0LnByaW50bG4obmFtZSArICI6ICIgKyB2YWx1ZSk7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LmZsdXNoKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2VuZHMgdGhlIG1lc3NhZ2UgYW5kIGNsb3NlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyLgotICAgKiBUaGUgTWFpbE1lc3NhZ2Ugb2JqZWN0IGNhbm5vdCBiZSByZXVzZWQuCi0gICAqCi0gICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUncyBhbnkgcHJvYmxlbSByZXBvcnRlZCBieSB0aGUgbWFpbCBzZXJ2ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbmRBbmRDbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc2VuZERvdCgpOwotICAgIHNlbmRRdWl0KCk7Ci0gICAgZGlzY29ubmVjdCgpOwotICB9Ci0KLSAgLy8gTWFrZSBhIGxpbWl0ZWQgYXR0ZW1wdCB0byBleHRyYWN0IGEgc2FuaXRpemVkIGVtYWlsIGFkZHJlc3MKLSAgLy8gUHJlZmVyIHRleHQgaW4gPGJyYWNrZXRzPiwgaWdub3JlIGFueXRoaW5nIGluIChwYXJlbnRoZXNlcykKLSAgc3RhdGljIFN0cmluZyBzYW5pdGl6ZUFkZHJlc3MoU3RyaW5nIHMpIHsKLSAgICBpbnQgcGFyYW1EZXB0aCA9IDA7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gMDsKLSAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgaWYgKGMgPT0gJygnKSB7Ci0gICAgICAgIHBhcmFtRGVwdGgrKzsKLSAgICAgICAgaWYgKHN0YXJ0ID09IDApIHsKLSAgICAgICAgICBlbmQgPSBpOyAgLy8gc3VwcG9ydCAiYWRkcmVzcyAobmFtZSkiCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGMgPT0gJyknKSB7Ci0gICAgICAgIHBhcmFtRGVwdGgtLTsKLSAgICAgICAgaWYgKGVuZCA9PSAwKSB7Ci0gICAgICAgICAgc3RhcnQgPSBpICsgMTsgIC8vIHN1cHBvcnQgIihuYW1lKSBhZGRyZXNzIgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXJhbURlcHRoID09IDAgJiYgYyA9PSAnPCcpIHsKLSAgICAgICAgc3RhcnQgPSBpICsgMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmFtRGVwdGggPT0gMCAmJiBjID09ICc+JykgewotICAgICAgICBlbmQgPSBpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChlbmQgPT0gMCkgewotICAgICAgZW5kID0gbGVuOwotICAgIH0KLQotICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgfQotCi0gIC8vICogKiAqICogKiBSYXcgcHJvdG9jb2wgbWV0aG9kcyBiZWxvdyBoZXJlICogKiAqICogKgotCi0gIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc29ja2V0ID0gbmV3IFNvY2tldChob3N0LCAyNSk7Ci0gICAgb3V0ID0gbmV3IE1haWxQcmludFN0cmVhbSgKLSAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCi0gICAgICAgICAgc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKSk7IAotICAgIGluID0gbmV3IFNtdHBSZXNwb25zZVJlYWRlcihzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgZ2V0UmVhZHkoKTsKLSAgfQotCi0gIHZvaWQgZ2V0UmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFN0cmluZyByZXNwb25zZSA9IGluLmdldFJlc3BvbnNlKCk7Ci0gICAgaW50W10gb2sgPSB7IDIyMCB9OwotICAgIGlmICghaXNSZXNwb25zZU9LKHJlc3BvbnNlLCBvaykpIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgIkRpZG4ndCBnZXQgaW50cm9kdWN0aW9uIGZyb20gc2VydmVyOiAiICsgcmVzcG9uc2UpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2VuZEhlbG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFN0cmluZyBsb2NhbCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCk7Ci0gICAgaW50W10gb2sgPSB7IDI1MCB9OwotICAgIHNlbmQoIkhFTE8gIiArIGxvY2FsLCBvayk7Ci0gIH0KLQotICB2b2lkIHNlbmRGcm9tKFN0cmluZyBmcm9tKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGludFtdIG9rID0geyAyNTAgfTsKLSAgICBzZW5kKCJNQUlMIEZST006ICIgKyAiPCIgKyBzYW5pdGl6ZUFkZHJlc3MoZnJvbSkgKyAiPiIsIG9rKTsKLSAgfQotCi0gIHZvaWQgc2VuZFJjcHQoU3RyaW5nIHJjcHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaW50W10gb2sgPSB7IDI1MCwgMjUxIH07Ci0gICAgc2VuZCgiUkNQVCBUTzogIiArICI8IiArIHNhbml0aXplQWRkcmVzcyhyY3B0KSArICI+Iiwgb2spOwotICB9Ci0KLSAgdm9pZCBzZW5kRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaW50W10gb2sgPSB7IDM1NCB9OwotICAgIHNlbmQoIkRBVEEiLCBvayk7Ci0gIH0KLQotICB2b2lkIHNlbmREb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGludFtdIG9rID0geyAyNTAgfTsKLSAgICBzZW5kKCJcclxuLiIsIG9rKTsgIC8vIG1ha2Ugc3VyZSBkb3QgaXMgb24gbmV3IGxpbmUKLSAgfQotCi0gIHZvaWQgc2VuZFF1aXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGludFtdIG9rID0geyAyMjEgfTsKLSAgICBzZW5kKCJRVUlUIiwgb2spOwotICB9Ci0KLSAgdm9pZCBzZW5kKFN0cmluZyBtc2csIGludFtdIG9rKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIG91dC5yYXdQcmludChtc2cgKyAiXHJcbiIpOyAgLy8gcmF3IHN1cHBvcnRzIDxDUkxGPi48Q1JMRj4KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUzogIiArIG1zZyk7Ci0gICAgU3RyaW5nIHJlc3BvbnNlID0gaW4uZ2V0UmVzcG9uc2UoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUjogIiArIHJlc3BvbnNlKTsKLSAgICBpZiAoIWlzUmVzcG9uc2VPSyhyZXNwb25zZSwgb2spKSB7Ci0gICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0gICAgICAgICJVbmV4cGVjdGVkIHJlcGx5IHRvIGNvbW1hbmQ6ICIgKyBtc2cgKyAiOiAiICsgcmVzcG9uc2UpOwotICAgIH0KLSAgfQotCi0gIGJvb2xlYW4gaXNSZXNwb25zZU9LKFN0cmluZyByZXNwb25zZSwgaW50W10gb2spIHsKLSAgICAvLyBDaGVjayB0aGF0IHRoZSByZXNwb25zZSBpcyBvbmUgb2YgdGhlIHZhbGlkIGNvZGVzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvay5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKHJlc3BvbnNlLnN0YXJ0c1dpdGgoIiIgKyBva1tpXSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHZvaWQgZGlzY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKG91dCAhPSBudWxsKSBvdXQuY2xvc2UoKTsgCi0gICAgaWYgKGluICE9IG51bGwpIGluLmNsb3NlKCk7IAotICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgc29ja2V0LmNsb3NlKCk7Ci0gIH0KLX0KLQotLy8gVGhpcyBQcmludFN0cmVhbSBzdWJjbGFzcyBtYWtlcyBzdXJlIHRoYXQgPENSTEY+LiBiZWNvbWVzIDxDUkxGPi4uCi0vLyBwZXIgUkZDIDgyMS4gIEl0IGFsc28gZW5zdXJlcyB0aGF0IG5ldyBsaW5lcyBhcmUgYWx3YXlzIFxyXG4uCi0vLwotY2xhc3MgTWFpbFByaW50U3RyZWFtIGV4dGVuZHMgUHJpbnRTdHJlYW0gewotCi0gIGludCBsYXN0Q2hhcjsKLQotICBwdWJsaWMgTWFpbFByaW50U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICBzdXBlcihvdXQsIHRydWUpOyAgLy8gZGVwcmVjYXRlZCwgYnV0IGVtYWlsIGlzIGJ5dGUtb3JpZW50ZWQKLSAgfQotCi0gIC8vIE1hYyBkb2VzIFxuXHIsIGJ1dCB0aGF0J3MgdG91Z2ggdG8gZGlzdGluZ3Vpc2ggZnJvbSBXaW5kb3dzIFxyXG5cclxuLgotICAvLyBEb24ndCB0YWNrbGUgdGhhdCBwcm9ibGVtIHJpZ2h0IG5vdy4KLSAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHsKLSAgICBpZiAoYiA9PSAnXG4nICYmIGxhc3RDaGFyICE9ICdccicpIHsKLSAgICAgIHJhd1dyaXRlKCdccicpOyAgLy8gZW5zdXJlIGFsd2F5cyBcclxuCi0gICAgICByYXdXcml0ZShiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYiA9PSAnLicgJiYgbGFzdENoYXIgPT0gJ1xuJykgewotICAgICAgcmF3V3JpdGUoJy4nKTsgIC8vIGFkZCBleHRyYSBkb3QKLSAgICAgIHJhd1dyaXRlKGIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHJhd1dyaXRlKGIpOwotICAgIH0KLSAgICBsYXN0Q2hhciA9IGI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgd3JpdGUoYnVmW29mZiArIGldKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJhd1dyaXRlKGludCBiKSB7Ci0gICAgc3VwZXIud3JpdGUoYik7Ci0gIH0KLQotICB2b2lkIHJhd1ByaW50KFN0cmluZyBzKSB7Ci0gICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgcmF3V3JpdGUocy5jaGFyQXQoaSkpOwotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvU210cFJlc3BvbnNlUmVhZGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvU210cFJlc3BvbnNlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOTA3NjcuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL1NtdHBSZXNwb25zZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMubWFpbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSByYXcgaW5wdXQgZnJvbSB0aGUgU01UUCBzZXJ2ZXIgdGhhdCBhc3NlbWJsZXMKLSAqIG11bHRpIGxpbmUgcmVzcG9uc2VzIGludG8gYSBzaW5nbGUgU3RyaW5nLgotICoKLSAqIDxwPlRoZSBzYW1lIHJ1bGVzIHVzZWQgaGVyZSB3b3VsZCBhcHBseSB0byBGVFAgYW5kIG90aGVyIFRlbG5ldAotICogYmFzZWQgcHJvdG9jb2xzIGFzIHdlbGwuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBTbXRwUmVzcG9uc2VSZWFkZXIgewotCi0gICAgcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgLyoqCi0gICAgICogV3JhcCB0aGlzIGlucHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU210cFJlc3BvbnNlUmVhZGVyKElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB1bnRpbCB0aGUgc2VydmVyIGluZGljYXRlcyB0aGF0IHRoZSByZXNwb25zZSBpcyBjb21wbGV0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmVzcG9uc2Vjb2RlICgzIGRpZ2l0cykgKyBCbGFuayArIFRleHQgZnJvbSBhbGwKLSAgICAgKiAgICAgICAgIHJlc3BvbnNlIGxpbmUgY29uY2F0ZW5hdGVkICh3aXRoIGJsYW5rcyByZXBsYWNpbmcgdGhlIFxyXG4KLSAgICAgKiAgICAgICAgIHNlcXVlbmNlcykuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlc3VsdC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZS5zdWJzdHJpbmcoMCwgMykpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhcHBlbmQobGluZSk7Ci0gICAgICAgICAgICBpZiAoIWhhc01vcmVMaW5lcyhsaW5lKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3VsZCB3ZSBleHBlY3QgbW9yZSBpbnB1dD8KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNb3JlTGluZXMoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIGxpbmUuY2hhckF0KDMpID09ICctJzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgdGhlIHRleHQgZnJvbSB0aGlzIGxpbmUgb2YgdGhlIHJlc29uc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgbGluZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDQpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckJ1ZmZlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTliOGYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotLyoKLSAqIFRoaXMgcGFja2FnZSBpcyBiYXNlZCBvbiB0aGUgd29yayBkb25lIGJ5IFRpbW90aHkgR2VyYXJkIEVuZHJlcyAKLSAqICh0aW1lQGljZS5jb20pIHRvIHdob20gdGhlIEFudCBwcm9qZWN0IGlzIHZlcnkgZ3JhdGVmdWwgZm9yIGhpcyBncmVhdCBjb2RlLgotICovCi0gCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMudGFyOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFRoZSBUYXJCdWZmZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgdGFyIGFyY2hpdmUgY29uY2VwdAotICogb2YgYSBidWZmZXJlZCBpbnB1dCBzdHJlYW0uIFRoaXMgY29uY2VwdCBnb2VzIGJhY2sgdG8gdGhlCi0gKiBkYXlzIG9mIGJsb2NrZWQgdGFwZSBkcml2ZXMgYW5kIHNwZWNpYWwgaW8gZGV2aWNlcy4gSW4gdGhlCi0gKiBKYXZhIHVuaXZlcnNlLCB0aGUgb25seSByZWFsIGZ1bmN0aW9uIHRoYXQgdGhpcyBjbGFzcwotICogcGVyZm9ybXMgaXMgdG8gZW5zdXJlIHRoYXQgZmlsZXMgaGF2ZSB0aGUgY29ycmVjdCAiYmxvY2siCi0gKiBzaXplLCBvciBvdGhlciB0YXJzIHdpbGwgY29tcGxhaW4uCi0gKiA8cD4KLSAqIFlvdSBzaG91bGQgbmV2ZXIgaGF2ZSBhIG5lZWQgdG8gYWNjZXNzIHRoaXMgY2xhc3MgZGlyZWN0bHkuCi0gKiBUYXJCdWZmZXJzIGFyZSBjcmVhdGVkIGJ5IFRhciBJTyBTdHJlYW1zLgotICogCi0gKiBAYXV0aG9yIFRpbW90aHkgR2VyYXJkIEVuZHJlcyA8YSBocmVmPSJtYWlsdG86dGltZUBpY2UuY29tIj50aW1lQGljZS5jb208L2E+Ci0gKi8KLSAKLXB1YmxpYyBjbGFzcyBUYXJCdWZmZXIgewotICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JDRFNJWkUgPSAoNTEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JMS1NJWkUgPSAoREVGQVVMVF9SQ0RTSVpFICogMjApOwotICAgIAotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gICAgIGluU3RyZWFtOwotICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtICAgIG91dFN0cmVhbTsKLSAgICBwcml2YXRlIGJ5dGVbXSAgICAgICAgICBibG9ja0J1ZmZlcjsKLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICBjdXJyQmxrSWR4OwotICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgIGN1cnJSZWNJZHg7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgYmxvY2tTaXplOwotICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgIHJlY29yZFNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgcmVjc1BlckJsb2NrOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIGRlYnVnOwotCi0gICAgcHVibGljIFRhckJ1ZmZlcihJbnB1dFN0cmVhbSBpblN0cmVhbSkgewotICAgICAgICB0aGlzKGluU3RyZWFtLCBUYXJCdWZmZXIuREVGQVVMVF9CTEtTSVpFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFyQnVmZmVyKElucHV0U3RyZWFtIGluU3RyZWFtLCBpbnQgYmxvY2tTaXplKSB7Ci0gICAgICAgIHRoaXMoaW5TdHJlYW0sIGJsb2NrU2l6ZSwgVGFyQnVmZmVyLkRFRkFVTFRfUkNEU0laRSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRhckJ1ZmZlcihJbnB1dFN0cmVhbSBpblN0cmVhbSwgaW50IGJsb2NrU2l6ZSwgaW50IHJlY29yZFNpemUpIHsKLSAgICAgICAgdGhpcy5pblN0cmVhbSA9IGluU3RyZWFtOwotICAgICAgICB0aGlzLm91dFN0cmVhbSA9IG51bGw7Ci0KLSAgICAgICAgdGhpcy5pbml0aWFsaXplKGJsb2NrU2l6ZSwgcmVjb3JkU2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRhckJ1ZmZlcihPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKSB7Ci0gICAgICAgIHRoaXMob3V0U3RyZWFtLCBUYXJCdWZmZXIuREVGQVVMVF9CTEtTSVpFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFyQnVmZmVyKE91dHB1dFN0cmVhbSBvdXRTdHJlYW0sIGludCBibG9ja1NpemUpIHsKLSAgICAgICAgdGhpcyhvdXRTdHJlYW0sIGJsb2NrU2l6ZSwgVGFyQnVmZmVyLkRFRkFVTFRfUkNEU0laRSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRhckJ1ZmZlcihPdXRwdXRTdHJlYW0gb3V0U3RyZWFtLCBpbnQgYmxvY2tTaXplLCBpbnQgcmVjb3JkU2l6ZSkgewotICAgICAgICB0aGlzLmluU3RyZWFtID0gbnVsbDsKLSAgICAgICAgdGhpcy5vdXRTdHJlYW0gPSBvdXRTdHJlYW07Ci0KLSAgICAgICAgdGhpcy5pbml0aWFsaXplKGJsb2NrU2l6ZSwgcmVjb3JkU2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6YXRpb24gY29tbW9uIHRvIGFsbCBjb25zdHJ1Y3RvcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoaW50IGJsb2NrU2l6ZSwgaW50IHJlY29yZFNpemUpIHsKLSAgICAgICAgdGhpcy5kZWJ1ZyA9IGZhbHNlOwotICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKLSAgICAgICAgdGhpcy5yZWNvcmRTaXplID0gcmVjb3JkU2l6ZTsKLSAgICAgICAgdGhpcy5yZWNzUGVyQmxvY2sgPSAodGhpcy5ibG9ja1NpemUgLyB0aGlzLnJlY29yZFNpemUpOwotICAgICAgICB0aGlzLmJsb2NrQnVmZmVyID0gbmV3IGJ5dGVbdGhpcy5ibG9ja1NpemVdOwotCi0gICAgICAgIGlmICh0aGlzLmluU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY3VyckJsa0lkeCA9IC0xOwotICAgICAgICAgICAgdGhpcy5jdXJyUmVjSWR4ID0gdGhpcy5yZWNzUGVyQmxvY2s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmN1cnJCbGtJZHggPSAwOwotICAgICAgICAgICAgdGhpcy5jdXJyUmVjSWR4ID0gMDsKLSAgICAgICAgfSAKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBUQVIgQnVmZmVyJ3MgYmxvY2sgc2l6ZS4gQmxvY2tzIGNvbnNpc3Qgb2YgbXVsdGlwbGUgcmVjb3Jkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tTaXplOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFRBUiBCdWZmZXIncyByZWNvcmQgc2l6ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJlY29yZFNpemUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlY29yZFNpemU7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVidWdnaW5nIGZsYWcgZm9yIHRoZSBidWZmZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRlYnVnIElmIHRydWUsIHByaW50IGRlYnVnZ2luZyBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykgewotICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiBhbiBhcmNoaXZlIHJlY29yZCBpbmRpY2F0ZSBFbmQgb2YgQXJjaGl2ZS4gRW5kIG9mCi0gICAgICogYXJjaGl2ZSBpcyBpbmRpY2F0ZWQgYnkgYSByZWNvcmQgdGhhdCBjb25zaXN0cyBlbnRpcmVseSBvZiBudWxsIGJ5dGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWNvcmQgVGhlIHJlY29yZCBkYXRhIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRU9GUmVjb3JkKGJ5dGVbXSByZWNvcmQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gdGhpcy5nZXRSZWNvcmRTaXplKCk7IGkgPCBzejsgKytpKSB7Ci0gICAgICAgICAgICBpZiAocmVjb3JkW2ldICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFNraXAgb3ZlciBhIHJlY29yZCBvbiB0aGUgaW5wdXQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNraXBSZWNvcmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5kZWJ1ZykgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTa2lwUmVjb3JkOiByZWNJZHggPSAiICsgdGhpcy5jdXJyUmVjSWR4IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBibGtJZHggPSAiICsgdGhpcy5jdXJyQmxrSWR4KTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAodGhpcy5pblN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlYWRpbmcgKHZpYSBza2lwKSBmcm9tIGFuIG91dHB1dCBidWZmZXIiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAodGhpcy5jdXJyUmVjSWR4ID49IHRoaXMucmVjc1BlckJsb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMucmVhZEJsb2NrKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47ICAgIC8vIFVORE9ORQotICAgICAgICAgICAgfSAKLSAgICAgICAgfSAKLQotICAgICAgICB0aGlzLmN1cnJSZWNJZHgrKzsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUmVhZCBhIHJlY29yZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJldHVybiB0aGUgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZWNvcmQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHJlYWRSZWNvcmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5kZWJ1ZykgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJSZWFkUmVjb3JkOiByZWNJZHggPSAiICsgdGhpcy5jdXJyUmVjSWR4IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBibGtJZHggPSAiICsgdGhpcy5jdXJyQmxrSWR4KTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAodGhpcy5pblN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlYWRpbmcgZnJvbSBhbiBvdXRwdXQgYnVmZmVyIik7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMuY3VyclJlY0lkeCA+PSB0aGlzLnJlY3NQZXJCbG9jaykgewotICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWRCbG9jaygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IAotCi0gICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVt0aGlzLnJlY29yZFNpemVdOwotCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5ibG9ja0J1ZmZlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuY3VyclJlY0lkeCAqIHRoaXMucmVjb3JkU2l6ZSksIHJlc3VsdCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRTaXplKTsKLQotICAgICAgICB0aGlzLmN1cnJSZWNJZHgrKzsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIEVuZC1PZi1GaWxlLCBlbHNlIHRydWUKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVhZEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZGVidWcpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUmVhZEJsb2NrOiBibGtJZHggPSAiICsgdGhpcy5jdXJyQmxrSWR4KTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAodGhpcy5pblN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlYWRpbmcgZnJvbSBhbiBvdXRwdXQgYnVmZmVyIik7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgdGhpcy5jdXJyUmVjSWR4ID0gMDsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgaW50IGJ5dGVzTmVlZGVkID0gdGhpcy5ibG9ja1NpemU7Ci0KLSAgICAgICAgd2hpbGUgKGJ5dGVzTmVlZGVkID4gMCkgewotICAgICAgICAgICAgbG9uZyBudW1CeXRlcyA9IHRoaXMuaW5TdHJlYW0ucmVhZCh0aGlzLmJsb2NrQnVmZmVyLCBvZmZzZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc05lZWRlZCk7Ci0KLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gTk9URQotICAgICAgICAgICAgLy8gV2UgaGF2ZSBmaXQgRU9GLCBhbmQgdGhlIGJsb2NrIGlzIG5vdCBmdWxsIQotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgYnJva2VuIGFyY2hpdmUuIEl0IGRvZXMgbm90IGZvbGxvdyB0aGUgc3RhbmRhcmQKLSAgICAgICAgICAgIC8vIGJsb2NraW5nIGFsZ29yaXRobS4gSG93ZXZlciwgYmVjYXVzZSB3ZSBhcmUgZ2VuZXJvdXMsIGFuZAotICAgICAgICAgICAgLy8gaXQgcmVxdWlyZXMgbGl0dGxlIGVmZm9ydCwgd2Ugd2lsbCBzaW1wbHkgaWdub3JlIHRoZSBlcnJvcgotICAgICAgICAgICAgLy8gYW5kIGNvbnRpbnVlIGFzIGlmIHRoZSBlbnRpcmUgYmxvY2sgd2VyZSByZWFkLiBUaGlzIGRvZXMKLSAgICAgICAgICAgIC8vIG5vdCBhcHBlYXIgdG8gYnJlYWsgYW55dGhpbmcgdXBzdHJlYW0uIFdlIHVzZWQgdG8gcmV0dXJuCi0gICAgICAgICAgICAvLyBmYWxzZSBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIFRoYW5rcyB0byAnWW9oYW5uLlJvdXNzZWxAYWxjYXRlbC5mcicgZm9yIHRoaXMgZml4LgotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICBpZiAobnVtQnl0ZXMgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gCi0KLSAgICAgICAgICAgIG9mZnNldCArPSBudW1CeXRlczsKLSAgICAgICAgICAgIGJ5dGVzTmVlZGVkIC09IG51bUJ5dGVzOwotCi0gICAgICAgICAgICBpZiAobnVtQnl0ZXMgIT0gdGhpcy5ibG9ja1NpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlJlYWRCbG9jazogSU5DT01QTEVURSBSRUFEICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG51bUJ5dGVzICsgIiBvZiAiICsgdGhpcy5ibG9ja1NpemUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnl0ZXMgcmVhZC4iKTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfSAKLSAgICAgICAgfSAKLQotICAgICAgICB0aGlzLmN1cnJCbGtJZHgrKzsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgemVybyBiYXNlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHplcm8gYmFzZWQgYmxvY2sgbnVtYmVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEJsb2NrTnVtKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jdXJyQmxrSWR4OwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcmVjb3JkIG51bWJlciwgd2l0aGluIHRoZSBjdXJyZW50IGJsb2NrLCB6ZXJvIGJhc2VkLgotICAgICAqIFRodXMsIGN1cnJlbnQgb2Zmc2V0ID0gKGN1cnJlbnRCbG9ja051bSAqIHJlY3NQZXJCbGspICsgY3VycmVudFJlY051bS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHplcm8gYmFzZWQgcmVjb3JkIG51bWJlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRSZWNvcmROdW0oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmN1cnJSZWNJZHggLSAxOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhbiBhcmNoaXZlIHJlY29yZCB0byB0aGUgYXJjaGl2ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjb3JkIFRoZSByZWNvcmQgZGF0YSB0byB3cml0ZSB0byB0aGUgYXJjaGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVJlY29yZChieXRlW10gcmVjb3JkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5kZWJ1ZykgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXcml0ZVJlY29yZDogcmVjSWR4ID0gIiArIHRoaXMuY3VyclJlY0lkeCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmxrSWR4ID0gIiArIHRoaXMuY3VyckJsa0lkeCk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMub3V0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigid3JpdGluZyB0byBhbiBpbnB1dCBidWZmZXIiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAocmVjb3JkLmxlbmd0aCAhPSB0aGlzLnJlY29yZFNpemUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigicmVjb3JkIHRvIHdyaXRlIGhhcyBsZW5ndGggJyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZWNvcmQubGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgd2hpY2ggaXMgbm90IHRoZSByZWNvcmQgc2l6ZSBvZiAnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMucmVjb3JkU2l6ZSArICInIik7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMuY3VyclJlY0lkeCA+PSB0aGlzLnJlY3NQZXJCbG9jaykgewotICAgICAgICAgICAgdGhpcy53cml0ZUJsb2NrKCk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZWNvcmQsIDAsIHRoaXMuYmxvY2tCdWZmZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmN1cnJSZWNJZHggKiB0aGlzLnJlY29yZFNpemUpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZFNpemUpOwotCi0gICAgICAgIHRoaXMuY3VyclJlY0lkeCsrOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhbiBhcmNoaXZlIHJlY29yZCB0byB0aGUgYXJjaGl2ZSwgd2hlcmUgdGhlIHJlY29yZCBtYXkgYmUKLSAgICAgKiBpbnNpZGUgb2YgYSBsYXJnZXIgYXJyYXkgYnVmZmVyLiBUaGUgYnVmZmVyIG11c3QgYmUgIm9mZnNldCBwbHVzCi0gICAgICogcmVjb3JkIHNpemUiIGxvbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZiBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBkYXRhIHRvIHdyaXRlLgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgcmVjb3JkIGRhdGEgd2l0aGluIGJ1Zi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVJlY29yZChieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5kZWJ1ZykgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXcml0ZVJlY29yZDogcmVjSWR4ID0gIiArIHRoaXMuY3VyclJlY0lkeCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmxrSWR4ID0gIiArIHRoaXMuY3VyckJsa0lkeCk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMub3V0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigid3JpdGluZyB0byBhbiBpbnB1dCBidWZmZXIiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAoKG9mZnNldCArIHRoaXMucmVjb3JkU2l6ZSkgPiBidWYubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlY29yZCBoYXMgbGVuZ3RoICciICsgYnVmLmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIHdpdGggb2Zmc2V0ICciICsgb2Zmc2V0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgd2hpY2ggaXMgbGVzcyB0aGFuIHRoZSByZWNvcmQgc2l6ZSBvZiAnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMucmVjb3JkU2l6ZSArICInIik7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMuY3VyclJlY0lkeCA+PSB0aGlzLnJlY3NQZXJCbG9jaykgewotICAgICAgICAgICAgdGhpcy53cml0ZUJsb2NrKCk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIG9mZnNldCwgdGhpcy5ibG9ja0J1ZmZlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuY3VyclJlY0lkeCAqIHRoaXMucmVjb3JkU2l6ZSksIAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkU2l6ZSk7Ci0KLSAgICAgICAgdGhpcy5jdXJyUmVjSWR4Kys7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFdyaXRlIGEgVGFyQnVmZmVyIGJsb2NrIHRvIHRoZSBhcmNoaXZlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZGVidWcpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV3JpdGVCbG9jazogYmxrSWR4ID0gIiArIHRoaXMuY3VyckJsa0lkeCk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMub3V0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigid3JpdGluZyB0byBhbiBpbnB1dCBidWZmZXIiKTsKLSAgICAgICAgfSAKLQotICAgICAgICB0aGlzLm91dFN0cmVhbS53cml0ZSh0aGlzLmJsb2NrQnVmZmVyLCAwLCB0aGlzLmJsb2NrU2l6ZSk7Ci0gICAgICAgIHRoaXMub3V0U3RyZWFtLmZsdXNoKCk7Ci0KLSAgICAgICAgdGhpcy5jdXJyUmVjSWR4ID0gMDsKLSAgICAgICAgdGhpcy5jdXJyQmxrSWR4Kys7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIEZsdXNoIHRoZSBjdXJyZW50IGRhdGEgYmxvY2sgaWYgaXQgaGFzIGFueSBkYXRhIGluIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmbHVzaEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZGVidWcpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGFyQnVmZmVyLmZsdXNoQmxvY2soKSBjYWxsZWQuIik7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMub3V0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigid3JpdGluZyB0byBhbiBpbnB1dCBidWZmZXIiKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAodGhpcy5jdXJyUmVjSWR4ID4gMCkgewotICAgICAgICAgICAgdGhpcy53cml0ZUJsb2NrKCk7Ci0gICAgICAgIH0gCi0gICAgfSAKLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBUYXJCdWZmZXIuIElmIHRoaXMgaXMgYW4gb3V0cHV0IGJ1ZmZlciwgYWxzbyBmbHVzaCB0aGUKLSAgICAgKiBjdXJyZW50IGJsb2NrIGJlZm9yZSBjbG9zaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZGVidWcpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGFyQnVmZmVyLmNsb3NlQnVmZmVyKCkuIik7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMub3V0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZmx1c2hCbG9jaygpOwotCi0gICAgICAgICAgICBpZiAodGhpcy5vdXRTdHJlYW0gIT0gU3lzdGVtLm91dCAKLSAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vdXRTdHJlYW0gIT0gU3lzdGVtLmVycikgewotICAgICAgICAgICAgICAgIHRoaXMub3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICB0aGlzLm91dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5TdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRoaXMuaW5TdHJlYW0gIT0gU3lzdGVtLmluKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pblN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgdGhpcy5pblN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IAotICAgIH0gCi19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJDb25zdGFudHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTRhNjk5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLS8qCi0gKiBUaGlzIHBhY2thZ2UgaXMgYmFzZWQgb24gdGhlIHdvcmsgZG9uZSBieSBUaW1vdGh5IEdlcmFyZCBFbmRyZXMgCi0gKiAodGltZUBpY2UuY29tKSB0byB3aG9tIHRoZSBBbnQgcHJvamVjdCBpcyB2ZXJ5IGdyYXRlZnVsIGZvciBoaXMgZ3JlYXQgY29kZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMudGFyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGFsbCB0aGUgZGVmaW5pdGlvbnMgdXNlZCBpbiB0aGUgcGFja2FnZS4KLSAqCi0gKiBAYXV0aG9yIFRpbW90aHkgR2VyYXJkIEVuZHJlcyA8YSBocmVmPSJtYWlsdG86dGltZUBpY2UuY29tIj50aW1lQGljZS5jb208L2E+Ci0gKiBAYXV0aG9yIFN0ZWZhbm8gTWF6em9jY2hpIDxhIGhyZWY9Im1haWx0bzpzdGVmYW5vQGFwYWNoZS5vcmciPnN0ZWZhbm9AYXBhY2hlLm9yZzwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFRhckNvbnN0YW50cyB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgICAgTkFNRUxFTiA9IDEwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIG1vZGUgZmllbGQgaW4gYSBoZWFkZXIgYnVmZmVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICAgIE1PREVMRU4gPSA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGxlbmd0aCBvZiB0aGUgdXNlciBpZCBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgICAgVUlETEVOID0gODsKLQotICAgIC8qKgotICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIGdyb3VwIGlkIGZpZWxkIGluIGEgaGVhZGVyIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAgICBHSURMRU4gPSA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGxlbmd0aCBvZiB0aGUgY2hlY2tzdW0gZmllbGQgaW4gYSBoZWFkZXIgYnVmZmVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICAgIENIS1NVTUxFTiA9IDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzaXplIGZpZWxkIGluIGEgaGVhZGVyIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAgICBTSVpFTEVOID0gMTI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBtYWdpYyBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgICAgTUFHSUNMRU4gPSA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGxlbmd0aCBvZiB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgZmllbGQgaW4gYSBoZWFkZXIgYnVmZmVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICAgIE1PRFRJTUVMRU4gPSAxMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIHVzZXIgbmFtZSBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgICAgVU5BTUVMRU4gPSAzMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIGdyb3VwIG5hbWUgZmllbGQgaW4gYSBoZWFkZXIgYnVmZmVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICAgIEdOQU1FTEVOID0gMzI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBkZXZpY2VzIGZpZWxkIGluIGEgaGVhZGVyIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAgICBERVZMRU4gPSA4OwotCi0gICAgLyoqCi0gICAgICogTEZfIGNvbnN0YW50cyByZXByZXNlbnQgdGhlICJsaW5rIGZsYWciIG9mIGFuIGVudHJ5LCBvciBtb3JlIGNvbW1vbmx5LAotICAgICAqIHRoZSAiZW50cnkgdHlwZSIuIFRoaXMgaXMgdGhlICJvbGQgd2F5IiBvZiBpbmRpY2F0aW5nIGEgbm9ybWFsIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlICAgTEZfT0xETk9STSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBOb3JtYWwgZmlsZSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSAgIExGX05PUk1BTCA9IChieXRlKSAnMCc7Ci0KLSAgICAvKioKLSAgICAgKiBMaW5rIGZpbGUgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgICBMRl9MSU5LID0gKGJ5dGUpICcxJzsKLQotICAgIC8qKgotICAgICAqIFN5bWJvbGljIGxpbmsgZmlsZSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSAgIExGX1NZTUxJTksgPSAoYnl0ZSkgJzInOwotCi0gICAgLyoqCi0gICAgICogQ2hhcmFjdGVyIGRldmljZSBmaWxlIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlICAgTEZfQ0hSID0gKGJ5dGUpICczJzsKLQotICAgIC8qKgotICAgICAqIEJsb2NrIGRldmljZSBmaWxlIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlICAgTEZfQkxLID0gKGJ5dGUpICc0JzsKLQotICAgIC8qKgotICAgICAqIERpcmVjdG9yeSBmaWxlIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlICAgTEZfRElSID0gKGJ5dGUpICc1JzsKLQotICAgIC8qKgotICAgICAqIEZJRk8gKHBpcGUpIGZpbGUgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgICBMRl9GSUZPID0gKGJ5dGUpICc2JzsKLQotICAgIC8qKgotICAgICAqIENvbnRpZ3VvdXMgZmlsZSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSAgIExGX0NPTlRJRyA9IChieXRlKSAnNyc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWFnaWMgdGFnIHJlcHJlc2VudGluZyBhIFBPU0lYIHRhciBhcmNoaXZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRNQUdJQyA9ICJ1c3RhciI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWFnaWMgdGFnIHJlcHJlc2VudGluZyBhIEdOVSB0YXIgYXJjaGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHTlVfVE1BR0lDID0gInVzdGFyICAiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbXIgb2YgdGhlIEdOVSB0YXIgZW50cnkgd2hpY2ggY29udGFpbnMgYSBsb25nIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR05VX0xPTkdMSU5LID0gIi4vLi9ATG9uZ0xpbmsiOwotICAgIAotICAgIC8qKgotICAgICAqIElkZW50aWZpZXMgdGhlICpuZXh0KiBmaWxlIG9uIHRoZSB0YXBlIGFzIGhhdmluZyBhIGxvbmcgbmFtZS4gIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMRl9HTlVUWVBFX0xPTkdOQU1FID0gKGJ5dGUpICdMJzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTFkZWY5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotLyoKLSAqIFRoaXMgcGFja2FnZSBpcyBiYXNlZCBvbiB0aGUgd29yayBkb25lIGJ5IFRpbW90aHkgR2VyYXJkIEVuZHJlcyAKLSAqICh0aW1lQGljZS5jb20pIHRvIHdob20gdGhlIEFudCBwcm9qZWN0IGlzIHZlcnkgZ3JhdGVmdWwgZm9yIGhpcyBncmVhdCBjb2RlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy50YXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGVudHJ5IGluIGEgVGFyIGFyY2hpdmUuIEl0IGNvbnNpc3RzCi0gKiBvZiB0aGUgZW50cnkncyBoZWFkZXIsIGFzIHdlbGwgYXMgdGhlIGVudHJ5J3MgRmlsZS4gRW50cmllcwotICogY2FuIGJlIGluc3RhbnRpYXRlZCBpbiBvbmUgb2YgdGhyZWUgd2F5cywgZGVwZW5kaW5nIG9uIGhvdwotICogdGhleSBhcmUgdG8gYmUgdXNlZC4KLSAqIDxwPgotICogVGFyRW50cmllcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gdGhlIGhlYWRlciBieXRlcyByZWFkIGZyb20KLSAqIGFuIGFyY2hpdmUgYXJlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBUYXJFbnRyeSggYnl0ZVtdICkKLSAqIGNvbnN0cnVjdG9yLiBUaGVzZSBlbnRyaWVzIHdpbGwgYmUgdXNlZCB3aGVuIGV4dHJhY3RpbmcgZnJvbQotICogb3IgbGlzdGluZyB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZS4gVGhlc2UgZW50cmllcyBoYXZlIHRoZWlyCi0gKiBoZWFkZXIgZmlsbGVkIGluIHVzaW5nIHRoZSBoZWFkZXIgYnl0ZXMuIFRoZXkgYWxzbyBzZXQgdGhlIEZpbGUKLSAqIHRvIG51bGwsIHNpbmNlIHRoZXkgcmVmZXJlbmNlIGFuIGFyY2hpdmUgZW50cnkgbm90IGEgZmlsZS4KLSAqIDxwPgotICogVGFyRW50cmllcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gRmlsZXMgdGhhdCBhcmUgdG8gYmUgd3JpdHRlbgotICogaW50byBhbiBhcmNoaXZlIGFyZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgVGFyRW50cnkoIEZpbGUgKQotICogY29uc3RydWN0b3IuIFRoZXNlIGVudHJpZXMgaGF2ZSB0aGVpciBoZWFkZXIgZmlsbGVkIGluIHVzaW5nCi0gKiB0aGUgRmlsZSdzIGluZm9ybWF0aW9uLiBUaGV5IGFsc28ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgRmlsZQotICogZm9yIGNvbnZlbmllbmNlIHdoZW4gd3JpdGluZyBlbnRyaWVzLgotICogPHA+Ci0gKiBGaW5hbGx5LCBUYXJFbnRyaWVzIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIG5vdGhpbmcgYnV0IGEgbmFtZS4KLSAqIFRoaXMgYWxsb3dzIHRoZSBwcm9ncmFtbWVyIHRvIGNvbnN0cnVjdCB0aGUgZW50cnkgYnkgaGFuZCwgZm9yCi0gKiBpbnN0YW5jZSB3aGVuIG9ubHkgYW4gSW5wdXRTdHJlYW0gaXMgYXZhaWxhYmxlIGZvciB3cml0aW5nIHRvCi0gKiB0aGUgYXJjaGl2ZSwgYW5kIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gaXMgY29uc3RydWN0ZWQgZnJvbQotICogb3RoZXIgaW5mb3JtYXRpb24uIEluIHRoaXMgY2FzZSB0aGUgaGVhZGVyIGZpZWxkcyBhcmUgc2V0IHRvCi0gKiBkZWZhdWx0cyBhbmQgdGhlIEZpbGUgaXMgc2V0IHRvIG51bGwuCi0gKiAKLSAqIDxwPgotICogVGhlIEMgc3RydWN0dXJlIGZvciBhIFRhciBFbnRyeSdzIGhlYWRlciBpczoKLSAqIDxwcmU+Ci0gKiBzdHJ1Y3QgaGVhZGVyIHsKLSAqIGNoYXIgbmFtZVtOQU1TSVpdOwotICogY2hhciBtb2RlWzhdOwotICogY2hhciB1aWRbOF07Ci0gKiBjaGFyIGdpZFs4XTsKLSAqIGNoYXIgc2l6ZVsxMl07Ci0gKiBjaGFyIG10aW1lWzEyXTsKLSAqIGNoYXIgY2hrc3VtWzhdOwotICogY2hhciBsaW5rZmxhZzsKLSAqIGNoYXIgbGlua25hbWVbTkFNU0laXTsKLSAqIGNoYXIgbWFnaWNbOF07Ci0gKiBjaGFyIHVuYW1lW1RVTk1MRU5dOwotICogY2hhciBnbmFtZVtUR05NTEVOXTsKLSAqIGNoYXIgZGV2bWFqb3JbOF07Ci0gKiBjaGFyIGRldm1pbm9yWzhdOwotICogfSBoZWFkZXI7Ci0gKiA8L3ByZT4KLSAqIAotICogQGF1dGhvciBUaW1vdGh5IEdlcmFyZCBFbmRyZXMgPGEgaHJlZj0ibWFpbHRvOnRpbWVAaWNlLmNvbSI+dGltZUBpY2UuY29tPC9hPgotICogQGF1dGhvciBTdGVmYW5vIE1henpvY2NoaSA8YSBocmVmPSJtYWlsdG86c3RlZmFub0BhcGFjaGUub3JnIj5zdGVmYW5vQGFwYWNoZS5vcmc8L2E+Ci0gKi8KLSAKLXB1YmxpYyBjbGFzcyBUYXJFbnRyeSBpbXBsZW1lbnRzIFRhckNvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBuYW1lOyAgICAgIC8qKiBUaGUgZW50cnkncyBuYW1lLiAqLwotICAgIHByaXZhdGUgaW50ICAgICAgICAgIG1vZGU7ICAgICAgLyoqIFRoZSBlbnRyeSdzIHBlcm1pc3Npb24gbW9kZS4gKi8KLSAgICBwcml2YXRlIGludCAgICAgICAgICB1c2VySWQ7ICAgIC8qKiBUaGUgZW50cnkncyB1c2VyIGlkLiAqLwotICAgIHByaXZhdGUgaW50ICAgICAgICAgIGdyb3VwSWQ7ICAgLyoqIFRoZSBlbnRyeSdzIGdyb3VwIGlkLiAqLwotICAgIHByaXZhdGUgbG9uZyAgICAgICAgIHNpemU7ICAgICAgLyoqIFRoZSBlbnRyeSdzIHNpemUuICovCi0gICAgcHJpdmF0ZSBsb25nICAgICAgICAgbW9kVGltZTsgICAvKiogVGhlIGVudHJ5J3MgbW9kaWZpY2F0aW9uIHRpbWUuICovCi0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgY2hlY2tTdW07ICAvKiogVGhlIGVudHJ5J3MgY2hlY2tzdW0uICovCi0gICAgcHJpdmF0ZSBieXRlICAgICAgICAgbGlua0ZsYWc7ICAvKiogVGhlIGVudHJ5J3MgbGluayBmbGFnLiAqLwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGxpbmtOYW1lOyAgLyoqIFRoZSBlbnRyeSdzIGxpbmsgbmFtZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBtYWdpYzsgICAgIC8qKiBUaGUgZW50cnkncyBtYWdpYyB0YWcuICovCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgdXNlck5hbWU7ICAvKiogVGhlIGVudHJ5J3MgdXNlciBuYW1lLiAqLwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGdyb3VwTmFtZTsgLyoqIFRoZSBlbnRyeSdzIGdyb3VwIG5hbWUuICovCi0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgZGV2TWFqb3I7ICAvKiogVGhlIGVudHJ5J3MgbWFqb3IgZGV2aWNlIG51bWJlci4gKi8KLSAgICBwcml2YXRlIGludCAgICAgICAgICBkZXZNaW5vcjsgIC8qKiBUaGUgZW50cnkncyBtaW5vciBkZXZpY2UgbnVtYmVyLiAqLwotICAgIHByaXZhdGUgRmlsZSAgICAgICAgIGZpbGU7ICAgICAgLyoqIFRoZSBlbnRyeSdzIGZpbGUgcmVmZXJlbmNlICovIAotCi0gICAgLyoqIAotICAgICAqIENvbnN0cnVjdCBhbiBlbXB0eSBlbnRyeSBhbmQgcHJlcGFyZXMgdGhlIGhlYWRlciB2YWx1ZXMuCi0gICAgICovIAotICAgIHByaXZhdGUgVGFyRW50cnkgKCkgewotICAgICAgICB0aGlzLm1hZ2ljID0gbmV3IFN0cmluZ0J1ZmZlcihUTUFHSUMpOwotICAgICAgICB0aGlzLm5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHRoaXMubGlua05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgCi0gICAgICAgIFN0cmluZyB1c2VyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiLCAiIik7Ci0gICAgCi0gICAgICAgIGlmICh1c2VyLmxlbmd0aCgpID4gMzEpIHsKLSAgICAgICAgICAgIHVzZXIgPSB1c2VyLnN1YnN0cmluZygwLCAzMSk7Ci0gICAgICAgIH0gCi0gICAgCi0gICAgICAgIHRoaXMudXNlcklkID0gMDsKLSAgICAgICAgdGhpcy5ncm91cElkID0gMDsKLSAgICAgICAgdGhpcy51c2VyTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIodXNlcik7Ci0gICAgICAgIHRoaXMuZ3JvdXBOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0gICAgICAgIHRoaXMuZmlsZSA9IG51bGw7Ci0gICAgfQotICAgICAgICAKLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0IGFuIGVudHJ5IHdpdGggb25seSBhIG5hbWUuIFRoaXMgYWxsb3dzIHRoZSBwcm9ncmFtbWVyCi0gICAgICogdG8gY29uc3RydWN0IHRoZSBlbnRyeSdzIGhlYWRlciAiYnkgaGFuZCIuIEZpbGUgaXMgc2V0IHRvIG51bGwuCi0gICAgICovIAotICAgIHB1YmxpYyBUYXJFbnRyeShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGlzRGlyID0gbmFtZS5lbmRzV2l0aCgiLyIpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jaGVja1N1bSA9IDA7Ci0gICAgICAgIHRoaXMuZGV2TWFqb3IgPSAwOwotICAgICAgICB0aGlzLmRldk1pbm9yID0gMDsKLSAgICAgICAgdGhpcy5uYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKLSAgICAgICAgdGhpcy5tb2RlID0gaXNEaXIgPyAwNDA3NTUgOiAwMTAwNjQ0OwotICAgICAgICB0aGlzLmxpbmtGbGFnID0gaXNEaXIgPyBMRl9ESVIgOiBMRl9OT1JNQUw7Ci0gICAgICAgIHRoaXMudXNlcklkID0gMDsKLSAgICAgICAgdGhpcy5ncm91cElkID0gMDsKLSAgICAgICAgdGhpcy5zaXplID0gMDsKLSAgICAgICAgdGhpcy5jaGVja1N1bSA9IDA7Ci0gICAgICAgIHRoaXMubW9kVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLyAxMDAwOwotICAgICAgICB0aGlzLmxpbmtOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0gICAgICAgIHRoaXMudXNlck5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLSAgICAgICAgdGhpcy5ncm91cE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLSAgICAgICAgdGhpcy5kZXZNYWpvciA9IDA7Ci0gICAgICAgIHRoaXMuZGV2TWlub3IgPSAwOwotCi0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0IGFuIGVudHJ5IHdpdGggYSBuYW1lIGFuIGEgbGluayBmbGFnLgotICAgICAqLyAKLSAgICBwdWJsaWMgVGFyRW50cnkoU3RyaW5nIG5hbWUsIGJ5dGUgbGlua0ZsYWcpIHsKLSAgICAgICAgdGhpcyhuYW1lKTsKLSAgICAgICAgdGhpcy5saW5rRmxhZyA9IGxpbmtGbGFnOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgLyoqIAotICAgICAqIENvbnN0cnVjdCBhbiBlbnRyeSBmb3IgYSBmaWxlLiBGaWxlIGlzIHNldCB0byBmaWxlLCBhbmQgdGhlCi0gICAgICogaGVhZGVyIGlzIGNvbnN0cnVjdGVkIGZyb20gaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdGhhdCB0aGUgZW50cnkgcmVwcmVzZW50cy4KLSAgICAgKi8gCi0gICAgcHVibGljIFRhckVudHJ5KEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLmdldFBhdGgoKTsKLSAgICAgICAgU3RyaW5nIG9zbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOwotICAgICAgICAKLSAgICAgICAgaWYgKG9zbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgIAotICAgICAgICAgICAgLy8gU3RyaXAgb2ZmIGRyaXZlIGxldHRlcnMhCi0gICAgICAgICAgICAvLyBSRVZJRVcgV291bGQgYSBiZXR0ZXIgY2hlY2sgYmUgIihGaWxlLnNlcGFyYXRvciA9PSAnXCcpIj8KLSAgICAgICAgICAgIFN0cmluZyBXaW4zMlByZWZpeCA9ICJXaW5kb3dzIjsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBvc25hbWUuc3Vic3RyaW5nKDAsIFdpbjMyUHJlZml4Lmxlbmd0aCgpKTsKLSAgICAgICAgCi0gICAgICAgICAgICBpZiAocHJlZml4LmVxdWFsc0lnbm9yZUNhc2UoV2luMzJQcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2gxID0gbmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2gyID0gbmFtZS5jaGFyQXQoMSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoY2gyID09ICc6JyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGNoMSA+PSAnYScgJiYgY2gxIDw9ICd6JykgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaDEgPj0gJ0EnICYmIGNoMSA8PSAnWicpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IAotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0gICAgICAgIAotICAgICAgICAvLyBObyBhYnNvbHV0ZSBwYXRobmFtZXMKLSAgICAgICAgLy8gV2luZG93cyAoYW5kIFBvc2l4PykgcGF0aHMgY2FuIHN0YXJ0IHdpdGggIlxcTmV0d29ya0RyaXZlXCIsCi0gICAgICAgIC8vIHNvIHdlIGxvb3Agb24gc3RhcnRpbmcgLydzLgotICAgICAgICB3aGlsZSAobmFtZS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5saW5rTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotICAgICAgICB0aGlzLm5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotICAgICAgICAKLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhpcy5tb2RlID0gMDQwNzU1OwotICAgICAgICAgICAgdGhpcy5saW5rRmxhZyA9IExGX0RJUjsKLSAgICAgICAgCi0gICAgICAgICAgICBpZiAodGhpcy5uYW1lLmNoYXJBdCh0aGlzLm5hbWUubGVuZ3RoKCkgLSAxKSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUuYXBwZW5kKCIvIik7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5tb2RlID0gMDEwMDY0NDsKLSAgICAgICAgICAgIHRoaXMubGlua0ZsYWcgPSBMRl9OT1JNQUw7Ci0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICB0aGlzLnNpemUgPSBmaWxlLmxlbmd0aCgpOwotICAgICAgICB0aGlzLm1vZFRpbWUgPSBmaWxlLmxhc3RNb2RpZmllZCgpIC8gMTAwMDsKLSAgICAgICAgdGhpcy5jaGVja1N1bSA9IDA7Ci0gICAgICAgIHRoaXMuZGV2TWFqb3IgPSAwOwotICAgICAgICB0aGlzLmRldk1pbm9yID0gMDsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3QgYW4gZW50cnkgZnJvbSBhbiBhcmNoaXZlJ3MgaGVhZGVyIGJ5dGVzLiBGaWxlIGlzIHNldAotICAgICAqIHRvIG51bGwuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBoZWFkZXJCdWYgVGhlIGhlYWRlciBieXRlcyBmcm9tIGEgdGFyIGFyY2hpdmUgZW50cnkuCi0gICAgICovIAotICAgIHB1YmxpYyBUYXJFbnRyeShieXRlW10gaGVhZGVyQnVmKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5wYXJzZVRhckhlYWRlcihoZWFkZXJCdWYpOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgLyoqIAotICAgICAqIERldGVybWluZSBpZiB0aGUgdHdvIGVudHJpZXMgYXJlIGVxdWFsLiBFcXVhbGl0eSBpcyBkZXRlcm1pbmVkCi0gICAgICogYnkgdGhlIGhlYWRlciBuYW1lcyBiZWluZyBlcXVhbC4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBpdCBFbnRyeSB0byBiZSBjaGVja2VkIGZvciBlcXVhbGl0eS4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJpZXMgYXJlIGVxdWFsLgotICAgICAqLyAKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVGFyRW50cnkgaXQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpLmVxdWFscyhpdC5nZXROYW1lKCkpOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgLyoqIAotICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gZW50cnkgaXMgYSBkZXNjZW5kYW50IG9mIHRoaXMgZW50cnkuCi0gICAgICogRGVzY2VuZGFuY3kgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbmFtZSBvZiB0aGUgZGVzY2VuZGFudAotICAgICAqIHN0YXJ0aW5nIHdpdGggdGhpcyBlbnRyeSdzIG5hbWUuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBkZXNjIEVudHJ5IHRvIGJlIGNoZWNrZWQgYXMgYSBkZXNjZW5kZW50IG9mIHRoaXMuCi0gICAgICogQHJldHVybiBUcnVlIGlmIGVudHJ5IGlzIGEgZGVzY2VuZGFudCBvZiB0aGlzLgotICAgICAqLyAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc2NlbmRlbnQoVGFyRW50cnkgZGVzYykgewotICAgICAgICByZXR1cm4gZGVzYy5nZXROYW1lKCkuc3RhcnRzV2l0aCh0aGlzLmdldE5hbWUoKSk7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogR2V0IHRoaXMgZW50cnkncyBuYW1lLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIFRoaXMgZW50cnkncyBuYW1lLgotICAgICAqLyAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWUudG9TdHJpbmcoKTsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBTZXQgdGhpcyBlbnRyeSdzIG5hbWUuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBuYW1lIFRoaXMgZW50cnkncyBuZXcgbmFtZS4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotICAgIH0gICAKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbW9kZSBmb3IgdGhpcyBlbnRyeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICB9Ci0gICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBHZXQgdGhpcyBlbnRyeSdzIHVzZXIgaWQuCi0gICAgICogIAotICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIHVzZXIgaWQuCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0VXNlcklkKCkgewotICAgICAgICByZXR1cm4gdGhpcy51c2VySWQ7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogU2V0IHRoaXMgZW50cnkncyB1c2VyIGlkLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gdXNlcklkIFRoaXMgZW50cnkncyBuZXcgdXNlciBpZC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcklkKGludCB1c2VySWQpIHsKLSAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogR2V0IHRoaXMgZW50cnkncyBncm91cCBpZC4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBUaGlzIGVudHJ5J3MgZ3JvdXAgaWQuCi0gICAgICovIAotICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBJZDsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBTZXQgdGhpcyBlbnRyeSdzIGdyb3VwIGlkLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gZ3JvdXBJZCBUaGlzIGVudHJ5J3MgbmV3IGdyb3VwIGlkLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cElkKGludCBncm91cElkKSB7Ci0gICAgICAgIHRoaXMuZ3JvdXBJZCA9IGdyb3VwSWQ7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogR2V0IHRoaXMgZW50cnkncyB1c2VyIG5hbWUuCi0gICAgICogIAotICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIHVzZXIgbmFtZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXNlck5hbWUudG9TdHJpbmcoKTsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBTZXQgdGhpcyBlbnRyeSdzIHVzZXIgbmFtZS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHVzZXJOYW1lIFRoaXMgZW50cnkncyBuZXcgdXNlciBuYW1lLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpIHsKLSAgICAgICAgdGhpcy51c2VyTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIodXNlck5hbWUpOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgLyoqIAotICAgICAqIEdldCB0aGlzIGVudHJ5J3MgZ3JvdXAgbmFtZS4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBUaGlzIGVudHJ5J3MgZ3JvdXAgbmFtZS4KLSAgICAgKi8gCi0gICAgcHVibGljIFN0cmluZyBnZXRHcm91cE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdyb3VwTmFtZS50b1N0cmluZygpOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgLyoqIAotICAgICAqIFNldCB0aGlzIGVudHJ5J3MgZ3JvdXAgbmFtZS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGdyb3VwTmFtZSBUaGlzIGVudHJ5J3MgbmV3IGdyb3VwIG5hbWUuCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwTmFtZShTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0gICAgICAgIHRoaXMuZ3JvdXBOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihncm91cE5hbWUpOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgLyoqIAotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzZXQgdGhpcyBlbnRyeSdzIGdyb3VwIGFuZCB1c2VyIGlkcy4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHVzZXJJZCBUaGlzIGVudHJ5J3MgbmV3IHVzZXIgaWQuCi0gICAgICogQHBhcmFtIGdyb3VwSWQgVGhpcyBlbnRyeSdzIG5ldyBncm91cCBpZC4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0SWRzKGludCB1c2VySWQsIGludCBncm91cElkKSB7Ci0gICAgICAgIHRoaXMuc2V0VXNlcklkKHVzZXJJZCk7Ci0gICAgICAgIHRoaXMuc2V0R3JvdXBJZChncm91cElkKTsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IHRoaXMgZW50cnkncyBncm91cCBhbmQgdXNlciBuYW1lcy4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHVzZXJOYW1lIFRoaXMgZW50cnkncyBuZXcgdXNlciBuYW1lLgotICAgICAqIEBwYXJhbSBncm91cE5hbWUgVGhpcyBlbnRyeSdzIG5ldyBncm91cCBuYW1lLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lcyhTdHJpbmcgdXNlck5hbWUsIFN0cmluZyBncm91cE5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXRVc2VyTmFtZSh1c2VyTmFtZSk7Ci0gICAgICAgIHRoaXMuc2V0R3JvdXBOYW1lKGdyb3VwTmFtZSk7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogU2V0IHRoaXMgZW50cnkncyBtb2RpZmljYXRpb24gdGltZS4gVGhlIHBhcmFtZXRlciBwYXNzZWQKLSAgICAgKiB0byB0aGlzIG1ldGhvZCBpcyBpbiAiSmF2YSB0aW1lIi4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHRpbWUgVGhpcyBlbnRyeSdzIG5ldyBtb2RpZmljYXRpb24gdGltZS4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0TW9kVGltZShsb25nIHRpbWUpIHsKLSAgICAgICAgdGhpcy5tb2RUaW1lID0gdGltZSAvIDEwMDA7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogU2V0IHRoaXMgZW50cnkncyBtb2RpZmljYXRpb24gdGltZS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHRpbWUgVGhpcyBlbnRyeSdzIG5ldyBtb2RpZmljYXRpb24gdGltZS4KLSAgICAgKi8gCi0gICAgcHVibGljIHZvaWQgc2V0TW9kVGltZShEYXRlIHRpbWUpIHsKLSAgICAgICAgdGhpcy5tb2RUaW1lID0gdGltZS5nZXRUaW1lKCkgLyAxMDAwOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgLyoqIAotICAgICAqIFNldCB0aGlzIGVudHJ5J3MgbW9kaWZpY2F0aW9uIHRpbWUuCi0gICAgICogIAotICAgICAqIEBwYXJhbSB0aW1lIFRoaXMgZW50cnkncyBuZXcgbW9kaWZpY2F0aW9uIHRpbWUuCi0gICAgICovIAotICAgIHB1YmxpYyBEYXRlIGdldE1vZFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLm1vZFRpbWUgKiAxMDAwKTsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBHZXQgdGhpcyBlbnRyeSdzIGZpbGUuCi0gICAgICogIAotICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIGZpbGUuCi0gICAgICovIAotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZpbGU7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogR2V0IHRoaXMgZW50cnkncyBmaWxlIHNpemUuCi0gICAgICogIAotICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIGZpbGUgc2l6ZS4KLSAgICAgKi8gCi0gICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBTZXQgdGhpcyBlbnRyeSdzIGZpbGUgc2l6ZS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHNpemUgVGhpcyBlbnRyeSdzIG5ldyBmaWxlIHNpemUuCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBzaXplKSB7Ci0gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7Ci0gICAgfSAgIAotCi0gICAgICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoaXMgZW50cnkgaXMgYSBHTlUgbG9uZyBuYW1lIGJsb2NrCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGxvbmcgbmFtZSBleHRlbnNpb24gcHJvdmlkZWQgYnkgR05VIHRhcgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR05VTG9uZ05hbWVFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIGxpbmtGbGFnID09IExGX0dOVVRZUEVfTE9OR05BTUUgJiYKLSAgICAgICAgICAgICAgIG5hbWUudG9TdHJpbmcoKS5lcXVhbHMoR05VX0xPTkdMSU5LKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0KLSAgICAvKiogCi0gICAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoaXMgZW50cnkgcmVwcmVzZW50cyBhIGRpcmVjdG9yeS4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgZW50cnkgaXMgYSBkaXJlY3RvcnkuCi0gICAgICovIAotICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotICAgICAgICBpZiAodGhpcy5maWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGUuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzLmxpbmtGbGFnID09IExGX0RJUikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICBpZiAodGhpcy5nZXROYW1lKCkuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogSWYgdGhpcyBlbnRyeSByZXByZXNlbnRzIGEgZmlsZSwgYW5kIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5LCByZXR1cm4KLSAgICAgKiBhbiBhcnJheSBvZiBUYXJFbnRyaWVzIGZvciB0aGlzIGVudHJ5J3MgY2hpbGRyZW4uCi0gICAgICogIAotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgVGFyRW50cnkncyBmb3IgdGhpcyBlbnRyeSdzIGNoaWxkcmVuLgotICAgICAqLyAKLSAgICBwdWJsaWMgVGFyRW50cnlbXSBnZXREaXJlY3RvcnlFbnRyaWVzKCkgewotICAgICAgICBpZiAodGhpcy5maWxlID09IG51bGwgfHwhdGhpcy5maWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFyRW50cnlbMF07Ci0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSAgIGxpc3QgPSB0aGlzLmZpbGUubGlzdCgpOwotICAgICAgICBUYXJFbnRyeVtdIHJlc3VsdCA9IG5ldyBUYXJFbnRyeVtsaXN0Lmxlbmd0aF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ldyBUYXJFbnRyeShuZXcgRmlsZSh0aGlzLmZpbGUsIGxpc3RbaV0pKTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgIAotICAgICAgICAKLSAgICAvKiogCi0gICAgICogV3JpdGUgYW4gZW50cnkncyBoZWFkZXIgaW5mb3JtYXRpb24gdG8gYSBoZWFkZXIgYnVmZmVyLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gb3V0YnVmIFRoZSB0YXIgZW50cnkgaGVhZGVyIGJ1ZmZlciB0byBmaWxsIGluLgotICAgICAqLyAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVudHJ5SGVhZGVyKGJ5dGVbXSBvdXRidWYpIHsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIAotICAgICAgICBvZmZzZXQgPSBUYXJVdGlscy5nZXROYW1lQnl0ZXModGhpcy5uYW1lLCBvdXRidWYsIG9mZnNldCwgTkFNRUxFTik7Ci0gICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE9jdGFsQnl0ZXModGhpcy5tb2RlLCBvdXRidWYsIG9mZnNldCwgTU9ERUxFTik7Ci0gICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE9jdGFsQnl0ZXModGhpcy51c2VySWQsIG91dGJ1Ziwgb2Zmc2V0LCBVSURMRU4pOwotICAgICAgICBvZmZzZXQgPSBUYXJVdGlscy5nZXRPY3RhbEJ5dGVzKHRoaXMuZ3JvdXBJZCwgb3V0YnVmLCBvZmZzZXQsIEdJRExFTik7Ci0gICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldExvbmdPY3RhbEJ5dGVzKHRoaXMuc2l6ZSwgb3V0YnVmLCBvZmZzZXQsIFNJWkVMRU4pOwotICAgICAgICBvZmZzZXQgPSBUYXJVdGlscy5nZXRMb25nT2N0YWxCeXRlcyh0aGlzLm1vZFRpbWUsIG91dGJ1Ziwgb2Zmc2V0LCBNT0RUSU1FTEVOKTsKLSAgICAgICAgCi0gICAgICAgIGludCBjc09mZnNldCA9IG9mZnNldDsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgQ0hLU1VNTEVOOyArK2MpIHsKLSAgICAgICAgICAgIG91dGJ1ZltvZmZzZXQrK10gPSAoYnl0ZSkgJyAnOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvdXRidWZbb2Zmc2V0KytdID0gdGhpcy5saW5rRmxhZzsKLSAgICAgICAgb2Zmc2V0ID0gVGFyVXRpbHMuZ2V0TmFtZUJ5dGVzKHRoaXMubGlua05hbWUsIG91dGJ1Ziwgb2Zmc2V0LCBOQU1FTEVOKTsKLSAgICAgICAgb2Zmc2V0ID0gVGFyVXRpbHMuZ2V0TmFtZUJ5dGVzKHRoaXMubWFnaWMsIG91dGJ1Ziwgb2Zmc2V0LCBNQUdJQ0xFTik7Ci0gICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE5hbWVCeXRlcyh0aGlzLnVzZXJOYW1lLCBvdXRidWYsIG9mZnNldCwgVU5BTUVMRU4pOwotICAgICAgICBvZmZzZXQgPSBUYXJVdGlscy5nZXROYW1lQnl0ZXModGhpcy5ncm91cE5hbWUsIG91dGJ1Ziwgb2Zmc2V0LCBHTkFNRUxFTik7Ci0gICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE9jdGFsQnl0ZXModGhpcy5kZXZNYWpvciwgb3V0YnVmLCBvZmZzZXQsIERFVkxFTik7Ci0gICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE9jdGFsQnl0ZXModGhpcy5kZXZNaW5vciwgb3V0YnVmLCBvZmZzZXQsIERFVkxFTik7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAob2Zmc2V0IDwgb3V0YnVmLmxlbmd0aCkgewotICAgICAgICAgICAgb3V0YnVmW29mZnNldCsrXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxvbmcgY2hlY2tTdW0gPSBUYXJVdGlscy5jb21wdXRlQ2hlY2tTdW0ob3V0YnVmKTsKLSAgICAgICAgCi0gICAgICAgIFRhclV0aWxzLmdldENoZWNrU3VtT2N0YWxCeXRlcyhjaGVja1N1bSwgb3V0YnVmLCBjc09mZnNldCwgQ0hLU1VNTEVOKTsKLSAgICB9ICAgCi0gICAgICAgIAotICAgIC8qKiAKLSAgICAgKiBQYXJzZSBhbiBlbnRyeSdzIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIGEgaGVhZGVyIGJ1ZmZlci4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGhlYWRlciBUaGUgdGFyIGVudHJ5IGhlYWRlciBidWZmZXIgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20uCi0gICAgICovIAotICAgIHB1YmxpYyB2b2lkIHBhcnNlVGFySGVhZGVyKGJ5dGVbXSBoZWFkZXIpIHsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm5hbWUgPSBUYXJVdGlscy5wYXJzZU5hbWUoaGVhZGVyLCBvZmZzZXQsIE5BTUVMRU4pOyAgCi0gICAgICAgIG9mZnNldCArPSBOQU1FTEVOOwotICAgICAgICB0aGlzLm1vZGUgPSAoaW50KSBUYXJVdGlscy5wYXJzZU9jdGFsKGhlYWRlciwgb2Zmc2V0LCBNT0RFTEVOKTsgCi0gICAgICAgIG9mZnNldCArPSBNT0RFTEVOOwotICAgICAgICB0aGlzLnVzZXJJZCA9IChpbnQpIFRhclV0aWxzLnBhcnNlT2N0YWwoaGVhZGVyLCBvZmZzZXQsIFVJRExFTik7Ci0gICAgICAgIG9mZnNldCArPSBVSURMRU47Ci0gICAgICAgIHRoaXMuZ3JvdXBJZCA9IChpbnQpIFRhclV0aWxzLnBhcnNlT2N0YWwoaGVhZGVyLCBvZmZzZXQsIEdJRExFTik7Ci0gICAgICAgIG9mZnNldCArPSBHSURMRU47Ci0gICAgICAgIHRoaXMuc2l6ZSA9IFRhclV0aWxzLnBhcnNlT2N0YWwoaGVhZGVyLCBvZmZzZXQsIFNJWkVMRU4pOwotICAgICAgICBvZmZzZXQgKz0gU0laRUxFTjsKLSAgICAgICAgdGhpcy5tb2RUaW1lID0gVGFyVXRpbHMucGFyc2VPY3RhbChoZWFkZXIsIG9mZnNldCwgTU9EVElNRUxFTik7Ci0gICAgICAgIG9mZnNldCArPSBNT0RUSU1FTEVOOwotICAgICAgICB0aGlzLmNoZWNrU3VtID0gKGludCkgVGFyVXRpbHMucGFyc2VPY3RhbChoZWFkZXIsIG9mZnNldCwgQ0hLU1VNTEVOKTsKLSAgICAgICAgb2Zmc2V0ICs9IENIS1NVTUxFTjsKLSAgICAgICAgdGhpcy5saW5rRmxhZyA9IGhlYWRlcltvZmZzZXQrK107Ci0gICAgICAgIHRoaXMubGlua05hbWUgPSBUYXJVdGlscy5wYXJzZU5hbWUoaGVhZGVyLCBvZmZzZXQsIE5BTUVMRU4pOwotICAgICAgICBvZmZzZXQgKz0gTkFNRUxFTjsKLSAgICAgICAgdGhpcy5tYWdpYyA9IFRhclV0aWxzLnBhcnNlTmFtZShoZWFkZXIsIG9mZnNldCwgTUFHSUNMRU4pOwotICAgICAgICBvZmZzZXQgKz0gTUFHSUNMRU47Ci0gICAgICAgIHRoaXMudXNlck5hbWUgPSBUYXJVdGlscy5wYXJzZU5hbWUoaGVhZGVyLCBvZmZzZXQsIFVOQU1FTEVOKTsKLSAgICAgICAgb2Zmc2V0ICs9IFVOQU1FTEVOOwotICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IFRhclV0aWxzLnBhcnNlTmFtZShoZWFkZXIsIG9mZnNldCwgR05BTUVMRU4pOwotICAgICAgICBvZmZzZXQgKz0gR05BTUVMRU47Ci0gICAgICAgIHRoaXMuZGV2TWFqb3IgPSAoaW50KSBUYXJVdGlscy5wYXJzZU9jdGFsKGhlYWRlciwgb2Zmc2V0LCBERVZMRU4pOwotICAgICAgICBvZmZzZXQgKz0gREVWTEVOOwotICAgICAgICB0aGlzLmRldk1pbm9yID0gKGludCkgVGFyVXRpbHMucGFyc2VPY3RhbChoZWFkZXIsIG9mZnNldCwgREVWTEVOKTsKLSAgICB9Ci19ICAgICAgIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFySW5wdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhcklucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYWQ5YzMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFySW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vKgotICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgVGltb3RoeSBHZXJhcmQgRW5kcmVzIAotICogKHRpbWVAaWNlLmNvbSkgdG8gd2hvbSB0aGUgQW50IHByb2plY3QgaXMgdmVyeSBncmF0ZWZ1bCBmb3IgaGlzIGdyZWF0IGNvZGUuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnRhcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBUaGUgVGFySW5wdXRTdHJlYW0gcmVhZHMgYSBVTklYIHRhciBhcmNoaXZlIGFzIGFuIElucHV0U3RyZWFtLgotICogbWV0aG9kcyBhcmUgcHJvdmlkZWQgdG8gcG9zaXRpb24gYXQgZWFjaCBzdWNjZXNzaXZlIGVudHJ5IGluCi0gKiB0aGUgYXJjaGl2ZSwgYW5kIHRoZSByZWFkIGVhY2ggZW50cnkgYXMgYSBub3JtYWwgaW5wdXQgc3RyZWFtCi0gKiB1c2luZyByZWFkKCkuCi0gKiAKLSAqIEBhdXRob3IgVGltb3RoeSBHZXJhcmQgRW5kcmVzIDxhIGhyZWY9Im1haWx0bzp0aW1lQGljZS5jb20iPnRpbWVAaWNlLmNvbTwvYT4KLSAqIEBhdXRob3IgU3RlZmFubyBNYXp6b2NjaGkgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbm9AYXBhY2hlLm9yZyI+c3RlZmFub0BhcGFjaGUub3JnPC9hPgotICovCi1wdWJsaWMgY2xhc3MgVGFySW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gICAgICBkZWJ1ZzsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiAgICAgIGhhc0hpdEVPRjsKLSAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgIGVudHJ5U2l6ZTsKLSAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgIGVudHJ5T2Zmc2V0OwotICAgIHByb3RlY3RlZCBieXRlW10gICAgICAgb25lQnVmOwotICAgIHByb3RlY3RlZCBieXRlW10gICAgICAgcmVhZEJ1ZjsKLSAgICBwcm90ZWN0ZWQgVGFyQnVmZmVyICAgIGJ1ZmZlcjsKLSAgICBwcm90ZWN0ZWQgVGFyRW50cnkgICAgIGN1cnJFbnRyeTsKLQotICAgIHB1YmxpYyBUYXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgewotICAgICAgICB0aGlzKGlzLCBUYXJCdWZmZXIuREVGQVVMVF9CTEtTSVpFLCBUYXJCdWZmZXIuREVGQVVMVF9SQ0RTSVpFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMsIGludCBibG9ja1NpemUpIHsKLSAgICAgICAgdGhpcyhpcywgYmxvY2tTaXplLCBUYXJCdWZmZXIuREVGQVVMVF9SQ0RTSVpFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMsIGludCBibG9ja1NpemUsIGludCByZWNvcmRTaXplKSB7Ci0gICAgICAgIHN1cGVyKGlzKTsKLQotICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUYXJCdWZmZXIoaXMsIGJsb2NrU2l6ZSwgcmVjb3JkU2l6ZSk7Ci0gICAgICAgIHRoaXMucmVhZEJ1ZiA9IG51bGw7Ci0gICAgICAgIHRoaXMub25lQnVmID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgIHRoaXMuZGVidWcgPSBmYWxzZTsKLSAgICAgICAgdGhpcy5oYXNIaXRFT0YgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWJ1Z2dpbmcgZmxhZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVidWdGIFRydWUgdG8gdHVybiBvbiBkZWJ1Z2dpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykgewotICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7Ci0gICAgICAgIHRoaXMuYnVmZmVyLnNldERlYnVnKGRlYnVnKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoaXMgc3RyZWFtLiBDYWxscyB0aGUgVGFyQnVmZmVyJ3MgY2xvc2UoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZSgpOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHJlY29yZCBzaXplIGJlaW5nIHVzZWQgYnkgdGhpcyBzdHJlYW0ncyBUYXJCdWZmZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgVGFyQnVmZmVyIHJlY29yZCBzaXplLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UmVjb3JkU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmdldFJlY29yZFNpemUoKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhdmFpbGFibGUgZGF0YSB0aGF0IGNhbiBiZSByZWFkIGZyb20gdGhlIGN1cnJlbnQKLSAgICAgKiBlbnRyeSBpbiB0aGUgYXJjaGl2ZS4gVGhpcyBkb2VzIG5vdCBpbmRpY2F0ZSBob3cgbXVjaCBkYXRhCi0gICAgICogaXMgbGVmdCBpbiB0aGUgZW50aXJlIGFyY2hpdmUsIG9ubHkgaW4gdGhlIGN1cnJlbnQgZW50cnkuCi0gICAgICogVGhpcyB2YWx1ZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGVudHJ5J3Mgc2l6ZSBoZWFkZXIgZmllbGQKLSAgICAgKiBhbmQgdGhlIGFtb3VudCBvZiBkYXRhIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGVudHJ5LgotICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZW50cnlTaXplIC0gdGhpcy5lbnRyeU9mZnNldDsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogU2tpcCBieXRlcyBpbiB0aGUgaW5wdXQgYnVmZmVyLiBUaGlzIHNraXBzIGJ5dGVzIGluIHRoZQotICAgICAqIGN1cnJlbnQgZW50cnkncyBkYXRhLCBub3QgdGhlIGVudGlyZSBhcmNoaXZlLCBhbmQgd2lsbAotICAgICAqIHN0b3AgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBlbnRyeSdzIGRhdGEgaWYgdGhlIG51bWJlcgotICAgICAqIHRvIHNraXAgZXh0ZW5kcyBiZXlvbmQgdGhhdCBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtVG9Ta2lwIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBza2lwKGludCBudW1Ub1NraXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gUkVWSUVXCi0gICAgICAgIC8vIFRoaXMgaXMgaG9ycmlibHkgaW5lZmZpY2llbnQsIGJ1dCBpdCBlbnN1cmVzIHRoYXQgd2UKLSAgICAgICAgLy8gcHJvcGVybHkgc2tpcCBvdmVyIGJ5dGVzIHZpYSB0aGUgVGFyQnVmZmVyLi4uCi0gICAgICAgIC8vIAotICAgICAgICBieXRlW10gc2tpcEJ1ZiA9IG5ldyBieXRlWzggKiAxMDI0XTsKLQotICAgICAgICBmb3IgKGludCBudW0gPSBudW1Ub1NraXA7IG51bSA+IDA7ICkgewotICAgICAgICAgICAgaW50IG51bVJlYWQgPSB0aGlzLnJlYWQoc2tpcEJ1ZiwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtID4gc2tpcEJ1Zi5sZW5ndGggPyBza2lwQnVmLmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bSkpOwotCi0gICAgICAgICAgICBpZiAobnVtUmVhZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgbnVtIC09IG51bVJlYWQ7Ci0gICAgICAgIH0gCi0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG1hcmtpbmcganVzdCB5ZXQsIHdlIHJldHVybiBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogU2luY2Ugd2UgZG8gbm90IHN1cHBvcnQgbWFya2luZyBqdXN0IHlldCwgd2UgZG8gbm90aGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFya0xpbWl0IFRoZSBsaW1pdCB0byBtYXJrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IG1hcmtMaW1pdCkge30KLQotICAgIC8qKgotICAgICAqIFNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG1hcmtpbmcganVzdCB5ZXQsIHdlIGRvIG5vdGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7fQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuZXh0IGVudHJ5IGluIHRoaXMgdGFyIGFyY2hpdmUuIFRoaXMgd2lsbCBza2lwCi0gICAgICogb3ZlciBhbnkgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGN1cnJlbnQgZW50cnksIGlmIHRoZXJlCi0gICAgICogaXMgb25lLCBhbmQgcGxhY2UgdGhlIGlucHV0IHN0cmVhbSBhdCB0aGUgaGVhZGVyIG9mIHRoZQotICAgICAqIG5leHQgZW50cnksIGFuZCByZWFkIHRoZSBoZWFkZXIgYW5kIGluc3RhbnRpYXRlIGEgbmV3Ci0gICAgICogVGFyRW50cnkgZnJvbSB0aGUgaGVhZGVyIGJ5dGVzIGFuZCByZXR1cm4gdGhhdCBlbnRyeS4KLSAgICAgKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIGluIHRoZSBhcmNoaXZlLCBudWxsIHdpbGwKLSAgICAgKiBiZSByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUgaGFzCi0gICAgICogYmVlbiByZWFjaGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG5leHQgVGFyRW50cnkgaW4gdGhlIGFyY2hpdmUsIG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFRhckVudHJ5IGdldE5leHRFbnRyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmhhc0hpdEVPRikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMuY3VyckVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBudW1Ub1NraXAgPSB0aGlzLmVudHJ5U2l6ZSAtIHRoaXMuZW50cnlPZmZzZXQ7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUYXJJbnB1dFN0cmVhbTogU0tJUCBjdXJyRU5UUlkgJyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5jdXJyRW50cnkuZ2V0TmFtZSgpICsgIicgU1ogIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmVudHJ5U2l6ZSArICIgT0ZGICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5lbnRyeU9mZnNldCArICIgIHNraXBwaW5nICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbnVtVG9Ta2lwICsgIiBieXRlcyIpOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgaWYgKG51bVRvU2tpcCA+IDApIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNraXAobnVtVG9Ta2lwKTsKLSAgICAgICAgICAgIH0gCi0KLSAgICAgICAgICAgIHRoaXMucmVhZEJ1ZiA9IG51bGw7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgYnl0ZVtdIGhlYWRlckJ1ZiA9IHRoaXMuYnVmZmVyLnJlYWRSZWNvcmQoKTsKLQotICAgICAgICBpZiAoaGVhZGVyQnVmID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJSRUFEIE5VTEwgUkVDT1JEIik7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgdGhpcy5oYXNIaXRFT0YgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLmlzRU9GUmVjb3JkKGhlYWRlckJ1ZikpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJSRUFEIEVPRiBSRUNPUkQiKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB0aGlzLmhhc0hpdEVPRiA9IHRydWU7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMuaGFzSGl0RU9GKSB7Ci0gICAgICAgICAgICB0aGlzLmN1cnJFbnRyeSA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmN1cnJFbnRyeSA9IG5ldyBUYXJFbnRyeShoZWFkZXJCdWYpOwotCi0gICAgICAgICAgICBpZiAoIShoZWFkZXJCdWZbMjU3XSA9PSAndScgJiYgaGVhZGVyQnVmWzI1OF0gPT0gJ3MnIAotICAgICAgICAgICAgICAgICAgICAmJiBoZWFkZXJCdWZbMjU5XSA9PSAndCcgJiYgaGVhZGVyQnVmWzI2MF0gPT0gJ2EnIAotICAgICAgICAgICAgICAgICAgICAmJiBoZWFkZXJCdWZbMjYxXSA9PSAncicpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5lbnRyeVNpemUgPSAwOwotICAgICAgICAgICAgICAgIHRoaXMuZW50cnlPZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIHRoaXMuY3VyckVudHJ5ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiYmFkIGhlYWRlciBpbiBibG9jayAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5idWZmZXIuZ2V0Q3VycmVudEJsb2NrTnVtKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHJlY29yZCAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5idWZmZXIuZ2V0Q3VycmVudFJlY29yZE51bSgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBtYWdpYyBpcyBub3QgJ3VzdGFyJywgYnV0ICciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGVhZGVyQnVmWzI1N10gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBoZWFkZXJCdWZbMjU4XSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhlYWRlckJ1ZlsyNTldIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGVhZGVyQnVmWzI2MF0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBoZWFkZXJCdWZbMjYxXSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInLCBvciAoZGVjKSAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChpbnQpIGhlYWRlckJ1ZlsyNTddKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKGludCkgaGVhZGVyQnVmWzI1OF0pIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoaW50KSBoZWFkZXJCdWZbMjU5XSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChpbnQpIGhlYWRlckJ1ZlsyNjBdKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKGludCkgaGVhZGVyQnVmWzI2MV0pKTsKLSAgICAgICAgICAgIH0gCi0KLSAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUYXJJbnB1dFN0cmVhbTogU0VUIENVUlJFTlRSWSAnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmN1cnJFbnRyeS5nZXROYW1lKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgc2l6ZSA9ICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5jdXJyRW50cnkuZ2V0U2l6ZSgpKTsKLSAgICAgICAgICAgIH0gCi0KLSAgICAgICAgICAgIHRoaXMuZW50cnlPZmZzZXQgPSAwOwotCi0gICAgICAgICAgICAvLyBSRVZJRVcgSG93IGRvIHdlIHJlc29sdmUgdGhpcyBkaXNjcmVwYW5jeT8hCi0gICAgICAgICAgICB0aGlzLmVudHJ5U2l6ZSA9IChpbnQpIHRoaXMuY3VyckVudHJ5LmdldFNpemUoKTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAodGhpcy5jdXJyRW50cnkgIT0gbnVsbCAmJiB0aGlzLmN1cnJFbnRyeS5pc0dOVUxvbmdOYW1lRW50cnkoKSkgewotICAgICAgICAgICAgLy8gcmVhZCBpbiB0aGUgbmFtZQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGxvbmdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzI1Nl07Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gcmVhZChidWZmZXIpKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbG9uZ05hbWUuYXBwZW5kKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBsZW5ndGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldE5leHRFbnRyeSgpOwotICAgICAgICAgICAgdGhpcy5jdXJyRW50cnkuc2V0TmFtZShsb25nTmFtZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLmN1cnJFbnRyeTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBieXRlIGZyb20gdGhlIGN1cnJlbnQgdGFyIGFyY2hpdmUgZW50cnkuCi0gICAgICogCi0gICAgICogVGhpcyBtZXRob2Qgc2ltcGx5IGNhbGxzIHJlYWQoIGJ5dGVbXSwgaW50LCBpbnQgKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBieXRlIHJlYWQsIG9yIC0xIGF0IEVPRi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgbnVtID0gdGhpcy5yZWFkKHRoaXMub25lQnVmLCAwLCAxKTsKLQotICAgICAgICBpZiAobnVtID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVtOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHRoaXMub25lQnVmWzBdOwotICAgICAgICB9Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgdGFyIGFyY2hpdmUgZW50cnkuCi0gICAgICogCi0gICAgICogVGhpcyBtZXRob2Qgc2ltcGx5IGNhbGxzIHJlYWQoIGJ5dGVbXSwgaW50LCBpbnQgKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIgaW50byB3aGljaCB0byBwbGFjZSBieXRlcyByZWFkLgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBhdCBFT0YuCi0gICAgICovCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCB0YXIgYXJjaGl2ZSBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhd2FyZSBvZiB0aGUgYm91bmRhcmllcyBvZiB0aGUgY3VycmVudAotICAgICAqIGVudHJ5IGluIHRoZSBhcmNoaXZlIGFuZCB3aWxsIGRlYWwgd2l0aCB0aGVtIGFzIGlmIHRoZXkKLSAgICAgKiB3ZXJlIHRoaXMgc3RyZWFtJ3Mgc3RhcnQgYW5kIEVPRi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIgaW50byB3aGljaCB0byBwbGFjZSBieXRlcyByZWFkLgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0byBwbGFjZSBieXRlcyByZWFkLgotICAgICAqIEBwYXJhbSBudW1Ub1JlYWQgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBhdCBFT0YuCi0gICAgICovCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBudW1Ub1JlYWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCB0b3RhbFJlYWQgPSAwOwotCi0gICAgICAgIGlmICh0aGlzLmVudHJ5T2Zmc2V0ID49IHRoaXMuZW50cnlTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKChudW1Ub1JlYWQgKyB0aGlzLmVudHJ5T2Zmc2V0KSA+IHRoaXMuZW50cnlTaXplKSB7Ci0gICAgICAgICAgICBudW1Ub1JlYWQgPSAodGhpcy5lbnRyeVNpemUgLSB0aGlzLmVudHJ5T2Zmc2V0KTsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAodGhpcy5yZWFkQnVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzeiA9IChudW1Ub1JlYWQgPiB0aGlzLnJlYWRCdWYubGVuZ3RoKSA/IHRoaXMucmVhZEJ1Zi5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICA6IG51bVRvUmVhZDsKLQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLnJlYWRCdWYsIDAsIGJ1Ziwgb2Zmc2V0LCBzeik7Ci0KLSAgICAgICAgICAgIGlmIChzeiA+PSB0aGlzLnJlYWRCdWYubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5yZWFkQnVmID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50ICAgIG5ld0xlbiA9IHRoaXMucmVhZEJ1Zi5sZW5ndGggLSBzejsKLSAgICAgICAgICAgICAgICBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbbmV3TGVuXTsKLQotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5yZWFkQnVmLCBzeiwgbmV3QnVmLCAwLCBuZXdMZW4pOwotCi0gICAgICAgICAgICAgICAgdGhpcy5yZWFkQnVmID0gbmV3QnVmOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgdG90YWxSZWFkICs9IHN6OwotICAgICAgICAgICAgbnVtVG9SZWFkIC09IHN6OwotICAgICAgICAgICAgb2Zmc2V0ICs9IHN6OwotICAgICAgICB9IAotCi0gICAgICAgIHdoaWxlIChudW1Ub1JlYWQgPiAwKSB7Ci0gICAgICAgICAgICBieXRlW10gcmVjID0gdGhpcy5idWZmZXIucmVhZFJlY29yZCgpOwotCi0gICAgICAgICAgICBpZiAocmVjID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBVbmV4cGVjdGVkIEVPRiEKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInVuZXhwZWN0ZWQgRU9GIHdpdGggIiArIG51bVRvUmVhZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ5dGVzIHVucmVhZCIpOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgaW50IHN6ID0gbnVtVG9SZWFkOwotICAgICAgICAgICAgaW50IHJlY0xlbiA9IHJlYy5sZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmIChyZWNMZW4gPiBzeikgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVjLCAwLCBidWYsIG9mZnNldCwgc3opOwotCi0gICAgICAgICAgICAgICAgdGhpcy5yZWFkQnVmID0gbmV3IGJ5dGVbcmVjTGVuIC0gc3pdOwotCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZWMsIHN6LCB0aGlzLnJlYWRCdWYsIDAsIHJlY0xlbiAtIHN6KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3ogPSByZWNMZW47Ci0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlYywgMCwgYnVmLCBvZmZzZXQsIHJlY0xlbik7Ci0gICAgICAgICAgICB9IAotCi0gICAgICAgICAgICB0b3RhbFJlYWQgKz0gc3o7Ci0gICAgICAgICAgICBudW1Ub1JlYWQgLT0gc3o7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc3o7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgdGhpcy5lbnRyeU9mZnNldCArPSB0b3RhbFJlYWQ7Ci0KLSAgICAgICAgcmV0dXJuIHRvdGFsUmVhZDsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCB0YXIgYXJjaGl2ZSBlbnRyeSBkaXJlY3RseSBpbnRvCi0gICAgICogYW4gb3V0cHV0IHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBPdXRwdXRTdHJlYW0gaW50byB3aGljaCB0byB3cml0ZSB0aGUgZW50cnkncyBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHlFbnRyeUNvbnRlbnRzKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVszMiAqIDEwMjRdOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbnQgbnVtUmVhZCA9IHRoaXMucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAobnVtUmVhZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbnVtUmVhZCk7Ci0gICAgICAgIH0gCi0gICAgfSAKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1Rhck91dHB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZmJhNDEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotLyoKLSAqIFRoaXMgcGFja2FnZSBpcyBiYXNlZCBvbiB0aGUgd29yayBkb25lIGJ5IFRpbW90aHkgR2VyYXJkIEVuZHJlcyAKLSAqICh0aW1lQGljZS5jb20pIHRvIHdob20gdGhlIEFudCBwcm9qZWN0IGlzIHZlcnkgZ3JhdGVmdWwgZm9yIGhpcyBncmVhdCBjb2RlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy50YXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogVGhlIFRhck91dHB1dFN0cmVhbSB3cml0ZXMgYSBVTklYIHRhciBhcmNoaXZlIGFzIGFuIE91dHB1dFN0cmVhbS4KLSAqIE1ldGhvZHMgYXJlIHByb3ZpZGVkIHRvIHB1dCBlbnRyaWVzLCBhbmQgdGhlbiB3cml0ZSB0aGVpciBjb250ZW50cwotICogYnkgd3JpdGluZyB0byB0aGlzIHN0cmVhbSB1c2luZyB3cml0ZSgpLgotICogCi0gKiBAYXV0aG9yIFRpbW90aHkgR2VyYXJkIEVuZHJlcyA8YSBocmVmPSJtYWlsdG86dGltZUBpY2UuY29tIj50aW1lQGljZS5jb208L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0gewotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IExPTkdGSUxFX0VSUk9SID0gMDsKLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCBMT05HRklMRV9UUlVOQ0FURSA9IDE7Ci0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgTE9OR0ZJTEVfR05VID0gMjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiAgIGRlYnVnOwotICAgIHByb3RlY3RlZCBpbnQgICAgICAgY3VyclNpemU7Ci0gICAgcHJvdGVjdGVkIGludCAgICAgICBjdXJyQnl0ZXM7Ci0gICAgcHJvdGVjdGVkIGJ5dGVbXSAgICBvbmVCdWY7Ci0gICAgcHJvdGVjdGVkIGJ5dGVbXSAgICByZWNvcmRCdWY7Ci0gICAgcHJvdGVjdGVkIGludCAgICAgICBhc3NlbUxlbjsKLSAgICBwcm90ZWN0ZWQgYnl0ZVtdICAgIGFzc2VtQnVmOwotICAgIHByb3RlY3RlZCBUYXJCdWZmZXIgYnVmZmVyOwotICAgIHByb3RlY3RlZCBpbnQgICAgICAgbG9uZ0ZpbGVNb2RlID0gTE9OR0ZJTEVfRVJST1I7Ci0KLSAgICBwdWJsaWMgVGFyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgewotICAgICAgICB0aGlzKG9zLCBUYXJCdWZmZXIuREVGQVVMVF9CTEtTSVpFLCBUYXJCdWZmZXIuREVGQVVMVF9SQ0RTSVpFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcywgaW50IGJsb2NrU2l6ZSkgewotICAgICAgICB0aGlzKG9zLCBibG9ja1NpemUsIFRhckJ1ZmZlci5ERUZBVUxUX1JDRFNJWkUpOwotICAgIH0KLQotICAgIHB1YmxpYyBUYXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zLCBpbnQgYmxvY2tTaXplLCBpbnQgcmVjb3JkU2l6ZSkgewotICAgICAgICBzdXBlcihvcyk7Ci0KLSAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVGFyQnVmZmVyKG9zLCBibG9ja1NpemUsIHJlY29yZFNpemUpOwotICAgICAgICB0aGlzLmRlYnVnID0gZmFsc2U7Ci0gICAgICAgIHRoaXMuYXNzZW1MZW4gPSAwOwotICAgICAgICB0aGlzLmFzc2VtQnVmID0gbmV3IGJ5dGVbcmVjb3JkU2l6ZV07Ci0gICAgICAgIHRoaXMucmVjb3JkQnVmID0gbmV3IGJ5dGVbcmVjb3JkU2l6ZV07Ci0gICAgICAgIHRoaXMub25lQnVmID0gbmV3IGJ5dGVbMV07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9uZ0ZpbGVNb2RlKGludCBsb25nRmlsZU1vZGUpIHsKLSAgICAgICAgdGhpcy5sb25nRmlsZU1vZGUgPSBsb25nRmlsZU1vZGU7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVidWdnaW5nIGZsYWcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRlYnVnRiBUcnVlIHRvIHR1cm4gb24gZGVidWdnaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWdGKSB7Ci0gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z0Y7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlYnVnZ2luZyBmbGFnIGluIHRoaXMgc3RyZWFtJ3MgVGFyQnVmZmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZWJ1Z0YgVHJ1ZSB0byB0dXJuIG9uIGRlYnVnZ2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJEZWJ1Zyhib29sZWFuIGRlYnVnKSB7Ci0gICAgICAgIHRoaXMuYnVmZmVyLnNldERlYnVnKGRlYnVnKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogRW5kcyB0aGUgVEFSIGFyY2hpdmUgd2l0aG91dCBjbG9zaW5nIHRoZSB1bmRlcmx5aW5nIE91dHB1dFN0cmVhbS4KLSAgICAgKiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIEVPRiByZWNvcmQgb2YgbnVsbHMgaXMgd3JpdHRlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzLndyaXRlRU9GUmVjb3JkKCk7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIEVuZHMgdGhlIFRBUiBhcmNoaXZlIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgT3V0cHV0U3RyZWFtLgotICAgICAqIFRoaXMgbWVhbnMgdGhhdCBmaW5pc2goKSBpcyBjYWxsZWQgZm9sbG93ZWQgYnkgY2FsbGluZyB0aGUKLSAgICAgKiBUYXJCdWZmZXIncyBjbG9zZSgpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5maW5pc2goKTsKLSAgICAgICAgdGhpcy5idWZmZXIuY2xvc2UoKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByZWNvcmQgc2l6ZSBiZWluZyB1c2VkIGJ5IHRoaXMgc3RyZWFtJ3MgVGFyQnVmZmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIFRhckJ1ZmZlciByZWNvcmQgc2l6ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJlY29yZFNpemUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5nZXRSZWNvcmRTaXplKCk7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFB1dCBhbiBlbnRyeSBvbiB0aGUgb3V0cHV0IHN0cmVhbS4gVGhpcyB3cml0ZXMgdGhlIGVudHJ5J3MKLSAgICAgKiBoZWFkZXIgcmVjb3JkIGFuZCBwb3NpdGlvbnMgdGhlIG91dHB1dCBzdHJlYW0gZm9yIHdyaXRpbmcKLSAgICAgKiB0aGUgY29udGVudHMgb2YgdGhlIGVudHJ5LiBPbmNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlCi0gICAgICogc3RyZWFtIGlzIHJlYWR5IGZvciBjYWxscyB0byB3cml0ZSgpIHRvIHdyaXRlIHRoZSBlbnRyeSdzCi0gICAgICogY29udGVudHMuIE9uY2UgdGhlIGNvbnRlbnRzIGFyZSB3cml0dGVuLCBjbG9zZUVudHJ5KCkKLSAgICAgKiA8Qj5NVVNUPC9CPiBiZSBjYWxsZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGJ1ZmZlcmVkIGRhdGEKLSAgICAgKiBpcyBjb21wbGV0ZWx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5IFRoZSBUYXJFbnRyeSB0byBiZSB3cml0dGVuIHRvIHRoZSBhcmNoaXZlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dE5leHRFbnRyeShUYXJFbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5sZW5ndGgoKSA+PSBUYXJDb25zdGFudHMuTkFNRUxFTikgewotCi0gICAgICAgICAgICBpZiAobG9uZ0ZpbGVNb2RlID09IExPTkdGSUxFX0dOVSkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFRhckVudHJ5IGZvciB0aGUgTG9uZ0xpbmssIHRoZSBjb250ZW50cwotICAgICAgICAgICAgICAgIC8vIG9mIHdoaWNoIGFyZSB0aGUgZW50cnkncyBuYW1lIAotICAgICAgICAgICAgICAgIFRhckVudHJ5IGxvbmdMaW5rRW50cnkgPSBuZXcgVGFyRW50cnkoVGFyQ29uc3RhbnRzLkdOVV9MT05HTElOSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhckNvbnN0YW50cy5MRl9HTlVUWVBFX0xPTkdOQU1FKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbG9uZ0xpbmtFbnRyeS5zZXRTaXplKGVudHJ5LmdldE5hbWUoKS5sZW5ndGgoKSArIDEpOwotICAgICAgICAgICAgICAgIHB1dE5leHRFbnRyeShsb25nTGlua0VudHJ5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd3JpdGUoZW50cnkuZ2V0TmFtZSgpLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlKDApOwotICAgICAgICAgICAgICAgIGNsb3NlRW50cnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxvbmdGaWxlTW9kZSAhPSBMT05HRklMRV9UUlVOQ0FURSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJmaWxlIG5hbWUgJyIgKyBlbnRyeS5nZXROYW1lKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGlzIHRvbyBsb25nICggPiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBUYXJDb25zdGFudHMuTkFNRUxFTiArICIgYnl0ZXMpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0KLSAgICAgICAgZW50cnkud3JpdGVFbnRyeUhlYWRlcih0aGlzLnJlY29yZEJ1Zik7Ci0gICAgICAgIHRoaXMuYnVmZmVyLndyaXRlUmVjb3JkKHRoaXMucmVjb3JkQnVmKTsKLQotICAgICAgICB0aGlzLmN1cnJCeXRlcyA9IDA7Ci0KLSAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRoaXMuY3VyclNpemUgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5jdXJyU2l6ZSA9IChpbnQpIGVudHJ5LmdldFNpemUoKTsKLSAgICAgICAgfQotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBDbG9zZSBhbiBlbnRyeS4gVGhpcyBtZXRob2QgTVVTVCBiZSBjYWxsZWQgZm9yIGFsbCBmaWxlCi0gICAgICogZW50cmllcyB0aGF0IGNvbnRhaW4gZGF0YS4gVGhlIHJlYXNvbiBpcyB0aGF0IHdlIG11c3QKLSAgICAgKiBidWZmZXIgZGF0YSB3cml0dGVuIHRvIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8gc2F0aXNmeQotICAgICAqIHRoZSBidWZmZXIncyByZWNvcmQgYmFzZWQgd3JpdGVzLiBUaHVzLCB0aGVyZSBtYXkgYmUKLSAgICAgKiBkYXRhIGZyYWdtZW50cyBzdGlsbCBiZWluZyBhc3NlbWJsZWQgdGhhdCBtdXN0IGJlIHdyaXR0ZW4KLSAgICAgKiB0byB0aGUgb3V0cHV0IHN0cmVhbSBiZWZvcmUgdGhpcyBlbnRyeSBpcyBjbG9zZWQgYW5kIHRoZQotICAgICAqIG5leHQgZW50cnkgd3JpdHRlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZUVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuYXNzZW1MZW4gPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gdGhpcy5hc3NlbUxlbjsgaSA8IHRoaXMuYXNzZW1CdWYubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmFzc2VtQnVmW2ldID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5idWZmZXIud3JpdGVSZWNvcmQodGhpcy5hc3NlbUJ1Zik7Ci0KLSAgICAgICAgICAgIHRoaXMuY3VyckJ5dGVzICs9IHRoaXMuYXNzZW1MZW47Ci0gICAgICAgICAgICB0aGlzLmFzc2VtTGVuID0gMDsKLSAgICAgICAgfSAKLQotICAgICAgICBpZiAodGhpcy5jdXJyQnl0ZXMgPCB0aGlzLmN1cnJTaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImVudHJ5IGNsb3NlZCBhdCAnIiArIHRoaXMuY3VyckJ5dGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYmVmb3JlIHRoZSAnIiArIHRoaXMuY3VyclNpemUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBieXRlcyBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciB3ZXJlIHdyaXR0ZW4iKTsKLSAgICAgICAgfSAKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgYnl0ZSB0byB0aGUgY3VycmVudCB0YXIgYXJjaGl2ZSBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCBzaW1wbHkgY2FsbHMgcmVhZCggYnl0ZVtdLCBpbnQsIGludCApLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiIFRoZSBieXRlIHdyaXR0ZW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMub25lQnVmWzBdID0gKGJ5dGUpIGI7Ci0KLSAgICAgICAgdGhpcy53cml0ZSh0aGlzLm9uZUJ1ZiwgMCwgMSk7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBieXRlcyB0byB0aGUgY3VycmVudCB0YXIgYXJjaGl2ZSBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCBzaW1wbHkgY2FsbHMgd3JpdGUoIGJ5dGVbXSwgaW50LCBpbnQgKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd0J1ZiBUaGUgYnVmZmVyIHRvIHdyaXRlIHRvIHRoZSBhcmNoaXZlLgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBhdCBFT0YuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIHdCdWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3JpdGUod0J1ZiwgMCwgd0J1Zi5sZW5ndGgpOwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYnl0ZXMgdG8gdGhlIGN1cnJlbnQgdGFyIGFyY2hpdmUgZW50cnkuIFRoaXMgbWV0aG9kCi0gICAgICogaXMgYXdhcmUgb2YgdGhlIGN1cnJlbnQgZW50cnkgYW5kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmCi0gICAgICogeW91IGF0dGVtcHQgdG8gd3JpdGUgYnl0ZXMgcGFzdCB0aGUgbGVuZ3RoIHNwZWNpZmllZCBmb3IgdGhlCi0gICAgICogY3VycmVudCBlbnRyeS4gVGhlIG1ldGhvZCBpcyBhbHNvIChwYWluZnVsbHkpIGF3YXJlIG9mIHRoZQotICAgICAqIHJlY29yZCBidWZmZXJpbmcgcmVxdWlyZWQgYnkgVGFyQnVmZmVyLCBhbmQgbWFuYWdlcyBidWZmZXJzCi0gICAgICogdGhhdCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgcmVjb3Jkc2l6ZSBpbiBsZW5ndGgsIGluY2x1ZGluZwotICAgICAqIGFzc2VtYmxpbmcgcmVjb3JkcyBmcm9tIHNtYWxsIGJ1ZmZlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdCdWYgVGhlIGJ1ZmZlciB0byB3cml0ZSB0byB0aGUgYXJjaGl2ZS4KLSAgICAgKiBAcGFyYW0gd09mZnNldCBUaGUgb2Zmc2V0IGluIHRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBnZXQgYnl0ZXMuCi0gICAgICogQHBhcmFtIG51bVRvV3JpdGUgVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gd0J1ZiwgaW50IHdPZmZzZXQsIGludCBudW1Ub1dyaXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoKHRoaXMuY3VyckJ5dGVzICsgbnVtVG9Xcml0ZSkgPiB0aGlzLmN1cnJTaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlcXVlc3QgdG8gd3JpdGUgJyIgKyBudW1Ub1dyaXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYnl0ZXMgZXhjZWVkcyBzaXplIGluIGhlYWRlciBvZiAnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMuY3VyclNpemUgKyAiJyBieXRlcyIpOwotCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZGVhbCB3aXRoIGFzc2VtYmx5ISEhCi0gICAgICAgICAgICAvLyBUaGUgcHJvZ3JhbW1lciBjYW4gYmUgd3JpdGluZyBsaXR0bGUgMzIgYnl0ZSBjaHVua3MgZm9yIGFsbAotICAgICAgICAgICAgLy8gd2Uga25vdywgYW5kIHdlIG11c3QgYXNzZW1ibGUgY29tcGxldGUgcmVjb3JkcyBmb3Igd3JpdGluZy4KLSAgICAgICAgICAgIC8vIFJFVklFVyBNYXliZSB0aGlzIHNob3VsZCBiZSBpbiBUYXJCdWZmZXI/IENvdWxkIHRoYXQgaGVscCB0bwotICAgICAgICAgICAgLy8gZWxpbWluYXRlIHNvbWUgb2YgdGhlIGJ1ZmZlciBjb3B5aW5nLgotICAgICAgICAgICAgLy8gCi0gICAgICAgIH0gCi0KLSAgICAgICAgaWYgKHRoaXMuYXNzZW1MZW4gPiAwKSB7Ci0gICAgICAgICAgICBpZiAoKHRoaXMuYXNzZW1MZW4gKyBudW1Ub1dyaXRlKSA+PSB0aGlzLnJlY29yZEJ1Zi5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpbnQgYUxlbiA9IHRoaXMucmVjb3JkQnVmLmxlbmd0aCAtIHRoaXMuYXNzZW1MZW47Ci0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYXNzZW1CdWYsIDAsIHRoaXMucmVjb3JkQnVmLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZW1MZW4pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod0J1Ziwgd09mZnNldCwgdGhpcy5yZWNvcmRCdWYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlbUxlbiwgYUxlbik7Ci0gICAgICAgICAgICAgICAgdGhpcy5idWZmZXIud3JpdGVSZWNvcmQodGhpcy5yZWNvcmRCdWYpOwotCi0gICAgICAgICAgICAgICAgdGhpcy5jdXJyQnl0ZXMgKz0gdGhpcy5yZWNvcmRCdWYubGVuZ3RoOwotICAgICAgICAgICAgICAgIHdPZmZzZXQgKz0gYUxlbjsKLSAgICAgICAgICAgICAgICBudW1Ub1dyaXRlIC09IGFMZW47Ci0gICAgICAgICAgICAgICAgdGhpcy5hc3NlbUxlbiA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod0J1Ziwgd09mZnNldCwgdGhpcy5hc3NlbUJ1ZiwgdGhpcy5hc3NlbUxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Ub1dyaXRlKTsKLQotICAgICAgICAgICAgICAgIHdPZmZzZXQgKz0gbnVtVG9Xcml0ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmFzc2VtTGVuICs9IG51bVRvV3JpdGU7Ci0gICAgICAgICAgICAgICAgbnVtVG9Xcml0ZSAtPSBudW1Ub1dyaXRlOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSAKLQotICAgICAgICAvLyAKLSAgICAgICAgLy8gV2hlbiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIEVJVEhFUjoKLSAgICAgICAgLy8gbyBBbiBlbXB0eSAiYXNzZW1ibGUiIGJ1ZmZlci4KLSAgICAgICAgLy8gbyBObyBieXRlcyB0byB3cml0ZSAobnVtVG9Xcml0ZSA9PSAwKQotICAgICAgICAvLyAKLSAgICAgICAgd2hpbGUgKG51bVRvV3JpdGUgPiAwKSB7Ci0gICAgICAgICAgICBpZiAobnVtVG9Xcml0ZSA8IHRoaXMucmVjb3JkQnVmLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod0J1Ziwgd09mZnNldCwgdGhpcy5hc3NlbUJ1ZiwgdGhpcy5hc3NlbUxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Ub1dyaXRlKTsKLQotICAgICAgICAgICAgICAgIHRoaXMuYXNzZW1MZW4gKz0gbnVtVG9Xcml0ZTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgdGhpcy5idWZmZXIud3JpdGVSZWNvcmQod0J1Ziwgd09mZnNldCk7Ci0KLSAgICAgICAgICAgIGludCBudW0gPSB0aGlzLnJlY29yZEJ1Zi5sZW5ndGg7Ci0KLSAgICAgICAgICAgIHRoaXMuY3VyckJ5dGVzICs9IG51bTsKLSAgICAgICAgICAgIG51bVRvV3JpdGUgLT0gbnVtOwotICAgICAgICAgICAgd09mZnNldCArPSBudW07Ci0gICAgICAgIH0gCi0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFdyaXRlIGFuIEVPRiAoZW5kIG9mIGFyY2hpdmUpIHJlY29yZCB0byB0aGUgdGFyIGFyY2hpdmUuCi0gICAgICogQW4gRU9GIHJlY29yZCBjb25zaXN0cyBvZiBhIHJlY29yZCBvZiBhbGwgemVyb3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRU9GUmVjb3JkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnJlY29yZEJ1Zi5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgdGhpcy5yZWNvcmRCdWZbaV0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5idWZmZXIud3JpdGVSZWNvcmQodGhpcy5yZWNvcmRCdWYpOwotICAgIH0gCi19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzRlMDQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vKgotICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgVGltb3RoeSBHZXJhcmQgRW5kcmVzIAotICogKHRpbWVAaWNlLmNvbSkgdG8gd2hvbSB0aGUgQW50IHByb2plY3QgaXMgdmVyeSBncmF0ZWZ1bCBmb3IgaGlzIGdyZWF0IGNvZGUuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnRhcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgdG8gd29yayB3aXRoIGJ5dGUgc3RyZWFtcy4KLSAqIAotICogQGF1dGhvciBUaW1vdGh5IEdlcmFyZCBFbmRyZXMgPGEgaHJlZj0ibWFpbHRvOnRpbWVAaWNlLmNvbSI+dGltZUBpY2UuY29tPC9hPgotICogQGF1dGhvciBTdGVmYW5vIE1henpvY2NoaSA8YSBocmVmPSJtYWlsdG86c3RlZmFub0BhcGFjaGUub3JnIj5zdGVmYW5vQGFwYWNoZS5vcmc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXJVdGlscyB7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbiBvY3RhbCBzdHJpbmcgZnJvbSBhIGhlYWRlciBidWZmZXIuIFRoaXMgaXMgdXNlZCBmb3IgdGhlCi0gICAgICogZmlsZSBwZXJtaXNzaW9uIG1vZGUgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgaGVhZGVyIGJ5dGVzIHRvIHBhcnNlLgotICAgICAqIEByZXR1cm4gVGhlIGxvbmcgdmFsdWUgb2YgdGhlIG9jdGFsIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgcGFyc2VPY3RhbChieXRlW10gaGVhZGVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGxvbmcgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgYm9vbGVhbiBzdGlsbFBhZGRpbmcgPSB0cnVlOwotICAgICAgICBpbnQgICAgIGVuZCA9IG9mZnNldCArIGxlbmd0aDsKLQotICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgZW5kOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChoZWFkZXJbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgaWYgKGhlYWRlcltpXSA9PSAoYnl0ZSkgJyAnIHx8IGhlYWRlcltpXSA9PSAnMCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RpbGxQYWRkaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gCi0KLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyW2ldID09IChieXRlKSAnICcpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0gCi0KLSAgICAgICAgICAgIHN0aWxsUGFkZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCAzKSArIChoZWFkZXJbaV0gLSAnMCcpOwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuIGVudHJ5IG5hbWUgZnJvbSBhIGhlYWRlciBidWZmZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgaGVhZGVyIGJ5dGVzIHRvIHBhcnNlLgotICAgICAqIEByZXR1cm4gVGhlIGhlYWRlcidzIGVudHJ5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgcGFyc2VOYW1lKGJ5dGVbXSBoZWFkZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgaW50ICAgICAgICAgIGVuZCA9IG9mZnNldCArIGxlbmd0aDsKLQotICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgZW5kOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChoZWFkZXJbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoY2hhcikgaGVhZGVyW2ldKTsKLSAgICAgICAgfSAKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gCi0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhbiBlbnRyeSBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIGhlYWRlciBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGZyb20gd2hpY2ggdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGhlYWRlciBieXRlcyB0byBwYXJzZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBoZWFkZXIncyBlbnRyeSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE5hbWVCeXRlcyhTdHJpbmdCdWZmZXIgbmFtZSwgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoICYmIGkgPCBuYW1lLmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IChieXRlKSBuYW1lLmNoYXJBdChpKTsKLSAgICAgICAgfSAKLQotICAgICAgICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSAwOwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiBvZmZzZXQgKyBsZW5ndGg7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuIG9jdGFsIGludGVnZXIgZnJvbSBhIGhlYWRlciBidWZmZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgaGVhZGVyIGJ5dGVzIHRvIHBhcnNlLgotICAgICAqIEByZXR1cm4gVGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIG9jdGFsIGJ5dGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE9jdGFsQnl0ZXMobG9uZyB2YWx1ZSwgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgaW50ICAgIGlkeCA9IGxlbmd0aCAtIDE7Ci0KLSAgICAgICAgYnVmW29mZnNldCArIGlkeF0gPSAwOwotICAgICAgICAtLWlkeDsKLSAgICAgICAgYnVmW29mZnNldCArIGlkeF0gPSAoYnl0ZSkgJyAnOwotICAgICAgICAtLWlkeDsKLQotICAgICAgICBpZiAodmFsdWUgPT0gMCkgewotICAgICAgICAgICAgYnVmW29mZnNldCArIGlkeF0gPSAoYnl0ZSkgJzAnOwotICAgICAgICAgICAgLS1pZHg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGxvbmcgdmFsID0gdmFsdWU7IGlkeCA+PSAwICYmIHZhbCA+IDA7IC0taWR4KSB7Ci0gICAgICAgICAgICAgICAgYnVmW29mZnNldCArIGlkeF0gPSAoYnl0ZSkgKChieXRlKSAnMCcgKyAoYnl0ZSkgKHZhbCAmIDcpKTsKLSAgICAgICAgICAgICAgICB2YWwgPSB2YWwgPj4gMzsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gCi0KLSAgICAgICAgZm9yICg7IGlkeCA+PSAwOyAtLWlkeCkgewotICAgICAgICAgICAgYnVmW29mZnNldCArIGlkeF0gPSAoYnl0ZSkgJyAnOwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiBvZmZzZXQgKyBsZW5ndGg7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuIG9jdGFsIGxvbmcgaW50ZWdlciBmcm9tIGEgaGVhZGVyIGJ1ZmZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGVhZGVyIFRoZSBoZWFkZXIgYnVmZmVyIGZyb20gd2hpY2ggdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBoZWFkZXIgYnl0ZXMgdG8gcGFyc2UuCi0gICAgICogQHJldHVybiBUaGUgbG9uZyB2YWx1ZSBvZiB0aGUgb2N0YWwgYnl0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TG9uZ09jdGFsQnl0ZXMobG9uZyB2YWx1ZSwgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgICBieXRlW10gdGVtcCA9IG5ldyBieXRlW2xlbmd0aCArIDFdOwotCi0gICAgICAgIGdldE9jdGFsQnl0ZXModmFsdWUsIHRlbXAsIDAsIGxlbmd0aCArIDEpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgICAgIHJldHVybiBvZmZzZXQgKyBsZW5ndGg7Ci0gICAgfSAKLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBjaGVja3N1bSBvY3RhbCBpbnRlZ2VyIGZyb20gYSBoZWFkZXIgYnVmZmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIGhlYWRlciBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGZyb20gd2hpY2ggdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGhlYWRlciBieXRlcyB0byBwYXJzZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBlbnRyeSdzIGNoZWNrc3VtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENoZWNrU3VtT2N0YWxCeXRlcyhsb25nIHZhbHVlLCBieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGdldE9jdGFsQnl0ZXModmFsdWUsIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgICAgIGJ1ZltvZmZzZXQgKyBsZW5ndGggLSAxXSA9IChieXRlKSAnICc7Ci0gICAgICAgIGJ1ZltvZmZzZXQgKyBsZW5ndGggLSAyXSA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIG9mZnNldCArIGxlbmd0aDsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIENvbXB1dGUgdGhlIGNoZWNrc3VtIG9mIGEgdGFyIGVudHJ5IGhlYWRlci4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGJ1ZiBUaGUgdGFyIGVudHJ5J3MgaGVhZGVyIGJ1ZmZlci4KLSAgICAgKiBAcmV0dXJuIFRoZSBjb21wdXRlZCBjaGVja3N1bS4KLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVDaGVja1N1bShieXRlW10gYnVmKSB7Ci0gICAgICAgIGxvbmcgc3VtID0gMDsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBzdW0gKz0gMjU1ICYgYnVmW2ldOwotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1bTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQXNpRXh0cmFGaWVsZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQXNpRXh0cmFGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTFjNmQ5Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0FzaUV4dHJhRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOwotCi1pbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBZGRzIFVuaXggZmlsZSBwZXJtaXNzaW9uIGFuZCBVSUQvR0lEIGZpZWxkcyBhcyB3ZWxsIGFzIHN5bWJvbGljCi0gKiBsaW5rIGhhbmRsaW5nLgotICoKLSAqIDxwPlRoaXMgY2xhc3MgdXNlcyB0aGUgQVNpIGV4dHJhIGZpZWxkIGluIHRoZSBmb3JtYXQ6Ci0gKiA8cHJlPgotICogICAgICAgICBWYWx1ZSAgICAgICAgIFNpemUgICAgICAgICAgICBEZXNjcmlwdGlvbgotICogICAgICAgICAtLS0tLSAgICAgICAgIC0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLQotICogKFVuaXgzKSAweDc1NmUgICAgICAgIFNob3J0ICAgICAgICAgICB0YWcgZm9yIHRoaXMgZXh0cmEgYmxvY2sgdHlwZQotICogICAgICAgICBUU2l6ZSAgICAgICAgIFNob3J0ICAgICAgICAgICB0b3RhbCBkYXRhIHNpemUgZm9yIHRoaXMgYmxvY2sKLSAqICAgICAgICAgQ1JDICAgICAgICAgICBMb25nICAgICAgICAgICAgQ1JDLTMyIG9mIHRoZSByZW1haW5pbmcgZGF0YQotICogICAgICAgICBNb2RlICAgICAgICAgIFNob3J0ICAgICAgICAgICBmaWxlIHBlcm1pc3Npb25zCi0gKiAgICAgICAgIFNpekRldiAgICAgICAgTG9uZyAgICAgICAgICAgIHN5bWxpbmsnZCBzaXplIE9SIG1ham9yL21pbm9yIGRldiBudW0KLSAqICAgICAgICAgVUlEICAgICAgICAgICBTaG9ydCAgICAgICAgICAgdXNlciBJRAotICogICAgICAgICBHSUQgICAgICAgICAgIFNob3J0ICAgICAgICAgICBncm91cCBJRAotICogICAgICAgICAodmFyLikgICAgICAgIHZhcmlhYmxlICAgICAgICBzeW1ib2xpYyBsaW5rIGZpbGVuYW1lCi0gKiA8L3ByZT4KLSAqIHRha2VuIGZyb20gYXBwbm90ZS5peiAoSW5mby1aSVAgbm90ZSwgOTgxMTE5KSBmb3VuZCBhdCA8YQotICogaHJlZj0iZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC9kb2MvIj5mdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy88L2E+PC9wPgotCi0gKgotICogPHA+U2hvcnQgaXMgdHdvIGJ5dGVzIGFuZCBMb25nIGlzIGZvdXIgYnl0ZXMgaW4gYmlnIGVuZGlhbiBieXRlIGFuZAotICogd29yZCBvcmRlciwgZGV2aWNlIG51bWJlcnMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLjwvcD4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEFzaUV4dHJhRmllbGQgaW1wbGVtZW50cyBaaXBFeHRyYUZpZWxkLCBVbml4U3RhdCwgQ2xvbmVhYmxlIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFppcFNob3J0IEhFQURFUl9JRCA9IG5ldyBaaXBTaG9ydCgweDc1NkUpOwotCi0gICAgLyoqCi0gICAgICogU3RhbmRhcmQgVW5peCBzdGF0KDIpIGZpbGUgbW9kZS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtb2RlID0gMDsKLSAgICAvKioKLSAgICAgKiBVc2VyIElELgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgaW50IHVpZCA9IDA7Ci0gICAgLyoqCi0gICAgICogR3JvdXAgSUQuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2lkID0gMDsKLSAgICAvKioKLSAgICAgKiBGaWxlIHRoaXMgZW50cnkgcG9pbnRzIHRvLCBpZiBpdCBpcyBhIHN5bWJvbGljIGxpbmsuCi0gICAgICoKLSAgICAgKiA8cD5lbXB0eSBzdHJpbmcgLSBpZiBlbnRyeSBpcyBub3QgYSBzeW1ib2xpYyBsaW5rLjwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsaW5rID0gIiI7Ci0gICAgLyoqCi0gICAgICogSXMgdGhpcyBhbiBlbnRyeSBmb3IgYSBkaXJlY3Rvcnk/Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpckZsYWcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEluc3RhbmNlIHVzZWQgdG8gY2FsY3VsYXRlIGNoZWNrc3Vtcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwotCi0gICAgcHVibGljIEFzaUV4dHJhRmllbGQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIEhlYWRlci1JRC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwU2hvcnQgZ2V0SGVhZGVySWQoKSB7Ci0gICAgICAgIHJldHVybiBIRUFERVJfSUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVuZ3RoIG9mIHRoZSBleHRyYSBmaWVsZCBpbiB0aGUgbG9jYWwgZmlsZSBkYXRhIC0gd2l0aG91dAotICAgICAqIEhlYWRlci1JRCBvciBsZW5ndGggc3BlY2lmaWVyLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBaaXBTaG9ydCBnZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gbmV3IFppcFNob3J0KCAgNCAgICAgICAgIC8vIENSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMiAgICAgICAgIC8vIE1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDQgICAgICAgICAvLyBTaXpEZXYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDIgICAgICAgICAvLyBVSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDIgICAgICAgICAvLyBHSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldExpbmtlZEZpbGUoKS5nZXRCeXRlcygpLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZWdhdGUgdG8gbG9jYWwgZmlsZSBkYXRhLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBaaXBTaG9ydCBnZXRDZW50cmFsRGlyZWN0b3J5TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgZGF0YSB0byBwdXQgaW50byBsb2NhbCBmaWxlIGRhdGEgLSB3aXRob3V0IEhlYWRlci1JRAotICAgICAqIG9yIGxlbmd0aCBzcGVjaWZpZXIuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRMb2NhbEZpbGVEYXRhRGF0YSgpIHsKLSAgICAgICAgLy8gQ1JDIHdpbGwgYmUgYWRkZWQgbGF0ZXIKLSAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtnZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkuZ2V0VmFsdWUoKSAtIDRdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KChuZXcgWmlwU2hvcnQoZ2V0TW9kZSgpKSkuZ2V0Qnl0ZXMoKSwgMCwgZGF0YSwgMCwgMik7Ci0KLSAgICAgICAgYnl0ZVtdIGxpbmtBcnJheSA9IGdldExpbmtlZEZpbGUoKS5nZXRCeXRlcygpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KChuZXcgWmlwTG9uZyhsaW5rQXJyYXkubGVuZ3RoKSkuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCBkYXRhLCAyLCA0KTsKLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KChuZXcgWmlwU2hvcnQoZ2V0VXNlcklkKCkpKS5nZXRCeXRlcygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCBkYXRhLCA2LCAyKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSgobmV3IFppcFNob3J0KGdldEdyb3VwSWQoKSkpLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgZGF0YSwgOCwgMik7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShsaW5rQXJyYXksIDAsIGRhdGEsIDEwLCBsaW5rQXJyYXkubGVuZ3RoKTsKLQotICAgICAgICBjcmMucmVzZXQoKTsKLSAgICAgICAgY3JjLnVwZGF0ZShkYXRhKTsKLSAgICAgICAgbG9uZyBjaGVja3N1bSA9IGNyYy5nZXRWYWx1ZSgpOwotCi0gICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aCArIDRdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KChuZXcgWmlwTG9uZyhjaGVja3N1bSkpLmdldEJ5dGVzKCksIDAsIHJlc3VsdCwgMCwgNCk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgcmVzdWx0LCA0LCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZWdhdGUgdG8gbG9jYWwgZmlsZSBkYXRhLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0Q2VudHJhbERpcmVjdG9yeURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMb2NhbEZpbGVEYXRhRGF0YSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdXNlciBpZC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VySWQoaW50IHVpZCkgewotICAgICAgICB0aGlzLnVpZCA9IHVpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHVzZXIgaWQuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRVc2VySWQoKSB7Ci0gICAgICAgIHJldHVybiB1aWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBncm91cCBpZC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cElkKGludCBnaWQpIHsKLSAgICAgICAgdGhpcy5naWQgPSBnaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBncm91cCBpZC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEdyb3VwSWQoKSB7Ci0gICAgICAgIHJldHVybiBnaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGVudHJ5IGlzIGEgc3ltYm9saWMgbGluayB0byB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBmaWxlIHRoaXMgZW50cnkgbGlua3MgdG8sIGVtcHR5IFN0cmluZwotICAgICAqICAgICAgICAgICAgIGlmIGl0IGlzIG5vdCBhIHN5bWJvbGljIGxpbmsuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlua2VkRmlsZShTdHJpbmcgbmFtZSkgewotICAgICAgICBsaW5rID0gbmFtZTsKLSAgICAgICAgbW9kZSA9IGdldE1vZGUobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBsaW5rZWQgZmlsZQotICAgICAqCi0gICAgICogQHJldHVybiBuYW1lIG9mIHRoZSBmaWxlIHRoaXMgZW50cnkgbGlua3MgdG8gaWYgaXQgaXMgYQotICAgICAqICAgICAgICAgc3ltYm9saWMgbGluaywgdGhlIGVtcHR5IHN0cmluZyBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMaW5rZWRGaWxlKCkgewotICAgICAgICByZXR1cm4gbGluazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGlzIGVudHJ5IGEgc3ltYm9saWMgbGluaz8KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmsoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5rZWRGaWxlKCkubGVuZ3RoKCkgIT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxlIG1vZGUgb2YgdGhpcyBmaWxlLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgdGhpcy5tb2RlID0gZ2V0TW9kZShtb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxlIG1vZGUgb2YgdGhpcyBmaWxlLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgd2hldGhlciB0aGlzIGVudHJ5IGlzIGEgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShib29sZWFuIGRpckZsYWcpIHsKLSAgICAgICAgdGhpcy5kaXJGbGFnID0gZGlyRmxhZzsKLSAgICAgICAgbW9kZSA9IGdldE1vZGUobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhpcyBlbnRyeSBhIGRpcmVjdG9yeT8KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGRpckZsYWcgJiYgIWlzTGluaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlIGRhdGEgZnJvbSB0aGlzIGFycmF5IGFzIGlmIGl0IHdhcyBpbiBsb2NhbCBmaWxlIGRhdGEuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2VGcm9tTG9jYWxGaWxlRGF0YShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIFppcEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbG9uZyBnaXZlbkNoZWNrc3VtID0gKG5ldyBaaXBMb25nKGRhdGEsIG9mZnNldCkpLmdldFZhbHVlKCk7Ci0gICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtsZW5ndGgtNF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2Zmc2V0KzQsIHRtcCwgMCwgbGVuZ3RoLTQpOwotICAgICAgICBjcmMucmVzZXQoKTsKLSAgICAgICAgY3JjLnVwZGF0ZSh0bXApOwotICAgICAgICBsb25nIHJlYWxDaGVja3N1bSA9IGNyYy5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAoZ2l2ZW5DaGVja3N1bSAhPSByZWFsQ2hlY2tzdW0pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oImJhZCBDUkMgY2hlY2tzdW0gIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBMb25nLnRvSGV4U3RyaW5nKGdpdmVuQ2hlY2tzdW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbnN0ZWFkIG9mICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTG9uZy50b0hleFN0cmluZyhyZWFsQ2hlY2tzdW0pKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IG5ld01vZGUgPSAobmV3IFppcFNob3J0KHRtcCwgMCkpLmdldFZhbHVlKCk7Ci0gICAgICAgIGJ5dGVbXSBsaW5rQXJyYXkgPSBuZXcgYnl0ZVsoaW50KSAobmV3IFppcExvbmcodG1wLCAyKSkuZ2V0VmFsdWUoKV07Ci0gICAgICAgIHVpZCA9IChuZXcgWmlwU2hvcnQodG1wLCA2KSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgZ2lkID0gKG5ldyBaaXBTaG9ydCh0bXAsIDgpKS5nZXRWYWx1ZSgpOwotCi0gICAgICAgIGlmIChsaW5rQXJyYXkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGxpbmsgPSAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAxMCwgbGlua0FycmF5LCAwLCBsaW5rQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgICAgIGxpbmsgPSBuZXcgU3RyaW5nKGxpbmtBcnJheSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RGlyZWN0b3J5KChuZXdNb2RlICYgRElSX0ZMQUcpICE9IDApOwotICAgICAgICBzZXRNb2RlKG5ld01vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmlsZSBtb2RlIGZvciBnaXZlbiBwZXJtaXNzaW9ucyB3aXRoIHRoZSBjb3JyZWN0IGZpbGUgdHlwZS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaW50IHR5cGUgPSBGSUxFX0ZMQUc7Ci0gICAgICAgIGlmIChpc0xpbmsoKSkgewotICAgICAgICAgICAgdHlwZSA9IExJTktfRkxBRzsKLSAgICAgICAgfSBlbHNlIGlmIChpc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0eXBlID0gRElSX0ZMQUc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGUgfCAobW9kZSAmIFBFUk1fTUFTSyk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvRXh0cmFGaWVsZFV0aWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9FeHRyYUZpZWxkVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1ZTk4OC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9FeHRyYUZpZWxkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotCi0vKioKLSAqIFppcEV4dHJhRmllbGQgcmVsYXRlZCBtZXRob2RzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRyYUZpZWxkVXRpbHMgewotCi0gICAgLyoqCi0gICAgICogU3RhdGljIHJlZ2lzdHJ5IG9mIGtub3duIGV4dHJhIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgaW1wbGVtZW50YXRpb25zOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgaW1wbGVtZW50YXRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICByZWdpc3RlcihBc2lFeHRyYUZpZWxkLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIFppcEV4dHJhRmllbGQgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgZ2l2ZW4gY2xhc3MgbXVzdCBoYXZlIGEgbm8tYXJnIGNvbnN0cnVjdG9yIGFuZCBpbXBsZW1lbnQKLSAgICAgKiB0aGUge0BsaW5rIFppcEV4dHJhRmllbGQgWmlwRXh0cmFGaWVsZCBpbnRlcmZhY2V9LjwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoQ2xhc3MgYykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWmlwRXh0cmFGaWVsZCB6ZSA9IChaaXBFeHRyYUZpZWxkKSBjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMucHV0KHplLmdldEhlYWRlcklkKCksIGMpOwotICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2MpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGMgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lc25cJ3QgaW1wbGVtZW50IFppcEV4dHJhRmllbGQiKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYyArICIgaXMgbm90IGEgY29uY3JldGUgY2xhc3MiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYyArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwncyBuby1hcmcgY29uc3RydWN0b3IgaXMgbm90IHB1YmxpYyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3JpYXRlIEV4dHJhRmllbGQsIGZhbGxzIGJhY2sgdG8KLSAgICAgKiB7QGxpbmsgVW5yZWNvZ25pemVkRXh0cmFGaWVsZCBVbnJlY29nbml6ZWRFeHRyYUZpZWxkfS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFppcEV4dHJhRmllbGQgY3JlYXRlRXh0cmFGaWVsZChaaXBTaG9ydCBoZWFkZXJJZCkKLSAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjID0gKENsYXNzKSBpbXBsZW1lbnRhdGlvbnMuZ2V0KGhlYWRlcklkKTsKLSAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChaaXBFeHRyYUZpZWxkKSBjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgVW5yZWNvZ25pemVkRXh0cmFGaWVsZCB1ID0gbmV3IFVucmVjb2duaXplZEV4dHJhRmllbGQoKTsKLSAgICAgICAgdS5zZXRIZWFkZXJJZChoZWFkZXJJZCk7Ci0gICAgICAgIHJldHVybiB1OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwbGl0IHRoZSBhcnJheSBpbnRvIEV4dHJhRmllbGRzIGFuZCBwb3B1bGF0ZSB0aGVtIHdpdGggdGhlCi0gICAgICogZ2l2ZSBkYXRhLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWmlwRXh0cmFGaWVsZFtdIHBhcnNlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgWmlwRXhjZXB0aW9uIHsKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIHdoaWxlIChzdGFydCA8PSBkYXRhLmxlbmd0aC00KSB7Ci0gICAgICAgICAgICBaaXBTaG9ydCBoZWFkZXJJZCA9IG5ldyBaaXBTaG9ydChkYXRhLCBzdGFydCk7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gKG5ldyBaaXBTaG9ydChkYXRhLCBzdGFydCsyKSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChzdGFydCs0K2xlbmd0aCA+IGRhdGEubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiZGF0YSBzdGFydGluZyBhdCAiK3N0YXJ0KyIgaXMgaW4gdW5rbm93biBmb3JtYXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWmlwRXh0cmFGaWVsZCB6ZSA9IGNyZWF0ZUV4dHJhRmllbGQoaGVhZGVySWQpOwotICAgICAgICAgICAgICAgIHplLnBhcnNlRnJvbUxvY2FsRmlsZURhdGEoZGF0YSwgc3RhcnQrNCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB2LmFkZEVsZW1lbnQoemUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oaWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihpYWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXJ0ICs9IChsZW5ndGgrNCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXJ0ICE9IGRhdGEubGVuZ3RoKSB7IC8vIGFycmF5IG5vdCBleGhhdXN0ZWQKLSAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oImRhdGEgc3RhcnRpbmcgYXQgIitzdGFydCsiIGlzIGluIHVua25vd24gZm9ybWF0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFppcEV4dHJhRmllbGRbXSByZXN1bHQgPSBuZXcgWmlwRXh0cmFGaWVsZFt2LnNpemUoKV07Ci0gICAgICAgIHYuY29weUludG8ocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZXMgdGhlIGxvY2FsIGZpbGUgZGF0YSBmaWVsZHMgb2YgdGhlIGdpdmVuIFppcEV4dHJhRmllbGRzLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIG1lcmdlTG9jYWxGaWxlRGF0YURhdGEoWmlwRXh0cmFGaWVsZFtdIGRhdGEpIHsKLSAgICAgICAgaW50IHN1bSA9IDQqZGF0YS5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzdW0gKz0gZGF0YVtpXS5nZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbc3VtXTsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YVtpXS5nZXRIZWFkZXJJZCgpLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJlc3VsdCwgc3RhcnQsIDIpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhW2ldLmdldExvY2FsRmlsZURhdGFMZW5ndGgoKS5nZXRCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCByZXN1bHQsIHN0YXJ0KzIsIDIpOwotICAgICAgICAgICAgYnl0ZVtdIGxvY2FsID0gZGF0YVtpXS5nZXRMb2NhbEZpbGVEYXRhRGF0YSgpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsb2NhbCwgMCwgcmVzdWx0LCBzdGFydCs0LCBsb2NhbC5sZW5ndGgpOwotICAgICAgICAgICAgc3RhcnQgKz0gKGxvY2FsLmxlbmd0aCs0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1lcmdlcyB0aGUgY2VudHJhbCBkaXJlY3RvcnkgZmllbGRzIG9mIHRoZSBnaXZlbiBaaXBFeHRyYUZpZWxkcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBtZXJnZUNlbnRyYWxEaXJlY3RvcnlEYXRhKFppcEV4dHJhRmllbGRbXSBkYXRhKSB7Ci0gICAgICAgIGludCBzdW0gPSA0KmRhdGEubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc3VtICs9IGRhdGFbaV0uZ2V0Q2VudHJhbERpcmVjdG9yeUxlbmd0aCgpLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3N1bV07Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGFbaV0uZ2V0SGVhZGVySWQoKS5nZXRCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCByZXN1bHQsIHN0YXJ0LCAyKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YVtpXS5nZXRDZW50cmFsRGlyZWN0b3J5TGVuZ3RoKCkuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcmVzdWx0LCBzdGFydCsyLCAyKTsKLSAgICAgICAgICAgIGJ5dGVbXSBsb2NhbCA9IGRhdGFbaV0uZ2V0Q2VudHJhbERpcmVjdG9yeURhdGEoKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobG9jYWwsIDAsIHJlc3VsdCwgc3RhcnQrNCwgbG9jYWwubGVuZ3RoKTsKLSAgICAgICAgICAgIHN0YXJ0ICs9IChsb2NhbC5sZW5ndGgrNCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbml4U3RhdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5peFN0YXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwNDcwMC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbml4U3RhdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7Ci0KLS8qKgotICogQ29uc3RhbnRzIGZyb20gc3RhdC5oIG9uIFVuaXggc3lzdGVtcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9InN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGludGVyZmFjZSBVbml4U3RhdCB7Ci0KLSAgICAvKioKLSAgICAgKiBCaXRzIHVzZWQgZm9yIHBlcm1pc3Npb25zIChhbmQgc3RpY2t5IGJpdCkKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJNX01BU0sgPSAgICAgICAgICAgMDc3Nzc7Ci0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHN5bWJvbGljIGxpbmtzLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTktfRkxBRyA9ICAgICAgICAgMDEyMDAwMDsKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgcGxhaW4gZmlsZXMuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9GTEFHID0gICAgICAgICAwMTAwMDAwOwotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBkaXJlY3Rvcmllcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfRkxBRyA9ICAgICAgICAgICAwNDAwMDA7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHNvbWV3aGF0IGFyYml0cmFyeSBjaG9pY2VzIHRoYXQgYXJlIHF1aXRlIGNvbW1vbiBmb3Igc2hhcmVkIAotICAgIC8vIGluc3RhbGxhdGlvbnMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBwZXJtaXNzaW9ucyBmb3Igc3ltYm9saWMgbGlua3MuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9MSU5LX1BFUk0gPSAgICAwNzc3OwotICAgIC8qKgotICAgICAqIERlZmF1bHQgcGVybWlzc2lvbnMgZm9yIGRpcmVjdG9yaWVzLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRElSX1BFUk0gPSAgICAgMDc1NTsKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IHBlcm1pc3Npb25zIGZvciBwbGFpbiBmaWxlcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZJTEVfUEVSTSA9ICAgIDA2NDQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VbnJlY29nbml6ZWRFeHRyYUZpZWxkLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VbnJlY29nbml6ZWRFeHRyYUZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNWMzNzEuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5yZWNvZ25pemVkRXh0cmFGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7Ci0KLS8qKgotICogU2ltcGxlIHBsYWNlaG9sZGVyIGZvciBhbGwgdGhvc2UgZXh0cmEgZmllbGRzIHdlIGRvbid0IHdhbnQgdG8gZGVhbAotICogd2l0aC4KLSAqCi0gKiA8cD5Bc3N1bWVzIGxvY2FsIGZpbGUgZGF0YSBhbmQgY2VudHJhbCBkaXJlY3RvcnkgZW50cmllcyBhcmUKLSAqIGlkZW50aWNhbCAtIHVubGVzcyB0b2xkIHRoZSBvcHBvc2l0ZS48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnJlY29nbml6ZWRFeHRyYUZpZWxkIGltcGxlbWVudHMgWmlwRXh0cmFGaWVsZCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSGVhZGVyLUlELgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgWmlwU2hvcnQgaGVhZGVySWQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJJZChaaXBTaG9ydCBoZWFkZXJJZCkgewotICAgICAgICB0aGlzLmhlYWRlcklkID0gaGVhZGVySWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFppcFNob3J0IGdldEhlYWRlcklkKCkge3JldHVybiBoZWFkZXJJZDt9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYSBmaWVsZCBkYXRhIGluIGxvY2FsIGZpbGUgZGF0YSAtIHdpdGhvdXQKLSAgICAgKiBIZWFkZXItSUQgb3IgbGVuZ3RoIHNwZWNpZmllci4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBsb2NhbERhdGE7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbEZpbGVEYXRhRGF0YShieXRlW10gZGF0YSkgewotICAgICAgICBsb2NhbERhdGEgPSBkYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyBaaXBTaG9ydCBnZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gbmV3IFppcFNob3J0KGxvY2FsRGF0YS5sZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0TG9jYWxGaWxlRGF0YURhdGEoKSB7cmV0dXJuIGxvY2FsRGF0YTt9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYSBmaWVsZCBkYXRhIGluIGNlbnRyYWwgZGlyZWN0b3J5IC0gd2l0aG91dAotICAgICAqIEhlYWRlci1JRCBvciBsZW5ndGggc3BlY2lmaWVyLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIGNlbnRyYWxEYXRhOwotCi0gICAgcHVibGljIHZvaWQgc2V0Q2VudHJhbERpcmVjdG9yeURhdGEoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgY2VudHJhbERhdGEgPSBkYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyBaaXBTaG9ydCBnZXRDZW50cmFsRGlyZWN0b3J5TGVuZ3RoKCkgewotICAgICAgICBpZiAoY2VudHJhbERhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBaaXBTaG9ydChjZW50cmFsRGF0YS5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRDZW50cmFsRGlyZWN0b3J5RGF0YSgpIHsKLSAgICAgICAgaWYgKGNlbnRyYWxEYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjZW50cmFsRGF0YTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0TG9jYWxGaWxlRGF0YURhdGEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtsZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCwgdG1wLCAwLCBsZW5ndGgpOwotICAgICAgICBzZXRMb2NhbEZpbGVEYXRhRGF0YSh0bXApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVudHJ5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWI2YTQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci0KLS8qKgotICogRXh0ZW5zaW9uIHRoYXQgYWRkcyBiZXR0ZXIgaGFuZGxpbmcgb2YgZXh0cmEgZmllbGRzIGFuZCBwcm92aWRlcwotICogYWNjZXNzIHRvIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ic3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgWmlwRW50cnkgZXh0ZW5kcyBqYXZhLnV0aWwuemlwLlppcEVudHJ5IHsKLQotICAgIHByaXZhdGUgaW50IGludGVybmFsQXR0cmlidXRlcyA9IDA7Ci0gICAgcHJpdmF0ZSBsb25nIGV4dGVybmFsQXR0cmlidXRlcyA9IDA7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZXh0cmFGaWVsZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHppcCBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwRW50cnkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB6aXAgZW50cnkgd2l0aCBmaWVsZHMgdGFrZW4gZnJvbSB0aGUgc3BlY2lmaWVkIHppcCBlbnRyeS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwRW50cnkoamF2YS51dGlsLnppcC5aaXBFbnRyeSBlbnRyeSkgdGhyb3dzIFppcEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFJFVklTSVQ6IGNhbGwgc3VwZXIoZW50cnkpIGluc3RlYWQgb2YgdGhpcyBzdHVmZiBpbiBBbnQyLAotICAgICAgICAgKiAgICAgICAgICAiY29weSBjb25zdHJ1Y3RvciIgaGFzIG5vdCBiZWVuIGF2YWlsYWJsZSBpbiBKREsgMS4xCi0gICAgICAgICAqLwotICAgICAgICBzdXBlcihlbnRyeS5nZXROYW1lKCkpOwotCi0gICAgICAgIHNldENvbW1lbnQoZW50cnkuZ2V0Q29tbWVudCgpKTsKLSAgICAgICAgc2V0TWV0aG9kKGVudHJ5LmdldE1ldGhvZCgpKTsKLSAgICAgICAgc2V0VGltZShlbnRyeS5nZXRUaW1lKCkpOwotCi0gICAgICAgIGxvbmcgc2l6ZSA9IGVudHJ5LmdldFNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICBzZXRTaXplKHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgY1NpemUgPSBlbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpOwotICAgICAgICBpZiAoY1NpemUgPiAwKSB7Ci0gICAgICAgICAgICBzZXRDb21wclNpemUoY1NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgY3JjID0gZW50cnkuZ2V0Q3JjKCk7Ci0gICAgICAgIGlmIChjcmMgPiAwKSB7Ci0gICAgICAgICAgICBzZXRDcmMoY3JjKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYnl0ZVtdIGV4dHJhID0gZW50cnkuZ2V0RXh0cmEoKTsKLSAgICAgICAgaWYgKGV4dHJhICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldEV4dHJhRmllbGRzKEV4dHJhRmllbGRVdGlscy5wYXJzZShleHRyYSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZXMgZXh0cmEgZGF0YSB0byBhbiBlbXB0eSBieXRlIGFycmF5Ci0gICAgICAgICAgICBzZXRFeHRyYSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB6aXAgZW50cnkgd2l0aCBmaWVsZHMgdGFrZW4gZnJvbSB0aGUgc3BlY2lmaWVkIHppcCBlbnRyeS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwRW50cnkoWmlwRW50cnkgZW50cnkpIHRocm93cyBaaXBFeGNlcHRpb24gewotICAgICAgICB0aGlzKChqYXZhLnV0aWwuemlwLlppcEVudHJ5KSBlbnRyeSk7Ci0gICAgICAgIHNldEludGVybmFsQXR0cmlidXRlcyhlbnRyeS5nZXRJbnRlcm5hbEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIHNldEV4dGVybmFsQXR0cmlidXRlcyhlbnRyeS5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIHNldEV4dHJhRmllbGRzKGVudHJ5LmdldEV4dHJhRmllbGRzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJ3cml0ZSBjbG9uZQotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIFppcEVudHJ5IGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZSA9IG5ldyBaaXBFbnRyeSgoamF2YS51dGlsLnppcC5aaXBFbnRyeSkgc3VwZXIuY2xvbmUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBleHRyYSBkYXRhIGlzIGluIGNvcnJlY3QgZm9ybWF0Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBlLnNldEludGVybmFsQXR0cmlidXRlcyhnZXRJbnRlcm5hbEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIGUuc2V0RXh0ZXJuYWxBdHRyaWJ1dGVzKGdldEV4dGVybmFsQXR0cmlidXRlcygpKTsKLSAgICAgICAgZS5zZXRFeHRyYUZpZWxkcyhnZXRFeHRyYUZpZWxkcygpKTsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnRlcm5hbEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcm5hbEF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEludGVybmFsQXR0cmlidXRlcyhpbnQgdmFsdWUpIHsKLSAgICAgICAgaW50ZXJuYWxBdHRyaWJ1dGVzID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0RXh0ZXJuYWxBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gZXh0ZXJuYWxBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEF0dHJpYnV0ZXMobG9uZyB2YWx1ZSkgewotICAgICAgICBleHRlcm5hbEF0dHJpYnV0ZXMgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyBhbGwgY3VycmVudGx5IGF0dGFjaGVkIGV4dHJhIGZpZWxkcyB3aXRoIHRoZSBuZXcgYXJyYXkuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFGaWVsZHMoWmlwRXh0cmFGaWVsZFtdIGZpZWxkcykgewotICAgICAgICBleHRyYUZpZWxkcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBleHRyYUZpZWxkcy5hZGRFbGVtZW50KGZpZWxkc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RXh0cmEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgZXh0cmEgZmllbGRzLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBaaXBFeHRyYUZpZWxkW10gZ2V0RXh0cmFGaWVsZHMoKSB7Ci0gICAgICAgIFppcEV4dHJhRmllbGRbXSByZXN1bHQgPSBuZXcgWmlwRXh0cmFGaWVsZFtleHRyYUZpZWxkcy5zaXplKCldOwotICAgICAgICBleHRyYUZpZWxkcy5jb3B5SW50byhyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZXh0cmEgZmllbGRzIC0gcmVwbGFjaW5nIGFuIGFscmVhZHkgcHJlc2VudCBleHRyYSBmaWVsZAotICAgICAqIG9mIHRoZSBzYW1lIHR5cGUuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXh0cmFGaWVsZChaaXBFeHRyYUZpZWxkIHplKSB7Ci0gICAgICAgIFppcFNob3J0IHR5cGUgPSB6ZS5nZXRIZWFkZXJJZCgpOwotICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyAhZG9uZSAmJiBpPGV4dHJhRmllbGRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKChaaXBFeHRyYUZpZWxkKSBleHRyYUZpZWxkcy5lbGVtZW50QXQoaSkpLmdldEhlYWRlcklkKCkuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFGaWVsZHMuc2V0RWxlbWVudEF0KHplLCBpKTsKLSAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgIGV4dHJhRmllbGRzLmFkZEVsZW1lbnQoemUpOwotICAgICAgICB9Ci0gICAgICAgIHNldEV4dHJhKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFuIGV4dHJhIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVFeHRyYUZpZWxkKFppcFNob3J0IHR5cGUpIHsKLSAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgIWRvbmUgJiYgaTxleHRyYUZpZWxkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKCgoWmlwRXh0cmFGaWVsZCkgZXh0cmFGaWVsZHMuZWxlbWVudEF0KGkpKS5nZXRIZWFkZXJJZCgpLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgIGV4dHJhRmllbGRzLnJlbW92ZUVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHNldEV4dHJhKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGFuIEV4Y2VwdGlvbiBpZiBleHRyYSBkYXRhIGNhbm5vdCBiZSBwYXJzZWQgaW50byBleHRyYSBmaWVsZHMuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmEoYnl0ZVtdIGV4dHJhKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRFeHRyYUZpZWxkcyhFeHRyYUZpZWxkVXRpbHMucGFyc2UoZXh0cmEpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVuZm9ydHVuYXRlbHkge0BsaW5rIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtCi0gICAgICogamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW19IHNlZW1zIHRvIGFjY2VzcyB0aGUgZXh0cmEgZGF0YQotICAgICAqIGRpcmVjdGx5LCBzbyBvdmVycmlkaW5nIGdldEV4dHJhIGRvZXNuJ3QgaGVscCAtIHdlIG5lZWQgdG8KLSAgICAgKiBtb2RpZnkgc3VwZXIncyBkYXRhIGRpcmVjdGx5LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEV4dHJhKCkgewotICAgICAgICBzdXBlci5zZXRFeHRyYShFeHRyYUZpZWxkVXRpbHMubWVyZ2VMb2NhbEZpbGVEYXRhRGF0YShnZXRFeHRyYUZpZWxkcygpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBleHRyYSBkYXRhIGZvciB0aGUgbG9jYWwgZmlsZSBkYXRhLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0TG9jYWxGaWxlRGF0YUV4dHJhKCkgewotICAgICAgICBieXRlW10gZXh0cmEgPSBnZXRFeHRyYSgpOwotICAgICAgICByZXR1cm4gZXh0cmEgIT0gbnVsbCA/IGV4dHJhIDogbmV3IGJ5dGVbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBleHRyYSBkYXRhIGZvciB0aGUgY2VudHJhbCBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRDZW50cmFsRGlyZWN0b3J5RXh0cmEoKSB7Ci0gICAgICAgIHJldHVybiBFeHRyYUZpZWxkVXRpbHMubWVyZ2VDZW50cmFsRGlyZWN0b3J5RGF0YShnZXRFeHRyYUZpZWxkcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZm9yIEpESyAxLjEgPC0+IDEuMiBpbmNvbXBhdGliaWxpdHkuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4yCi0gICAgICovCi0gICAgcHJpdmF0ZSBMb25nIGNvbXByZXNzZWRTaXplID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIE1ha2UgdGhpcyBjbGFzcyB3b3JrIGluIEpESyAxLjEgbGlrZSBhIDEuMiBjbGFzcy4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgZWl0aGVyIHN0b3JlcyB0aGUgc2l6ZSBmb3IgbGF0ZXIgdXNhZ2Ugb3IgaW52b2tlcwotICAgICAqIHNldENvbXByZXNzZWRTaXplIHZpYSByZWZsZWN0aW9uLjwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wclNpemUobG9uZyBzaXplKSB7Ci0gICAgICAgIGlmIChoYXZlU2V0Q29tcHJlc3NlZFNpemUoKSkgewotICAgICAgICAgICAgcGVyZm9ybVNldENvbXByZXNzZWRTaXplKHRoaXMsIHNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29tcHJlc3NlZFNpemUgPSBuZXcgTG9uZyhzaXplKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRvIG1ha2UgdGhpcyBjbGFzcyB3b3JrIGluIEpESyAxLjEgbGlrZSBhIDEuMiBjbGFzcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb21wcmVzc2VkU2l6ZSgpIHsKLSAgICAgICAgaWYgKGNvbXByZXNzZWRTaXplICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGhhcyBiZWVuIHNldCBleHBsaWNpdGx5IGFuZCB3ZSBhcmUgcnVubmluZyBpbiBhIDEuMSBWTQotICAgICAgICAgICAgcmV0dXJuIGNvbXByZXNzZWRTaXplLmxvbmdWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRDb21wcmVzc2VkU2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBmb3IgSkRLIDEuMQotICAgICAqCi0gICAgICogQHNpbmNlIDEuMgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBzZXRDb21wcmVzc2VkU2l6ZU1ldGhvZCA9IG51bGw7Ci0gICAgLyoqCi0gICAgICogSGVscGVyIGZvciBKREsgMS4xCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4yCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvY2tSZWZsZWN0aW9uID0gbmV3IE9iamVjdCgpOwotICAgIC8qKgotICAgICAqIEhlbHBlciBmb3IgSkRLIDEuMQotICAgICAqCi0gICAgICogQHNpbmNlIDEuMgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJpZWRUb0dldE1ldGhvZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQXJlIHdlIHJ1bm5pbmcgSkRLIDEuMiBvciBoaWdoZXI/Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMS4yCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXZlU2V0Q29tcHJlc3NlZFNpemUoKSB7Ci0gICAgICAgIGNoZWNrU0NTKCk7Ci0gICAgICAgIHJldHVybiBzZXRDb21wcmVzc2VkU2l6ZU1ldGhvZCAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZSBzZXRDb21wcmVzc2VkU2l6ZSB2aWEgcmVmbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBlcmZvcm1TZXRDb21wcmVzc2VkU2l6ZShaaXBFbnRyeSB6ZSwgbG9uZyBzaXplKSB7Ci0gICAgICAgIExvbmdbXSBzID0ge25ldyBMb25nKHNpemUpfTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldENvbXByZXNzZWRTaXplTWV0aG9kLmludm9rZSh6ZSwgcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgbmVzdGVkID0gaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbiBzZXR0aW5nIHRoZSBjb21wcmVzc2VkIHNpemUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib2YgIiArIHplICsgIjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXN0ZWQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIG90aGVyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uIHNldHRpbmcgdGhlIGNvbXByZXNzZWQgc2l6ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvZiAiICsgemUgKyAiOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG90aGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnkgdG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBzZXRDb21wcmVzc2VkU2l6ZSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4yCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1NDUygpIHsKLSAgICAgICAgaWYgKCF0cmllZFRvR2V0TWV0aG9kKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2tSZWZsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdHJpZWRUb0dldE1ldGhvZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29tcHJlc3NlZFNpemVNZXRob2QgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwRW50cnkuY2xhc3MuZ2V0TWV0aG9kKCJzZXRDb21wcmVzc2VkU2l6ZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge0xvbmcuVFlQRX0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc2UpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEV4dHJhRmllbGQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEV4dHJhRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0ZDU1Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFeHRyYUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKLQotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotCi0vKioKLSAqIEdlbmVyYWwgZm9ybWF0IG9mIGV4dHJhIGZpZWxkIGRhdGEuCi0gKgotICogPHA+RXh0cmEgZmllbGRzIHVzdWFsbHkgYXBwZWFyIHR3aWNlIHBlciBmaWxlLCBvbmNlIGluIHRoZSBsb2NhbAotICogZmlsZSBkYXRhIGFuZCBvbmNlIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeS4gIFVzdWFsbHkgdGhleSBhcmUgdGhlCi0gKiBzYW1lLCBidXQgdGhleSBkb24ndCBoYXZlIHRvIGJlLiAge0BsaW5rCi0gKiBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbSBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbX0gd2lsbAotICogb25seSB1c2UgdGhlIGxvY2FsIGZpbGUgZGF0YSBpbiBib3RoIHBsYWNlcy48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWmlwRXh0cmFGaWVsZCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSGVhZGVyLUlELgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBaaXBTaG9ydCBnZXRIZWFkZXJJZCgpOwotCi0gICAgLyoqCi0gICAgICogTGVuZ3RoIG9mIHRoZSBleHRyYSBmaWVsZCBpbiB0aGUgbG9jYWwgZmlsZSBkYXRhIC0gd2l0aG91dAotICAgICAqIEhlYWRlci1JRCBvciBsZW5ndGggc3BlY2lmaWVyLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBaaXBTaG9ydCBnZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBMZW5ndGggb2YgdGhlIGV4dHJhIGZpZWxkIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAtIHdpdGhvdXQKLSAgICAgKiBIZWFkZXItSUQgb3IgbGVuZ3RoIHNwZWNpZmllci4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwU2hvcnQgZ2V0Q2VudHJhbERpcmVjdG9yeUxlbmd0aCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBkYXRhIHRvIHB1dCBpbnRvIGxvY2FsIGZpbGUgZGF0YSAtIHdpdGhvdXQgSGVhZGVyLUlECi0gICAgICogb3IgbGVuZ3RoIHNwZWNpZmllci4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIGdldExvY2FsRmlsZURhdGFEYXRhKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGRhdGEgdG8gcHV0IGNlbnRyYWwgZGlyZWN0b3J5IC0gd2l0aG91dCBIZWFkZXItSUQgb3IKLSAgICAgKiBsZW5ndGggc3BlY2lmaWVyLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0Q2VudHJhbERpcmVjdG9yeURhdGEoKTsKLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlIGRhdGEgZnJvbSB0aGlzIGFycmF5IGFzIGlmIGl0IHdhcyBpbiBsb2NhbCBmaWxlIGRhdGEuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2VGcm9tTG9jYWxGaWxlRGF0YShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIFppcEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcExvbmcuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcExvbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1YmYwMy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIGZvdXIgYnl0ZSBpbnRlZ2VyIHdpdGggY29udmVyc2lvbgotICogcnVsZXMgZm9yIHRoZSBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgb2YgWklQIGZpbGVzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFppcExvbmcgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCi0gICAgcHJpdmF0ZSBsb25nIHZhbHVlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYSBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIFppcExvbmcobG9uZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYnl0ZXMuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIFppcExvbmcgKGJ5dGVbXSBieXRlcykgewotICAgICAgICB0aGlzKGJ5dGVzLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSB0aGUgZm91ciBieXRlcyBzdGFydGluZyBhdCBvZmZzZXQuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIFppcExvbmcgKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCkgewotICAgICAgICB2YWx1ZSA9IChieXRlc1tvZmZzZXQrM10gPDwgMjQpICYgMHhGRjAwMDAwMGw7Ci0gICAgICAgIHZhbHVlICs9IChieXRlc1tvZmZzZXQrMl0gPDwgMTYpICYgMHhGRjAwMDA7Ci0gICAgICAgIHZhbHVlICs9IChieXRlc1tvZmZzZXQrMV0gPDwgOCkgJiAweEZGMDA7Ci0gICAgICAgIHZhbHVlICs9IChieXRlc1tvZmZzZXRdICYgMHhGRik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHZhbHVlIGFzIHR3byBieXRlcyBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHsKLSAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlWzRdOwotICAgICAgICByZXN1bHRbMF0gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYpKTsKLSAgICAgICAgcmVzdWx0WzFdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDApID4+IDgpOwotICAgICAgICByZXN1bHRbMl0gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMDAwKSA+PiAxNik7Ci0gICAgICAgIHJlc3VsdFszXSA9IChieXRlKSAoKHZhbHVlICYgMHhGRjAwMDAwMGwpID4+IDI0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdmFsdWUgYXMgSmF2YSBpbnQuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSB0byBtYWtlIHR3byBpbnN0YW5jZXMgd2l0aCBzYW1lIHZhbHVlIGVxdWFsLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyA9PSBudWxsIHx8ICEobyBpbnN0YW5jZW9mIFppcExvbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlID09ICgoWmlwTG9uZykgbykuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSB0byBtYWtlIHR3byBpbnN0YW5jZXMgd2l0aCBzYW1lIHZhbHVlIGVxdWFsLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoaW50KSB2YWx1ZTsKLSAgICB9Ci0KLX0vLyBaaXBMb25nCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcE91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODYyMzUyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcE91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtCi0gKiBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbX0gdGhhdCBkb2VzIGhhbmRsZSB0aGUgZXh0ZW5kZWQKLSAqIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBwYWNrYWdlLCBlc3BlY2lhbGx5IGludGVybmFsL2V4dGVybmFsIGZpbGUKLSAqIGF0dHJpYnV0ZXMgYW5kIGV4dHJhIGZpZWxkcyB3aXRoIGRpZmZlcmVudCBsYXlvdXRzIGZvciBsb2NhbCBmaWxlCi0gKiBkYXRhIGFuZCBjZW50cmFsIGRpcmVjdG9yeSBlbnRyaWVzLgotICoKLSAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCB1c2UgYSBEYXRhIERlc2NyaXB0b3IgdG8gc3RvcmUgc2l6ZSBhbmQKLSAqIENSQyBpbmZvcm1hdGlvbiBmb3IgREVGTEFURUQgZW50cmllcywgdGhpcyBtZWFucywgeW91IGRvbid0IG5lZWQgdG8KLSAqIGNhbGN1bGF0ZSB0aGVtIHlvdXJzZWxmLiAgVW5mb3J0dW5hdGVseSB0aGlzIGlzIG5vdCBwb3NzaWJsZSBmb3IKLSAqIHRoZSBTVE9SRUQgbWV0aG9kLCBoZXJlIHNldHRpbmcgdGhlIENSQyBhbmQgdW5jb21wcmVzc2VkIHNpemUKLSAqIGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSB7QGxpbmsgI3B1dE5leHRFbnRyeSBwdXROZXh0RW50cnl9Ci0gKiB3aWxsIGJlIGNhbGxlZC48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBPdXRwdXRTdHJlYW0gZXh0ZW5kcyBEZWZsYXRlck91dHB1dFN0cmVhbSB7Ci0KLSAgICAvKioKLSAgICAgKiBDdXJyZW50IGVudHJ5LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgWmlwRW50cnkgZW50cnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlsZSBjb21tZW50LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSAiIjsKLQotICAgIC8qKgotICAgICAqIENvbXByZXNzaW9uIGxldmVsIGZvciBuZXh0IGVudHJ5LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGxldmVsID0gRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29tcHJlc3Npb24gbWV0aG9kIGZvciBuZXh0IGVudHJ5LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1ldGhvZCA9IERFRkxBVEVEOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiBaaXBFbnRyaWVzIHdyaXR0ZW4gc28gZmFyLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgVmVjdG9yIGVudHJpZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDUkMgaW5zdGFuY2UgdG8gYXZvaWQgcGFyc2luZyBERUZMQVRFRCBkYXRhIHR3aWNlLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb3VudCB0aGUgYnl0ZXMgd3JpdHRlbiB0byBvdXQuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIHdyaXR0ZW4gPSAwOwotCi0gICAgLyoqCi0gICAgICogRGF0YSBmb3IgY3VycmVudCBlbnRyeSBzdGFydGVkIGhlcmUuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIGRhdGFTdGFydCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIFppcExvbmcgY2RPZmZzZXQgPSBuZXcgWmlwTG9uZygwKTsKLQotICAgIC8qKgotICAgICAqIExlbmd0aCBvZiBjZW50cmFsIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIFppcExvbmcgY2RMZW5ndGggPSBuZXcgWmlwTG9uZygwKTsKLQotICAgIC8qKgotICAgICAqIEhlbHBlciwgYSAwIGFzIFppcFNob3J0LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBaRVJPID0gezAsIDB9OwotCi0gICAgLyoqCi0gICAgICogSGVscGVyLCBhIDAgYXMgWmlwTG9uZy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTFpFUk8gPSB7MCwgMCwgMCwgMH07Ci0KLSAgICAvKioKLSAgICAgKiBIb2xkcyB0aGUgb2Zmc2V0cyBvZiB0aGUgTEZIIHN0YXJ0cyBmb3IgZWFjaCBlbnRyeQotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIG9mZnNldHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMgYW5kIHRoZSBmaWxlIGNvbW1lbnQuCi0gICAgICoKLSAgICAgKiA8cD5Gb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgPGEKLSAgICAgKiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvZ3VpZGUvaW50ZXJuYXQvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LgotICAgICAqIERlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLjwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb21wcmVzc2lvbiBtZXRob2QgZm9yIGRlZmxhdGVkIGVudHJpZXMuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGTEFURUQgPSBaaXBFbnRyeS5ERUZMQVRFRDsKLQotICAgIC8qKgotICAgICAqIENvbXByZXNzaW9uIG1ldGhvZCBmb3IgZGVmbGF0ZWQgZW50cmllcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SRUQgPSBaaXBFbnRyeS5TVE9SRUQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFpJUCBPdXRwdXRTdHJlYW0gZmlsdGVyaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICAgICAgc3VwZXIob3V0LCBuZXcgRGVmbGF0ZXIoRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTiwgdHJ1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBhbmQgdGhlIGZpbGUgY29tbWVudC4KLSAgICAgKgotICAgICAqIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uCi0gICAgICogRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9wPgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzIGFuZCB0aGUgZmlsZSBjb21tZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBudWxsIGlmIHVzaW5nIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkge3JldHVybiBlbmNvZGluZzt9Ci0KLSAgICAvKgotICAgICAqIEZvdW5kIG91dCBieSBleHBlcmltZW50LCB0aGF0IERlZmxhdGVyT3V0cHV0U3RyZWFtLmNsb3NlKCkKLSAgICAgKiB3aWxsIGNhbGwgZmluaXNoKCkgLSBzbyB3ZSBkb24ndCBuZWVkIHRvIG92ZXJyaWRlIGNsb3NlCi0gICAgICogb3Vyc2VsdmVzLgotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogRmluaXNocyB3cml0aW5nIHRoZSBjb250ZW50cyBhbmQgY2xvc2VzIHRoaXMgYXMgd2VsbCBhcyB0aGUKLSAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjbG9zZUVudHJ5KCk7Ci0gICAgICAgIGNkT2Zmc2V0ID0gbmV3IFppcExvbmcod3JpdHRlbik7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKChaaXBFbnRyeSkgZW50cmllcy5lbGVtZW50QXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIGNkTGVuZ3RoID0gbmV3IFppcExvbmcod3JpdHRlbi1jZE9mZnNldC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgd3JpdGVDZW50cmFsRGlyZWN0b3J5RW5kKCk7Ci0gICAgICAgIG9mZnNldHMuY2xlYXIoKTsKLSAgICAgICAgZW50cmllcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbGwgbmVjZXNzYXJ5IGRhdGEgZm9yIHRoaXMgZW50cnkuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2VFbnRyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHJlYWxDcmMgPSBjcmMuZ2V0VmFsdWUoKTsKLSAgICAgICAgY3JjLnJlc2V0KCk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LmdldE1ldGhvZCgpID09IERFRkxBVEVEKSB7Ci0gICAgICAgICAgICBkZWYuZmluaXNoKCk7Ci0gICAgICAgICAgICB3aGlsZSAoIWRlZi5maW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZGVmbGF0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbnRyeS5zZXRTaXplKGRlZi5nZXRUb3RhbEluKCkpOwotICAgICAgICAgICAgZW50cnkuc2V0Q29tcHJTaXplKGRlZi5nZXRUb3RhbE91dCgpKTsKLSAgICAgICAgICAgIGVudHJ5LnNldENyYyhyZWFsQ3JjKTsKLQotICAgICAgICAgICAgZGVmLnJlc2V0KCk7Ci0KLSAgICAgICAgICAgIHdyaXR0ZW4gKz0gZW50cnkuZ2V0Q29tcHJlc3NlZFNpemUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRDcmMoKSAhPSByZWFsQ3JjKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiYmFkIENSQyBjaGVja3N1bSBmb3IgZW50cnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2VudHJ5LmdldE5hbWUoKSsgIjogIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTG9uZy50b0hleFN0cmluZyhlbnRyeS5nZXRDcmMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbnN0ZWFkIG9mICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExvbmcudG9IZXhTdHJpbmcocmVhbENyYykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0U2l6ZSgpICE9IHdyaXR0ZW4gLSBkYXRhU3RhcnQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJiYWQgc2l6ZSBmb3IgZW50cnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2VudHJ5LmdldE5hbWUoKSsgIjogIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW50cnkuZ2V0U2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW5zdGVhZCBvZiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAod3JpdHRlbiAtIGRhdGFTdGFydCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICB3cml0ZURhdGFEZXNjcmlwdG9yKGVudHJ5KTsKLSAgICAgICAgZW50cnkgPSBudWxsOwotICAgfQotCi0gICAgLyoqCi0gICAgICogQmVnaW4gd3JpdGluZyBuZXh0IGVudHJ5LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dE5leHRFbnRyeShaaXBFbnRyeSB6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2xvc2VFbnRyeSgpOwotCi0gICAgICAgIGVudHJ5ID0gemU7Ci0gICAgICAgIGVudHJpZXMuYWRkRWxlbWVudChlbnRyeSk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LmdldE1ldGhvZCgpID09IC0xKSB7IC8vIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICAgIGVudHJ5LnNldE1ldGhvZChtZXRob2QpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZW50cnkuZ2V0VGltZSgpID09IC0xKSB7IC8vIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICAgIGVudHJ5LnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVudHJ5LmdldE1ldGhvZCgpID09IFNUT1JFRCkgewotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFNpemUoKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oInVuY29tcHJlc3NlZCBzaXplIGlzIHJlcXVpcmVkIGZvciBTVE9SRUQgbWV0aG9kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0Q3JjKCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJjcmMgY2hlY2tzdW0gaXMgcmVxdWlyZWQgZm9yIFNUT1JFRCBtZXRob2QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5LnNldENvbXByU2l6ZShlbnRyeS5nZXRTaXplKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVmLnNldExldmVsKGxldmVsKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHdyaXRlTG9jYWxGaWxlSGVhZGVyKGVudHJ5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZpbGUgY29tbWVudC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7Ci0gICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgZm9yIHN1YnNlcXVlbnQgZW50cmllcy4KLSAgICAgKgotICAgICAqIDxwPkRlZmF1bHQgaXMgRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTi48L3A+Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGV2ZWwoaW50IGxldmVsKSB7Ci0gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIG1ldGhvZCBmb3Igc3Vic2VxdWVudCBlbnRyaWVzLgotICAgICAqCi0gICAgICogPHA+RGVmYXVsdCBpcyBERUZMQVRFRC48L3A+Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKGludCBtZXRob2QpIHsKLSAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGJ5dGVzIHRvIFpJUCBlbnRyeS4KLSAgICAgKgotICAgICAqIDxwPk92ZXJyaWRlIGlzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IFNUT1JFRCBlbnRyaWVzLCBhcyB3ZWxsIGFzCi0gICAgICogY2FsY3VsYXRpb25nIENSQyBhdXRvbWF0aWNhbGx5IGZvciBERUZMQVRFRCBlbnRyaWVzLjwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVudHJ5LmdldE1ldGhvZCgpID09IERFRkxBVEVEKSB7Ci0gICAgICAgICAgICBzdXBlci53cml0ZShiLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoYiwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICAgICAgd3JpdHRlbiArPSBsZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgY3JjLnVwZGF0ZShiLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBWYXJpb3VzIFpJUCBjb25zdGFudHMKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBsb2NhbCBmaWxlIGhlYWRlciBzaWduYXR1cmUKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFppcExvbmcgTEZIX1NJRyA9IG5ldyBaaXBMb25nKDBYMDQwMzRCNTBMKTsKLSAgICAvKioKLSAgICAgKiBkYXRhIGRlc2NyaXB0b3Igc2lnbmF0dXJlCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBaaXBMb25nIEREX1NJRyA9IG5ldyBaaXBMb25nKDBYMDgwNzRCNTBMKTsKLSAgICAvKioKLSAgICAgKiBjZW50cmFsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZQotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgWmlwTG9uZyBDRkhfU0lHID0gbmV3IFppcExvbmcoMFgwMjAxNEI1MEwpOwotICAgIC8qKgotICAgICAqIGVuZCBvZiBjZW50cmFsIGRpciBzaWduYXR1cmUKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFppcExvbmcgRU9DRF9TSUcgPSBuZXcgWmlwTG9uZygwWDA2MDU0QjUwTCk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGxvY2FsIGZpbGUgaGVhZGVyIGVudHJ5Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVMb2NhbEZpbGVIZWFkZXIoWmlwRW50cnkgemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG9mZnNldHMucHV0KHplLCBuZXcgWmlwTG9uZyh3cml0dGVuKSk7Ci0KLSAgICAgICAgb3V0LndyaXRlKExGSF9TSUcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gNDsKLQotICAgICAgICAvLyB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0Ci0gICAgICAgIC8vIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZwotICAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCkgPT0gREVGTEFURUQpIHsKLSAgICAgICAgICAgIC8vIHJlcXVpcmVzIHZlcnNpb24gMiBhcyB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgbGVuZ3RoIGluZm8KLSAgICAgICAgICAgIC8vIGluIHRoZSBkYXRhIGRlc2NyaXB0b3IKLSAgICAgICAgICAgIG91dC53cml0ZSgobmV3IFppcFNob3J0KDIwKSkuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIGJpdDMgc2V0IHRvIHNpZ25hbCwgd2UgdXNlIGEgZGF0YSBkZXNjcmlwdG9yCi0gICAgICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBTaG9ydCg4KSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBTaG9ydCgxMCkpLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgb3V0LndyaXRlKFpFUk8pOwotICAgICAgICB9Ci0gICAgICAgIHdyaXR0ZW4gKz0gNDsKLQotICAgICAgICAvLyBjb21wcmVzc2lvbiBtZXRob2QKLSAgICAgICAgb3V0LndyaXRlKChuZXcgWmlwU2hvcnQoemUuZ2V0TWV0aG9kKCkpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgd3JpdHRlbiArPSAyOwotCi0gICAgICAgIC8vIGxhc3QgbW9kLiB0aW1lIGFuZCBkYXRlCi0gICAgICAgIG91dC53cml0ZSh0b0Rvc1RpbWUobmV3IERhdGUoemUuZ2V0VGltZSgpKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gNDsKLQotICAgICAgICAvLyBDUkMKLSAgICAgICAgLy8gY29tcHJlc3NlZCBsZW5ndGgKLSAgICAgICAgLy8gdW5jb21wcmVzc2VkIGxlbmd0aAotICAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCkgPT0gREVGTEFURUQpIHsKLSAgICAgICAgICAgIG91dC53cml0ZShMWkVSTyk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoTFpFUk8pOwotICAgICAgICAgICAgb3V0LndyaXRlKExaRVJPKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgobmV3IFppcExvbmcoemUuZ2V0Q3JjKCkpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgobmV3IFppcExvbmcoemUuZ2V0U2l6ZSgpKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBMb25nKHplLmdldFNpemUoKSkpLmdldEJ5dGVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXR0ZW4gKz0gMTI7Ci0gICAgICAgIAotICAgICAgICAvLyBmaWxlIG5hbWUgbGVuZ3RoCi0gICAgICAgIGJ5dGVbXSBuYW1lID0gZ2V0Qnl0ZXMoemUuZ2V0TmFtZSgpKTsKLSAgICAgICAgb3V0LndyaXRlKChuZXcgWmlwU2hvcnQobmFtZS5sZW5ndGgpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgd3JpdHRlbiArPSAyOwotICAgICAgICAKLSAgICAgICAgLy8gZXh0cmEgZmllbGQgbGVuZ3RoCi0gICAgICAgIGJ5dGVbXSBleHRyYSA9IHplLmdldExvY2FsRmlsZURhdGFFeHRyYSgpOwotICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBTaG9ydChleHRyYS5sZW5ndGgpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgd3JpdHRlbiArPSAyOwotCi0gICAgICAgIC8vIGZpbGUgbmFtZQotICAgICAgICBvdXQud3JpdGUobmFtZSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gbmFtZS5sZW5ndGg7Ci0KLSAgICAgICAgLy8gZXh0cmEgZmllbGQKLSAgICAgICAgb3V0LndyaXRlKGV4dHJhKTsKLSAgICAgICAgd3JpdHRlbiArPSBleHRyYS5sZW5ndGg7Ci0KLSAgICAgICAgZGF0YVN0YXJ0ID0gd3JpdHRlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGRhdGEgZGVzY3JpcHRvciBlbnRyeQotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRGF0YURlc2NyaXB0b3IoWmlwRW50cnkgemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh6ZS5nZXRNZXRob2QoKSAhPSBERUZMQVRFRCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZShERF9TSUcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIG91dC53cml0ZSgobmV3IFppcExvbmcoZW50cnkuZ2V0Q3JjKCkpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgb3V0LndyaXRlKChuZXcgWmlwTG9uZyhlbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIG91dC53cml0ZSgobmV3IFppcExvbmcoZW50cnkuZ2V0U2l6ZSgpKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gMTY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBjZW50cmFsIGZpbGUgaGVhZGVyIGVudHJ5Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDZW50cmFsRmlsZUhlYWRlcihaaXBFbnRyeSB6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKENGSF9TSUcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gNDsKLQotICAgICAgICAvLyB2ZXJzaW9uIG1hZGUgYnkKLSAgICAgICAgb3V0LndyaXRlKChuZXcgWmlwU2hvcnQoMjApKS5nZXRCeXRlcygpKTsKLSAgICAgICAgd3JpdHRlbiArPSAyOwotCi0gICAgICAgIC8vIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QKLSAgICAgICAgLy8gZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnCi0gICAgICAgIGlmICh6ZS5nZXRNZXRob2QoKSA9PSBERUZMQVRFRCkgewotICAgICAgICAgICAgLy8gcmVxdWlyZXMgdmVyc2lvbiAyIGFzIHdlIGFyZSBnb2luZyB0byBzdG9yZSBsZW5ndGggaW5mbwotICAgICAgICAgICAgLy8gaW4gdGhlIGRhdGEgZGVzY3JpcHRvcgotICAgICAgICAgICAgb3V0LndyaXRlKChuZXcgWmlwU2hvcnQoMjApKS5nZXRCeXRlcygpKTsKLQotICAgICAgICAgICAgLy8gYml0MyBzZXQgdG8gc2lnbmFsLCB3ZSB1c2UgYSBkYXRhIGRlc2NyaXB0b3IKLSAgICAgICAgICAgIG91dC53cml0ZSgobmV3IFppcFNob3J0KDgpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgobmV3IFppcFNob3J0KDEwKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoWkVSTyk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdHRlbiArPSA0OwotCi0gICAgICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZAotICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBTaG9ydCh6ZS5nZXRNZXRob2QoKSkpLmdldEJ5dGVzKCkpOwotICAgICAgICB3cml0dGVuICs9IDI7Ci0KLSAgICAgICAgLy8gbGFzdCBtb2QuIHRpbWUgYW5kIGRhdGUKLSAgICAgICAgb3V0LndyaXRlKHRvRG9zVGltZShuZXcgRGF0ZSh6ZS5nZXRUaW1lKCkpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgd3JpdHRlbiArPSA0OwotCi0gICAgICAgIC8vIENSQwotICAgICAgICAvLyBjb21wcmVzc2VkIGxlbmd0aAotICAgICAgICAvLyB1bmNvbXByZXNzZWQgbGVuZ3RoCi0gICAgICAgIG91dC53cml0ZSgobmV3IFppcExvbmcoemUuZ2V0Q3JjKCkpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgb3V0LndyaXRlKChuZXcgWmlwTG9uZyh6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIG91dC53cml0ZSgobmV3IFppcExvbmcoemUuZ2V0U2l6ZSgpKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gMTI7Ci0gICAgICAgIAotICAgICAgICAvLyBmaWxlIG5hbWUgbGVuZ3RoCi0gICAgICAgIGJ5dGVbXSBuYW1lID0gZ2V0Qnl0ZXMoemUuZ2V0TmFtZSgpKTsKLSAgICAgICAgb3V0LndyaXRlKChuZXcgWmlwU2hvcnQobmFtZS5sZW5ndGgpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgd3JpdHRlbiArPSAyOwotICAgICAgICAKLSAgICAgICAgLy8gZXh0cmEgZmllbGQgbGVuZ3RoCi0gICAgICAgIGJ5dGVbXSBleHRyYSA9IHplLmdldENlbnRyYWxEaXJlY3RvcnlFeHRyYSgpOwotICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBTaG9ydChleHRyYS5sZW5ndGgpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgd3JpdHRlbiArPSAyOwotCi0gICAgICAgIC8vIGZpbGUgY29tbWVudCBsZW5ndGgKLSAgICAgICAgU3RyaW5nIGNvbW0gPSB6ZS5nZXRDb21tZW50KCk7Ci0gICAgICAgIGlmIChjb21tID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbW0gPSAiIjsKLSAgICAgICAgfQotICAgICAgICBieXRlW10gY29tbWVudCA9IGdldEJ5dGVzKGNvbW0pOwotICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBTaG9ydChjb21tZW50Lmxlbmd0aCkpLmdldEJ5dGVzKCkpOwotICAgICAgICB3cml0dGVuICs9IDI7Ci0gICAgICAgIAotICAgICAgICAvLyBkaXNrIG51bWJlciBzdGFydAotICAgICAgICBvdXQud3JpdGUoWkVSTyk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gMjsKLQotICAgICAgICAvLyBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMKLSAgICAgICAgb3V0LndyaXRlKChuZXcgWmlwU2hvcnQoemUuZ2V0SW50ZXJuYWxBdHRyaWJ1dGVzKCkpKS5nZXRCeXRlcygpKTsKLSAgICAgICAgd3JpdHRlbiArPSAyOwotCi0gICAgICAgIC8vIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcwotICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBMb25nKHplLmdldEV4dGVybmFsQXR0cmlidXRlcygpKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gNDsKLQotICAgICAgICAvLyByZWxhdGl2ZSBvZmZzZXQgb2YgTEZICi0gICAgICAgIG91dC53cml0ZSgoKFppcExvbmcpIG9mZnNldHMuZ2V0KHplKSkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gNDsKLQotICAgICAgICAvLyBmaWxlIG5hbWUKLSAgICAgICAgb3V0LndyaXRlKG5hbWUpOwotICAgICAgICB3cml0dGVuICs9IG5hbWUubGVuZ3RoOwotCi0gICAgICAgIC8vIGV4dHJhIGZpZWxkCi0gICAgICAgIG91dC53cml0ZShleHRyYSk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gZXh0cmEubGVuZ3RoOwotCi0gICAgICAgIC8vIGZpbGUgY29tbWVudAotICAgICAgICBvdXQud3JpdGUoY29tbWVudCk7Ci0gICAgICAgIHdyaXR0ZW4gKz0gY29tbWVudC5sZW5ndGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSAmcXVvdDtFbmQgb2YgY2VudHJhbCBkaXIgcmVjb3JkJnF1b3Q7Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDZW50cmFsRGlyZWN0b3J5RW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKEVPQ0RfU0lHLmdldEJ5dGVzKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gZGlzayBudW1iZXJzCi0gICAgICAgIG91dC53cml0ZShaRVJPKTsKLSAgICAgICAgb3V0LndyaXRlKFpFUk8pOwotCi0gICAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzCi0gICAgICAgIGJ5dGVbXSBudW0gPSAobmV3IFppcFNob3J0KGVudHJpZXMuc2l6ZSgpKSkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgb3V0LndyaXRlKG51bSk7Ci0gICAgICAgIG91dC53cml0ZShudW0pOwotCi0gICAgICAgIC8vIGxlbmd0aCBhbmQgbG9jYXRpb24gb2YgQ0QKLSAgICAgICAgb3V0LndyaXRlKGNkTGVuZ3RoLmdldEJ5dGVzKCkpOwotICAgICAgICBvdXQud3JpdGUoY2RPZmZzZXQuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICAgICAgLy8gWklQIGZpbGUgY29tbWVudAotICAgICAgICBieXRlW10gZGF0YSA9IGdldEJ5dGVzKGNvbW1lbnQpOwotICAgICAgICBvdXQud3JpdGUoKG5ldyBaaXBTaG9ydChkYXRhLmxlbmd0aCkpLmdldEJ5dGVzKCkpOwotICAgICAgICBvdXQud3JpdGUoZGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU21hbGxlc3QgZGF0ZS90aW1lIFpJUCBjYW4gaGFuZGxlLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFppcExvbmcgRE9TX1RJTUVfTUlOID0gbmV3IFppcExvbmcoMHgwMDAwMjEwMEwpOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIERhdGUgb2JqZWN0IHRvIGEgRE9TIGRhdGUvdGltZSBmaWVsZC4KLSAgICAgKgotICAgICAqIDxwPlN0b2xlbiBmcm9tIEluZm9aaXAncyA8Y29kZT5maWxlaW8uYzwvY29kZT48L3A+Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBaaXBMb25nIHRvRG9zVGltZShEYXRlIHRpbWUpIHsKLSAgICAgICAgaW50IHllYXIgPSB0aW1lLmdldFllYXIoKSArIDE5MDA7Ci0gICAgICAgIGludCBtb250aCA9IHRpbWUuZ2V0TW9udGgoKSArIDE7Ci0gICAgICAgIGlmICh5ZWFyIDwgMTk4MCkgewotICAgICAgICAgICAgcmV0dXJuIERPU19USU1FX01JTjsKLSAgICAgICAgfQotICAgICAgICBsb25nIHZhbHVlID0gICgoeWVhciAtIDE5ODApIDw8IDI1KQotICAgICAgICAgICAgfCAgICAgICAgIChtb250aCA8PCAyMSkKLSAgICAgICAgICAgIHwgICAgICAgICAodGltZS5nZXREYXRlKCkgPDwgMTYpCi0gICAgICAgICAgICB8ICAgICAgICAgKHRpbWUuZ2V0SG91cnMoKSA8PCAxMSkKLSAgICAgICAgICAgIHwgICAgICAgICAodGltZS5nZXRNaW51dGVzKCkgPDwgNSkKLSAgICAgICAgICAgIHwgICAgICAgICAodGltZS5nZXRTZWNvbmRzKCkgPj4gMSk7Ci0gICAgICAgIAotICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgIHJlc3VsdFswXSA9IChieXRlKSAoKHZhbHVlICYgMHhGRikpOwotICAgICAgICByZXN1bHRbMV0gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMCkgPj4gOCk7Ci0gICAgICAgIHJlc3VsdFsyXSA9IChieXRlKSAoKHZhbHVlICYgMHhGRjAwMDApID4+IDE2KTsKLSAgICAgICAgcmVzdWx0WzNdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMDAwbCkgPj4gMjQpOwotICAgICAgICByZXR1cm4gbmV3IFppcExvbmcocmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgYnl0ZXMgZm9yIHRoZSBnaXZlbiBTdHJpbmcgaW4gdGhlIGVuY29kaW5nIHNldCBmb3IKLSAgICAgKiB0aGlzIFN0cmVhbS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldEJ5dGVzKFN0cmluZyBuYW1lKSB0aHJvd3MgWmlwRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldEJ5dGVzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmdldEJ5dGVzKGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbih1ZWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcFNob3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YWJmOWYuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgdHdvIGJ5dGUgaW50ZWdlciB3aXRoIGNvbnZlcnNpb24KLSAqIHJ1bGVzIGZvciB0aGUgYmlnIGVuZGlhbiBieXRlIG9yZGVyIG9mIFpJUCBmaWxlcy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBTaG9ydCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLSAgICBwcml2YXRlIGludCB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBpbnN0YW5jZSBmcm9tIGEgbnVtYmVyLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBaaXBTaG9ydCAoaW50IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSBieXRlcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwU2hvcnQgKGJ5dGVbXSBieXRlcykgewotICAgICAgICB0aGlzKGJ5dGVzLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nIGF0IG9mZnNldC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwU2hvcnQgKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCkgewotICAgICAgICB2YWx1ZSA9IChieXRlc1tvZmZzZXQrMV0gPDwgOCkgJiAweEZGMDA7Ci0gICAgICAgIHZhbHVlICs9IChieXRlc1tvZmZzZXRdICYgMHhGRik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHZhbHVlIGFzIHR3byBieXRlcyBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHsKLSAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlWzJdOwotICAgICAgICByZXN1bHRbMF0gPSAoYnl0ZSkgKHZhbHVlICYgMHhGRik7Ci0gICAgICAgIHJlc3VsdFsxXSA9IChieXRlKSAoKHZhbHVlICYgMHhGRjAwKSA+PiA4KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdmFsdWUgYXMgSmF2YSBpbnQuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRvIG1ha2UgdHdvIGluc3RhbmNlcyB3aXRoIHNhbWUgdmFsdWUgZXF1YWwuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgWmlwU2hvcnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlID09ICgoWmlwU2hvcnQpIG8pLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gbWFrZSB0d28gaW5zdGFuY2VzIHdpdGggc2FtZSB2YWx1ZSBlcXVhbC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi19Ly8gWmlwU2hvcnQKZGlmZiAtLWdpdCBhL3NyYy9zY3JpcHQvYW50IGIvc3JjL3NjcmlwdC9hbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NWY5MDAuLjAwMDAwMDAKLS0tIGEvc3JjL3NjcmlwdC9hbnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi1pZiBbIC1mICRIT01FLy5hbnRyYyBdIDsgdGhlbiAKLSAgLiAkSE9NRS8uYW50cmMKLWZpCi0KLSMgT1Mgc3BlY2lmaWMgc3VwcG9ydC4gICR2YXIgX211c3RfIGJlIHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KLWN5Z3dpbj1mYWxzZTsKLWRhcndpbj1mYWxzZTsKLWNhc2UgImB1bmFtZWAiIGluCi0gIENZR1dJTiopIGN5Z3dpbj10cnVlIDs7Ci0gIERhcndpbiopIGRhcndpbj10cnVlIDs7Ci1lc2FjCi0KLWlmIFsgLXogIiRBTlRfSE9NRSIgXSA7IHRoZW4KLSAgIyB0cnkgdG8gZmluZCBBTlQKLSAgaWYgWyAtZCAvb3B0L2FudCBdIDsgdGhlbiAKLSAgICBBTlRfSE9NRT0vb3B0L2FudAotICBmaQotCi0gIGlmIFsgLWQgJHtIT01FfS9vcHQvYW50IF0gOyB0aGVuIAotICAgIEFOVF9IT01FPSR7SE9NRX0vb3B0L2FudAotICBmaQotCi0gICMjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBsaW5rIHRvIGFudCdzIGhvbWUKLSAgUFJHPSQwCi0gIHByb2duYW1lPWBiYXNlbmFtZSAkMGAKLSAgCi0gIHdoaWxlIFsgLWggIiRQUkciIF0gOyBkbwotICAgIGxzPWBscyAtbGQgIiRQUkciYAotICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKLSAgICBpZiBleHByICIkbGluayIgOiAnLiovLionID4gL2Rldi9udWxsOyB0aGVuCi0JUFJHPSIkbGluayIKLSAgICBlbHNlCi0JUFJHPSJgZGlybmFtZSAkUFJHYC8kbGluayIKLSAgICBmaQotICBkb25lCi0gIAotICBBTlRfSE9NRT1gZGlybmFtZSAiJFBSRyJgLy4uCi0KLWZpCi0KLSMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAotaWYgJGN5Z3dpbiA7IHRoZW4KLSAgWyAtbiAiJEFOVF9IT01FIiBdICYmCi0gICAgQU5UX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkQU5UX0hPTUUiYAotICBbIC1uICIkSkFWQV9IT01FIiBdICYmCi0gICAgSkFWQV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFfSE9NRSJgCi0gIFsgLW4gIiRDTEFTU1BBVEgiIF0gJiYKLSAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCi1maQotCi1pZiBbIC16ICIkSkFWQUNNRCIgXSA7IHRoZW4gCi0gIGlmIFsgLW4gIiRKQVZBX0hPTUUiICBdIDsgdGhlbgotICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuIAotICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcwotICAgICAgSkFWQUNNRD0kSkFWQV9IT01FL2pyZS9zaC9qYXZhCi0gICAgZWxzZQotICAgICAgSkFWQUNNRD0kSkFWQV9IT01FL2Jpbi9qYXZhCi0gICAgZmkKLSAgZWxzZQotICAgIEpBVkFDTUQ9amF2YQotICBmaQotZmkKLSAKLWlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCi0gIGVjaG8gIkVycm9yOiBKQVZBX0hPTUUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LiIKLSAgZWNobyAiICBXZSBjYW5ub3QgZXhlY3V0ZSAkSkFWQUNNRCIKLSAgZXhpdAotZmkKLQotaWYgWyAtbiAiJENMQVNTUEFUSCIgXSA7IHRoZW4KLSAgTE9DQUxDTEFTU1BBVEg9JENMQVNTUEFUSAotZmkKLQotIyBhZGQgaW4gdGhlIGRlcGVuZGVuY3kgLmphciBmaWxlcwotRElSTElCUz0ke0FOVF9IT01FfS9saWIvKi5qYXIKLWZvciBpIGluICR7RElSTElCU30KLWRvCi0gICAgIyBpZiB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LCB0aGVuIGl0IHdpbGwgcmV0dXJuIHRoZSBpbnB1dCBzdHJpbmcKLSAgICAjIHRoaXMgaXMgc3R1cGlkLCBzbyBjYXNlIGZvciBpdAotICAgIGlmIFsgIiRpIiAhPSAiJHtESVJMSUJTfSIgXSA7IHRoZW4KLSAgICAgIGlmIFsgLXogIiRMT0NBTENMQVNTUEFUSCIgXSA7IHRoZW4KLSAgICAgICAgTE9DQUxDTEFTU1BBVEg9JGkKLSAgICAgIGVsc2UKLSAgICAgICAgTE9DQUxDTEFTU1BBVEg9IiRpIjokTE9DQUxDTEFTU1BBVEgKLSAgICAgIGZpCi0gICAgZmkKLWRvbmUKLQotaWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KLSAgaWYgWyAtZiAiJEpBVkFfSE9NRS9saWIvdG9vbHMuamFyIiBdIDsgdGhlbgotICAgIExPQ0FMQ0xBU1NQQVRIPSRMT0NBTENMQVNTUEFUSDokSkFWQV9IT01FL2xpYi90b29scy5qYXIKLSAgZmkKLQotICBpZiBbIC1mICIkSkFWQV9IT01FL2xpYi9jbGFzc2VzLnppcCIgXSA7IHRoZW4KLSAgICBMT0NBTENMQVNTUEFUSD0kTE9DQUxDTEFTU1BBVEg6JEpBVkFfSE9NRS9saWIvY2xhc3Nlcy56aXAKLSAgZmkKLQotICAjIE9TWCBoYWNrIHRvIG1ha2UgQW50IHdvcmsgd2l0aCBqaWtlcwotICBpZiAkZGFyd2luIDsgdGhlbgotICAgIE9TWEhBQ0s9Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudEpESy9DbGFzc2VzIgotICAgIGlmIFsgLWQgJHtPU1hIQUNLfSBdIDsgdGhlbgotICAgICAgZm9yIGkgaW4gJHtPU1hIQUNLfS8qLmphcgotICAgICAgZG8KLSAgICAgICAgSklLRVNQQVRIPSRKSUtFU1BBVEg6JGkKLSAgICAgIGRvbmUKLSAgICBmaQotICBmaQotCi1lbHNlCi0gIGVjaG8gIldhcm5pbmc6IEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LiIKLSAgZWNobyAiICBJZiBidWlsZCBmYWlscyBiZWNhdXNlIHN1bi4qIGNsYXNzZXMgY291bGQgbm90IGJlIGZvdW5kIgotICBlY2hvICIgIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gIGVjaG8gIiAgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgamF2YS4iCi1maQotCi0jIHN1cHBseSBKSUtFU1BBVEggdG8gQW50IGFzIGppa2VzLmNsYXNzLnBhdGgKLWlmIFsgLW4gIiRKSUtFU1BBVEgiIF0gOyB0aGVuCi0gIGlmIFsgLW4gIiRBTlRfT1BUUyIgXSA7IHRoZW4KLSAgICBBTlRfT1BUUz0iJEFOVF9PUFRTIC1EamlrZXMuY2xhc3MucGF0aD0kSklLRVNQQVRIIgotICBlbHNlCi0gICAgQU5UX09QVFM9LURqaWtlcy5jbGFzcy5wYXRoPSRKSUtFU1BBVEgKLSAgZmkKLWZpCi0KLSMgRm9yIEN5Z3dpbiwgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKLWlmICRjeWd3aW47IHRoZW4KLSAgQU5UX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJEFOVF9IT01FImAKLSAgSkFWQV9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRKQVZBX0hPTUUiYAotICBMT0NBTENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkTE9DQUxDTEFTU1BBVEgiYAotZmkKLQotJEpBVkFDTUQgLWNsYXNzcGF0aCAiJExPQ0FMQ0xBU1NQQVRIIiAtRGFudC5ob21lPSIke0FOVF9IT01FfSIgJEFOVF9PUFRTIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4gIiRAIgpkaWZmIC0tZ2l0IGEvc3JjL3NjcmlwdC9hbnQuYmF0IGIvc3JjL3NjcmlwdC9hbnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MWEyODM1Li4wMDAwMDAwCi0tLSBhL3NyYy9zY3JpcHQvYW50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi1AZWNobyBvZmYKLQotaWYgZXhpc3QgIiVIT01FJVxhbnRyY19wcmUuYmF0IiBjYWxsICIlSE9NRSVcYW50cmNfcHJlLmJhdCIKLQotaWYgbm90ICIlT1MlIj09IldpbmRvd3NfTlQiIGdvdG8gd2luOXhTdGFydAotOndpbk5UU3RhcnQKLUBzZXRsb2NhbAotCi1yZW0gJX5kcDAgaXMgbmFtZSBvZiBjdXJyZW50IHNjcmlwdCB1bmRlciBOVAotc2V0IERFRkFVTFRfQU5UX0hPTUU9JX5kcDAKLQotcmVtIDogb3BlcmF0b3Igd29ya3Mgc2ltaWxhciB0byBtYWtlIDogb3BlcmF0b3IKLXNldCBERUZBVUxUX0FOVF9IT01FPSVERUZBVUxUX0FOVF9IT01FJVwuLgotCi1pZiAiJUFOVF9IT01FJSI9PSIiIHNldCBBTlRfSE9NRT0lREVGQVVMVF9BTlRfSE9NRSUKLXNldCBERUZBVUxUX0FOVF9IT01FPQotCi1yZW0gTmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgdXNpbmcgdGhlIDROVCBzaGVsbC4uLgotaWYgIiVldmFsWzIrMl0iID09ICI0IiBnb3RvIHNldHVwNE5UCi0KLXJlbSBPbiBOVC8ySyBncmFiIGFsbCBhcmd1bWVudHMgYXQgb25jZQotc2V0IEFOVF9DTURfTElORV9BUkdTPSUqCi1nb3RvIGRvbmVTdGFydAotCi06c2V0dXA0TlQKLXNldCBBTlRfQ01EX0xJTkVfQVJHUz0lJAotZ290byBkb25lU3RhcnQKLQotOndpbjl4U3RhcnQKLXJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFRoaXMgbG9vcCBhbGxvd3MgZm9yIGFuIHVubGltaXRlZCBudW1iZXIgb2YgCi1yZW0gYWdydW1lbnRzICh1cCB0byB0aGUgY29tbWFuZCBsaW5lIGxpbWl0LCBhbnl3YXkpLgotCi1zZXQgQU5UX0NNRF9MSU5FX0FSR1M9Ci0KLTpzZXR1cEFyZ3MKLWlmICUxYT09YSBnb3RvIGRvbmVTdGFydAotc2V0IEFOVF9DTURfTElORV9BUkdTPSVBTlRfQ01EX0xJTkVfQVJHUyUgJTEKLXNoaWZ0Ci1nb3RvIHNldHVwQXJncwotCi06ZG9uZVN0YXJ0Ci1yZW0gVGhpcyBsYWJlbCBwcm92aWRlcyBhIHBsYWNlIGZvciB0aGUgYXJndW1lbnQgbGlzdCBsb29wIHRvIGJyZWFrIG91dCAKLXJlbSBhbmQgZm9yIE5UIGhhbmRsaW5nIHRvIHNraXAgdG8uCi0KLXJlbSBmaW5kIEFOVF9IT01FCi1pZiBub3QgIiVBTlRfSE9NRSUiPT0iIiBnb3RvIGNoZWNrSmF2YQotCi1yZW0gY2hlY2sgZm9yIGFudCBpbiBQcm9ncmFtIEZpbGVzIG9uIHN5c3RlbSBkcml2ZQotaWYgbm90IGV4aXN0ICIlU3lzdGVtRHJpdmUlXFByb2dyYW0gRmlsZXNcYW50IiBnb3RvIGNoZWNrU3lzdGVtRHJpdmUKLXNldCBBTlRfSE9NRT0lU3lzdGVtRHJpdmUlXFByb2dyYW0gRmlsZXNcYW50Ci1nb3RvIGNoZWNrSmF2YQotCi06Y2hlY2tTeXN0ZW1Ecml2ZQotcmVtIGNoZWNrIGZvciBhbnQgaW4gcm9vdCBkaXJlY3Rvcnkgb2Ygc3lzdGVtIGRyaXZlCi1pZiBub3QgZXhpc3QgJVN5c3RlbURyaXZlJVxhbnRcbnVsIGdvdG8gY2hlY2tDRHJpdmUKLXNldCBBTlRfSE9NRT0lU3lzdGVtRHJpdmUlXGFudAotZ290byBjaGVja0phdmEKLQotOmNoZWNrQ0RyaXZlCi1yZW0gY2hlY2sgZm9yIGFudCBpbiBDOlxhbnQgZm9yIFdpbjlYIHVzZXJzCi1pZiBub3QgZXhpc3QgQzpcYW50XG51bCBnb3RvIG5vQW50SG9tZQotc2V0IEFOVF9IT01FPUM6XGFudAotZ290byBjaGVja0phdmEKLQotOm5vQW50SG9tZQotZWNobyBBTlRfSE9NRSBpcyBub3Qgc2V0IGFuZCBhbnQgY291bGQgbm90IGJlIGxvY2F0ZWQuIFBsZWFzZSBzZXQgQU5UX0hPTUUuCi1nb3RvIGVuZAotCi06Y2hlY2tKYXZhCi1zZXQgX0pBVkFDTUQ9JUpBVkFDTUQlCi1zZXQgTE9DQUxDTEFTU1BBVEg9JUNMQVNTUEFUSCUKLWZvciAlJWkgaW4gKCIlQU5UX0hPTUUlXGxpYlwqLmphciIpIGRvIGNhbGwgIiVBTlRfSE9NRSVcYmluXGxjcC5iYXQiICUlaQotCi1pZiAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gbm9KYXZhSG9tZQotaWYgIiVfSkFWQUNNRCUiID09ICIiIHNldCBfSkFWQUNNRD0lSkFWQV9IT01FJVxiaW5camF2YQotaWYgZXhpc3QgIiVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIiIGNhbGwgIiVBTlRfSE9NRSVcYmluXGxjcC5iYXQiICVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIKLWlmIGV4aXN0ICIlSkFWQV9IT01FJVxsaWJcY2xhc3Nlcy56aXAiIGNhbGwgIiVBTlRfSE9NRSVcYmluXGxjcC5iYXQiICVKQVZBX0hPTUUlXGxpYlxjbGFzc2VzLnppcAotZ290byBjaGVja0ppa2VzCi0KLTpub0phdmFIb21lCi1pZiAiJV9KQVZBQ01EJSIgPT0gIiIgc2V0IF9KQVZBQ01EPWphdmEKLWVjaG8uCi1lY2hvIFdhcm5pbmc6IEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LgotZWNobyAgIElmIGJ1aWxkIGZhaWxzIGJlY2F1c2Ugc3VuLiogY2xhc3NlcyBjb3VsZCBub3QgYmUgZm91bmQKLWVjaG8gICB5b3Ugd2lsbCBuZWVkIHRvIHNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlCi1lY2hvICAgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgamF2YS4KLWVjaG8uCi0KLTpjaGVja0ppa2VzCi1pZiBub3QgIiVKSUtFU1BBVEglIiA9PSAiIiBnb3RvIHJ1bkFudFdpdGhKaWtlcwotCi06cnVuQW50Ci0iJV9KQVZBQ01EJSIgLWNsYXNzcGF0aCAiJUxPQ0FMQ0xBU1NQQVRIJSIgLURhbnQuaG9tZT0iJUFOVF9IT01FJSIgJUFOVF9PUFRTJSBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluICVBTlRfQ01EX0xJTkVfQVJHUyUKLWdvdG8gZW5kCi0KLTpydW5BbnRXaXRoSmlrZXMKLSIlX0pBVkFDTUQlIiAtY2xhc3NwYXRoICIlTE9DQUxDTEFTU1BBVEglIiAtRGFudC5ob21lPSIlQU5UX0hPTUUlIiAtRGppa2VzLmNsYXNzLnBhdGg9IiVKSUtFU1BBVEglIiAlQU5UX09QVFMlIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4gJUFOVF9DTURfTElORV9BUkdTJQotCi06ZW5kCi1zZXQgTE9DQUxDTEFTU1BBVEg9Ci1zZXQgX0pBVkFDTUQ9Ci1zZXQgQU5UX0NNRF9MSU5FX0FSR1M9Ci0KLWlmIG5vdCAiJU9TJSI9PSJXaW5kb3dzX05UIiBnb3RvIG1haW5FbmQKLTp3aW5OVGVuZAotQGVuZGxvY2FsCi0KLTptYWluRW5kCi1pZiBleGlzdCAiJUhPTUUlXGFudHJjX3Bvc3QuYmF0IiBjYWxsICIlSE9NRSVcYW50cmNfcG9zdC5iYXQiCi0KZGlmZiAtLWdpdCBhL3NyYy9zY3JpcHQvYW50UnVuIGIvc3JjL3NjcmlwdC9hbnRSdW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTE4ZjEuLjAwMDAwMDAKLS0tIGEvc3JjL3NjcmlwdC9hbnRSdW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBBcmdzOiBESVIgY29tbWFuZAotY2QgIiQxIgotQ01EPSIkMiIKLXNoaWZ0Ci1zaGlmdAotCi1leGVjICRDTUQgIiRAIgpkaWZmIC0tZ2l0IGEvc3JjL3NjcmlwdC9hbnRSdW4uYmF0IGIvc3JjL3NjcmlwdC9hbnRSdW4uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTY4OTMyLi4wMDAwMDAwCi0tLSBhL3NyYy9zY3JpcHQvYW50UnVuLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUBlY2hvIG9mZgotCi1yZW0gQ2hhbmdlIGRyaXZlIGFuZCBkaXJlY3RvcnkgdG8gJTEgKFdpbjlYIG9ubHkgZm9yIE5ULzJLIHVzZSAiY2QgL2QiKQotY2QgJTEKLSUxXAotc2V0IEFOVF9SVU5fQ01EPSUyCi1zaGlmdAotc2hpZnQKLQotc2V0IFBBUkFNUz0KLTpsb29wCi1pZiAiIiUxID09ICIiIGdvdG8gcnVuQ29tbWFuZAotc2V0IFBBUkFNUz0lUEFSQU1TJSAlMQotc2hpZnQKLWdvdG8gbG9vcAotCi06cnVuQ29tbWFuZAotcmVtIGVjaG8gJUFOVF9SVU5fQ01EJSAlUEFSQU1TJQotJUFOVF9SVU5fQ01EJSAlUEFSQU1TJQotCmRpZmYgLS1naXQgYS9zcmMvc2NyaXB0L2xjcC5iYXQgYi9zcmMvc2NyaXB0L2xjcC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjN2UyNzYuLjAwMDAwMDAKLS0tIGEvc3JjL3NjcmlwdC9sY3AuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zZXQgX0NMQVNTUEFUSENPTVBPTkVOVD0lMQotOmFyZ0NoZWNrCi1pZiAlMmE9PWEgZ290byBnb3RBbGxBcmdzCi1zaGlmdAotc2V0IF9DTEFTU1BBVEhDT01QT05FTlQ9JV9DTEFTU1BBVEhDT01QT05FTlQlICUxCi1nb3RvIGFyZ0NoZWNrCi06Z290QWxsQXJncwotc2V0IExPQ0FMQ0xBU1NQQVRIPSVfQ0xBU1NQQVRIQ09NUE9ORU5UJTslTE9DQUxDTEFTU1BBVEglCi0KZGlmZiAtLWdpdCBhL3NyYy9zY3JpcHQvcnVuYW50LnBsIGIvc3JjL3NjcmlwdC9ydW5hbnQucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyY2M1MjMuLjAwMDAwMDAKLS0tIGEvc3JjL3NjcmlwdC9ydW5hbnQucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBydW5hbnQucGwKLSMKLSMgd3JhcHBlciBzY3JpcHQgZm9yIGludm9raW5nIGFudCBpbiBhIHBsYXRmb3JtIHdpdGggUGVybCBpbnN0YWxsZWQKLSMgdGhpcyBtYXkgaW5jbHVkZSBjZ2ktYmluIGludm9jYXRpb24sIHdoaWNoIGlzIGNvbnNpZGVyZWQgc29tZXdoYXQgZGFmdC4KLSMgKHNsbzogdGhhdCBzaG91bGQgYmUgYSBzZXBhcmF0ZSBmaWxlIHdoaWNoIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhpcwotIyBhbmQgcmV0dXJucyB0aGUgWE1MIGZvcm1hdHRlZCBvdXRwdXQpCi0jCi0jIHRoZSBjb2RlIGlzIG5vdCB0b3RhbGx5IHBvcnRhYmxlIGR1ZSB0byBjbGFzc3BhdGggYW5kIGRpcmVjdG9yeSBzcGxpdHRpbmcKLSMgaXNzdWVzLiBvb3BzLiAoTkIsIHVzZSBGaWxlOjpTcGVjOjpGdW5jdGlvbnMgIHdpbGwgaGVscCBhbmQgdGhlIGNvZGUgaXMKLSMgc3RydWN0dXJlZCBmb3IgdGhlIGNhdGZpbGUoKSBjYWxsLCBidXQgYmVjYXVzZSBvZiBwZXJsIHZlcnNpb24gZnVubmllcwotIyB0aGUgY29kZSBpcyBub3QgaW5jbHVkZWQuIAotIwotIyBjcmVhdGVkOiAgICAgICAgIDIwMDAtOC0yNAotIyBsYXN0IG1vZGlmaWVkOiAgIDIwMDAtOC0yNAotIyBhdXRob3I6ICAgICAgICAgIFN0ZXZlIExvdWdocmFuIHN0ZXZlX2xAc291cmNlZm9yZ2UubmV0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBBc3N1bXB0aW9uczoKLSMKLSMgLSB0aGUgImphdmEiIGV4ZWN1dGFibGUvc2NyaXB0IGlzIG9uIHRoZSBjb21tYW5kIHBhdGgKLSMgLSBBTlRfSE9NRSBoYXMgYmVlbiBzZXQKLSMgLSB0YXJnZXQgcGxhdGZvcm0gdXNlcyAiOiIgYXMgY2xhc3NwYXRoIHNlcGFyYXRvciBvciBwZXJsIGluZGljYXRlcyBpdCBpcyBkb3Mvd2luMzIKLSMgLSB0YXJnZXQgcGxhdGZvcm0gdXNlcyAiLyIgYXMgZGlyZWN0b3J5IHNlcGFyYXRvci4KLQotI2JlIGZ1c3N5IGFib3V0IHZhcmlhYmxlcwotdXNlIHN0cmljdDsKLQotI3BsYXRmb3JtIHNwZWNpZmljcyAoZGlzYWJsZWQpCi0jdXNlIEZpbGU6OlNwZWM6OkZ1bmN0aW9uczsKLQotI3R1cm4gd2FybmluZ3Mgb24gZHVyaW5nIGRldjsgZ2VuZXJhdGVzIGEgZmV3IHNwdXJpb3VzIHVuaW5pdGlhbGlzZWQgdmFyIGFjY2VzcyB3YXJuaW5ncwotI3VzZSB3YXJuaW5nczsKLQotI2FuZCBzZXQgJGRlYnVnIHRvIDEgdG8gdHVybiBvbiB0cmFjZSBpbmZvCi1teSAkZGVidWc9MDsKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgY2hlY2sgdG8gbWFrZSBzdXJlIGVudmlyb25tZW50IGlzIHNldHVwCi0jCi0KLW15ICRIT01FID0gJEVOVntBTlRfSE9NRX07Ci1pZiAoJEhPTUUgZXEgIiIpCi0gICAgICAgIHsKLSAgICBkaWUgIlxuXG5BTlRfSE9NRSAqTVVTVCogYmUgc2V0IVxuXG4iOwotICAgICAgICB9Ci0KLW15ICRKQVZBQ01EID0gJEVOVntKQVZBQ01EfTsKLSRKQVZBQ01EID0gImphdmEiIGlmICRKQVZBQ01EIGVxICIiOwotCi0jSVNTVUU6IHdoYXQgamF2YSB3YW50cyB0byBzcGxpdCB1cCBjbGFzc3BhdGggdmFyaWVzIGZyb20gcGxhdGZvcm0gdG8gcGxhdGZvcm0gCi0jYW5kIHBlcmwgaXMgbm90IHRvbyBob3QgYXQgaGludGluZyB3aGljaCBib3ggaXQgaXMgb24uCi0jaGVyZSBJIGFzc3VtZSAiOiIgJ2NlcHQgb24gd2luMzIgYW5kIGRvcy4gQWRkIGV4dHJhIHRlc3RzIGhlcmUgYXMgbmVlZGVkLgotbXkgJHM9IjoiOwotaWYoKCReTyBlcSAiTVNXaW4zMiIpIHx8ICgkXk8gZXEgImRvcyIpKQotICAgICAgICB7Ci0gICAgICAgICRzPSI7IjsKLSAgICAgICAgfQotCi0jYnVpbGQgdXAgc3RhbmRhcmQgY2xhc3NwYXRoCi1teSAkbG9jYWxwYXRoPSRFTlZ7Q0xBU1NQQVRIfTsKLWlmICgkbG9jYWxwYXRoIGVxICIiKQotICAgICAgICB7Ci0gICAgICAgIHByaW50ICJ3YXJuaW5nOiBubyBpbml0aWFsIGNsYXNzcGF0aFxuIiBpZiAoJGRlYnVnKTsKLSAgICAgICAgJGxvY2FscGF0aD0iIjsKLSAgICAgICAgfQotCi0jYWRkIGphciBmaWxlcy4gSSBhbSBzdXJlIHRoZXJlIGlzIGEgcGVybCBvbmUgbGluZXIgdG8gZG8gdGhpcy4KLW15ICRqYXJwYXR0ZXJuPSIkSE9NRS9saWIvKi5qYXIiOwotbXkgQGphcmZpbGVzID1nbG9iKCRqYXJwYXR0ZXJuKTsKLXByaW50ICJqYXJmaWxlcz1AamFyZmlsZXNcbiIgaWYgKCRkZWJ1Zyk7Ci1teSAkamFyOwotZm9yZWFjaCAkamFyIChAamFyZmlsZXMgKQotICAgICAgICB7Ci0gICAgICAgICRsb2NhbHBhdGguPSIkcyRqYXIiOwotICAgICAgICB9Ci0KLSNpZiBKYXZhIGhvbWUgaXMgZGVmaW5lZCwgbG9vayBmb3IgdG9vbHMuamFyICYgY2xhc3Nlcy56aXAgYW5kIGFkZCB0byBjbGFzc3BhdGgKLW15ICRKQVZBX0hPTUUgPSAkRU5We0pBVkFfSE9NRX07Ci1pZiAoJEpBVkFfSE9NRSBuZSAiIikKLSAgICAgICAgewotICAgICAgICBteSAkdG9vbHM9IiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphciI7Ci0gICAgICAgIGlmICgtZSAiJHRvb2xzIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJGxvY2FscGF0aCAuPSAiJHMkdG9vbHMiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgbXkgJGNsYXNzZXM9IiRKQVZBX0hPTUUvbGliL2NsYXNzZXMuemlwIjsKLSAgICAgICAgaWYgKC1lICRjbGFzc2VzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkbG9jYWxwYXRoIC49ICIkcyRjbGFzc2VzIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLWVsc2UKLSAgICAgICAgewotICAgIHByaW50ICJcblxuV2FybmluZzogSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuXG4iLgotICAgICAgICAgICAgICAgICJJZiB0aGUgYnVpbGQgZmFpbHMgYmVjYXVzZSBzdW4uKiBjbGFzc2VzIGNvdWxkIG5vdCBiZSBmb3VuZFxuIi4KLSAgICAgICAgICAgICAgICAieW91IHdpbGwgbmVlZCB0byBzZXQgdGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZVxuIi4KLSAgICAgICAgICAgICAgICAidG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgamF2YVxuIjsKLSAgICAgICAgfQotCi0jamlrZXMKLW15IEBBTlRfT1BUUz1zcGxpdCAkRU5We0FOVF9PUFRTfTsKLWlmKCRFTlZ7SklLRVNQQVRIfSBuZSAiIikKLSAgICAgICAgewotICAgICAgICBwdXNoIEBBTlRfT1BUUywgIi1EamlrZXMuY2xhc3MucGF0aD0kRU5We0pJS0VTUEFUSH0iOwotICAgICAgICB9Ci0KLSNjb25zdHJ1Y3QgYXJndW1lbnRzIHRvIGphdmEKLQotbXkgQEFSR1M7Ci1wdXNoIEBBUkdTLCAiLWNsYXNzcGF0aCIsICIkbG9jYWxwYXRoIiwgIi1EYW50LmhvbWU9JEhPTUUiOwotcHVzaCBAQVJHUywgQEFOVF9PUFRTOwotcHVzaCBAQVJHUywgIm9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4iOwotcHVzaCBAQVJHUywgQEFSR1Y7Ci0KLXByaW50ICJcbiAkSkFWQUNNRCBAQVJHU1xuXG4iIGlmICgkZGVidWcpOwotCi1teSAkcmV0dXJuVmFsdWUgPSBzeXN0ZW0gJEpBVkFDTUQsIEBBUkdTOwotaWYgKCRyZXR1cm5WYWx1ZSBlcSAwKQotICAgICAgICB7Ci0gICAgICAgIGV4aXQgMDsKLSAgICAgICAgfQotZWxzZQotICAgICAgICB7Ci0gICAgICAgICMgb25seSAwIGFuZCAxIGFyZSB3aWRlbHkgcmVjb2duaXplZCBhcyBleGl0IHZhbHVlcwotICAgICAgICAjIHNvIGNoYW5nZSB0aGUgZXhpdCB2YWx1ZSB0byAxCi0gICAgICAgIGV4aXQgMTsKLSAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3NjcmlwdC9ydW5hbnQucHkgYi9zcmMvc2NyaXB0L3J1bmFudC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMjAwYy4uMDAwMDAwMAotLS0gYS9zcmMvc2NyaXB0L3J1bmFudC5weQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSMhL3Vzci9iaW4vcHl0aG9uCi0iIiIKLQotIHJ1bmFudC5weQotCi0JVGhpcyBzY3JpcHQgaXMgYSB0cmFuc2xhdGlvbiBvZiB0aGUgcnVuYW50LnBsIHdyaXR0ZW4gYnkgU3RldmUgTG91Z2hyYW4uCi0JSXQgcnVucyBhbnQgd2l0aC9vdXQgYXJndW1lbnRzLCBpdCBzaG91bGQgYmUgcXVpdGUgcG9ydGFibGUgKHRoYW5rcyB0bwotCXRoZSBweXRob24gb3MgbGlicmFyeSkKLQlUaGlzIHNjcmlwdCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBQeXRob24yLjAvV2luMksKLQotIGNyZWF0ZWQ6ICAgICAgICAgMjAwMS0wNC0xMQotIGF1dGhvcjogICAgICAgICAgUGllcnJlIERpdHRnZW4gcGllcnJlLmRpdHRnZW5AY3JpbHRlbGVjb20uY29tCi0KLSBBc3N1bXB0aW9uczoKLQotIC0gdGhlICJqYXZhIiBleGVjdXRhYmxlL3NjcmlwdCBpcyBvbiB0aGUgY29tbWFuZCBwYXRoCi0gLSBBTlRfSE9NRSBoYXMgYmVlbiBzZXQKLSIiIgotaW1wb3J0IG9zLCBvcy5wYXRoLCBzdHJpbmcsIHN5cwotCi0jIENoYW5nZSBpdCB0byAxIHRvIGdldCBleHRyYSBkZWJ1ZyBpbmZvcm1hdGlvbgotZGVidWcgPSAwCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGNoZWNrIHRvIG1ha2Ugc3VyZSBlbnZpcm9ubWVudCBpcyBzZXR1cAotIwotaWYgbm90IG9zLmVudmlyb24uaGFzX2tleSgnQU5UX0hPTUUnKToKLQlwcmludCAnXG5cbkFOVF9IT01FICpNVVNUKiBiZSBzZXQhXG5cbicKLQlzeXMuZXhpdCgxKQotZWxzZToKLQlBTlRfSE9NRSA9IG9zLmVudmlyb25bJ0FOVF9IT01FJ10KLQotaWYgbm90IG9zLmVudmlyb24uaGFzX2tleSgnSkFWQUNNRCcpOgotCUpBVkFDTUQgPSAnamF2YScKLWVsc2U6Ci0JSkFWQUNNRCA9IG9zLmVudmlyb25bJ0pBVkFDTUQnXQotCi0jIFNldHMgdGhlIHNlcGFyYXRvciBjaGFyIGZvciBDTEFTU1BBVEgKLVNFUEFSQVRPUiA9ICc6JwotaWYgb3MubmFtZSA9PSAnZG9zJyBvciBvcy5uYW1lID09ICdudCc6Ci0JU0VQQVJBVE9SID0gJzsnCi0KLSMgQnVpbGQgdXAgc3RhbmRhcmQgY2xhc3NwYXRoCi1sb2NhbHBhdGggPSAnJwotaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdDTEFTU1BBVEgnKToKLQlsb2NhbHBhdGggPSBvcy5lbnZpcm9uWydDTEFTU1BBVEgnXQotZWxzZToKLQlpZiBkZWJ1ZzoKLQkJcHJpbnQgJ1dhcm5pbmc6IG5vIGluaXRpYWwgY2xhc3NwYXRoXG4nCi0KLSMgQWRkIGphciBmaWxlcwotTElCRElSID0gb3MucGF0aC5qb2luKEFOVF9IT01FLCAnbGliJykKLWphcmZpbGVzID0gW10KLWZvciBmaWxlIGluIG9zLmxpc3RkaXIoTElCRElSKToKLQlpZiBmaWxlWy00Ol0gPT0gJy5qYXInOgotCQlqYXJmaWxlcy5hcHBlbmQob3MucGF0aC5qb2luKExJQkRJUixmaWxlKSkKLWlmIGRlYnVnOgotCXByaW50ICdKYXIgZmlsZXM6JwotCWZvciBqYXIgaW4gamFyZmlsZXM6Ci0JCXByaW50IGphcgotbG9jYWxwYXRoID0gbG9jYWxwYXRoICsgU0VQQVJBVE9SICsgc3RyaW5nLmpvaW4oamFyZmlsZXMsIFNFUEFSQVRPUikKLQotIyBJZiBKQVZBX0hPTUUgaXMgZGVmaW5lZCwgbG9vayBmb3IgdG9vbHMuamFyICYgY2xhc3Nlcy56aXAKLSMgYW5kIGFkZCB0byBjbGFzc3BhdGgKLWlmIG9zLmVudmlyb24uaGFzX2tleSgnSkFWQV9IT01FJykgYW5kIG9zLmVudmlyb25bJ0pBVkFfSE9NRSddICE9ICcnOgotCUpBVkFfSE9NRSA9IG9zLmVudmlyb25bJ0pBVkFfSE9NRSddCi0JVE9PTFMgPSBvcy5wYXRoLmpvaW4oSkFWQV9IT01FLCBvcy5wYXRoLmpvaW4oJ2xpYicsICd0b29scy5qYXInKSkKLQlpZiBvcy5wYXRoLmV4aXN0cyhUT09MUyk6Ci0JCWxvY2FscGF0aCA9IGxvY2FscGF0aCArIFNFUEFSQVRPUiArIFRPT0xTCi0JQ0xBU1NFUyA9IG9zLnBhdGguam9pbihKQVZBX0hPTUUsIG9zLnBhdGguam9pbignbGliJywgJ2NsYXNzZXMuemlwJykpCi0JaWYgb3MucGF0aC5leGlzdHMoQ0xBU1NFUyk6Ci0JCWxvY2FscGF0aCA9IGxvY2FscGF0aCArIFNFUEFSQVRPUiArIENMQVNTRVMKLWVsc2U6Ci0JcHJpbnQgJ1xuXG5XYXJuaW5nOiBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC5cbicsIFwKLQkJJ0lmIHRoZSBidWlsZCBmYWlscyBiZWNhdXNlIHN1bi4qIGNsYXNzZXMgY291bGQgbm90IGJlIGZvdW5kXG4nLCBcCi0JCSd5b3Ugd2lsbCBuZWVkIHRvIHNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlXG4nLCBcCi0JCSd0byB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBqYXZhXG4nCi0KLSMgSmlrZXMKLUFOVF9PUFRTID0gW10KLWlmIG9zLmVudmlyb24uaGFzX2tleSgnQU5UX09QVFMnKToKLQlBTlRfT1BUUyA9IHN0cmluZy5zcGxpdChvcy5lbnZpcm9uWydBTlRfT1BUUyddKQotaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdKSUtFU1BBVEgnKToKLQlBTlRfT1BUUy5hcHBlbmQoJy1EamlrZXMuY2xhc3MucGF0aD0nICsgb3MuZW52aXJvblsnSklLRVNQQVRIJ10pCi0KLSMgQnVpbGRzIHRoZSBjb21tYW5kbGluZQotY21kbGluZSA9ICclcyAtY2xhc3NwYXRoICVzIC1EYW50LmhvbWU9JXMgJXMgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiAlcycgXAotCSAlIChKQVZBQ01ELCBsb2NhbHBhdGgsIEFOVF9IT01FLCBzdHJpbmcuam9pbihBTlRfT1BUUywnICcpLCBcCi0JIAlzdHJpbmcuam9pbihzeXMuYXJndlsxOl0sICcgJykpCi0KLWlmIGRlYnVnOgotCXByaW50ICdcbiVzXG5cbicgJSAoY21kbGluZSkKLQotIyBSdW4gdGhlIGJpbmlvdSEKLW9zLnN5c3RlbShjbWRsaW5lKQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzU0Njg1Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvRGlyZWN0b3J5U2Nhbm5lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXIKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5U2Nhbm5lclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgRGlyZWN0b3J5U2Nhbm5lclRlc3QoU3RyaW5nIG5hbWUpIHtzdXBlcihuYW1lKTt9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGluc3BpcmVkIGJ5IEJ1ZyMxNDE1LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbk9mRXhjbHVkZWREaXJlY3RvcnkoKSB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoInNyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMiKTsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7Ci0gICAgICAgIGRzLnNldEJhc2VkaXIoZGlyKTsKLSAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsiYW50LyoqIn0pOwotICAgICAgICBkcy5zY2FuKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBoYXZlWmlwUGFja2FnZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGhhdmVUYXNrZGVmc1BhY2thZ2UgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nW10gaW5jbHVkZWQgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxpbmNsdWRlZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGluY2x1ZGVkW2ldLmVxdWFscygiemlwIikpIHsKLSAgICAgICAgICAgICAgICBoYXZlWmlwUGFja2FnZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVkW2ldLmVxdWFscygiYW50IitGaWxlLnNlcGFyYXRvcisidGFza2RlZnMiKSkgewotICAgICAgICAgICAgICAgIGhhdmVUYXNrZGVmc1BhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCgiKDEpIHppcCBwYWNrYWdlIGluY2x1ZGVkIiwgaGF2ZVppcFBhY2thZ2UpOwotICAgICAgICBhc3NlcnQoIigxKSB0YXNrZGVmcyBwYWNrYWdlIG5vdCBpbmNsdWRlZCIsICFoYXZlVGFza2RlZnNQYWNrYWdlKTsKLQotICAgICAgICBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7Ci0gICAgICAgIGRzLnNldEJhc2VkaXIoZGlyKTsKLSAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsiYW50In0pOwotICAgICAgICBkcy5zY2FuKCk7Ci0gICAgICAgIGhhdmVaaXBQYWNrYWdlID0gZmFsc2U7Ci0gICAgICAgIGluY2x1ZGVkID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8aW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlZFtpXS5lcXVhbHMoInppcCIpKSB7Ci0gICAgICAgICAgICAgICAgaGF2ZVppcFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbmNsdWRlZFtpXS5lcXVhbHMoImFudCIrRmlsZS5zZXBhcmF0b3IrInRhc2tkZWZzIikpIHsKLSAgICAgICAgICAgICAgICBoYXZlVGFza2RlZnNQYWNrYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnQoIigyKSB6aXAgcGFja2FnZSBpbmNsdWRlZCIsIGhhdmVaaXBQYWNrYWdlKTsKLSAgICAgICAgYXNzZXJ0KCIoMikgdGFza2RlZnMgcGFja2FnZSBpbmNsdWRlZCIsIGhhdmVUYXNrZGVmc1BhY2thZ2UpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L0luY2x1ZGVUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L0luY2x1ZGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZGJhMDIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbmNsdWRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRhc2tkZWZzVGVzdDsKLQotLyoqCi0gKiBUZXN0IHRoZSBidWlsZCBmaWxlIGluY2x1c2lvbiB1c2luZyBYTUwgZW50aXRpZXMuCi0gKgotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgY2xhc3MgSW5jbHVkZVRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgeyAKLSAgICAKLSAgICBwdWJsaWMgSW5jbHVkZVRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS54bWwiKTsKLSAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0MSIsICJmcm9tIGluY2x1ZGVkIGVudGl0eSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnI21lbnQvaW5jbHVkZS54bWwiKTsKLSAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0MSIsICJmcm9tIGluY2x1ZGVkIGVudGl0eSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnI21lbnQvc2ltcGxlLnhtbCIpOwotICAgICAgICBleHBlY3RMb2coInRlc3QxIiwgImZyb20gc2ltcGxlIGJ1aWxkZmlsZSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9yZWxhdGl2ZS54bWwiKTsKLSAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0MSIsICJmcm9tIGluY2x1ZGVkIGVudGl0eSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnI21lbnQvcmVsYXRpdmUueG1sIik7Ci0gICAgICAgIGV4cGVjdExvZygidGVzdDEiLCAiZnJvbSBpbmNsdWRlZCBlbnRpdHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXJUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWM1YzEuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbnRyb3NwZWN0aW9uSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQuSW50cm9zcGVjdGlvbkhlbHBlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi0KLXB1YmxpYyBjbGFzcyBJbnRyb3NwZWN0aW9uSGVscGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgUHJvamVjdCBwOwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5peFN0eWxlID0gRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciA9PSAnOic7Ci0KLSAgICBwdWJsaWMgSW50cm9zcGVjdGlvbkhlbHBlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBwID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgcC5zZXRCYXNlZGlyKCIvdG1wIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFRleHQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5hZGRUZXh0KHAsICIiLCAidGVzdCIpOwotICAgICAgICAgICAgZmFpbCgiU3RyaW5nIGRvZXNuXCd0IHN1cHBvcnQgYWRkVGV4dCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgaWggPSBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcihnZXRDbGFzcygpKTsKLSAgICAgICAgaWguYWRkVGV4dChwLCB0aGlzLCAidGVzdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguYWRkVGV4dChwLCB0aGlzLCAidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoInRlc3QyIHNob3VsZG5cJ3QgYmUgZXF1YWwgdG8gdGVzdCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0KGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN1cHBvcnRzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotICAgICAgICBhc3NlcnQoIlN0cmluZyBkb2VzblwndCBzdXBwb3J0IGFkZFRleHQiLCAhaWguc3VwcG9ydHNDaGFyYWN0ZXJzKCkpOwotICAgICAgICBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKGdldENsYXNzKCkpOwotICAgICAgICBhc3NlcnQoIkludHJvc3BlY3Rpb25IZWxwZXJUZXN0IHN1cHBvcnRzIGFkZFRleHQiLCAKLSAgICAgICAgICAgICAgIGloLnN1cHBvcnRzQ2hhcmFjdGVycygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENyZWF0b3JzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKGdldENsYXNzKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoIm9uZSIpOwotICAgICAgICAgICAgZmFpbCgiZG9uJ3QgaGF2ZSBlbGVtZW50IHR5cGUgb25lIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJ0d28iKTsKLSAgICAgICAgICAgIGZhaWwoImNyZWF0ZVR3byB0YWtlcyBhcmd1bWVudHMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInRocmVlIik7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGVUaHJlZSByZXR1cm5zIHZvaWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoImZvdXIiKTsKLSAgICAgICAgICAgIGZhaWwoImNyZWF0ZUZvdXIgcmV0dXJucyBhcnJheSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgiZml2ZSIpOwotICAgICAgICAgICAgZmFpbCgiY3JlYXRlRml2ZSByZXR1cm5zIHByaW1pdGl2ZSB0eXBlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIGloLmdldEVsZW1lbnRUeXBlKCJzaXgiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIGloLmNyZWF0ZUVsZW1lbnQocCwgdGhpcywgInNpeCIpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInNldmVuIik7Ci0gICAgICAgICAgICBmYWlsKCJhZGRTZXZlbiB0YWtlcyB0d28gYXJndW1lbnRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJlaWdodCIpOwotICAgICAgICAgICAgZmFpbCgiYWRkRWlnaHQgdGFrZXMgbm8gYXJndW1lbnRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJuaW5lIik7Ci0gICAgICAgICAgICBmYWlsKCJuaW5lIHJldHVybiBub24gdm9pZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgidGVuIik7Ci0gICAgICAgICAgICBmYWlsKCJhZGRUZW4gdGFrZXMgYXJyYXkgYXJndW1lbnQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoImVsZXZlbiIpOwotICAgICAgICAgICAgZmFpbCgiYWRkVGVuIHRha2VzIHByaW1pdGl2ZSBhcmd1bWVudCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgidHdlbHZlIik7Ci0gICAgICAgICAgICBmYWlsKCJubyBwcmltaXRpdmUgY29uc3RydWN0b3IgZm9yIGphdmEubGFuZy5DbGFzcyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNsYXNzLCBpaC5nZXRFbGVtZW50VHlwZSgidGhpcnRlZW4iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIGloLmNyZWF0ZUVsZW1lbnQocCwgdGhpcywgInRoaXJ0ZWVuIikudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLmNyZWF0ZUVsZW1lbnQocCwgdGhpcywgImZvdXJ0ZWVuIik7Ci0gICAgICAgICAgICBmYWlsKCJmb3VydGVlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydChiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5jcmVhdGVFbGVtZW50KHAsIHRoaXMsICJmb3VydGVlbiIpOwotICAgICAgICAgICAgZmFpbCgiZmlmdGVlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydChiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmVzdGVkRWxlbWVudHMoKSB7Ci0gICAgICAgIEhhc2h0YWJsZSBoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBoLnB1dCgic2l4IiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0gICAgICAgIGgucHV0KCJ0aGlydGVlbiIsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIuY2xhc3MpOwotICAgICAgICBoLnB1dCgiZm91cnRlZW4iLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNsYXNzKTsKLSAgICAgICAgaC5wdXQoImZpZnRlZW4iLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmNsYXNzKTsKLSAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKGdldENsYXNzKCkpOwotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gaWguZ2V0TmVzdGVkRWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgQ2xhc3MgZXhwZWN0ID0gKENsYXNzKSBoLmdldChuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlN1cHBvcnQgZm9yICIrbmFtZSsiIGluIEludHJvc3BlY3Rpb05IZWxwZXJUZXN0PyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybiB0eXBlIG9mICIrbmFtZSwgZXhwZWN0LCBpaC5nZXRFbGVtZW50VHlwZShuYW1lKSk7Ci0gICAgICAgICAgICBoLnJlbW92ZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQoIkZvdW5kIGFsbCIsIGguaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVR3byhTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVUaHJlZSgpIHt9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gY3JlYXRlRm91cigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjcmVhdGVGaXZlKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVNpeCgpIHsKLSAgICAgICAgcmV0dXJuICJ0ZXN0IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGNyZWF0ZUZpZnRlZW4oKSB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNldmVuKFN0cmluZyBzLCBTdHJpbmcgczIpIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFaWdodCgpIHt9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGFkZE5pbmUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVGVuKFN0cmluZ1tdIHMpIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGV2ZW4oaW50IGkpIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRUd2VsdmUoQ2xhc3MgYykge30KLQotICAgIHB1YmxpYyB2b2lkIGFkZFRoaXJ0ZWVuKFN0cmluZ0J1ZmZlciBzYikgewotICAgICAgICBzYi5hcHBlbmQoInRlc3QiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkRm91cnRlZW4oU3RyaW5nQnVmZmVyIHMpIHsKLSAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVNldHRlcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgIm9uZSIsICJ0ZXN0Iik7Ci0gICAgICAgICAgICBmYWlsKCJzZXRPbmUgZG9lc24ndCBleGlzdCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInR3byIsICJ0ZXN0Iik7Ci0gICAgICAgICAgICBmYWlsKCJzZXRUd28gcmV0dXJucyBub24gdm9pZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInRocmVlIiwgInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoInNldFRocmVlIHRha2VzIG5vIGFyZ3MiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmb3VyIiwgInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoInNldEZvdXIgdGFrZXMgdHdvIGFyZ3MiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmaXZlIiwgInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoInNldEZpdmUgdGFrZXMgYXJyYXkgYXJnIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2l4IiwgInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoIlByb2plY3QgZG9lc24ndCBoYXZlIGEgU3RyaW5nIGNvbnN0cnVjdG9yIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJzZXZlbiIsICIyIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInNldmVuIiwgIjMiKTsKLSAgICAgICAgICAgIGZhaWwoIjIgc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0KGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZWlnaHQiLCAiMiIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlaWdodCIsICIzIik7Ci0gICAgICAgICAgICBmYWlsKCIyIHNob3VsZG4ndCBiZSBlcXVhbHMgdG8gdGhyZWUgLSBhcyBpbnQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydChiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgIm5pbmUiLCAiMiIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJuaW5lIiwgIjMiKTsKLSAgICAgICAgICAgIGZhaWwoIjIgc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSAtIGFzIEludGVnZXIiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydChiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInRlbiIsICIyIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInRlbiIsICIzIik7Ci0gICAgICAgICAgICBmYWlsKCIvdG1wLzIgc2hvdWxkbid0IGJlIGVxdWFscyB0byAvdG1wLzMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydChiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImVsZXZlbiIsICIyIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImVsZXZlbiIsICJvbiIpOwotICAgICAgICAgICAgZmFpbCgib24gc2hvdWxkbid0IGJlIGZhbHNlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnQoYmUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0d2VsdmUiLCAiMiIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0d2VsdmUiLCAib24iKTsKLSAgICAgICAgICAgIGZhaWwoIm9uIHNob3VsZG4ndCBiZSBmYWxzZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0KGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidGhpcnRlZW4iLCAib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0aGlydGVlbiIsICJvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyIik7Ci0gICAgICAgICAgICBmYWlsKCJvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0IHNob3VsZG4ndCBiZSBlcXVhbCB0byBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnQoYmUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidGhpcnRlZW4iLCAib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDIiKTsKLSAgICAgICAgICAgIGZhaWwoIm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QyIGRvZXNuJ3QgZXhpc3QiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydChiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZm91cnRlZW4iLCAiMiIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmb3VydGVlbiIsICJvbiIpOwotICAgICAgICAgICAgZmFpbCgiMiBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvIHRocmVlIC0gYXMgU3RyaW5nQnVmZmVyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnQoYmUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmaWZ0ZWVuIiwgImFiY2QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZmlmdGVlbiIsICJvbiIpOwotICAgICAgICAgICAgZmFpbCgibyBzaG91bGRuJ3QgYmUgZXF1YWwgdG8gYSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0KGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2l4dGVlbiIsICJhYmNkIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInNpeHRlZW4iLCAib24iKTsKLSAgICAgICAgICAgIGZhaWwoIm8gc2hvdWxkbid0IGJlIGVxdWFsIHRvIGEiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydChiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICBIYXNodGFibGUgaCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgaC5wdXQoInNldmVuIiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0gICAgICAgIGgucHV0KCJlaWdodCIsIGphdmEubGFuZy5JbnRlZ2VyLlRZUEUpOwotICAgICAgICBoLnB1dCgibmluZSIsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKTsKLSAgICAgICAgaC5wdXQoInRlbiIsIGphdmEuaW8uRmlsZS5jbGFzcyk7Ci0gICAgICAgIGgucHV0KCJlbGV2ZW4iLCBqYXZhLmxhbmcuQm9vbGVhbi5UWVBFKTsKLSAgICAgICAgaC5wdXQoInR3ZWx2ZSIsIGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKTsKLSAgICAgICAgaC5wdXQoInRoaXJ0ZWVuIiwgamF2YS5sYW5nLkNsYXNzLmNsYXNzKTsKLSAgICAgICAgaC5wdXQoImZvdXJ0ZWVuIiwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5jbGFzcyk7Ci0gICAgICAgIGgucHV0KCJmaWZ0ZWVuIiwgamF2YS5sYW5nLkNoYXJhY3Rlci5UWVBFKTsKLSAgICAgICAgaC5wdXQoInNpeHRlZW4iLCBqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBKVW5pdCAzLjcgYWRkcyBhIGdldE5hbWUgbWV0aG9kIHRvIFRlc3RDYXNlIC0gc28gd2Ugbm93Ci0gICAgICAgICAqIGhhdmUgYSBuYW1lIGF0dHJpYnV0ZSBpbiBJbnRyb3NwZWN0aW9uSGVscGVyVGVzdCBpZiB3ZSBydW4KLSAgICAgICAgICogdW5kZXIgSlVuaXQgMy43IGJ1dCBub3QgaW4gZWFybGllciB2ZXJzaW9ucy4KLSAgICAgICAgICoKLSAgICAgICAgICogU2ltcGx5IGFkZCBpdCBoZXJlIGFuZCByZW1vdmUgaXQgYWZ0ZXIgdGhlIHRlc3RzLgotICAgICAgICAgKi8KLSAgICAgICAgaC5wdXQoIm5hbWUiLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQotICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBpaC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIENsYXNzIGV4cGVjdCA9IChDbGFzcykgaC5nZXQobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTdXBwb3J0IGZvciAiK25hbWUrIiBpbiBJbnRyb3NwZWN0aW9uSGVscGVyVGVzdD8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUeXBlIG9mICIrbmFtZSwgZXhwZWN0LCBpaC5nZXRBdHRyaWJ1dGVUeXBlKG5hbWUpKTsKLSAgICAgICAgICAgIGgucmVtb3ZlKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGgucmVtb3ZlKCJuYW1lIik7Ci0gICAgICAgIGFzc2VydCgiRm91bmQgYWxsIiwgaC5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2V0VHdvKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRocmVlKCkge30KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvdXIoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXZlKFN0cmluZ1tdIHMpIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXgoUHJvamVjdCBwKSB7fQotCi0gICAgcHVibGljIHZvaWQgc2V0U2V2ZW4oU3RyaW5nIHMpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWlnaHQoaW50IGkpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5pbmUoSW50ZWdlciBpKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBpLmludFZhbHVlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRlbihGaWxlIGYpIHsKLSAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7IAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdG1wLzIiLCBmLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiOlxcdG1wXFwyIiwgZi5nZXRBYnNvbHV0ZVBhdGgoKS50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZygxKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGV2ZW4oYm9vbGVhbiBiKSB7Ci0gICAgICAgIGFzc2VydCghYik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHdlbHZlKEJvb2xlYW4gYikgewotICAgICAgICBhc3NlcnQoIWIuYm9vbGVhblZhbHVlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRoaXJ0ZWVuKENsYXNzIGMpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFByb2plY3QuY2xhc3MsIGMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvdXJ0ZWVuKFN0cmluZ0J1ZmZlciBzYikgewotICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBzYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWZ0ZWVuKGNoYXIgYykgewotICAgICAgICBhc3NlcnRFcXVhbHMoYywgJ2EnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXh0ZWVuKENoYXJhY3RlciBjKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjLmNoYXJWYWx1ZSgpLCAnYScpOwotICAgIH0KLQotfS8vIEludHJvc3BlY3Rpb25IZWxwZXJUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzY0Y2UuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVmVyeSBsaW1pdGVkIHRlc3QgY2xhc3MgZm9yIFByb2plY3QuIFdhaXRpbmcgdG8gYmUgZXh0ZW5kZWQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBQcm9qZWN0IHA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcm9vdDsKLQotICAgIHB1YmxpYyBQcm9qZWN0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgcCA9IG5ldyBQcm9qZWN0KCk7Ci0gICAgICAgIHAuaW5pdCgpOwotICAgICAgICByb290ID0gbmV3IEZpbGUoRmlsZS5zZXBhcmF0b3IpLmdldEFic29sdXRlUGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhVHlwZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROdWxsKCJkdW1teSBpcyBub3QgYSBrbm93biBkYXRhIHR5cGUiLCAKLSAgICAgICAgICAgICAgICAgICBwLmNyZWF0ZURhdGFUeXBlKCJkdW1teSIpKTsKLSAgICAgICAgT2JqZWN0IG8gPSBwLmNyZWF0ZURhdGFUeXBlKCJmaWxlc2V0Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoImZpbGVzZXQgaXMgYSBrbm93biB0eXBlIiwgbyk7Ci0gICAgICAgIGFzc2VydCgiZmlsZXNldCBjcmVhdGVzIEZpbGVTZXQiLCBvIGluc3RhbmNlb2YgRmlsZVNldCk7Ci0gICAgICAgIGFzc2VydCgiUGF0dGVyblNldCIsIAotICAgICAgICAgICAgICAgcC5jcmVhdGVEYXRhVHlwZSgicGF0dGVybnNldCIpIGluc3RhbmNlb2YgUGF0dGVyblNldCk7Ci0gICAgICAgIGFzc2VydCgiUGF0aCIsIHAuY3JlYXRlRGF0YVR5cGUoInBhdGgiKSBpbnN0YW5jZW9mIFBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdCBoYXMgYmVlbiBhIHN0YXJ0aW5nIHBvaW50IGZvciBtb3ZpbmcgdGhlIGNvZGUgdG8gRmlsZVV0aWxzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRmlsZSgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogU3RhcnQgd2l0aCBzaW1wbGUgYWJzb2x1dGUgZmlsZSBuYW1lcy4KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwgCi0gICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLCAKLSAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiB0aHJvdyBpbiBkcml2ZSBsZXR0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgZHJpdmVTcGVjID0gIkM6IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsIAotICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiLyIsIG51bGwpLmdldFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLCAKLSAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsIAotICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWNMb3dlciArICIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsIAotICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWNMb3dlciArICJcXCIsIG51bGwpLmdldFBhdGgoKSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIHByb21pc2VkIHRvIGVsaW1pbmF0ZSBjb25zZWN1dGl2ZSBzbGFzaGVzIGFmdGVyIGRyaXZlIGxldHRlci4KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLCAKLSAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIi8vLy8vIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsIAotICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiXFxcXFxcXFxcXFxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBOb3cgdGVzdCBzb21lIHJlbGF0aXZlIGZpbGUgbmFtZSBtYWdpYy4KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIjQiLCBuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIuLzQiLCBuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIuXFw0IiwgbmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZSgiLi8uXFw0IiwgbmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZSgiLi4vMy80IiwgbmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZSgiLi5cXDNcXDQiLCBuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIuLi8uLi81Ly4uLy4vMi8uLzMvNi8uLi80IiwgbmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZSgiLi5cXC4uLzUvLi5cXC4vMi8uLzMvNlxcLi4vNCIsIG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSkpLmdldFBhdGgoKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGFwdCBmaWxlIHNlcGFyYXRvcnMgdG8gbG9jYWwgY29udmVudGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbGl6ZShTdHJpbmcgcGF0aCkgewotICAgICAgICBwYXRoID0gcm9vdCArIHBhdGguc3Vic3RyaW5nKDEpOwotICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmVUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFN0cnVjdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1YjhkZS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFN0cnVjdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLS8qKgotICogQGF1dGhvciBOaWNvIFNlZXNzbGUgPG5pY29Ac2Vlc3NsZS5kZT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRTdHJ1Y3R1cmVUZXN0IGV4dGVuZHMgVGFza2RlZnNUZXN0IHsgCi0gICAgCi0gICAgcHVibGljIEFudFN0cnVjdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnRzdHJ1Y3R1cmUueG1sIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGUwNDZkLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotLyoqCi0gKiBAYXV0aG9yIE5pY28gU2Vlc3NsZSA8bmljb0BzZWVzc2xlLmRlPiAKLSAqLwotcHVibGljIGNsYXNzIEFudFRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgeyAKLSAgICAKLSAgICBwdWJsaWMgQW50VGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC54bWwiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVjdXJzaXZlIGNhbGwiKTsKLSAgICB9Ci0KLSAgICAvLyB0YXJnZXQgbXVzdCBiZSBzcGVjaWZpZWQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIGZhaWwgc2luY2UgYSByZWN1cnNpb24gd2lsbCBvY2N1ci4uLgotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlY3Vyc2l2ZSBjYWxsIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDQiLCAidGFyZ2V0IGRvZXNuJ3QgZXhpc3QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDYoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXZhaWxhYmxlVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTBmNjAuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotLyoqCi0gKiBAYXV0aG9yIE5pY28gU2Vlc3NsZSA8bmljb0BzZWVzc2xlLmRlPiAKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJsZVRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgeyAKLQotICAgIHB1YmxpYyBBdmFpbGFibGVUZXN0KFN0cmluZyBuYW1lKSB7IAotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXZhaWxhYmxlLnhtbCIpOwotICAgIH0KLSAgICAKLSAgICAvLyBOb3RoaW5nIHNwZWNpZmllZCAtPiBGYWlsCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgIH0KLQotICAgIC8vIE9ubHkgcHJvcGVydHkgc3BlY2lmaWVkIC0+IEZhaWwKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotICAgIAotICAgIC8vIE9ubHkgZmlsZSBzcGVjaWZpZWQgLT4gRmFpbAotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICAvLyBmaWxlIGRvZXNuJ3QgZXhpc3QgLT4gcHJvcGVydHkgJ3Rlc3QnID09IG51bGwKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgICAgIGFzc2VydChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikgPT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8gZmlsZSBkb2VzIGV4aXN0IC0+IHByb3BlcnR5ICd0ZXN0JyA9PSAndHJ1ZScKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7Ci0gICAgfQotICAgIAotICAgIC8vIHJlc291cmNlIGRvZXNuJ3QgZXhpc3QgLT4gcHJvcGVydHkgJ3Rlc3QnID09IG51bGwKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7Ci0gICAgICAgIGFzc2VydChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikgPT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8gcmVzb3VyY2UgZG9lcyBleGlzdCAtPiBwcm9wZXJ0eSAndGVzdCcgPT0gJ3RydWUnCi0gICAgcHVibGljIHZvaWQgdGVzdDcoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOwotICAgIH0KLQotICAgIC8vIGNsYXNzIGRvZXNuJ3QgZXhpc3QgLT4gcHJvcGVydHkgJ3Rlc3QnID09IG51bGwKLSAgICBwdWJsaWMgdm9pZCB0ZXN0OCgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7Ci0gICAgICAgIGFzc2VydChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikgPT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8gY2xhc3MgZG9lcyBleGlzdCAtPiBwcm9wZXJ0eSAndGVzdCcgPT0gJ3RydWUnCi0gICAgcHVibGljIHZvaWQgdGVzdDkoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOwotICAgIH0KLSAgICAKLSAgICAvLyBBbGwgdGhyZWUgc3BlY2lmaWVkIGFuZCBhbGwgdGhyZWUgZXhpc3QgLT4gdHJ1ZQotICAgIHB1YmxpYyB2b2lkIHRlc3QxMCgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxMCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOwotICAgIH0KLQotICAgIC8vIEFsbCB0aHJlZSBzcGVjaWZpZWQgYnV0IGNsYXNzIG1pc3NpbmcgLT4gbnVsbAotICAgIHB1YmxpYyB2b2lkIHRlc3QxMSgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxMSIpOwotICAgICAgICBhc3NlcnROdWxsKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7Ci0gICAgfQotCi0gICAgLy8gU3BlY2lmaWVkIHByb3BlcnR5LW5hbWUgaXMgIiIgLT4gdHJ1ZQotICAgIHB1YmxpYyB2b2lkIHRlc3QxMigpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxMiIpOwotICAgICAgICBhc3NlcnROdWxsKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHByb2plY3QuZ2V0UHJvcGVydHkoIiIpKTsKLSAgICB9Ci0KLSAgICAvLyBTcGVjaWZpZWQgZmlsZSBpcyAiIiAtPiBpbnZhbGlkIGZpbGVzIGRvIG5vdCBleGlzdAotICAgIHB1YmxpYyB2b2lkIHRlc3QxMygpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxMyIpOwotICAgICAgICBhc3NlcnROdWxsKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7Ci0gICAgfQotCi0gICAgLy8gU3BlY2lmaWVkIGZpbGUgaXMgIiIgYWN0dWFsbHkgYSBkaXJlY3RvcnksIHNvIGl0IHNob3VsZCBwYXNzCi0gICAgcHVibGljIHZvaWQgdGVzdDEzYigpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxM2IiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKLSAgICB9Ci0KLSAgICAvLyBTcGVjaWZpZWQgcmVzb3VyY2UgaXMgIiIgLT4gY2FuIHN1Y2ggYSB0aGluZyBleGlzdD8KLSAgICAvKgotICAgICAqIHJldHVybnMgbm9uIG51bGwgSUJNIEpESyAxLjMgTGludXgKLSAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3QxNCgpIHsgCi0vLyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE0Iik7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSwgbnVsbCk7Ci0vLyAgICB9Ci0gICAgCi0gICAgLy8gU3BlY2lmaWVkIGNsYXNzIGlzICIiIC0+IGNhbiBub3QgZXhpc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MTUoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTUiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOwotICAgIH0KLQotICAgIC8vIFNwZWNpZmllZCBkaXIgaXMgIiIgLT4gdGhpcyBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHNob3VsZAotICAgIC8vIGFsd2F5cyBleGlzdAotICAgIHB1YmxpYyB2b2lkIHRlc3QxNigpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxNiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOwotICAgIH0KLQotICAgIC8vIFNwZWNpZmllZCBkaXIgaXMgIi4uL3Rhc2tkZWZzIiAtPiBzaG91bGQgZXhpc3Qgc2luY2UgaXQncyB0aGUgCi0gICAgLy8gbG9jYXRpb24gb2YgdGhlIGJ1aWxkZmlsZSB1c2VkLi4uCi0gICAgcHVibGljIHZvaWQgdGVzdDE3KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE3Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7Ci0gICAgfQotCi0gICAgLy8gU3BlY2lmaWVkIGRpciBpcyAiLi4vdGhpc19kaXJfc2hvdWxkX25ldmVyX2V4aXN0IiAtPiBudWxsCi0gICAgcHVibGljIHZvaWQgdGVzdDE4KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE4Iik7Ci0gICAgICAgIGFzc2VydE51bGwocHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3NUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTZiN2UuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DVlNQYXNzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLQotLyoqCi0gKiBUZXN0cyBDVlNMb2dpbiB0YXNrLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplZmZAY3VzdG9tbW9ua2V5Lm9yZyI+SmVmZiBNYXJ0aW48L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDVlNQYXNzVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBKQUtBUlRBX1VSTCA9Ci0gICAgICAgICI6cHNlcnZlcjphbm9uY3ZzQGpha2FydGEuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgQXk9MD1oPFoiOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFhNTF9VUkwgPQotICAgICAgICAiOnBzZXJ2ZXI6YW5vbmN2c0B4bWwuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgQXk9MD1oPFoiOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRJR1JJU19VUkwgPQotICAgICAgICAiOnBzZXJ2ZXI6Z3Vlc3RAY3ZzLnRpZ3Jpcy5vcmc6L2N2cyBBSWJkWiwiOwotICAgIAotICAgIAotICAgIHB1YmxpYyBDVlNQYXNzVGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jdnNwYXNzLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NWU1Jvb3QoKSB7IAotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gbm90IHRocm93biIpOwotICAgICAgICB9Y2F0Y2goQnVpbGRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImN2c3Jvb3QgaXMgcmVxdWlyZWQiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9QYXNzd29yZCgpIHsgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0gICAgICAgIH1jYXRjaChCdWlsZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygicGFzc3dvcmQgaXMgcmVxdWlyZWQiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXNzRmlsZSgpIHRocm93cyBFeGNlcHRpb24geyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCAidGVzdHBhc3NmaWxlLnRtcCIpOwotCi0gICAgICAgIGFzc2VydCggIlBhc3NmaWxlICIrZisiIG5vdCBjcmVhdGVkIiwgZi5leGlzdHMoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEpBS0FSVEFfVVJMK0VPTCwgcmVhZEZpbGUoZikpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhc3NGaWxlRHVwbGljYXRlRW50cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgInRlc3RwYXNzZmlsZS50bXAiKTsKLQotICAgICAgICBhc3NlcnQoICJQYXNzZmlsZSAiK2YrIiBub3QgY3JlYXRlZCIsIGYuZXhpc3RzKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgIEpBS0FSVEFfVVJMKyBFT0wrCi0gICAgICAgICAgICBUSUdSSVNfVVJMKyBFT0wsCi0gICAgICAgICAgICByZWFkRmlsZShmKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhc3NGaWxlTXVsdGlwbGVFbnRyeSgpIHRocm93cyBFeGNlcHRpb24geyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCAidGVzdHBhc3NmaWxlLnRtcCIpOwotCi0gICAgICAgIGFzc2VydCggIlBhc3NmaWxlICIrZisiIG5vdCBjcmVhdGVkIiwgZi5leGlzdHMoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgSkFLQVJUQV9VUkwrIEVPTCsKLSAgICAgICAgICAgIFhNTF9VUkwrIEVPTCsKLSAgICAgICAgICAgIFRJR1JJU19VUkwrIEVPTCwKLSAgICAgICAgICAgIHJlYWRGaWxlKGYpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkRmlsZShGaWxlIGYpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOyAKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZikpOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmU9bnVsbDsKLSAgICAgICAgICAgIHdoaWxlKChsaW5lPXJlYWRlci5yZWFkTGluZSgpKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChsaW5lICsgRU9MKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5VGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWMwNzkzLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLS8qKgotICogVGVzdHMgRmlsZVNldCB1c2luZyB0aGUgQ29weSB0YXNrLgotICoKLSAqIEBhdXRob3IgRGF2aWQgUmVlcyA8ZGF2ZUB1Ymlxc29mdC5jb20+IAotICovCi1wdWJsaWMgY2xhc3MgQ29weVRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgeyAKLSAgICAKLSAgICBwdWJsaWMgQ29weVRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29weS54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgIGphdmEuaW8uRmlsZSBmID0gbmV3IGphdmEuaW8uRmlsZShnZXRQcm9qZWN0RGlyKCksICJjb3B5dGVzdDEudG1wIik7Ci0gICAgICAgIGlmICggIWYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoIkNvcHkgZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgamF2YS5pby5GaWxlIGYgPSBuZXcgamF2YS5pby5GaWxlKGdldFByb2plY3REaXIoKSwgImNvcHl0ZXN0MWRpci9jb3B5LnhtbCIpOwotICAgICAgICBpZiAoICFmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKCJDb3B5IGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZGlyVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZGlyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk2MmUwLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgY2xhc3MgQ29weWRpclRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgeyAKLSAgICAKLSAgICBwdWJsaWMgQ29weWRpclRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZGlyLnhtbCIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsgCi0gICAgICAgIGV4cGVjdExvZygidGVzdDQiLCAiREVQUkVDQVRFRCAtIFRoZSBjb3B5ZGlyIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBjb3B5IGluc3RlYWQuV2FybmluZzogc3JjID09IGRlc3QiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDUoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOwotICAgICAgICBqYXZhLmlvLkZpbGUgZiA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0UHJvamVjdERpcigpLCAiLi4vdGFza2RlZnMudG1wIik7Ci0gICAgICAgIGlmICghZi5leGlzdHMoKSB8fCAhZi5pc0RpcmVjdG9yeSgpKSB7IAotICAgICAgICAgICAgZmFpbCgiQ29weSBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBXZSBrZWVwIHRoaXMsIHNvIHdlIGhhdmUgc29tZXRoaW5nIHRvIGRlbGV0ZSBpbiBsYXRlciB0ZXN0cyA6LSkKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NiIsICJ0YXJnZXQgaXMgZmlsZSIpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWZpbGVUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlmaWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzIwZTJhLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWZpbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIE5pY28gU2Vlc3NsZSA8bmljb0BzZWVzc2xlLmRlPiAKLSAqLwotcHVibGljIGNsYXNzIENvcHlmaWxlVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q2IiwgInRhcmdldCBpcyBkaXJlY3RvcnkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29weWZpbGVUZXN0KFN0cmluZyBuYW1lKSB7IAotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29weWZpbGUueG1sIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDMiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeyAKLSAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0NCIsICJERVBSRUNBVEVEIC0gVGhlIGNvcHlmaWxlIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBjb3B5IGluc3RlYWQuV2FybmluZzogc3JjID09IGRlc3QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgICAgIGphdmEuaW8uRmlsZSBmID0gbmV3IGphdmEuaW8uRmlsZShnZXRQcm9qZWN0RGlyKCksICJjb3B5ZmlsZS50bXAiKTsKLSAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsgCi0gICAgICAgICAgICBmLmRlbGV0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmFpbCgiQ29weSBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsZXRlVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWxldGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDBhYmEuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWxldGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBEZWxldGVUZXN0KFN0cmluZyBuYW1lKSB7IAotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsZXRlLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgfQotCi0gICAgLy8gZGVsZXRlIG5vdyBoYW5kbGVzIGZpbGVzICphbmQqIGRpcmVjdG9yaWVzIC0tU0IKLS8vICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLS8vICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDMiLCAiTm90IGEgZGlyZWN0b3J5Iik7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWx0cmVlVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWx0cmVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmJlZTEwLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsdHJlZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLS8qKgotICogQGF1dGhvciBOaWNvIFNlZXNzbGUgPG5pY29Ac2Vlc3NsZS5kZT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWx0cmVlVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBEZWx0cmVlVGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbHRyZWUueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeyAKLSAgICAgICAgLy8gV2UgdHJ5IHRvIGRlbGV0ZSB0aGUgZGlyZWN0b3J5IGNyZWF0ZWQgaW4gQ29weWRpclRlc3QKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVwZW5kU2V0VGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXBlbmRTZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTIyYzYuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXBlbmRTZXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotLyoqCi0gKiBUZXN0cyBEZXBlbmRTZXQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3N0cm9uZ0BhcmllbHBhcnRuZXJzLmNvbSI+Q3JhZWcgU3Ryb25nPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kU2V0VGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBEZXBlbmRTZXRUZXN0KFN0cmluZyBuYW1lKSB7IAotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlcGVuZHNldC54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwiQXQgbGVhc3Qgb25lIDxzcmNmaWxlc2V0PiBvciA8c3JjZmlsZWxpc3Q+IGVsZW1lbnQgbXVzdCBiZSBzZXQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeyAKLSAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCJBdCBsZWFzdCBvbmUgPHRhcmdldGZpbGVzZXQ+IG9yIDx0YXJnZXRmaWxlbGlzdD4gZWxlbWVudCBtdXN0IGJlIHNldCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCJBdCBsZWFzdCBvbmUgPHNyY2ZpbGVzZXQ+IG9yIDxzcmNmaWxlbGlzdD4gZWxlbWVudCBtdXN0IGJlIHNldCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgICAgIGphdmEuaW8uRmlsZSBmID0gbmV3IGphdmEuaW8uRmlsZShnZXRQcm9qZWN0RGlyKCksICJvbGRlci50bXAiKTsKLSAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgZmFpbCgiZGVwZW5kc2V0IGZhaWxlZCB0byByZW1vdmUgb3V0IG9mIGRhdGUgZmlsZSAiICsgZi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzIzNjY4Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNob1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLS8qKgotICogQGF1dGhvciBOaWNvIFNlZXNzbGUgPG5pY29Ac2Vlc3NsZS5kZT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2hvVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBFY2hvVGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG8ueG1sIik7Ci0gICAgfQotICAgIAotICAgIC8vIE91dHB1dCBhbiBlbXB0eSBTdHJpbmcKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgIGV4cGVjdExvZygidGVzdDEiLCAiIik7Ci0gICAgfQotCi0gICAgLy8gT3V0cHV0ICdPVVRQVVQgT0YgRUNITycKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGV4cGVjdExvZygidGVzdDIiLCAiT1VUUFVUIE9GIEVDSE8iKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7IAotICAgICAgICBleHBlY3RMb2coInRlc3QzIiwgIlxuIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgVGhpcyBcbiIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlzXG4iKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBhIFxuIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbXVsdGlsaW5lXG4iKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBtZXNzYWdlXG4iKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVXYXRjaGRvZ1Rlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVdhdGNoZG9nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzM5NTk4Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVdhdGNoZG9nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogU2ltcGxlIHRlc3RjYXNlIGZvciB0aGUgRXhlY3V0ZVdhdGNoZG9nIGNsYXNzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjdXRlV2F0Y2hkb2dUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRJTUVfT1VUID0gNTAwMDsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBURVNUX0NMQVNTUEFUSCA9IGdldFRlc3RDbGFzc1BhdGgoKTsKLQotCXByaXZhdGUgRXhlY3V0ZVdhdGNoZG9nIHdhdGNoZG9nOwotCi0JcHVibGljIEV4ZWN1dGVXYXRjaGRvZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKXsKLQkJd2F0Y2hkb2cgPSBuZXcgRXhlY3V0ZVdhdGNoZG9nKFRJTUVfT1VUKTsKLQl9Ci0KLQkvKioKLQkgKiBEYW5nZXJvdXMgbWV0aG9kIHRvIG9idGFpbiB0aGUgY2xhc3NwYXRoIGZvciB0aGUgdGVzdC4gVGhpcyBpcwotCSAqIHNldmVyZWx5IHRpZ2h0ZWQgdG8gdGhlIGJ1aWxkLnhtbCBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZXN0Q2xhc3NQYXRoKCl7Ci0JCVN0cmluZyBjbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzIik7Ci0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiAnYnVpbGQudGVzdHMnIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUgISIpOwotCQkJY2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKLQkJfQotCi0gICAgICAgICAgICAgICAgLy8gSkRLIDEuMSBuZWVkcyBjbGFzc2VzLnppcCBpbiAtY2xhc3NwYXRoIGFyZ3VtZW50Ci0gICAgICAgICAgICAgICAgaWYgKFByb2plY3QuZ2V0SmF2YVZlcnNpb24oKSA9PSBQcm9qZWN0LkpBVkFfMV8xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCArPSAgIEZpbGUucGF0aFNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiY2xhc3Nlcy56aXAiOwotICAgICAgICAgICAgICAgIH0KLQotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQotCXByaXZhdGUgUHJvY2VzcyBnZXRQcm9jZXNzKGludCB0aW1ldG9ydW4pIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdbXSBjbWRBcnJheSA9IHsKLQkJCSJqYXZhIiwgIi1jbGFzc3BhdGgiLCBURVNUX0NMQVNTUEFUSCwKLQkJCVRpbWVQcm9jZXNzLmNsYXNzLmdldE5hbWUoKSwgU3RyaW5nLnZhbHVlT2YodGltZXRvcnVuKQotCQl9OwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGVzdGluZyB3aXRoIGNsYXNzcGF0aDogIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpOwotCQlyZXR1cm4gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRBcnJheSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXJyb3JPdXRwdXQoUHJvY2VzcyBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRSZWFkZXIgZXJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocC5nZXRFcnJvclN0cmVhbSgpKSApOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgbGluZTsKLQkJd2hpbGUgKCAobGluZSA9IGVyci5yZWFkTGluZSgpKSAhPSBudWxsKXsKLQkJCWJ1Zi5hcHBlbmQobGluZSk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIGludCB3YWl0Rm9yRW5kKFByb2Nlc3MgcCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWludCByZXRjb2RlID0gcC53YWl0Rm9yKCk7Ci0JCWlmIChyZXRjb2RlICE9IDApewotCQkJU3RyaW5nIGVyciA9IGdldEVycm9yT3V0cHV0KHApOwotCQkJaWYgKGVyci5sZW5ndGgoKSA+IDApewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRVJST1I6Iik7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGVycik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldGNvZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vVGltZU91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQcm9jZXNzIHByb2Nlc3MgPSBnZXRQcm9jZXNzKFRJTUVfT1VULzIpOwotCQl3YXRjaGRvZy5zdGFydChwcm9jZXNzKTsKLQkJaW50IHJldENvZGUgPSB3YWl0Rm9yRW5kKHByb2Nlc3MpOwotCQlhc3NlcnQoInByb2Nlc3Mgc2hvdWxkIG5vdCBoYXZlIGJlZW4ga2lsbGVkIiwgIXdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXRDb2RlKTsKLQl9Ci0KLQkvLyB0ZXN0IHRoYXQgdGhlIHdhdGNoZG9nIGVuZHMgdGhlIHByb2Nlc3MKLQlwdWJsaWMgdm9pZCB0ZXN0VGltZU91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQcm9jZXNzIHByb2Nlc3MgPSBnZXRQcm9jZXNzKFRJTUVfT1VUKjIpOwotCQlsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl3YXRjaGRvZy5zdGFydChwcm9jZXNzKTsKLQkJaW50IHJldENvZGUgPSBwcm9jZXNzLndhaXRGb3IoKTsKLQkJbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBub3c7Ci0JCWFzc2VydCgicHJvY2VzcyBzaG91bGQgaGF2ZSBiZWVuIGtpbGxlZCIsIHdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKSk7Ci0gICAgICAgICAgICAgICAgLy8JCWFzc2VydCgicmV0dXJuIGNvZGUgaXMgaW52YWxpZDogIiArIHJldENvZGUsIHJldENvZGUhPTApOwotCQlhc3NlcnQoImVsYXBzZSB0aW1lIGlzIGxlc3MgdGhhbiB0aW1lb3V0IHZhbHVlIiwgZWxhcHNlZCA+IFRJTUVfT1VUKTsKLQkJYXNzZXJ0KCJlbGFwc2UgdGltZSBpcyBncmVhdGVyIHRoYW4gcnVuIHZhbHVlIiwgZWxhcHNlZCA8IFRJTUVfT1VUKjIpOwotCX0KLQotCS8vIHRlc3QgYSBwcm9jZXNzIHRoYXQgcnVucyBhbmQgZmFpbGVkCi0JcHVibGljIHZvaWQgdGVzdEZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQcm9jZXNzIHByb2Nlc3MgPSBnZXRQcm9jZXNzKC0xKTsgLy8gcHJvY2VzcyBzaG91bGQgYWJvcnQKLQkJd2F0Y2hkb2cuc3RhcnQocHJvY2Vzcyk7Ci0JCWludCByZXRDb2RlID0gcHJvY2Vzcy53YWl0Rm9yKCk7Ci0JCWFzc2VydCgicHJvY2VzcyBzaG91bGQgbm90IGhhdmUgYmVlbiBraWxsZWQiLCAhd2F0Y2hkb2cua2lsbGVkUHJvY2VzcygpKTsKLQkJYXNzZXJ0KCJyZXR1cm4gY29kZSBpcyBpbnZhbGlkOiAiICsgcmV0Q29kZSwgcmV0Q29kZSE9MCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hbnVhbFN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgUHJvY2VzcyBwcm9jZXNzID0gZ2V0UHJvY2VzcyhUSU1FX09VVCoyKTsKLQkJd2F0Y2hkb2cuc3RhcnQocHJvY2Vzcyk7Ci0KLQkJLy8gSSBhc3N1bWUgdGhhdCBzdGFydGluZyB0aGlzIHRha2VzIGxlc3MgdGhhbiBUSU1FX09VVC8yIG1zLi4uCi0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9jZXNzLndhaXRGb3IoKTsKLQkJCQkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKLQkJCQkJCS8vIG5vdCB2ZXJ5IG5pY2UgYnV0IHdpbGwgZG8gdGhlIGpvYgotCQkJCQkJZmFpbCgicHJvY2VzcyBpbnRlcnJ1cHRlZCBpbiB0aHJlYWQiKTsKLQkJCQkJfQotCQkJCX0KLQkJfTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgVElNRV9PVVQvMiwgdGhlcmUgc2hvdWxkIGJlIGFib3V0IFRJTUVfT1VULzIgbXMgcmVtYWluaW5nIGJlZm9yZSB0aW1lb3V0Ci0JCXRocmVhZC5qb2luKFRJTUVfT1VULzIpOwotCi0JCSAvLyBub3cgc3RvcCB0aGUgd2F0Y2hkb2cuCi0JCXdhdGNoZG9nLnN0b3AoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGRpZSwgc2hvdWxkIGJlIHRoZSBlbmQgb2YgdGhlIHByb2Nlc3MKLQkJdGhyZWFkLmpvaW4oKTsKLQotCQkvLyBwcm9jZXNzIHNob3VsZCBiZSBkZWFkIGFuZCB3ZWxsIGZpbmlzaGVkCi0JCWFzc2VydEVxdWFscygwLCBwcm9jZXNzLmV4aXRWYWx1ZSgpKTsKLQkJYXNzZXJ0KCJwcm9jZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGtpbGxlZCIsICF3YXRjaGRvZy5raWxsZWRQcm9jZXNzKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGltZVByb2Nlc3MgewotCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCWludCB0aW1lID0gSW50ZWdlci5wYXJzZUludChhcmdzWzBdKTsKLQkJCWlmICh0aW1lIDwgMSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdGltZTogIiArIHRpbWUpOwotCQkJfQotCQkJVGhyZWFkLnNsZWVwKHRpbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GYWlsVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GYWlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzJkNGZlLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmFpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLS8qKgotICogQGF1dGhvciBOaWNvIFNlZXNzbGUgPG5pY29Ac2Vlc3NsZS5kZT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWlsVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBGYWlsVGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZhaWwueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAiaXQgaXMgcmVxdWlyZWQgdG8gZmFpbCA6LSkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJpdCBpcyByZXF1aXJlZCB0byBmYWlsIDotKSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaWx0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNmNiZWEuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaWx0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgICAgCi0gICAgcHVibGljIEZpbHRlclRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QyIiwgInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDUoKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjAwMCIsCi0gICAgICAgICAgICAgICAgICAgICBnZXRGaWx0ZXJlZEZpbGUoIjUiLCAiZmlsdGVyZWQudG1wIikpOwotICAgIH0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgewotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDAiLAotICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsdGVyZWRGaWxlKCI2IiwgInRhc2tkZWZzLnRtcC9maWx0ZXIxLnR4dCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8JUAgaW5jbHVkZSBmaWxlPVwicm9vdC9zb21lL2luY2x1ZGUuanNwXCIlPiIsCi0gICAgICAgICAgICAgICAgICAgICBnZXRGaWx0ZXJlZEZpbGUoIjciLCAiZmlsdGVyZWQudG1wIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q4KCkgewotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0OCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjwlQCBpbmNsdWRlIGZpbGU9XCJyb290L3NvbWUvaW5jbHVkZS5qc3BcIiU+IiwKLSAgICAgICAgICAgICAgICAgICAgIGdldEZpbHRlcmVkRmlsZSgiOCIsICJ0YXNrZGVmcy50bXAvZmlsdGVyMi50eHQiKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEZpbHRlcmVkRmlsZShTdHJpbmcgdGVzdE51bWJlciwgU3RyaW5nIGZpbHRlcmVkRmlsZSkgewotICAgIAotICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgZmlsdGVyZWRGaWxlKTsKLSAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKCJmaWx0ZXIgdGVzdCIrdGVzdE51bWJlcisiIGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgICAgIGZhaWwoImZpbHRlciB0ZXN0Iit0ZXN0TnVtYmVyKyIgZmFpbGVkLCBmaWx0ZXJlZCBmaWxlOiAiICsgZi50b1N0cmluZygpICsgIiBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGluLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIGZhaWwoImZpbHRlciB0ZXN0Iit0ZXN0TnVtYmVyKyIgZmFpbGVkLiAgSU9FeGNlcHRpb24gd2hpbGUgcmVhZGluZyBmaWx0ZXJlZCBmaWxlOiAiICsgaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmLmRlbGV0ZSgpOwotICAgICAgICByZXR1cm4gbGluZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENyTGZUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENyTGZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2M0M2IuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDckxmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cGJ3ZXN0QHBvd2VydXAuY29tLmF1Ij5QZXRlciBCLiBXZXN0PC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRml4Q3JMZlRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgewotCi0gICAgcHVibGljIEZpeENyTGZUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9idWlsZC54bWwiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgIGFzc2VydEVxdWFsQ29udGVudChuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rMS5qYXZhIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9yZXN1bHQvSnVuazEuamF2YSIpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgSU9FeGNlcHRpb24geyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxDb250ZW50KG5ldyBGaWxlKCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bmsyLmphdmEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL3Jlc3VsdC9KdW5rMi5qYXZhIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHRocm93cyBJT0V4Y2VwdGlvbiB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwotICAgICAgICBhc3NlcnRFcXVhbENvbnRlbnQobmV3IEZpbGUoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazMuamF2YSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvcmVzdWx0L0p1bmszLmphdmEiKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFsQ29udGVudChuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNC5qYXZhIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9yZXN1bHQvSnVuazQuamF2YSIpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDUoKSB0aHJvd3MgSU9FeGNlcHRpb24geyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxDb250ZW50KG5ldyBGaWxlKCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms1LmphdmEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL3Jlc3VsdC9KdW5rNS5qYXZhIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHRocm93cyBJT0V4Y2VwdGlvbiB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgICAgICBhc3NlcnRFcXVhbENvbnRlbnQobmV3IEZpbGUoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazYuamF2YSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvcmVzdWx0L0p1bms2LmphdmEiKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Q3KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q3Iik7Ci0gICAgICAgIGFzc2VydEVxdWFsQ29udGVudChuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNy5qYXZhIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9yZXN1bHQvSnVuazcuamF2YSIpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDgoKSB0aHJvd3MgSU9FeGNlcHRpb24geyAgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7Ci0gICAgICAgIGFzc2VydEVxdWFsQ29udGVudChuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rOC5qYXZhIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9yZXN1bHQvSnVuazguamF2YSIpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDkoKSB0aHJvd3MgSU9FeGNlcHRpb24geyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxDb250ZW50KG5ldyBGaWxlKCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms5LmphdmEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL3Jlc3VsdC9KdW5rOS5qYXZhIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9PdmVyd3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICBGaWxlIHJlc3VsdCA9IAotICAgICAgICAgICAgbmV3IEZpbGUoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvcmVzdWx0L0p1bmsxLmphdmEiKTsKLSAgICAgICAgbG9uZyBtb2RUaW1lID0gcmVzdWx0Lmxhc3RNb2RpZmllZCgpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNsZWVwIGZvciBzb21lIHRpbWUgdG8gbWFrZSBzdXJlIGEgbmV3ZXIgZmlsZSB3b3VsZCBnZXQgYQotICAgICAgICAgKiBtb3JlIHJlY2VudCB0aW1lc3RhbXAgYWNjb3JkaW5nIHRvIHRoZSBmaWxlIHN5c3RlbSdzCi0gICAgICAgICAqIGdyYW51bGFyaXR5IChzaG91bGQgYmUgPiAycyB0byBhY2NvdW50IGZvciBXaW5kb3dzIEZBVCkuCi0gICAgICAgICAqLwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSAvLyBlbmQgb2YgdHJ5LWNhdGNoCi0KLSAgICAgICAgLyogCi0gICAgICAgICAqIG1ha2Ugc3VyZSB3ZSBnZXQgYSBuZXcgUHJvamVjdCBpbnN0YW5jZSBvciB0aGUgdGFyZ2V0IHdvbid0IGdldCBydW4KLSAgICAgICAgICogYSBzZWNvbmQgdGltZS4KLSAgICAgICAgICovCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvYnVpbGQueG1sIik7Ci0KLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgcmVzdWx0ID0gCi0gICAgICAgICAgICBuZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9yZXN1bHQvSnVuazEuamF2YSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kVGltZSwgcmVzdWx0Lmxhc3RNb2RpZmllZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbENvbnRlbnQoRmlsZSBleHBlY3QsIEZpbGUgcmVzdWx0KSAKLSAgICAgICAgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBmaWxlICIrcmVzdWx0KyIgZG9lc25cJ3QgZXhpc3QiKTsKLSAgICAgICAgfQotCi0gICAgICAgIElucHV0U3RyZWFtIGluRXhwZWN0ID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5SZXN1bHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5FeHBlY3QgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGV4cGVjdCkpOwotICAgICAgICAgICAgaW5SZXN1bHQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlc3VsdCkpOwotCi0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRCeXRlID0gaW5FeHBlY3QucmVhZCgpOwotICAgICAgICAgICAgd2hpbGUgKGV4cGVjdGVkQnl0ZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEJ5dGUsIGluUmVzdWx0LnJlYWQoKSk7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlID0gaW5FeHBlY3QucmVhZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFbmQgb2YgZmlsZSIsIC0xLCBpblJlc3VsdC5yZWFkKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGluUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpblJlc3VsdC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluRXhwZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbkV4cGVjdC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dVbnppcFRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1VuemlwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk4YTUwLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1VuemlwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0gCi0gaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIE5pY28gU2Vlc3NsZSA8bmljb0BzZWVzc2xlLmRlPiAKLSAqLwotcHVibGljIGNsYXNzIEdVbnppcFRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgeyAKLSAgICAKLSAgICBwdWJsaWMgR1VuemlwVGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d1bnppcC54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAiYXR0cmlidXRlIHNyYyBpbnZhbGlkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwotICAgICAgICBqYXZhLmlvLkZpbGUgZiA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgImd6aXAudG1wMiIpOwotICAgICAgICBpZiAoIWYuZXhpc3RzKCkpIHsgCi0gICAgICAgICAgICBmYWlsKCJnemlwIGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZi5kZWxldGUoKTsKLSAgICAgICAgICAgIGYgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJnemlwLnRtcCIpOwotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIGYuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dldFRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQ4ZWZiLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2V0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBOaWNvIFNlZXNzbGUgPG5pY29Ac2Vlc3NsZS5kZT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXRUZXN0IGV4dGVuZHMgVGFza2RlZnNUZXN0IHsgCi0gICAgCi0gICAgcHVibGljIEdldFRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nZXQueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QyIiwgInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDQiLCAic3JjIGludmFsaWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NSIsICJkZXN0IGludmFsaWQgKG9yIG5vIGh0dHAtc2VydmVyIG9uIGxvY2FsIG1hY2hpbmUpIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDYoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgICAgICBqYXZhLmlvLkZpbGUgZiA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgImdldC50bXAiKTsKLSAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7IAotICAgICAgICAgICAgZmFpbCgiZ2V0IGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZi5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0d6aXBUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0d6aXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzEwZWUuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HemlwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLSAKLS8qKgotICogQGF1dGhvciBOaWNvIFNlZXNzbGUgPG5pY29Ac2Vlc3NsZS5kZT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBHemlwVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBHemlwVGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d6aXAueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QyIiwgInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDQiLCAiYXR0cmlidXRlIHppcGZpbGUgaW52YWxpZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICAgICAgamF2YS5pby5GaWxlIGYgPSBuZXcgamF2YS5pby5GaWxlKGdldFByb2plY3REaXIoKSwgImd6aXAudG1wIik7Ci0gICAgICAgIGlmICghZi5leGlzdHMoKSkgeyAKLSAgICAgICAgICAgIGZhaWwoImd6aXAgZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gS2VlcCBmb3IgdW56aXAKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phclRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmFyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzkyMjM1Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmFyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogQGF1dGhvciBFcmlrIE1lYWRlIDxlbWVhZGVAZ2Vla2Zhcm0ub3JnPgotICovCi1wdWJsaWMgY2xhc3MgSmFyVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGphck1vZGlmaWVkRGF0ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcEphciA9ICJ0bXAuamFyIjsKLQotICAgIHB1YmxpYyBKYXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXIueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJtYW5pZmVjdCBmaWxlIGRvZXMgbm90IGV4aXN0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJVbnJlY29nbml6ZWQgd2hlbmVtcHR5IGF0dHJpYnV0ZTogZm9ybWF0IEM6IC95Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgICAgIEZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgdGVtcEphcik7Ci0gICAgICAgIGFzc2VydChqYXJGaWxlLmV4aXN0cygpKTsKLSAgICAgICAgamFyTW9kaWZpZWREYXRlID0gamFyRmlsZS5sYXN0TW9kaWZpZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBYWFh0ZXN0NSgpIHsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICAgICAgRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCB0ZW1wSmFyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphck1vZGlmaWVkRGF0ZSwgamFyRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY4OWY3Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogU29tZSBiYXNpYyB0ZXN0cyBtYWlubHkgaW50ZW5kZWQgdG8gdGVzdCBmb3IgamFyL2NsYXNzbmFtZSBiZWhhdmlvci4KLSAqIEB0b2RvIGhhcyB0byBiZSBlbmhhbmNlZCB0byB1c2UgVGFza2RlZnNUZXN0IGluc3RlYWQuCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAYXBhY2hlLm9yZz5TdGVwaGFuZSBCYWlsbGllejwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsgCi0gICAgCi0gICAgcHJvdGVjdGVkIEphdmEgamF2YTsKLSAgICAKLSAgICBwdWJsaWMgSmF2YVRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBqYXZhID0gbmV3IEphdmEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9KYXJOb0NsYXNzbmFtZSgpewotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YS5leGVjdXRlKCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBmYWlsZWQuIENhbm5vdCBydW4gd2l0aCBubyBjbGFzc25hbWUgbm9yIGphciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2xhc3NuYW1lIG11c3Qgbm90IGJlIG51bGwuIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphck5vRm9yaygpIHsKLSAgICAgICAgamF2YS5zZXRKYXIoIG5ldyBGaWxlKCJ0ZXN0LmphciIpICk7Ci0gICAgICAgIGphdmEuc2V0Rm9yayhmYWxzZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGZhaWxlZC4gQ2Fubm90IHJ1biBqYXIgaW4gbm9uLWZvcmtlZCBtb2RlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW5ub3QgZXhlY3V0ZSBhIGphciBpbiBub24tZm9ya2VkIG1vZGUuIFBsZWFzZSBzZXQgZm9yaz0ndHJ1ZScuICIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NuYW1lKCkgeyAKLSAgICAgICAgamF2YS5zZXRDbGFzc25hbWUoInRlc3QuY2xhc3MuTmFtZSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmFyQW5kQ2xhc3NOYW1lKCkgeyAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmEuc2V0SmFyKCBuZXcgRmlsZSgidGVzdC5qYXIiKSApOwotICAgICAgICAgICAgamF2YS5zZXRDbGFzc25hbWUoInRlc3QuY2xhc3MuTmFtZSIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHNldCBib3RoIGNsYXNzbmFtZSBBTkQgamFyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzbmFtZUFuZEphcigpIHsgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhLnNldENsYXNzbmFtZSgidGVzdC5jbGFzcy5OYW1lIik7Ci0gICAgICAgICAgICBqYXZhLnNldEphciggbmV3IEZpbGUoInRlc3QuamFyIikgKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byBzZXQgYm90aCBjbGFzc25hbWUgQU5EIGphciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWtkaXJUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01rZGlyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg1ZmEwLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWtkaXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgY2xhc3MgTWtkaXJUZXN0IGV4dGVuZHMgVGFza2RlZnNUZXN0IHsgCi0gICAgCi0gICAgcHVibGljIE1rZGlyVGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ta2Rpci54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgYXMgYSBmaWxlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwotICAgICAgICBqYXZhLmlvLkZpbGUgZiA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0UHJvamVjdERpcigpLCAidGVzdGRpci50bXAiKTsKLSAgICAgICAgaWYgKCFmLmV4aXN0cygpIHx8ICFmLmlzRGlyZWN0b3J5KCkpIHsgCi0gICAgICAgICAgICBmYWlsKCJta2RpciBmYWlsZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGYuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5VGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyODYwMy4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogQGF1dGhvciBDb25vciBNYWNOZWlsbAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlUZXN0IGV4dGVuZHMgVGFza2RlZnNUZXN0IHsgCi0gICAgCi0gICAgcHVibGljIFByb3BlcnR5VGVzdChTdHJpbmcgbmFtZSkgeyAKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsgCi0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5LnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeyAKLSAgICAgICAgLy8gc2hvdWxkIGdldCBubyBvdXRwdXQgYXQgYWxsCi0gICAgICAgIGV4cGVjdE91dHB1dEFuZEVycm9yKCJ0ZXN0MSIsICIiLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7IAotICAgICAgICBleHBlY3RMb2coInRlc3QyIiwgInRlc3Rwcm9wMT1hYSwgdGVzdHByb3AzPXh4eXksIHRlc3Rwcm9wND1hYXp6Iik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaXJjdWxhciBkZWZpbml0aW9uIG5vdCBkZXRlY3RlZCAtICIsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJ3YXMgY2lyY3VsYXJseSBkZWZpbmVkIikgIT0gLTEpOwotICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIkRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIG9uIGNpcmN1bGFyIGV4Y2VwdGlvbiIpOyAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeyAKLSAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0NCIsICJodHRwLnVybCBpcyBodHRwOi8vbG9jYWxob3N0Ojk5OSIpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVuYW1lVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZW5hbWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MzNiYzcuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZW5hbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBSZW5hbWVUZXN0KFN0cmluZyBuYW1lKSB7IAotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVuYW1lLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgfQotLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q0IiwgInNvdXJjZSBhbmQgZGVzdGluYXRpb24gdGhlIHNhbWUiKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdDUoKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgfQotICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdDYoKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXBsYWNlVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXBsYWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg4YTA5Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgeyAKLSAgICAKLSAgICBwdWJsaWMgUmVwbGFjZVRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlLnhtbCIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NCIsICJlbXB0eSB0b2tlbiBub3QgYWxsb3dlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NiIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDcoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDciLCAiZW1wdHkgdG9rZW4gbm90IGFsbG93ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0OCgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NsZWVwVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyZTg2Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NsZWVwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLS8qKgotICogQGF1dGhvciBzdGV2ZV9sQGlzZXJhbi5jb20gc3RldmUgbG91Z2hyYW4KLSAqIEBjcmVhdGVkIDAxIE1heSAyMDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBTbGVlcFRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgewotCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzLyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBUUkFDRT1mYWxzZTsKLQotICAgIHB1YmxpYyBTbGVlcFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGNvbmZpZ3VyZVByb2plY3QoVEFTS0RFRlNfRElSICsgInNsZWVwLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgIFRpbWVyIHRpbWVyPW5ldyBUaW1lcigpOwotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICB0aW1lci5zdG9wKCk7Ci0gICAgICAgIGlmKFRSQUNFKSBTeXN0ZW0ub3V0LnByaW50bG4oIiB0ZXN0MSBlbGFwc2VkIHRpbWU9Iit0aW1lci50aW1lKCkpOwotICAgICAgICBhc3NlcnQodGltZXIudGltZSgpPj0wKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgVGltZXIgdGltZXI9bmV3IFRpbWVyKCk7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgIHRpbWVyLnN0b3AoKTsKLSAgICAgICAgaWYoVFJBQ0UpIFN5c3RlbS5vdXQucHJpbnRsbigiIHRlc3QyIGVsYXBzZWQgdGltZT0iK3RpbWVyLnRpbWUoKSk7Ci0gICAgICAgIGFzc2VydCh0aW1lci50aW1lKCk+PTApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICBUaW1lciB0aW1lcj1uZXcgVGltZXIoKTsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgdGltZXIuc3RvcCgpOwotICAgICAgICBpZihUUkFDRSkgU3lzdGVtLm91dC5wcmludGxuKCIgdGVzdDMgZWxhcHNlZCB0aW1lPSIrdGltZXIudGltZSgpKTsKLSAgICAgICAgYXNzZXJ0KHRpbWVyLnRpbWUoKT49MjAwMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB7Ci0gICAgICAgIFRpbWVyIHRpbWVyPW5ldyBUaW1lcigpOwotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwotICAgICAgICB0aW1lci5zdG9wKCk7Ci0gICAgICAgIGlmKFRSQUNFKSBTeXN0ZW0ub3V0LnByaW50bG4oIiB0ZXN0NCBlbGFwc2VkIHRpbWU9Iit0aW1lci50aW1lKCkpOwotICAgICAgICBhc3NlcnQodGltZXIudGltZSgpPj0yMDAwICYmIHRpbWVyLnRpbWUoKTw2MDAwMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDUoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NSIsCi0gICAgICAgICAgICAiTmVnYXRpdmUgc2xlZXAgcGVyaW9kcyBhcmUgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgewotICAgICAgICBUaW1lciB0aW1lcj1uZXcgVGltZXIoKTsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDYiKTsKLSAgICAgICAgdGltZXIuc3RvcCgpOwotICAgICAgICBpZihUUkFDRSkgU3lzdGVtLm91dC5wcmludGxuKCIgdGVzdDYgZWxhcHNlZCB0aW1lPSIrdGltZXIudGltZSgpKTsKLSAgICAgICAgYXNzZXJ0KHRpbWVyLnRpbWUoKTwyMDAwKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICogaW5uZXIgdGltZXIgY2xhc3MKLSAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRpbWVyIHsKLSAgICAgICAgbG9uZyBzdGFydD0wOwotICAgICAgICBsb25nIHN0b3A9MDsKLQotICAgICAgICBwdWJsaWMgVGltZXIoKSB7Ci0gICAgICAgICAgICBzdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgICAgICBzdGFydD1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgICAgICBzdG9wPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgdGltZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdG9wLXN0YXJ0OwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFyVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmN2EwMzIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgY2xhc3MgVGFyVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBUYXJUZXN0KFN0cmluZyBuYW1lKSB7IAotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFyLnhtbCIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NCIsICJ0YXIgY2Fubm90IGluY2x1ZGUgaXRzZWxmIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDUoKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgICAgIGphdmEuaW8uRmlsZSBmIAotICAgICAgICAgICAgPSBuZXcgamF2YS5pby5GaWxlKCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0NS50YXIiKTsKLQotICAgICAgICBpZiAoIWYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoIlRhcnJpbmcgYSBkaXJlY3RvcnkgZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZlRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiMGRkOS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgY2xhc3MgVGFza2RlZlRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgeyAKLSAgICAKLSAgICBwdWJsaWMgVGFza2RlZlRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90YXNrZGVmLnhtbCIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NCIsICJjbGFzc25hbWUgc3BlY2lmaWVkIGRvZXNuJ3QgZXhpc3QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgfQotCi0gICAgLyogZGlzYWJsZWQgdW50aWwgSSBrbm93IHdoeSB0aGV5IGZhaWwgd2hlbiBydW4gdmlhIHRoZSBqdW5pdCB0YXNrIC0tU0IKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKLSAgICAgICAgZXhwZWN0T3V0cHV0KCJ0ZXN0NiIsICJzaW1wbGV0YXNrOiB3b3JrZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHsKLSAgICAgICAgZXhwZWN0T3V0cHV0KCJ0ZXN0NyIsICJ3b3JrZWQiKTsKLSAgICB9Ci0gICAgKi8KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZlRlc3RDb250YWluZXJUYXNrLmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0Q29udGFpbmVyVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTNkYjcxLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZlRlc3RDb250YWluZXJUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwotCi1wdWJsaWMgY2xhc3MgVGFza2RlZlRlc3RDb250YWluZXJUYXNrIGV4dGVuZHMgU2VxdWVudGlhbCB7Ci0gICAgcHVibGljIFRhc2tkZWZUZXN0Q29udGFpbmVyVGFzaygpIHt9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0U2ltcGxlVGFzay5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmVGVzdFNpbXBsZVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNjc0OC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0U2ltcGxlVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLQotcHVibGljIGNsYXNzIFRhc2tkZWZUZXN0U2ltcGxlVGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgcHVibGljIGNsYXNzIEVjaG8gewotICAgICAgICBFY2hvKCkge30KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIHMpIHttZXNzYWdlID0gczt9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUYXNrZGVmVGVzdFNpbXBsZVRhc2soKSB7fQotICAgIAotICAgIHByaXZhdGUgRWNobyBlY2hvOwotICAgIHB1YmxpYyBFY2hvIGNyZWF0ZUVjaG8oKSB7Ci0gICAgICAgIGVjaG8gPSBuZXcgRWNobygpOwotICAgICAgICByZXR1cm4gZWNobzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgbG9nKCJzaW1wbGV0YXNrOiAiK2VjaG8ubWVzc2FnZSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZnNUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTY3Y2U5Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEBhdXRob3IgTmljbyBTZWVzc2xlIDxuaWNvQHNlZXNzbGUuZGU+IAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFza2RlZnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeyAKLSAgICAKLSAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0OwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGxvZ0J1ZmZlcjsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBvdXRCdWZmZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXJyQnVmZmVyOwotICAgIHByaXZhdGUgQnVpbGRFeGNlcHRpb24gYnVpbGRFeGNlcHRpb247Ci0gICAgCi0gICAgcHVibGljIFRhc2tkZWZzVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2coKSB7IAotICAgICAgICByZXR1cm4gbG9nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhwZWN0QnVpbGRFeGNlcHRpb24oU3RyaW5nIHRhc2tuYW1lLCBTdHJpbmcgY2F1c2UpIHsgCi0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24odGFza25hbWUsIGNhdXNlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHBlY3RPdXRwdXQoU3RyaW5nIHRhc2tuYW1lLCBTdHJpbmcgb3V0cHV0KSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KHRhc2tuYW1lKTsKLSAgICAgICAgU3RyaW5nIHJlYWxPdXRwdXQgPSBnZXRPdXRwdXQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG91dHB1dCwgcmVhbE91dHB1dCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhwZWN0T3V0cHV0QW5kRXJyb3IoU3RyaW5nIHRhc2tuYW1lLCBTdHJpbmcgb3V0cHV0LCBTdHJpbmcgZXJyb3IpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQodGFza25hbWUpOwotICAgICAgICBTdHJpbmcgcmVhbE91dHB1dCA9IGdldE91dHB1dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3V0cHV0LCByZWFsT3V0cHV0KTsKLSAgICAgICAgU3RyaW5nIHJlYWxFcnJvciA9IGdldEVycm9yKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlcnJvciwgcmVhbEVycm9yKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHBlY3RMb2coU3RyaW5nIHRhc2tuYW1lLCBTdHJpbmcgbG9nKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KHRhc2tuYW1lKTsKLSAgICAgICAgU3RyaW5nIHJlYWxMb2cgPSBnZXRMb2coKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvZywgcmVhbExvZyk7Ci0gICAgfQotCi0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPdXRwdXQoKSB7Ci0gICAgICAgIHJldHVybiBjbGVhbkJ1ZmZlcihvdXRCdWZmZXIpOwotICAgIH0KLSAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvcigpIHsKLSAgICAgICAgcmV0dXJuIGNsZWFuQnVmZmVyKGVyckJ1ZmZlcik7Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIFN0cmluZyBjbGVhbkJ1ZmZlcihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBjbGVhbmVkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBib29sZWFuIGNyID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aCgpOyBpKyspIHsgCi0gICAgICAgICAgICBjaGFyIGNoID0gYnVmZmVyLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgY3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNyKSB7IAotICAgICAgICAgICAgICAgIGNsZWFuZWRCdWZmZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IAotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFuZWRCdWZmZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjbGVhbmVkQnVmZmVyLmFwcGVuZCgnXHInKS5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xlYW5lZEJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVQcm9qZWN0KFN0cmluZyBmaWxlbmFtZSkgeyAKLSAgICAgICAgbG9nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgcHJvamVjdC5pbml0KCk7Ci0gICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KCAiYW50LmZpbGUiICwgbmV3IEZpbGUoZmlsZW5hbWUpLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihuZXcgQW50VGVzdExpc3RlbmVyKCkpOwotICAgICAgICBQcm9qZWN0SGVscGVyLmNvbmZpZ3VyZVByb2plY3QocHJvamVjdCwgbmV3IEZpbGUoZmlsZW5hbWUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVRhcmdldChTdHJpbmcgdGFyZ2V0TmFtZSkgeyAKLSAgICAgICAgUHJpbnRTdHJlYW0gc3lzT3V0ID0gU3lzdGVtLm91dDsKLSAgICAgICAgUHJpbnRTdHJlYW0gc3lzRXJyID0gU3lzdGVtLmVycjsKLSAgICAgICAgdHJ5IHsgCi0gICAgICAgICAgICBzeXNPdXQuZmx1c2goKTsKLSAgICAgICAgICAgIHN5c0Vyci5mbHVzaCgpOwotICAgICAgICAgICAgb3V0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBBbnRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KG91dCk7Ci0gICAgICAgICAgICBlcnJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBQcmludFN0cmVhbSBlcnIgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEFudE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoZXJyKTsKLSAgICAgICAgICAgIGxvZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkRXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsgCi0gICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KHN5c091dCk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKHN5c0Vycik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBGaWxlIGdldFByb2plY3REaXIoKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0LmdldEJhc2VEaXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKFN0cmluZyB0YXNrbmFtZSwgU3RyaW5nIGNhdXNlLCBTdHJpbmcgbXNnKSB7IAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXNrbmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBpZiAoKG51bGwgIT0gbXNnKSAmJiAoZXguZ2V0TWVzc2FnZSgpICE9IG1zZykpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgQnVpbGRFeGNlcHRpb24gYmVjYXVzZSAnIiArIGNhdXNlICsgIicgd2l0aCBtZXNzYWdlICciICsgbXNnICsgIicgKHJlY2VpdmVkIG1lc3NhZ2UgJyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiJyBpbnN0ZWFkKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBiZWNhdXNlOiAiICsgY2F1c2UpOwotICAgIH0KLSAgICBwcml2YXRlIGNsYXNzIEFudE91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uT3V0cHV0U3RyZWFtIHsgCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7IAotICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVuZCgoY2hhciliKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGNsYXNzIEFudFRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgeyAKLSAgICAgICAgLyoqCi0gICAgICAgICAqICBGaXJlZCBiZWZvcmUgYW55IHRhcmdldHMgYXJlIHN0YXJ0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBGaXJlZCBhZnRlciB0aGUgbGFzdCB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50Ci0gICAgICAgICAqICB3aWxsIHN0aWxsIGJlIHRocm93biBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgYnVpbGQuCi0gICAgICAgICAqCi0gICAgICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBGaXJlZCB3aGVuIGEgdGFyZ2V0IGlzIHN0YXJ0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFyZ2V0KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldFN0YXJ0ZWQgIiArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIEZpcmVkIHdoZW4gYSB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50IHdpbGwKLSAgICAgICAgICogIHN0aWxsIGJlIHRocm93biBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgYnVpbGQuCi0gICAgICAgICAqCi0gICAgICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJ0YXJnZXRGaW5pc2hlZCAiICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgRmlyZWQgd2hlbiBhIHRhc2sgaXMgc3RhcnRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRUYXNrKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJ0YXNrU3RhcnRlZCAiICsgZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBGaXJlZCB3aGVuIGEgdGFzayBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQgd2lsbCBzdGlsbAotICAgICAgICAgKiAgYmUgdGhyb3cgaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGhlIGJ1aWxkLgotICAgICAgICAgKgotICAgICAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldEV4Y2VwdGlvbigpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInRhc2tGaW5pc2hlZCAiICsgZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBGaXJlZCB3aGVuZXZlciBhIG1lc3NhZ2UgaXMgbG9nZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldE1lc3NhZ2UoKQotICAgICAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldFByaW9yaXR5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKGV2ZW50LmdldFByaW9yaXR5KCkgPT0gUHJvamVjdC5NU0dfSU5GTyB8fAotICAgICAgICAgICAgICAgIGV2ZW50LmdldFByaW9yaXR5KCkgPT0gUHJvamVjdC5NU0dfV0FSTiB8fAotICAgICAgICAgICAgICAgIGV2ZW50LmdldFByaW9yaXR5KCkgPT0gUHJvamVjdC5NU0dfRVJSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ0J1ZmZlci5hcHBlbmQoZXZlbnQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VuemlwVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnppcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyZjhmYi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VuemlwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKLQotLyoqCi0gKiBAYXV0aG9yIE5pY28gU2Vlc3NsZSA8bmljb0BzZWVzc2xlLmRlPiAKLSAqLwotcHVibGljIGNsYXNzIFVuemlwVGVzdCBleHRlbmRzIFRhc2tkZWZzVGVzdCB7IAotICAgIAotICAgIHB1YmxpYyBVbnppcFRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91bnppcC54bWwiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QyIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ppcFRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE3ZDFhLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLS8qKgotICogQGF1dGhvciBOaWNvIFNlZXNzbGUgPG5pY29Ac2Vlc3NsZS5kZT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBUZXN0IGV4dGVuZHMgVGFza2RlZnNUZXN0IHsgCi0gICAgCi0gICAgcHVibGljIFppcFRlc3QoU3RyaW5nIG5hbWUpIHsgCi0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy96aXAueG1sIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInppcCBjYW5ub3QgaW5jbHVkZSBpdHNlbGYiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsgCi0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NCIsICJ6aXAgY2Fubm90IGluY2x1ZGUgaXRzZWxmIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDYiKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q3KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDciKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BTlRMUlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4YmViMy4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFza2RlZnNUZXN0OwotLyoqCi0gKiBAYXV0aG9yIEVyaWsgTWVhZGUgPGVtZWFkZUBnZWVrZmFybS5vcmc+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBTlRMUlRlc3QgZXh0ZW5kcyBUYXNrZGVmc1Rlc3QgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBU0tERUZTX0RJUiA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci8iOwotCi0gICAgcHVibGljIEFOVExSVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAiYW50bHIueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCwgdGFyZ2V0LCBtaXNzaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJJbnZhbGlkIG91dHB1dCBkaXJlY3RvcnkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBuZXcgRmlsZShUQVNLREVGU19ESVIgKyAiYW50bHIudG1wIik7Ci0gICAgICAgIFN0cmluZ1tdIGNhbGNGaWxlcyA9IG91dHB1dERpcmVjdG9yeS5saXN0KG5ldyBDYWxjRmlsZUZpbHRlcigpKTsKLSAgICAgICAgYXNzZXJ0KDUgPT0gY2FsY0ZpbGVzLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDUoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NSIsICJJbnZhbGlkIHdvcmtpbmcgZGlyZWN0b3J5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDYoKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDcoKSB7Ci0gICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NyIsICJVbmFibGUgdG8gZGV0ZXJtaW5lIGdlbmVyYXRlZCBjbGFzcyIpOwotICAgIH0KLX0KLQotY2xhc3MgQ2FsY0ZpbGVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKCJDYWxjIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRlNzU2Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOwotCi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiSmFrYXJ0YS1SZWdleHAiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRMaWFpc29uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBBYnRyYWN0IHRlc3RjYXNlIGZvciBYU0xUTGlhaXNvbi4KLSAqIE92ZXJyaWRlIGNyZWF0ZUxpYWlzb24gZm9yIGVhY2ggWFNMVExpYWlzb24uCi0gKgotICogPGEgaHJlZj0ic2JhaWxsaWV6QGFwYWNoZS5vcmciPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgWFNMVExpYWlzb24gbGlhaXNvbjsKLQotICAgIHByb3RlY3RlZCAgQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QoU3RyaW5nIG5hbWUpewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsaWFpc29uID0gY3JlYXRlTGlhaXNvbigpOwotICAgIH0KLQotICAgIC8vIHRvIG92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTTFRMaWFpc29uIGNyZWF0ZUxpYWlzb24oKSB0aHJvd3MgRXhjZXB0aW9uIDsKLQotICAgIHByb3RlY3RlZCBGaWxlIGdldEZpbGUoU3RyaW5nIG5hbWUpewotICAgICAgICBVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotICAgIH0KLQotICAgIC8qKiBrZWVwIGl0IHNpbXBsZSBzdHVwaWQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgeHNsID0gZ2V0RmlsZSgiL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluLnhzbCIpOwotICAgICAgICBsaWFpc29uLnNldFN0eWxlc2hlZXQoeHNsKTsKLSAgICAgICAgbGlhaXNvbi5hZGRQYXJhbSgicGFyYW0iLCAidmFsdWUiKTsKLSAgICAgICAgRmlsZSBpbiA9IGdldEZpbGUoIi90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwiKTsKLSAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZSgieHNsdGxpYWlzb24udG1wIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsaWFpc29uLnRyYW5zZm9ybShpbiwgb3V0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG91dC5kZWxldGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIHhzbCA9IGdldEZpbGUoIi90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54c2wiKTsKLSAgICAgICAgbGlhaXNvbi5zZXRTdHlsZXNoZWV0KHhzbCk7Ci0gICAgICAgIEZpbGUgaW4gPSBnZXRGaWxlKCIvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueG1sIik7Ci0gICAgICAgIEZpbGUgb3V0ID0gbmV3IEZpbGUoInhzbHRsaWFpc29uLWVuY29kaW5nLnRtcCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbGlhaXNvbi50cmFuc2Zvcm0oaW4sIG91dCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBwYXJzZVhNTChvdXQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290Iixkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UiLGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDBFOVx1MDBFMFx1MDBFOFx1MDBFRlx1MDBGOSIsZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEZpcnN0Q2hpbGQoKS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0LmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IHBhcnNlWE1MKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGJ1aWxkZXIgPSBkYmZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIHJldHVybiBkYnVpbGRlci5wYXJzZShmaWxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1B2Y3NUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1B2Y3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTMyYjcuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9QdmNzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UYXNrZGVmc1Rlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBUaG9tYXMgQ2hyaXN0ZW5zZW4gPHRjaHJpc3RlbnNlbkBub3JkaWphLmNvbT4KLSAqLwotcHVibGljIGNsYXNzIFB2Y3NUZXN0IGV4dGVuZHMgVGFza2RlZnNUZXN0IHsgCi0gICAgCi0gICAgcHVibGljIFB2Y3NUZXN0KFN0cmluZyBuYW1lKSB7IAotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy54bWwiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAiUmVxdWlyZWQgYXJndW1lbnQgcmVwb3NpdG9yeSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDYoKSB7IAotICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDYiLCAiRmFpbGVkIGV4ZWN1dGluZzogL25ldmVyL2hlYXJkL29mL2EvZGlyZWN0b3J5L3N0cnVjdHVyZS9saWtlL3RoaXMvcGNsaSBsdmYgLXogLWF3IC1wci8vY3Q0c2VydjIvcHZjcy9tb25pdG9yIC8uIEV4Y2VwdGlvbjogL25ldmVyL2hlYXJkL29mL2EvZGlyZWN0b3J5L3N0cnVjdHVyZS9saWtlL3RoaXMvcGNsaTogbm90IGZvdW5kIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvblRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNjNlNjQuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUTGlhaXNvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyogCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkpha2FydGEtUmVnZXhwIiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qKgotICogVHJhWCBYU0xUTGlhaXNvbiB0ZXN0Y2FzZQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGFwYWNoZS5vcmciPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgotICovCi1wdWJsaWMgY2xhc3MgVHJhWExpYWlzb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QgewotICAgIHB1YmxpYyBUcmFYTGlhaXNvblRlc3QoU3RyaW5nIG5hbWUpewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWFNMVExpYWlzb24gY3JlYXRlTGlhaXNvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFRyYVhMaWFpc29uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFhhbGFuMlJlZGlyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgeHNsID0gZ2V0RmlsZSgiL3Rhc2tkZWZzL29wdGlvbmFsL3hhbGFuLXJlZGlyZWN0LWluLnhzbCIpOwotICAgICAgICBsaWFpc29uLnNldFN0eWxlc2hlZXQoeHNsKTsKLSAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZSgieGFsYW4yLXJlZGlyZWN0LW91dC1kdW1teS50bXAiKTsKLSAgICAgICAgRmlsZSBpbiA9IGdldEZpbGUoIi90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54c2wiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxpYWlzb24uYWRkUGFyYW0oInhhbGFuLXZlcnNpb24iLCAiMiIpOwotICAgICAgICAgICAgbGlhaXNvbi50cmFuc2Zvcm0oaW4sIG91dCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvdXQuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hhbGFuTGlhaXNvblRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWGFsYW5MaWFpc29uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWE0YzEzLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWGFsYW5MaWFpc29uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiSmFrYXJ0YS1SZWdleHAiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRMaWFpc29uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFhhbGFuIExpYWlzb24gdGVzdGNhc2UKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBhcGFjaGUub3JnIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIFhhbGFuTGlhaXNvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFhTTFRMaWFpc29uVGVzdCB7Ci0gICAgcHVibGljIFhhbGFuTGlhaXNvblRlc3QoU3RyaW5nIG5hbWUpewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWFNMVExpYWlzb24gY3JlYXRlTGlhaXNvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFhhbGFuTGlhaXNvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RYYWxhbjFSZWRpcmVjdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIHhzbCA9IGdldEZpbGUoIi90YXNrZGVmcy9vcHRpb25hbC94YWxhbi1yZWRpcmVjdC1pbi54c2wiKTsKLSAgICAgICAgbGlhaXNvbi5zZXRTdHlsZXNoZWV0KHhzbCk7Ci0gICAgICAgIEZpbGUgb3V0ID0gbmV3IEZpbGUoInhhbGFuMS1yZWRpcmVjdC1vdXQtZHVtbXkudG1wIik7Ci0gICAgICAgIEZpbGUgaW4gPSBnZXRGaWxlKCIvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueHNsIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsaWFpc29uLmFkZFBhcmFtKCJ4YWxhbi12ZXJzaW9uIiwgIjEiKTsKLSAgICAgICAgICAgIGxpYWlzb24udHJhbnNmb3JtKGluLCBvdXQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0LmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hzbHBMaWFpc29uVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Yc2xwTGlhaXNvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2YTc3MS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hzbHBMaWFpc29uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRMaWFpc29uOwotCi0vKiAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiSmFrYXJ0YS1SZWdleHAiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoqCi0gKiBYU0xQIExpYWlzb24gdGVzdGNhc2UKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBhcGFjaGUub3JnIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAqLwotcHVibGljIGNsYXNzIFhzbHBMaWFpc29uVGVzdCBleHRlbmRzIEFic3RyYWN0WFNMVExpYWlzb25UZXN0IHsKLSAgICBwdWJsaWMgWHNscExpYWlzb25UZXN0KFN0cmluZyBuYW1lKXsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhTTFRMaWFpc29uIGNyZWF0ZUxpYWlzb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYc2xwTGlhaXNvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0UnVubmVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RSdW5uZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZDM4ZGEuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RSdW5uZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLS8qKgotICogU21hbGwgdGVzdGNhc2UgZm9yIHRoZSBydW5uZXIsIHRlc3RzIGFyZSB2ZXJ5IHZlcnkgdmVyeSBiYXNpY3MuCi0gKiBUaGV5IG11c3QgYmUgZW5oYW5jZWQgd2l0aCB0aW1lLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKVW5pdFRlc3RSdW5uZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLy8gbWFuZGF0b3J5IGNvbnN0cnVjdG9yCi0gICAgcHVibGljIEpVbml0VGVzdFJ1bm5lclRlc3QoU3RyaW5nIG5hbWUpewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayB0aGF0IGhhdmluZyBubyBzdWl0ZSBnZW5lcmF0ZXMgbm8gZXJyb3JzCi0gICAgcHVibGljIHZvaWQgdGVzdE5vU3VpdGUoKXsKLSAgICAgICAgVGVzdFJ1bm5lciBydW5uZXIgPSBjcmVhdGVSdW5uZXIoTm9TdWl0ZVRlc3RDYXNlLmNsYXNzKTsKLSAgICAgICAgcnVubmVyLnJ1bigpOwotICAgICAgICBhc3NlcnRFcXVhbHMocnVubmVyLmdldEZvcm1hdHRlcigpLmdldEVycm9yKCksIEpVbml0VGVzdFJ1bm5lci5TVUNDRVNTLCBydW5uZXIuZ2V0UmV0Q29kZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayB0aGF0IGEgc3VpdGUgZ2VuZXJhdGVzIG5vIGVycm9ycwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdWl0ZSgpewotICAgICAgICBUZXN0UnVubmVyIHJ1bm5lciA9IGNyZWF0ZVJ1bm5lcihTdWl0ZVRlc3RDYXNlLmNsYXNzKTsKLSAgICAgICAgcnVubmVyLnJ1bigpOwotICAgICAgICBhc3NlcnRFcXVhbHMocnVubmVyLmdldEZvcm1hdHRlcigpLmdldEVycm9yKCksIEpVbml0VGVzdFJ1bm5lci5TVUNDRVNTLCBydW5uZXIuZ2V0UmV0Q29kZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayB0aGF0IGFuIGludmFsaWQgc3VpdGUgZ2VuZXJhdGVzIGFuIGVycm9yLgotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU3VpdGUoKXsKLSAgICAgICAgVGVzdFJ1bm5lciBydW5uZXIgPSBjcmVhdGVSdW5uZXIoSW52YWxpZFN1aXRlVGVzdENhc2UuY2xhc3MpOwotICAgICAgICBydW5uZXIucnVuKCk7Ci0gICAgICAgIFN0cmluZyBlcnJvciA9IHJ1bm5lci5nZXRGb3JtYXR0ZXIoKS5nZXRFcnJvcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXJyb3IsIEpVbml0VGVzdFJ1bm5lci5FUlJPUlMsIHJ1bm5lci5nZXRSZXRDb2RlKCkpOwotICAgICAgICBhc3NlcnQoZXJyb3IsIGVycm9yLmluZGV4T2YoInRocm93biBvbiBwdXJwb3NlIikgIT0gLTEpOwotICAgIH0KLQotICAgIC8vIGNoZWNrIHRoYXQgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhIHRlc3RjYXNlIGdlbmVyYXRlcyBubyBlcnJvcnMKLSAgICAvLyBhdCBmaXJzdCBldmVuIHRob3VnaCB0aGlzIGlzIGluY29ycmVjdC4KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UZXN0Q2FzZSgpewotICAgICAgICBUZXN0UnVubmVyIHJ1bm5lciA9IGNyZWF0ZVJ1bm5lcihOb1Rlc3RDYXNlLmNsYXNzKTsKLSAgICAgICAgcnVubmVyLnJ1bigpOwotICAgICAgICBhc3NlcnRFcXVhbHMocnVubmVyLmdldEZvcm1hdHRlcigpLmdldEVycm9yKCksIEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUywgcnVubmVyLmdldFJldENvZGUoKSk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgdGhhdCBhbiBleGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yIGlzIG5vdGljZWQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRlc3RDYXNlKCl7Ci0gICAgICAgIFRlc3RSdW5uZXIgcnVubmVyID0gY3JlYXRlUnVubmVyKEludmFsaWRUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgICAgIHJ1bm5lci5ydW4oKTsKLSAgICAgICAgU3RyaW5nIGVycm9yID0gcnVubmVyLmdldEZvcm1hdHRlcigpLmdldEVycm9yKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlcnJvciwgSlVuaXRUZXN0UnVubmVyLkZBSUxVUkVTLCBydW5uZXIuZ2V0UmV0Q29kZSgpKTsKLSAgICAgICAgLy9AZml4bWUgYXMgb2Ygbm93IGRvZXMgbm90IHJlcG9ydCB0aGUgb3JpZ2luYWwgc3RhY2t0cmFjZS4KLSAgICAgICAgLy9hc3NlcnQoZXJyb3IsIGVycm9yLmluZGV4T2YoInRocm93biBvbiBwdXJwb3NlIikgIT0gLTEpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgVGVzdFJ1bm5lciBjcmVhdGVSdW5uZXIoQ2xhc3MgY2xhenopewotICAgICAgICByZXR1cm4gbmV3IFRlc3RSdW5uZXIobmV3IEpVbml0VGVzdChjbGF6ei5nZXROYW1lKCkpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvLyB0aGUgdGVzdCBydW5uZXIgdGhhdCB3cmFwIHRoZSBkdW1teSBmb3JtYXR0ZXIgdGhhdCBpbnRlcmVzdHMgdXMKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBUZXN0UnVubmVyIGV4dGVuZHMgSlVuaXRUZXN0UnVubmVyIHsKLSAgICAgICAgcHJpdmF0ZSBSZXN1bHRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IFJlc3VsdEZvcm1hdHRlcigpOwotICAgICAgICBUZXN0UnVubmVyKEpVbml0VGVzdCB0ZXN0LCBib29sZWFuIHgsIGJvb2xlYW4geSl7Ci0gICAgICAgICAgICBzdXBlcih0ZXN0LCB4LCB5LCAgVGVzdFJ1bm5lci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIC8vIHVzZSB0aGUgY2xhc3Nsb2FkZXIgdGhhdCBsb2FkZWQgdGhpcyBjbGFzcyBvdGhlcndpc2UKLSAgICAgICAgICAgIC8vIGl0IHdpbGwgbm90IGJlIGFibGUgdG8gcnVuIGlubmVyIGNsYXNzZXMgaWYgdGhpcyB0ZXN0Ci0gICAgICAgICAgICAvLyBpcyByYW4gaW4gbm9uLWZvcmtlZCBtb2RlLgotICAgICAgICAgICAgYWRkRm9ybWF0dGVyKGZvcm1hdHRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgUmVzdWx0Rm9ybWF0dGVyIGdldEZvcm1hdHRlcigpewotICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGR1bW15IGZvcm1hdHRlciBqdXN0IHRvIGNhdGNoIHRoZSBlcnJvcgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIFJlc3VsdEZvcm1hdHRlciBpbXBsZW1lbnRzIEpVbml0UmVzdWx0Rm9ybWF0dGVyIHsKLSAgICAgICAgcHJpdmF0ZSBUaHJvd2FibGUgZXJyb3I7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbU91dHB1dChTdHJpbmcgb3V0cHV0KXt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVycm9yKFN0cmluZyBvdXRwdXQpe30KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb257fQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb257fQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0KXt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChUZXN0IHQpIHt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7fQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsgfQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgeyB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGVycm9yID0gdDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZ2V0RXJyb3IoKXsKLSAgICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBlcnJvci5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN3KSk7Ci0gICAgICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9UZXN0Q2FzZSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgICAgIHB1YmxpYyBJbnZhbGlkVGVzdENhc2UoU3RyaW5nIG5hbWUpewotICAgICAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRocm93biBvbiBwdXJwb3NlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb1N1aXRlVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgICAgIHB1YmxpYyBOb1N1aXRlVGVzdENhc2UoU3RyaW5nIG5hbWUpeyBzdXBlcihuYW1lKTsgfQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QSgpe307Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWl0ZVRlc3RDYXNlIGV4dGVuZHMgTm9TdWl0ZVRlc3RDYXNlIHsKLSAgICAgICAgcHVibGljIFN1aXRlVGVzdENhc2UoU3RyaW5nIG5hbWUpeyBzdXBlcihuYW1lKTsgfQotICAgICAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFN1aXRlVGVzdENhc2UuY2xhc3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkU3VpdGVUZXN0Q2FzZSBleHRlbmRzIE5vU3VpdGVUZXN0Q2FzZSB7Ci0gICAgICAgIHB1YmxpYyBJbnZhbGlkU3VpdGVUZXN0Q2FzZShTdHJpbmcgbmFtZSl7IHN1cGVyKG5hbWUpOyB9Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0aHJvd24gb24gcHVycG9zZSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oSlVuaXRUZXN0UnVubmVyVGVzdC5jbGFzcyk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lSmF2YVRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmE2MDA3Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQuQ29tbWFuZGxpbmVKYXZhCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRsaW5lSmF2YVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgQ29tbWFuZGxpbmVKYXZhVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKCIuIik7Ci0gICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoImJ1aWxkLnN5c2NsYXNzcGF0aCIsICJpZ25vcmUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tbWFuZGxpbmUoKSB7Ci0gICAgICAgIENvbW1hbmRsaW5lSmF2YSBjID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOwotICAgICAgICBjLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LkNvbW1hbmRsaW5lSmF2YVRlc3QiKTsKLSAgICAgICAgYy5zZXRDbGFzc25hbWUoImp1bml0LnRleHR1aS5UZXN0UnVubmVyIik7Ci0gICAgICAgIGMuY3JlYXRlVm1Bcmd1bWVudCgpLnNldFZhbHVlKCItRGphdmEuY29tcGlsZXI9Tk9ORSIpOwotICAgICAgICBTdHJpbmdbXSBzID0gYy5nZXRDb21tYW5kbGluZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGNsYXNzcGF0aCIsIDQsIHMubGVuZ3RoKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogQWZ0ZXIgY2hhbmdpbmcgQ29tbWFuZGxpbmVKYXZhIHRvIHNlYXJjaCBmb3IgdGhlIGphdmEKLSAgICAgICAgICogZXhlY3V0YWJsZSwgSSBkb24ndCBrbm93LCBob3cgdG8gdGVzdHMgdGhlIHZhbHVlIHJldHVybmVkCi0gICAgICAgICAqIGhlcmUgd2l0aG91dCB1c2luZyB0aGUgc2FtZSBsb2dpYyBhcyBhcHBsaWVkIGluIHRoZSBjbGFzcwotICAgICAgICAgKiBpdHNlbGYuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFzc2VydCgibm8gY2xhc3NwYXRoIiwgImphdmEiLCBzWzBdKTsKLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydEVxdWFscygibm8gY2xhc3NwYXRoIiwgIi1EamF2YS5jb21waWxlcj1OT05FIiwgc1sxXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibm8gY2xhc3NwYXRoIiwgImp1bml0LnRleHR1aS5UZXN0UnVubmVyIiwgc1syXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibm8gY2xhc3NwYXRoIiwgCi0gICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQuQ29tbWFuZGxpbmVKYXZhVGVzdCIsIHNbM10pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGMyID0gKENvbW1hbmRsaW5lSmF2YSkgYy5jbG9uZSgpOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmFpbCgiY2xvbmluZyBzaG91bGQgd29yayB3aXRob3V0IGNsYXNzcGF0aCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGMuY3JlYXRlQ2xhc3NwYXRoKHByb2plY3QpLnNldExvY2F0aW9uKHByb2plY3QucmVzb2x2ZUZpbGUoImxpYi9vcHRpb25hbC9qdW5pdC5qYXIiKSk7Ci0gICAgICAgIGMuY3JlYXRlQ2xhc3NwYXRoKHByb2plY3QpLnNldExvY2F0aW9uKHByb2plY3QucmVzb2x2ZUZpbGUoImJvb3RzdHJhcC9saWIvYW50LmphciIpKTsKLSAgICAgICAgcyA9IGMuZ2V0Q29tbWFuZGxpbmUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aXRoIGNsYXNzcGF0aCIsIDYsIHMubGVuZ3RoKTsKLSAgICAgICAgLy8gICAgICAgIGFzc2VydEVxdWFscygid2l0aCBjbGFzc3BhdGgiLCAiamF2YSIsIHNbMF0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIndpdGggY2xhc3NwYXRoIiwgIi1EamF2YS5jb21waWxlcj1OT05FIiwgc1sxXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygid2l0aCBjbGFzc3BhdGgiLCAiLWNsYXNzcGF0aCIsIHNbMl0pOwotICAgICAgICBhc3NlcnQoImp1bml0LmphciBjb250YWluZWQiLCAKLSAgICAgICAgICAgICAgIHNbM10uaW5kZXhPZigianVuaXQuamFyIitqYXZhLmlvLkZpbGUucGF0aFNlcGFyYXRvcikgPj0gMCk7Ci0gICAgICAgIGFzc2VydCgiYW50LmphciBjb250YWluZWQiLCBzWzNdLmVuZHNXaXRoKCJhbnQuamFyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIndpdGggY2xhc3NwYXRoIiwgImp1bml0LnRleHR1aS5UZXN0UnVubmVyIiwgc1s0XSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygid2l0aCBjbGFzc3BhdGgiLCAKLSAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC5Db21tYW5kbGluZUphdmFUZXN0Iiwgc1s1XSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxMjc3NC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LkNvbW1hbmRMaW5lCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZGxpbmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIENvbW1hbmRsaW5lVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5pemVyKCkgewotICAgICAgICBTdHJpbmdbXSBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoIjEgMiAzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2ltcGxlIGNhc2UiLCAzLCBzLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiIisoaSsxKSwgc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZW1wdHkgc3RyaW5nIiwgMCwgcy5sZW5ndGgpOwotCi0gICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZShudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgMCwgcy5sZW5ndGgpOwotCi0gICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiMSBcJzJcJyAzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2ltcGxlIGNhc2Ugd2l0aCBzaW5nbGUgcXVvdGVzIiwgMywgcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZSBxdW90ZXMgaGF2ZSBiZWVuIHN0cmlwcGVkIiwgIjIiLCBzWzFdKTsKLQotICAgICAgICBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoIjEgXCIyXCIgMyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbXBsZSBjYXNlIHdpdGggZG91YmxlIHF1b3RlcyIsIDMsIHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEb3VibGUgcXVvdGVzIGhhdmUgYmVlbiBzdHJpcHBlZCIsICIyIiwgc1sxXSk7Ci0KLSAgICAgICAgcyA9IENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKCIxIFwiMiAzXCIgNCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNhc2Ugd2l0aCBkb3VibGUgcXVvdGVzIGFuZCB3aGl0ZXNwYWNlIiwgMywgcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRvdWJsZSBxdW90ZXMgc3RyaXBwZWQsIHNwYWNlIGluY2x1ZGVkIiwgIjIgMyIsIHNbMV0pOwotICAgICAgICAKLSAgICAgICAgcyA9IENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKCIxIFwiMlwnM1wiIDQiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYXNlIHdpdGggZG91YmxlIHF1b3RlcyBhcm91bmQgc2luZ2xlIHF1b3RlIiwgMywgcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRvdWJsZSBxdW90ZXMgc3RyaXBwZWQsIHNpbmdsZSBxdW90ZSBpbmNsdWRlZCIsICIyXCczIiwKLSAgICAgICAgICAgICAgICAgICAgIHNbMV0pOwotCi0gICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiMSBcJzIgM1wnIDQiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYXNlIHdpdGggc2luZ2xlIHF1b3RlcyBhbmQgd2hpdGVzcGFjZSIsIDMsIHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaW5nbGUgcXVvdGVzIHN0cmlwcGVkLCBzcGFjZSBpbmNsdWRlZCIsICIyIDMiLCBzWzFdKTsKLSAgICAgICAgCi0gICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiMSBcJzJcIjNcJyA0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2FzZSB3aXRoIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGRvdWJsZSBxdW90ZSIsIDMsIHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaW5nbGUgcXVvdGVzIHN0cmlwcGVkLCBkb3VibGUgcXVvdGUgaW5jbHVkZWQiLCAiMlwiMyIsCi0gICAgICAgICAgICAgICAgICAgICBzWzFdKTsKLQotICAgICAgICAvLyBcIGRvZXNuJ3QgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBhbnltb3JlIC0gdGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotICAgICAgICAvLyB3aGF0IHRoZSBVbml4IHNoIGRvZXMgYnV0IGNhdXNlcyBhIGxvdCBvZiBwcm9ibGVtcyBvbiBET1MKLSAgICAgICAgLy8gYmFzZWQgcGxhdGZvcm1zIG90aGVyd2lzZQotICAgICAgICBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoIjEgMlxcIDMgNCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNhc2Ugd2l0aCBxdW90ZWQgd2hpdGVzcGFjZSIsIDQsIHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYWNrc2xhc2ggaW5jbHVkZWQiLCAiMlxcIiwgc1sxXSk7Ci0KLQotICAgICAgICAvLyBub3cgdG8gdGhlIGV4cGVjdGVkIGZhaWx1cmVzCi0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcyA9IENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKCJhIFwnYiBjIik7Ci0gICAgICAgICAgICBmYWlsKCJ1bmJhbGFuY2VkIHNpbmdsZSBxdW90ZXMgdW5kZXRlY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmJhbGFuY2VkIHF1b3RlcyBpbiBhIFwnYiBjIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoImEgXCJiIGMiKTsKLSAgICAgICAgICAgIGZhaWwoInVuYmFsYW5jZWQgZG91YmxlIHF1b3RlcyB1bmRldGVjdGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInVuYmFsYW5jZWQgcXVvdGVzIGluIGEgXCJiIGMiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIENvbW1hbmRsaW5lLnRvU3RyaW5nKG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBDb21tYW5kbGluZS50b1N0cmluZyhudWxsKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMSAyIDMiLCBDb21tYW5kbGluZS50b1N0cmluZyhuZXcgU3RyaW5nW10geyIxIiwgIjIiLCAiMyJ9KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMSBcIjIgM1wiIiwgQ29tbWFuZGxpbmUudG9TdHJpbmcobmV3IFN0cmluZ1tdIHsiMSIsICIyIDMifSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEgXCIyXCczXCIiLCBDb21tYW5kbGluZS50b1N0cmluZyhuZXcgU3RyaW5nW10geyIxIiwgIjJcJzMifSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEgXCcyXCIzXCciLCBDb21tYW5kbGluZS50b1N0cmluZyhuZXcgU3RyaW5nW10geyIxIiwgIjJcIjMifSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZVRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1NGYxMC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotLyoqCi0gKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQuRW51bWVyYXRlZEF0dHJpYnV0ZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEVudW1lcmF0ZWRBdHRyaWJ1dGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZXhwZWN0ZWQgPSB7ImEiLCAiYiIsICJjIn07Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRlZEF0dHJpYnV0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLSAgICAgICAgRW51bWVyYXRlZEF0dHJpYnV0ZSB0MSA9IG5ldyBUZXN0Tm9ybWFsKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxleHBlY3RlZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0KGV4cGVjdGVkW2ldKyIgaXMgaW4gVGVzdE5vcm1hbCIsCi0gICAgICAgICAgICAgICAgICAgdDEuY29udGFpbnNWYWx1ZShleHBlY3RlZFtpXSkpOwotICAgICAgICAgICAgYXNzZXJ0KGV4cGVjdGVkW2ldLnRvVXBwZXJDYXNlKCkrIiBpcyBpbiBUZXN0Tm9ybWFsIiwKLSAgICAgICAgICAgICAgICAgICAhdDEuY29udGFpbnNWYWx1ZShleHBlY3RlZFtpXS50b1VwcGVyQ2FzZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KCJUZXN0Tm9ybWFsIGRvZXNuXCd0IGhhdmUgXCJkXCIgYXR0cmlidXRlIiwKLSAgICAgICAgICAgICAgICF0MS5jb250YWluc1ZhbHVlKCJkIikpOwotICAgICAgICBhc3NlcnQoIlRlc3ROdWxsIGRvZXNuXCd0IGhhdmUgXCJkXCIgYXR0cmlidXRlIGFuZCBkb2VzblwndCBkaWUiLAotICAgICAgICAgICAgICAgIShuZXcgVGVzdE51bGwoKSkuY29udGFpbnNWYWx1ZSgiZCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9ucygpIHsKLSAgICAgICAgRW51bWVyYXRlZEF0dHJpYnV0ZSB0MSA9IG5ldyBUZXN0Tm9ybWFsKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxleHBlY3RlZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0MS5zZXRWYWx1ZShleHBlY3RlZFtpXSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGZvciB2YWx1ZSAiK2V4cGVjdGVkW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdDEuc2V0VmFsdWUoImQiKTsKLSAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBmb3IgdmFsdWUgXCJkXCIiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgKG5ldyBUZXN0TnVsbCgpKS5zZXRWYWx1ZSgiZCIpOwotICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGZvciB2YWx1ZSBcImRcIiBpbiBUZXN0TnVsbCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgb3RoZXIpIHsKLSAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZGVhdGggb2YgVGVzdE51bGw6ICIrb3RoZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE5vcm1hbCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TnVsbCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVMaXN0VGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhYTdiOC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVMaXN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZUxpc3QuCi0gKgotICogPHA+VGhpcyBkb2Vzbid0IGFjdHVhbGx5IHRlc3QgbXVjaCwgbWFpbmx5IHJlZmVyZW5jZSBoYW5kbGluZy4KLSAqIEFkYXB0ZWQgZnJvbSBGaWxlU2V0VGVzdC48L3A+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3N0cm9uZ0BhcmllbHBhcnRuZXJzLmNvbSI+Q3JhZWcgU3Ryb25nPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBGaWxlTGlzdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyBGaWxlTGlzdFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoIi4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZSgpIHsKLSAgICAgICAgRmlsZUxpc3QgZiA9IG5ldyBGaWxlTGlzdCgpOwotICAgICAgICBmLnNldERpcihwcm9qZWN0LnJlc29sdmVGaWxlKCIuIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIEZpbGVMaXN0IHdpdGggZGlyZWN0b3J5IGF0dHJpYnV0ZSBzZXQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gbmV3IEZpbGVMaXN0KCk7Ci0gICAgICAgIGYuc2V0RmlsZXMoImZvby54bWwsYy9kL2Jhci54bWwiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXlyZWYiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBGaWxlTGlzdCB3aXRoIGZpbGUgYXR0cmlidXRlIHNldC4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGYgPSBuZXcgRmlsZUxpc3QoKTsKLSAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teXJlZiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0RmlsZXMoImEvYi9mb28uamF2YSIpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBmaWxlcyBpbiBGaWxlTGlzdCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldERpcihwcm9qZWN0LnJlc29sdmVGaWxlKCIuIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBkaXIgaW4gRmlsZUxpc3QgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDaXJjdWxhclJlZmVyZW5jZUNoZWNrKCkgewotICAgICAgICBGaWxlTGlzdCBmID0gbmV3IEZpbGVMaXN0KCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teSIsIGYpOwotICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15IikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5nZXREaXIocHJvamVjdCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBGaWxlTGlzdCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5nZXRGaWxlcyhwcm9qZWN0KTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIEZpbGVMaXN0IGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAtLT4gZHVtbXkxCi0gICAgICAgIEZpbGVMaXN0IGYxID0gbmV3IEZpbGVMaXN0KCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBmMSk7Ci0gICAgICAgIGYxLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15MiIpKTsKLSAgICAgICAgRmlsZUxpc3QgZjIgPSBuZXcgRmlsZUxpc3QoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIGYyKTsKLSAgICAgICAgZjIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkzIikpOwotICAgICAgICBGaWxlTGlzdCBmMyA9IG5ldyBGaWxlTGlzdCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgZjMpOwotICAgICAgICBmMy5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teTEiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmMS5nZXREaXIocHJvamVjdCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZjEuZ2V0RmlsZXMocHJvamVjdCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgCi0gICAgICAgIC8vICh3aGljaCBoYXMgdGhlIFByb2plY3QncyBiYXNlZGlyIGFzIHJvb3QpLgotICAgICAgICBmMSA9IG5ldyBGaWxlTGlzdCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgZjEpOwotICAgICAgICBmMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teTIiKSk7Ci0gICAgICAgIGYyID0gbmV3IEZpbGVMaXN0KCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBmMik7Ci0gICAgICAgIGYyLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15MyIpKTsKLSAgICAgICAgZjMgPSBuZXcgRmlsZUxpc3QoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIGYzKTsKLSAgICAgICAgZjMuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7Ci0gICAgICAgIEZpbGUgZGlyID0gZjEuZ2V0RGlyKHByb2plY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRpciBpcyBiYXNlZGlyIiwgZGlyLCBwcm9qZWN0LmdldEJhc2VEaXIoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0VGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWVkYmU0Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZVNldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQuCi0gKgotICogPHA+VGhpcyBkb2Vzbid0IGFjdHVhbGx5IHRlc3QgbXVjaCwgbWFpbmx5IHJlZmVyZW5jZSBoYW5kbGluZy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEZpbGVTZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwdWJsaWMgRmlsZVNldFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoIi4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZSgpIHsKLSAgICAgICAgRmlsZVNldCBmID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgZi5zZXRJbmNsdWRlcygiKiovKi5qYXZhIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gRmlsZVNldCB3aXRoIGVsZW1lbnRzIGZyb20gc2V0SW5jbHVkZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGYgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICBmLmNyZWF0ZVBhdHRlcm5TZXQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXlyZWYiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBGaWxlU2V0IHdpdGggbmVzdGVkIHBhdHRlcm5zZXQgZWxlbWVudC4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgZi5jcmVhdGVJbmNsdWRlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gRmlsZVNldCB3aXRoIG5lc3RlZCBpbmNsdWRlIGVsZW1lbnQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teXJlZiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0SW5jbHVkZXMoIioqLyouamF2YSIpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBpbmNsdWRlcyBpbiBGaWxlU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0SW5jbHVkZXNmaWxlKG5ldyBGaWxlKCIvYSIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgaW5jbHVkZXNmaWxlIGluIEZpbGVTZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRFeGNsdWRlcygiKiovKi5qYXZhIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGV4Y2x1ZGVzIGluIEZpbGVTZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRFeGNsdWRlc2ZpbGUobmV3IEZpbGUoIi9hIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBleGNsdWRlc2ZpbGUgaW4gRmlsZVNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldERpcihwcm9qZWN0LnJlc29sdmVGaWxlKCIuIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBkaXIgaW4gRmlsZVNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLmNyZWF0ZUluY2x1ZGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGluY2x1ZGUgaW4gRmlsZVNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5jcmVhdGVFeGNsdWRlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBleGNsdWRlIGluIEZpbGVTZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuY3JlYXRlSW5jbHVkZXNGaWxlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBpbmNsdWRlc2ZpbGUgaW4gRmlsZVNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5jcmVhdGVFeGNsdWRlc0ZpbGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGV4Y2x1ZGVzZmlsZSBpbiBGaWxlU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLmNyZWF0ZVBhdHRlcm5TZXQoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIHBhdHRlcm5zZXQgaW4gRmlsZVNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDaXJjdWxhclJlZmVyZW5jZUNoZWNrKCkgewotICAgICAgICBGaWxlU2V0IGYgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBmKTsKLSAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuZ2V0RGlyKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgRmlsZVNldCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgRmlsZVNldCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgLS0+IGR1bW15MQotICAgICAgICBGaWxlU2V0IGYxID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIGYxKTsKLSAgICAgICAgZjEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkyIikpOwotICAgICAgICBGaWxlU2V0IGYyID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIGYyKTsKLSAgICAgICAgZjIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkzIikpOwotICAgICAgICBGaWxlU2V0IGYzID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIGYzKTsKLSAgICAgICAgZjMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkxIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZjEuZ2V0RGlyKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYxLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgCi0gICAgICAgIC8vICh3aGljaCBoYXMgdGhlIFByb2plY3QncyBiYXNlZGlyIGFzIHJvb3QpLgotICAgICAgICBmMSA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBmMSk7Ci0gICAgICAgIGYxLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15MiIpKTsKLSAgICAgICAgZjIgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgZjIpOwotICAgICAgICBmMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teTMiKSk7Ci0gICAgICAgIGYzID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIGYzKTsKLSAgICAgICAgZjMuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7Ci0gICAgICAgIEZpbGUgZGlyID0gZjEuZ2V0RGlyKHByb2plY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRpZSBpcyBiYXNlZGlyIiwgZGlyLCBwcm9qZWN0LmdldEJhc2VEaXIoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJTZXRUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYzEyZC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UYXNrZGVmc1Rlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEZpbHRlclNldCB0ZXN0aW5nCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y29ub3JAYXBhY2hlLm9yZyI+Q29ub3IgTWFjTmVpbGw8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJTZXRUZXN0IGV4dGVuZHMgVGFza2RlZnNUZXN0IHsKLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBCVUZfU0laRSA9IDMyNzY4OwotICAgIAotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHVibGljIEZpbHRlclNldFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7IAotICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXQueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IAotICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICBhc3NlcnRUcnVlKCJGaWx0ZXJzZXQgMSBmYWlsZWQiLCBjb21wYXJlRmlsZXMoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2dvbGQvZmlsdGVyc2V0MS50eHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc3QxLnR4dCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsgCi0gICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgIGFzc2VydFRydWUoIkZpbHRlcnNldCAyIGZhaWxlZCIsIGNvbXBhcmVGaWxlcygic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQyLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzdDIudHh0IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeyAKLSAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsdGVyc2V0IDMgZmFpbGVkIiwgY29tcGFyZUZpbGVzKCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDMudHh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXN0My50eHQiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVGaWxlcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotICAgICAgICBGaWxlIGZpbGUxID0gbmV3IEZpbGUobmFtZTEpOwotICAgICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUobmFtZTIpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghZmlsZTEuZXhpc3RzKCkgfHwgIWZpbGUyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPbmUgb3IgYm90aCBmaWxlcyBkbyBub3QgZXhpc3Q6IiArIG5hbWUxICsgIiwgIiArIG5hbWUyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChmaWxlMS5sZW5ndGgoKSAhPSBmaWxlMi5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBzaXplIG1pc21hdGNoOiIgKyBuYW1lMSArICIoIiArIGZpbGUxLmxlbmd0aCgpICsgIiksICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTIgICsgIigiICsgZmlsZTIubGVuZ3RoKCkgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYnl0ZSAtIGJ5dGUgY29tcGFyZQotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlcjEgPSBuZXcgYnl0ZVtCVUZfU0laRV07Ci0gICAgICAgICAgICBieXRlW10gYnVmZmVyMiA9IG5ldyBieXRlW0JVRl9TSVpFXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpczEgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMyID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMik7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgaW50IHJlYWQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gZmlzMS5yZWFkKGJ1ZmZlcjEpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGZpczIucmVhZChidWZmZXIyKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlYWQ7ICsraSwgKytpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyMVtpXSAhPSBidWZmZXIyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ5dGVzIG1pc21hdGNoOiIgKyBuYW1lMSArICIsICIgKyBuYW1lMiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYXQgYnl0ZSAiICsgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSU9FeGNlcHRpb24gY29tcGFyaW5nIGZpbGVzOiAiICsgbmFtZTEgKyAiLCAiICsgbmFtZTIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9NYXBwZXJUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhNTk5ZS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFza2RlZnNUZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLQotcHVibGljIGNsYXNzIE1hcHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyBNYXBwZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKCIuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudElmSXNSZWZlcmVuY2UoKSB7Ci0gICAgICAgIE1hcHBlciBtID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKLSAgICAgICAgbS5zZXRGcm9tKCIqLmphdmEiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXlyZWYiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBNYXBwZXIgd2l0aCBmcm9tIGF0dHJpYnV0ZSBzZXQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG0gPSBuZXcgTWFwcGVyKHByb2plY3QpOwotICAgICAgICBtLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbS5zZXRGcm9tKCIqLmphdmEiKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgZnJvbSBpbiBNYXBwZXIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG0gPSBuZXcgTWFwcGVyKHByb2plY3QpOwotICAgICAgICBtLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbS5zZXRUbygiKi5qYXZhIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IHRvIGluIE1hcHBlciB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXBwZXIuTWFwcGVyVHlwZSBtdCA9IG5ldyBNYXBwZXIuTWFwcGVyVHlwZSgpOwotICAgICAgICAgICAgbXQuc2V0VmFsdWUoImdsb2IiKTsKLSAgICAgICAgICAgIG0uc2V0VHlwZShtdCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IHR5cGUgaW4gTWFwcGVyIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKLSAgICAgICAgTWFwcGVyIG0gPSBuZXcgTWFwcGVyKHByb2plY3QpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBtKTsKLSAgICAgICAgbS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG0uZ2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIE1hcHBlciBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgLS0+IGR1bW15MQotICAgICAgICBNYXBwZXIgbTEgPSBuZXcgTWFwcGVyKHByb2plY3QpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgbTEpOwotICAgICAgICBtMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teTIiKSk7Ci0gICAgICAgIE1hcHBlciBtMiA9IG5ldyBNYXBwZXIocHJvamVjdCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBtMik7Ci0gICAgICAgIG0yLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15MyIpKTsKLSAgICAgICAgTWFwcGVyIG0zID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIG0zKTsKLSAgICAgICAgbTMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkxIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbTEuZ2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAKLSAgICAgICAgLy8gKHdoaWNoIGhvbGRzIGEgZ2xvYiBtYXBwZXIgZnJvbSAiKi5qYXZhIiB0byAiKi5jbGFzcyIKLSAgICAgICAgbTEgPSBuZXcgTWFwcGVyKHByb2plY3QpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgbTEpOwotICAgICAgICBtMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teTIiKSk7Ci0gICAgICAgIG0yID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIG0yKTsKLSAgICAgICAgbTIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkzIikpOwotICAgICAgICBtMyA9IG5ldyBNYXBwZXIocHJvamVjdCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBtMyk7Ci0gICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIG10ID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7Ci0gICAgICAgIG10LnNldFZhbHVlKCJnbG9iIik7Ci0gICAgICAgIG0zLnNldFR5cGUobXQpOwotICAgICAgICBtMy5zZXRGcm9tKCIqLmphdmEiKTsKLSAgICAgICAgbTMuc2V0VG8oIiouY2xhc3MiKTsKLSAgICAgICAgRmlsZU5hbWVNYXBwZXIgZm1tID0gbTEuZ2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgYXNzZXJ0KCJzaG91bGQgYmUgZ2xvYiIsIGZtbSBpbnN0YW5jZW9mIEdsb2JQYXR0ZXJuTWFwcGVyKTsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gZm1tLm1hcEZpbGVOYW1lKCJhLmphdmEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLmphdmEgc2hvdWxkIG1hdGNoIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYS5jbGFzcyIsIHJlc3VsdFswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvcHlUYXNrV2l0aFR3b0ZpbGVzZXRzKCkgewotICAgICAgICBUYXNrZGVmRm9yQ29weVRlc3QgdCA9IG5ldyBUYXNrZGVmRm9yQ29weVRlc3QoInRlc3QxIik7Ci0gICAgICAgIHQuc2V0VXAoKTsKLSAgICAgICAgdC50ZXN0MSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVGFza2RlZkZvckNvcHlUZXN0IGV4dGVuZHMgVGFza2RlZnNUZXN0IHsKLSAgICAgICAgVGFza2RlZkZvckNvcHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeyAKLSAgICAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlci54bWwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeyAKLSAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdGhUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdGhUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTNmYjQuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aAotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLQotcHVibGljIGNsYXNzIFBhdGhUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5peFN0eWxlID0gRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciA9PSAnOic7Ci0KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyBQYXRoVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7Ci0gICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigiLiIpOwotICAgIH0KLQotICAgIC8vIGFjdHVhbGx5IHRlc3RzIGNvbnN0cnVjdG9yIGFzIHdlbGwgYXMgc2V0UGF0aAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIi9hOi9iIik7Ci0gICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28gaXRlbXMsIFVuaXggc3R5bGUiLCAyLCBsLmxlbmd0aCk7Ci0gICAgICAgIGlmIChpc1VuaXhTdHlsZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYSIsIGxbMF0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIGxbMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI6XFxhIiwgbFswXS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI6XFxiIiwgbFsxXS5zdWJzdHJpbmcoMSkpOwotICAgICAgICB9ICAgICAgICAKLQotICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgIlxcYTtcXGIiKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInR3byBpdGVtcywgRE9TIHN0eWxlIiwgMiwgbC5sZW5ndGgpOwotICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiL2EiLCBsWzBdKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiL2IiLCBsWzFdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiOlxcYSIsIGxbMF0uc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiOlxcYiIsIGxbMV0uc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgfSAgICAgICAgCi0KLSAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsICJcXGE7XFxiOi9jIik7Ci0gICAgICAgIGwgPSBwLmxpc3QoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHJlZSBpdGVtcywgbWl4ZWQgc3R5bGUiLCAzLCBsLmxlbmd0aCk7Ci0gICAgICAgIGlmIChpc1VuaXhTdHlsZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYSIsIGxbMF0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIGxbMV0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYyIsIGxbMl0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI6XFxhIiwgbFswXS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI6XFxiIiwgbFsxXS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI6XFxjIiwgbFsyXS5zdWJzdHJpbmcoMSkpOwotICAgICAgICB9ICAgICAgICAKLQotICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgImM6XFx0ZXN0Iik7Ci0gICAgICAgIGwgPSBwLmxpc3QoKTsKLSAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGRyaXZlcyBvbiBVbml4IiwgMiwgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0KCJjIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsIAotICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIi9jIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGVzdCIsIGxbMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkcml2ZXMgb24gRE9TIiwgMSwgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgImM6L3Rlc3QiKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gZHJpdmVzIG9uIFVuaXgiLCAyLCBsLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnQoImMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwgCi0gICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiL2MiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi90ZXN0IiwgbFsxXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRyaXZlcyBvbiBET1MiLCAxLCBsLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMb2NhdGlvbigpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoRmlsZS5zZXBhcmF0b3JDaGFyKyJhIikpOwotICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7Ci0gICAgICAgIGlmIChpc1VuaXhTdHlsZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiL2EiLCBsWzBdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjpcXGEiLCBsWzBdLnN1YnN0cmluZygxKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kaW5nKCkgewotICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiL2E6L2IiKTsKLSAgICAgICAgU3RyaW5nW10gbCA9IHAubGlzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIgYWZ0ZXIgY29uc3RydWN0aW9uIiwgMiwgbC5sZW5ndGgpOwotICAgICAgICBwLnNldExvY2F0aW9uKG5ldyBGaWxlKCIvYyIpKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjMgYWZ0ZXIgc2V0TG9jYXRpb24iLCAzLCBsLmxlbmd0aCk7Ci0gICAgICAgIHAuc2V0UGF0aCgiXFxkO1xcZSIpOwotICAgICAgICBsID0gcC5saXN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNSBhZnRlciBzZXRQYXRoIiwgNSwgbC5sZW5ndGgpOwotICAgICAgICBwLmFwcGVuZChuZXcgUGF0aChwcm9qZWN0LCAiXFxmIikpOwotICAgICAgICBsID0gcC5saXN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNiBhZnRlciBhcHBlbmQiLCA2LCBsLmxlbmd0aCk7Ci0gICAgICAgIHAuY3JlYXRlUGF0aCgpLnNldExvY2F0aW9uKG5ldyBGaWxlKCIvZyIpKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjcgYWZ0ZXIgYXBwZW5kIiwgNywgbC5sZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB5UGF0aCgpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIiIpOwotICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMCBhZnRlciBjb25zdHJ1Y3Rpb24iLCAwLCBsLmxlbmd0aCk7Ci0gICAgICAgIHAuc2V0UGF0aCgiIik7Ci0gICAgICAgIGwgPSBwLmxpc3QoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIGFmdGVyIHNldFBhdGgiLCAwLCBsLmxlbmd0aCk7Ci0gICAgICAgIHAuYXBwZW5kKG5ldyBQYXRoKHByb2plY3QpKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAgYWZ0ZXIgYXBwZW5kIiwgMCwgbC5sZW5ndGgpOwotICAgICAgICBwLmNyZWF0ZVBhdGgoKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAgYWZ0ZXIgYXBwZW5kIiwgMCwgbC5sZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlxdWUoKSB7Ci0gICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QsICIvYTovYSIpOwotICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMSBhZnRlciBjb25zdHJ1Y3Rpb24iLCAxLCBsLmxlbmd0aCk7Ci0gICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoRmlsZS5zZXBhcmF0b3JDaGFyKyJhIikpOwotICAgICAgICBsID0gcC5saXN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMSBhZnRlciBzZXRMb2NhdGlvbiIsIDEsIGwubGVuZ3RoKTsKLSAgICAgICAgcC5zZXRQYXRoKCJcXGE7L2EiKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEgYWZ0ZXIgc2V0UGF0aCIsIDEsIGwubGVuZ3RoKTsKLSAgICAgICAgcC5hcHBlbmQobmV3IFBhdGgocHJvamVjdCwgIi9hO1xcYTpcXGEiKSk7Ci0gICAgICAgIGwgPSBwLmxpc3QoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIGFmdGVyIGFwcGVuZCIsIDEsIGwubGVuZ3RoKTsKLSAgICAgICAgcC5jcmVhdGVQYXRoKCkuc2V0UGF0aCgiXFxhOi9hIik7Ci0gICAgICAgIGwgPSBwLmxpc3QoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIGFmdGVyIGFwcGVuZCIsIDEsIGwubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZSgpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIi9hOi9hIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gUGF0aCB3aXRoIGVsZW1lbnRzIGZyb20gY29uc3RydWN0b3IiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgcC5zZXRMb2NhdGlvbihuZXcgRmlsZSgiL2EiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gUGF0aCB3aXRoIGVsZW1lbnRzIGZyb20gc2V0TG9jYXRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teXJlZiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoIi9hIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBsb2NhdGlvbiBpbiBQYXRoIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRQYXRoKCIvYTtcXGEiKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgcGF0aCBpbiBQYXRoIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5jcmVhdGVQYXRoKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gY3JlYXRlIG5lc3RlZCBQYXRoIGluIFBhdGggdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5jcmVhdGVQYXRoRWxlbWVudCgpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGNyZWF0ZSBuZXN0ZWQgUGF0aEVsZW1lbnQgaW4gUGF0aCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmFkZEZpbGVzZXQobmV3IEZpbGVTZXQoKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBGaWxlU2V0IGluIFBhdGggdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teSIsIHApOwotICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15IikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5saXN0KCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBQYXRoIGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAtLT4gZHVtbXkxCi0gICAgICAgIFBhdGggcDEgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIHAxKTsKLSAgICAgICAgUGF0aCBwMiA9IHAxLmNyZWF0ZVBhdGgoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIHAyKTsKLSAgICAgICAgUGF0aCBwMyA9IHAyLmNyZWF0ZVBhdGgoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIHAzKTsKLSAgICAgICAgcDMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkxIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcDEubGlzdCgpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1teTEgLS0+IGR1bW15MiAtLT4gZHVtbXkzICh3aXRoIFBhdGggIi9hIikKLSAgICAgICAgcDEgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIHAxKTsKLSAgICAgICAgcDIgPSBwMS5jcmVhdGVQYXRoKCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBwMik7Ci0gICAgICAgIHAzID0gcDIuY3JlYXRlUGF0aCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgcDMpOwotICAgICAgICBwMy5zZXRMb2NhdGlvbihuZXcgRmlsZSgiL2EiKSk7Ci0gICAgICAgIFN0cmluZ1tdIGwgPSBwMS5saXN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiT25lIGVsZW1lbnQgYnVyaWVkIGRlZXAgaW5zaWRlIGEgbmVzdGVkIHBhdGggc3RydWN0dXJlIiwKLSAgICAgICAgICAgICAgICAgICAgIDEsIGwubGVuZ3RoKTsKLSAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9hIiwgbFswXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjpcXGEiLCBsWzBdLnN1YnN0cmluZygxKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0dGVyblNldFRlc3QuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0dGVyblNldFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkOTQ0ZS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdHRlcm5TZXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0LgotICoKLSAqIDxwPlRoaXMgZG9lc24ndCBhY3R1YWxseSB0ZXN0IG11Y2gsIG1haW5seSByZWZlcmVuY2UgaGFuZGxpbmcuPC9wPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLQotcHVibGljIGNsYXNzIFBhdHRlcm5TZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwdWJsaWMgUGF0dGVyblNldFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoIi4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZSgpIHsKLSAgICAgICAgUGF0dGVyblNldCBwID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcC5zZXRJbmNsdWRlcygiKiovKi5qYXZhIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gUGF0dGVyblNldCB3aXRoIGVsZW1lbnRzIGZyb20gc2V0SW5jbHVkZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHAgPSBuZXcgUGF0dGVyblNldCgpOwotICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRJbmNsdWRlcygiKiovKi5qYXZhIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGluY2x1ZGVzIGluIFBhdHRlcm5TZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHAgPSBuZXcgUGF0dGVyblNldCgpOwotICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15cmVmIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRJbmNsdWRlc2ZpbGUobmV3IEZpbGUoIi9hIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBpbmNsdWRlc2ZpbGUgaW4gUGF0dGVyblNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLnNldEV4Y2x1ZGVzKCIqKi8qLmphdmEiKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgZXhjbHVkZXMgaW4gUGF0dGVyblNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLnNldEV4Y2x1ZGVzZmlsZShuZXcgRmlsZSgiL2EiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGV4Y2x1ZGVzZmlsZSBpbiBQYXR0ZXJuU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAuY3JlYXRlSW5jbHVkZSgpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgaW5jbHVkZSBpbiBQYXR0ZXJuU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmNyZWF0ZUV4Y2x1ZGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGV4Y2x1ZGUgaW4gUGF0dGVyblNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5jcmVhdGVJbmNsdWRlc0ZpbGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGluY2x1ZGVzZmlsZSBpbiBQYXR0ZXJuU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmNyZWF0ZUV4Y2x1ZGVzRmlsZSgpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgZXhjbHVkZXNmaWxlIGluIFBhdHRlcm5TZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKLSAgICAgICAgUGF0dGVyblNldCBwID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15IiwgcCk7Ci0gICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmdldEluY2x1ZGVQYXR0ZXJucyhwcm9qZWN0KTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIFBhdHRlcm5TZXQgYSBSZWZlcmVuY2UgdG8gaXRzZWxmLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgUGF0dGVyblNldCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgLS0+IGR1bW15MQotICAgICAgICBQYXR0ZXJuU2V0IHAxID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIHAxKTsKLSAgICAgICAgcDEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkyIikpOwotICAgICAgICBQYXR0ZXJuU2V0IHAyID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIHAyKTsKLSAgICAgICAgcDIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkzIikpOwotICAgICAgICBQYXR0ZXJuU2V0IHAzID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIHAzKTsKLSAgICAgICAgcDMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZSgiZHVtbXkxIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcDEuZ2V0SW5jbHVkZVBhdHRlcm5zKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAxLmdldEV4Y2x1ZGVQYXR0ZXJucyhwcm9qZWN0KTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAKLSAgICAgICAgLy8gKHdoaWNoIGhvbGRzIHBhdHRlcm5zICJpbmNsdWRlIiBhbmQgImV4Y2x1ZGUiKQotICAgICAgICBwMSA9IG5ldyBQYXR0ZXJuU2V0KCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBwMSk7Ci0gICAgICAgIHAxLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoImR1bW15MiIpKTsKLSAgICAgICAgcDIgPSBuZXcgUGF0dGVyblNldCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgcDIpOwotICAgICAgICBwMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKCJkdW1teTMiKSk7Ci0gICAgICAgIHAzID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIHAzKTsKLSAgICAgICAgcDMuc2V0SW5jbHVkZXMoImluY2x1ZGUiKTsKLSAgICAgICAgcDMuY3JlYXRlRXhjbHVkZSgpLnNldE5hbWUoImV4Y2x1ZGUiKTsKLSAgICAgICAgU3RyaW5nW10gaSA9IHAxLmdldEluY2x1ZGVQYXR0ZXJucyhwcm9qZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJPbmUgaW5jbHVkZSBwYXR0ZXJuIGJ1cmllZCBkZWVwIGluc2lkZSBhIG5lc3RlZCBwYXR0ZXJuc2V0IHN0cnVjdHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAxLCBpLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW5jbHVkZSIsIGlbMF0pOwotICAgICAgICBpID0gcDMuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk9uZSBleGNsdWRlIHBhdHRlcm4gYnVyaWVkIGRlZXAgaW5zaWRlIGEgbmVzdGVkIHBhdHRlcm5zZXQgc3RydWN0dXJlIiwKLSAgICAgICAgICAgICAgICAgICAgIDEsIGkubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGNsdWRlIiwgaVswXSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RPTUVsZW1lbnRXcml0ZXJUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5MGViYi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5ET01FbGVtZW50V3JpdGVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBET01FbGVtZW50V3JpdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRE9NRWxlbWVudFdyaXRlciB3ID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKTsKLQotICAgIHB1YmxpYyBET01FbGVtZW50V3JpdGVyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2UoKSB7Ci0gICAgICAgIGFzc2VydCgiJiMyMDsiLCB3LmlzUmVmZXJlbmNlKCImIzIwOyIpKTsKLSAgICAgICAgYXNzZXJ0KCImI3gyMDsiLCB3LmlzUmVmZXJlbmNlKCImI3gyMDsiKSk7Ci0gICAgICAgIGFzc2VydCgiJiN4QTA7Iiwgdy5pc1JlZmVyZW5jZSgiJiN4QTA7IikpOwotICAgICAgICBhc3NlcnQoIiYjQTA7IiwgIXcuaXNSZWZlcmVuY2UoIiYjQTA7IikpOwotICAgICAgICBhc3NlcnQoIjIwOyIsICF3LmlzUmVmZXJlbmNlKCIyMDsiKSk7Ci0gICAgICAgIGFzc2VydCgiJiMyMCIsICF3LmlzUmVmZXJlbmNlKCImIzIwIikpOwotICAgICAgICBhc3NlcnQoIiZxdW90OyIsIHcuaXNSZWZlcmVuY2UoIiZxdW90OyIpKTsKLSAgICAgICAgYXNzZXJ0KCImYXBvczsiLCB3LmlzUmVmZXJlbmNlKCImYXBvczsiKSk7Ci0gICAgICAgIGFzc2VydCgiJmd0OyIsIHcuaXNSZWZlcmVuY2UoIiZndDsiKSk7Ci0gICAgICAgIGFzc2VydCgiJmx0OyIsIHcuaXNSZWZlcmVuY2UoIiZsdDsiKSk7Ci0gICAgICAgIGFzc2VydCgiJmFtcDsiLCB3LmlzUmVmZXJlbmNlKCImYW1wOyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIiYjMjA7Iiwgdy5lbmNvZGUoIiYjMjA7IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiYjeDIwOyIsIHcuZW5jb2RlKCImI3gyMDsiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiJiN4QTA7Iiwgdy5lbmNvZGUoIiYjeEEwOyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCImYW1wOyNBMDsiLCB3LmVuY29kZSgiJiNBMDsiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjA7Iiwgdy5lbmNvZGUoIjIwOyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCImYW1wOyMyMCIsIHcuZW5jb2RlKCImIzIwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiZxdW90OyIsIHcuZW5jb2RlKCImcXVvdDsiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiJmFwb3M7Iiwgdy5lbmNvZGUoIiZhcG9zOyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCImZ3Q7Iiwgdy5lbmNvZGUoIiZndDsiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiJmx0OyIsIHcuZW5jb2RlKCImbHQ7IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiZhbXA7Iiwgdy5lbmNvZGUoIiZhbXA7IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiZxdW90OyIsIHcuZW5jb2RlKCJcIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCImbHQ7Iiwgdy5lbmNvZGUoIjwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiJmFtcDsiLCB3LmVuY29kZSgiJiIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzNjk5Zi4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi0vKioKLSAqIFRlc3RzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlscy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRmlsZVV0aWxzIGZ1OwotICAgIHByaXZhdGUgRmlsZSByZW1vdmVUaGlzOwotICAgIHByaXZhdGUgU3RyaW5nIHJvb3Q7Ci0KLSAgICBwdWJsaWMgRmlsZVV0aWxzVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgZnUgPSBGaWxlVXRpbHMubmV3RmlsZVV0aWxzKCk7Ci0gICAgICAgIC8vIFdpbmRvd3MgYWRkcyB0aGUgZHJpdmUgbGV0dGVyIGluIHVwcGVyY2FzZSwgdW5sZXNzIHlvdSBydW4gQ3lnbnVzCi0gICAgICAgIHJvb3QgPSBuZXcgRmlsZShGaWxlLnNlcGFyYXRvcikuZ2V0QWJzb2x1dGVQYXRoKCkudG9VcHBlckNhc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgaWYgKHJlbW92ZVRoaXMgIT0gbnVsbCAmJiByZW1vdmVUaGlzLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZW1vdmVUaGlzLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldExhc3RNb2RpZmllZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlbW92ZVRoaXMgPSBuZXcgRmlsZSgiZHVtbXkiKTsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShyZW1vdmVUaGlzKTsKLSAgICAgICAgZm9zLndyaXRlKG5ldyBieXRlWzBdKTsKLSAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgIGxvbmcgbW9kVGltZSA9IHJlbW92ZVRoaXMubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgIGFzc2VydFRydWUobW9kVGltZSAhPSAwKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTbGVlcCBmb3Igc29tZSB0aW1lIHRvIG1ha2Ugc3VyZSBhIHRvdWNoZWQgZmlsZSB3b3VsZCBnZXQgYQotICAgICAgICAgKiBtb3JlIHJlY2VudCB0aW1lc3RhbXAgYWNjb3JkaW5nIHRvIHRoZSBmaWxlIHN5c3RlbSdzCi0gICAgICAgICAqIGdyYW51bGFyaXR5IChzaG91bGQgYmUgPiAycyB0byBhY2NvdW50IGZvciBXaW5kb3dzIEZBVCkuCi0gICAgICAgICAqLwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1LnNldEZpbGVMYXN0TW9kaWZpZWQocmVtb3ZlVGhpcywgLTEpOwotICAgICAgICBsb25nIHNlY29uZE1vZFRpbWUgPSByZW1vdmVUaGlzLmxhc3RNb2RpZmllZCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlRocmVhZExvY2FsIik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNlY29uZE1vZFRpbWUgPiBtb2RUaW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBKREsgMS4xCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9kVGltZSwgc2Vjb25kTW9kVGltZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgZnUuc2V0RmlsZUxhc3RNb2RpZmllZChyZW1vdmVUaGlzLCAxMjM0NTYpOwotICAgICAgICBsb25nIHRoaXJkTW9kVGltZSA9IHJlbW92ZVRoaXMubGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuVGhyZWFkTG9jYWwiKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJIHdvdWxkIGxvdmUgdG8gY29tcGFyZSB0aGlzIHdpdGggMTIzNDU2LCBidXQgZGVwZW5kaW5nIG9uCi0gICAgICAgICAgICAgKiB0aGUgZmlsZXN5c3RlbXMgZ3JhbnVsYXJpdHkgaXQgY2FuIHRha2UgYW4gYXJiaXRyYXJ5IHZhbHVlLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEp1c3QgYXNzZXJ0IHRoZSB0aW1lIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRoaXJkTW9kVGltZSAhPSBzZWNvbmRNb2RUaW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBKREsgMS4xCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9kVGltZSwgdGhpcmRNb2RUaW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRmlsZSgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogU3RhcnQgd2l0aCBzaW1wbGUgYWJzb2x1dGUgZmlsZSBuYW1lcy4KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwgCi0gICAgICAgICAgICAgICAgICAgICBmdS5yZXNvbHZlRmlsZShudWxsLCAiLyIpLmdldFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwgCi0gICAgICAgICAgICAgICAgICAgICBmdS5yZXNvbHZlRmlsZShudWxsLCAiXFwiKS5nZXRQYXRoKCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIHRocm93IGluIGRyaXZlIGxldHRlcnMKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwgCi0gICAgICAgICAgICAgICAgICAgICBmdS5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiLyIpLmdldFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLCAKLSAgICAgICAgICAgICAgICAgICAgIGZ1LnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICJcXCIpLmdldFBhdGgoKSk7Ci0gICAgICAgIFN0cmluZyBkcml2ZVNwZWNMb3dlciA9ICJjOiI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLCAKLSAgICAgICAgICAgICAgICAgICAgIGZ1LnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlY0xvd2VyICsgIi8iKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwgCi0gICAgICAgICAgICAgICAgICAgICBmdS5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWNMb3dlciArICJcXCIpLmdldFBhdGgoKSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIHByb21pc2VkIHRvIGVsaW1pbmF0ZSBjb25zZWN1dGl2ZSBzbGFzaGVzIGFmdGVyIGRyaXZlIGxldHRlci4KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLCAKLSAgICAgICAgICAgICAgICAgICAgIGZ1LnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICIvLy8vLyIpLmdldFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLCAKLSAgICAgICAgICAgICAgICAgICAgIGZ1LnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICJcXFxcXFxcXFxcXFwiKS5nZXRQYXRoKCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE5vdyB0ZXN0IHNvbWUgcmVsYXRpdmUgZmlsZSBuYW1lIG1hZ2ljLgotICAgICAgICAgKi8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgZnUucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIjQiKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBmdS5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpLCAiLi80IikuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgZnUucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIi5cXDQiKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBmdS5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpLCAiLi8uXFw0IikuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgZnUucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIi4uLzMvNCIpLmdldFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIGZ1LnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLlxcM1xcNCIpLmdldFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIGZ1LnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLi8uLi81Ly4uLy4vMi8uLzMvNi8uLi80IikuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgZnUucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIi4uXFwuLi81Ly4uXFwuLzIvLi8zLzZcXC4uLzQiKS5nZXRQYXRoKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmdS5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEiKSksICIuLi8uLi9iIik7Ci0gICAgICAgICAgICBmYWlsKCJzdWNjZXNzZnVsbHkgY3Jhd2xlZCBiZXlvbmQgdGhlIGZpbGVzeXN0ZW0gcm9vdCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBFeGNlcHRpb24gY2F1Z2h0Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemUoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFN0YXJ0IHdpdGggc2ltcGxlIGFic29sdXRlIGZpbGUgbmFtZXMuCi0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZS5zZXBhcmF0b3IsIAotICAgICAgICAgICAgICAgICAgICAgZnUubm9ybWFsaXplKCIvIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLCAKLSAgICAgICAgICAgICAgICAgICAgIGZ1Lm5vcm1hbGl6ZSgiXFwiKS5nZXRQYXRoKCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIHRocm93IGluIGRyaXZlIGxldHRlcnMKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwgCi0gICAgICAgICAgICAgICAgICAgICBmdS5ub3JtYWxpemUoZHJpdmVTcGVjICsgIi8iKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwgCi0gICAgICAgICAgICAgICAgICAgICBmdS5ub3JtYWxpemUoZHJpdmVTcGVjICsgIlxcIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsIAotICAgICAgICAgICAgICAgICAgICAgZnUubm9ybWFsaXplKGRyaXZlU3BlY0xvd2VyICsgIi8iKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwgCi0gICAgICAgICAgICAgICAgICAgICBmdS5ub3JtYWxpemUoZHJpdmVTcGVjTG93ZXIgKyAiXFwiKS5nZXRQYXRoKCkpOwotICAgICAgICAvKgotICAgICAgICAgKiBwcm9taXNlZCB0byBlbGltaW5hdGUgY29uc2VjdXRpdmUgc2xhc2hlcyBhZnRlciBkcml2ZSBsZXR0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwgCi0gICAgICAgICAgICAgICAgICAgICBmdS5ub3JtYWxpemUoZHJpdmVTcGVjICsgIi8vLy8vIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsIAotICAgICAgICAgICAgICAgICAgICAgZnUubm9ybWFsaXplKGRyaXZlU3BlYyArICJcXFxcXFxcXFxcXFwiKS5nZXRQYXRoKCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE5vdyB0ZXN0IHNvbWUgcmVsYXRpdmUgZmlsZSBuYW1lIG1hZ2ljLgotICAgICAgICAgKi8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgZnUubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvNCIpKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBmdS5ub3JtYWxpemUobG9jYWxpemUoIi8xLzIvMy8uLzQiKSkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgZnUubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLlxcNCIpKS5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBmdS5ub3JtYWxpemUobG9jYWxpemUoIi8xLzIvMy8uLy5cXDQiKSkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgZnUubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi4vMy80IikpLmdldFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIGZ1Lm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy4uXFwzXFw0IikpLmdldFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIGZ1Lm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy4uLy4uLzUvLi4vLi8yLy4vMy82Ly4uLzQiKSkuZ2V0UGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgZnUubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi5cXC4uLzUvLi5cXC4vMi8uLzMvNlxcLi4vNCIpKS5nZXRQYXRoKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmdS5ub3JtYWxpemUoImZvbyIpOwotICAgICAgICAgICAgZmFpbCgiZm9vIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZ1Lm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvLi4vLi4vYiIpKTsKLSAgICAgICAgICAgIGZhaWwoInN1Y2Nlc3NmdWxseSBjcmF3bGVkIGJleW9uZCB0aGUgZmlsZXN5c3RlbSByb290Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkYXB0IGZpbGUgc2VwYXJhdG9ycyB0byBsb2NhbCBjb252ZW50aW9ucwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsaXplKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHBhdGggPSByb290ICsgcGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvR2xvYlBhdHRlcm5NYXBwZXJUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvR2xvYlBhdHRlcm5NYXBwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjkzZDYuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0dsb2JQYXR0ZXJuTWFwcGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRlc3RzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsO0dsb2JQYXR0ZXJuTWFwcGVyLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9iUGF0dGVybk1hcHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgR2xvYlBhdHRlcm5NYXBwZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1BhdHRlcm5BdEFsbCgpIHsKLSAgICAgICAgR2xvYlBhdHRlcm5NYXBwZXIgbSA9IG5ldyBHbG9iUGF0dGVybk1hcHBlcigpOwotICAgICAgICBtLnNldEZyb20oImZvb2JhciIpOwotICAgICAgICBtLnNldFRvKCJiYXoiKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkblwndCBtYXRjaCBmb29iYXIiLCBtLm1hcEZpbGVOYW1lKCJwbG9uayIpKTsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbS5tYXBGaWxlTmFtZSgiZm9vYmFyIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBtYXRjaCBmb29iYXIiLCByZXN1bHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9ubHkgb25lIHJlc3VsdCBmb3IgZm9vYmFyIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYmF6IiwgcmVzdWx0WzBdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGZpeE9ubHkoKSB7Ci0gICAgICAgIEdsb2JQYXR0ZXJuTWFwcGVyIG0gPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKLSAgICAgICAgbS5zZXRGcm9tKCIqZm9vIik7Ci0gICAgICAgIG0uc2V0VG8oIipwbG9uayIpOwotICAgICAgICBhc3NlcnROdWxsKCJTaG91bGRuXCd0IG1hdGNoICpmb28iLCBtLm1hcEZpbGVOYW1lKCJiYXIuYmF6IikpOwotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBtLm1hcEZpbGVOYW1lKCJiYXIuZm9vIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBtYXRjaCAqLmZvbyIsIHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib25seSBvbmUgcmVzdWx0IGZvciBiYXIuZm9vIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYmFyLnBsb25rIiwgcmVzdWx0WzBdKTsKLQotICAgICAgICAvLyBUcnkgYSBzaWxseSBjYXNlCi0gICAgICAgIG0uc2V0VG8oImZvbyoiKTsKLSAgICAgICAgcmVzdWx0ID0gbS5tYXBGaWxlTmFtZSgiYmFyLmZvbyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb2Jhci4iLCByZXN1bHRbMF0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVmaXhPbmx5KCkgewotICAgICAgICBHbG9iUGF0dGVybk1hcHBlciBtID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7Ci0gICAgICAgIG0uc2V0RnJvbSgiZm9vKiIpOwotICAgICAgICBtLnNldFRvKCJwbG9uayoiKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkblwndCBtYXRjaCBmb28qIiwgbS5tYXBGaWxlTmFtZSgiYmFyLmJheiIpKTsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbS5tYXBGaWxlTmFtZSgiZm9vLmJhciIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgbWF0Y2ggZm9vKiIsIHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib25seSBvbmUgcmVzdWx0IGZvciBmb28uYmFyIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGxvbmsuYmFyIiwgcmVzdWx0WzBdKTsKLQotICAgICAgICAvLyBUcnkgYSBzaWxseSBjYXNlCi0gICAgICAgIG0uc2V0VG8oIipmb28iKTsKLSAgICAgICAgcmVzdWx0ID0gbS5tYXBGaWxlTmFtZSgiZm9vLmJhciIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIi5iYXJmb28iLCByZXN1bHRbMF0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVBbmRQb3N0Zml4KCkgewotICAgICAgICBHbG9iUGF0dGVybk1hcHBlciBtID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7Ci0gICAgICAgIG0uc2V0RnJvbSgiZm9vKmJhciIpOwotICAgICAgICBtLnNldFRvKCJwbG9uaypwbGluZyIpOwotICAgICAgICBhc3NlcnROdWxsKCJTaG91bGRuXCd0IG1hdGNoIGZvbypiYXIiLCBtLm1hcEZpbGVOYW1lKCJiYXIuYmF6IikpOwotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBtLm1hcEZpbGVOYW1lKCJmb28uYmFyIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBtYXRjaCBmb28qYmFyIiwgcmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmx5IG9uZSByZXN1bHQgZm9yIGZvby5iYXIiLCAxLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbG9uay5wbGluZyIsIHJlc3VsdFswXSk7Ci0KLSAgICAgICAgLy8gYW5kIGEgbGl0dGxlIGxvbmdlcgotICAgICAgICByZXN1bHQgPSBtLm1hcEZpbGVOYW1lKCJmb28uYmF6LmJhciIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgbWF0Y2ggZm9vKmJhciIsIHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib25seSBvbmUgcmVzdWx0IGZvciBmb28uYmF6LmJhciIsIDEsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBsb25rLmJhei5wbGluZyIsIHJlc3VsdFswXSk7Ci0KLSAgICAgICAgLy8gYW5kIGEgbGl0dGxlIHNob3J0ZXIKLSAgICAgICAgcmVzdWx0ID0gbS5tYXBGaWxlTmFtZSgiZm9vYmFyIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBtYXRjaCBmb28qYmFyIiwgcmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmx5IG9uZSByZXN1bHQgZm9yIGZvb2JhciIsIDEsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBsb25rcGxpbmciLCByZXN1bHRbMF0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb01hdGNoZXJUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIzNTM5Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb01hdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwOwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgamFrYXJ0YS1vcm8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFJlZ2V4cE1hdGNoZXIgaW50ZXJmYWNlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKYWthcnRhT3JvTWF0Y2hlclRlc3QgZXh0ZW5kcyBSZWdleHBNYXRjaGVyVGVzdCB7Ci0KLSAgICBwdWJsaWMgUmVnZXhwTWF0Y2hlciBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKYWthcnRhT3JvTWF0Y2hlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBKYWthcnRhT3JvTWF0Y2hlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwTWF0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkM2UyOS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIGpha2FydGEtcmVnZXhwIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSZWdleHBNYXRjaGVyIGludGVyZmFjZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi1wdWJsaWMgY2xhc3MgSmFrYXJ0YVJlZ2V4cE1hdGNoZXJUZXN0IGV4dGVuZHMgUmVnZXhwTWF0Y2hlclRlc3QgewotCi0gICAgcHVibGljIFJlZ2V4cE1hdGNoZXIgZ2V0SW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSmFrYXJ0YVJlZ2V4cE1hdGNoZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmFrYXJ0YVJlZ2V4cE1hdGNoZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXJUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwTWF0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxN2Y0MC4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwTWF0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBKREsgMS40IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSZWdleHBNYXRjaGVyIGludGVyZmFjZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi1wdWJsaWMgY2xhc3MgSmRrMTRSZWdleHBNYXRjaGVyVGVzdCBleHRlbmRzIFJlZ2V4cE1hdGNoZXJUZXN0IHsKLQotICAgIHB1YmxpYyBSZWdleHBNYXRjaGVyIGdldEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEpkazE0UmVnZXhwTWF0Y2hlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBKZGsxNFJlZ2V4cE1hdGNoZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU5OTA2Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRlc3RzIGZvciBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBSZWdleHBNYXRjaGVyIGludGVyZmFjZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BlcG9zdC5kZSI+U3RlZmFuIEJvZGV3aWc8L2E+IAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnZXhwTWF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgUmVnZXhwTWF0Y2hlciBnZXRJbXBsZW1lbnRhdGlvbigpOwotCi0gICAgcHVibGljIFJlZ2V4cE1hdGNoZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRjaGVzKCkgewotICAgICAgICBSZWdleHBNYXRjaGVyIHJlZyA9IGdldEltcGxlbWVudGF0aW9uKCk7Ci0gICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJhYWFhIik7Ci0gICAgICAgIGFzc2VydCgiYWFhYSBzaG91bGQgbWF0Y2ggaXRzZWxmIiwgcmVnLm1hdGNoZXMoImFhYWEiKSk7Ci0gICAgICAgIGFzc2VydCgiYWFhYSBzaG91bGQgbWF0Y2ggeGFhYWEiLCByZWcubWF0Y2hlcygieGFhYWEiKSk7Ci0gICAgICAgIGFzc2VydCgiYWFhYSBzaG91bGRuXCd0IG1hdGNoIHhhYWEiLCAhcmVnLm1hdGNoZXMoInhhYWEiKSk7Ci0gICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJeYWFhYSIpOwotICAgICAgICBhc3NlcnQoIl5hYWFhIHNob3VsZG5cJ3QgbWF0Y2ggeGFhYWEiLCAhcmVnLm1hdGNoZXMoInhhYWFhIikpOwotICAgICAgICBhc3NlcnQoIl5hYWFhIHNob3VsZCBtYXRjaCBhYWFheCIsIHJlZy5tYXRjaGVzKCJhYWFheCIpKTsKLSAgICAgICAgcmVnLnNldFBhdHRlcm4oImFhYWEkIik7Ci0gICAgICAgIGFzc2VydCgiYWFhYSQgc2hvdWxkblwndCBtYXRjaCBhYWFheCIsICFyZWcubWF0Y2hlcygiYWFhYXgiKSk7Ci0gICAgICAgIGFzc2VydCgiYWFhYSQgc2hvdWxkIG1hdGNoIHhhYWFhIiwgcmVnLm1hdGNoZXMoInhhYWFhIikpOwotICAgICAgICByZWcuc2V0UGF0dGVybigiWzAtOV0rIik7Ci0gICAgICAgIGFzc2VydCgiWzAtOV0rIHNob3VsZCBtYXRjaCAxMjMiLCByZWcubWF0Y2hlcygiMTIzIikpOwotICAgICAgICBhc3NlcnQoIlswLTldKyBzaG91bGQgbWF0Y2ggMSIsIHJlZy5tYXRjaGVzKCIxIikpOwotICAgICAgICBhc3NlcnQoIlswLTldKyBzaG91bGRuXCd0IG1hdGNoIFwnXCciLCAhcmVnLm1hdGNoZXMoIiIpKTsKLSAgICAgICAgYXNzZXJ0KCJbMC05XSsgc2hvdWxkblwndCBtYXRjaCBhIiwgIXJlZy5tYXRjaGVzKCJhIikpOwotICAgICAgICByZWcuc2V0UGF0dGVybigiWzAtOV0qIik7Ci0gICAgICAgIGFzc2VydCgiWzAtOV0qIHNob3VsZCBtYXRjaCAxMjMiLCByZWcubWF0Y2hlcygiMTIzIikpOwotICAgICAgICBhc3NlcnQoIlswLTldKiBzaG91bGQgbWF0Y2ggMSIsIHJlZy5tYXRjaGVzKCIxIikpOwotICAgICAgICBhc3NlcnQoIlswLTldKiBzaG91bGQgbWF0Y2ggXCdcJyIsIHJlZy5tYXRjaGVzKCIiKSk7Ci0gICAgICAgIGFzc2VydCgiWzAtOV0qIHNob3VsZCBtYXRjaCBhIiwgcmVnLm1hdGNoZXMoImEiKSk7Ci0gICAgICAgIHJlZy5zZXRQYXR0ZXJuKCIoWzAtOV0rKT1cXDEiKTsKLSAgICAgICAgYXNzZXJ0KCIoWzAtOV0rKT1cXDEgc2hvdWxkIG1hdGNoIDE9MSIsIHJlZy5tYXRjaGVzKCIxPTEiKSk7Ci0gICAgICAgIGFzc2VydCgiKFswLTldKyk9XFwxIHNob3VsZG5cJ3QgbWF0Y2ggMT0yIiwgIXJlZy5tYXRjaGVzKCIxPTIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwcygpIHsKLSAgICAgICAgUmVnZXhwTWF0Y2hlciByZWcgPSBnZXRJbXBsZW1lbnRhdGlvbigpOwotICAgICAgICByZWcuc2V0UGF0dGVybigiYWFhYSIpOwotICAgICAgICBWZWN0b3IgdiA9IHJlZy5nZXRHcm91cHMoInhhYWFhIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTm8gcGFyZW5zIC0+IG5vIGV4dHJhIGdyb3VwcyIsIDEsIHYuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUcml2aWFsIG1hdGNoIHdpdGggbm8gcGFyZW5zIiwgImFhYWEiLCAKLSAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIHYuZWxlbWVudEF0KDApKTsKLQotICAgICAgICByZWcuc2V0UGF0dGVybigiKGFhYWEpIik7Ci0gICAgICAgIHYgPSByZWcuZ2V0R3JvdXBzKCJ4YWFhYSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRyaXZpYWwgbWF0Y2ggd2l0aCBzaW5nbGUgcGFyZW4iLCAyLCB2LnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHJpdmlhbCBtYXRjaCB3aXRoIHNpbmdsZSBwYXJlbiwgZnVsbCBtYXRjaCIsICJhYWFhIiwgCi0gICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSB2LmVsZW1lbnRBdCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHJpdmlhbCBtYXRjaCB3aXRoIHNpbmdsZSBwYXJlbiwgbWF0Y2hlZCBwYXJlbiIsICJhYWFhIiwgCi0gICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSB2LmVsZW1lbnRBdCgwKSk7Ci0KLSAgICAgICAgcmVnLnNldFBhdHRlcm4oIihhKyliKGIrKSIpOwotICAgICAgICB2ID0gcmVnLmdldEdyb3VwcygieGFhYmIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHYuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYWJiIiwgKFN0cmluZykgdi5lbGVtZW50QXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFhIiwgKFN0cmluZykgdi5lbGVtZW50QXQoMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCAoU3RyaW5nKSB2LmVsZW1lbnRBdCgyKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Bc2lFeHRyYUZpZWxkVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Bc2lFeHRyYUZpZWxkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzA5YzdjLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy96aXAvQXNpRXh0cmFGaWVsZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5Bc2lFeHRyYUZpZWxkLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBBc2lFeHRyYUZpZWxkVGVzdCBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgVW5peFN0YXQgewotICAgIHB1YmxpYyBBc2lFeHRyYUZpZWxkVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZpbGUgbW9kZSBtYWdpYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZXMoKSB7Ci0gICAgICAgIEFzaUV4dHJhRmllbGQgYSA9IG5ldyBBc2lFeHRyYUZpZWxkKCk7Ci0gICAgICAgIGEuc2V0TW9kZSgwMTIzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiBmaWxlIiwgMDEwMDEyMywgYS5nZXRNb2RlKCkpOwotICAgICAgICBhLnNldERpcmVjdG9yeSh0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXJlY3RvcnkiLCAwNDAxMjMsIGEuZ2V0TW9kZSgpKTsKLSAgICAgICAgYS5zZXRMaW5rZWRGaWxlKCJ0ZXN0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3ltYm9saWMgbGluayIsIDAxMjAxMjMsIGEuZ2V0TW9kZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnQoKSB7Ci0gICAgICAgIEFzaUV4dHJhRmllbGQgYSA9IG5ldyBBc2lFeHRyYUZpZWxkKCk7Ci0gICAgICAgIGEuc2V0TW9kZSgwMTIzKTsKLSAgICAgICAgYS5zZXRVc2VySWQoNSk7Ci0gICAgICAgIGEuc2V0R3JvdXBJZCg2KTsKLSAgICAgICAgYnl0ZVtdIGIgPSBhLmdldExvY2FsRmlsZURhdGFEYXRhKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDUkMgbWFudWFsbHkgY2FsY3VsYXRlZCwgc29ycnkKLSAgICAgICAgYnl0ZVtdIGV4cGVjdCA9IHsoYnl0ZSkweEM2LCAweDAyLCAweDc4LCAoYnl0ZSkweEI2LCAvLyBDUkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAwMTIzLCAoYnl0ZSkweDgwLCAgICAgICAgICAgICAgICAgICAvLyBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aWQsIGdpZAotICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGxpbmsiLCBleHBlY3QubGVuZ3RoLCBiLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxleHBlY3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gbGluaywgYnl0ZSAiK2ksIGV4cGVjdFtpXSwgYltpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhLnNldExpbmtlZEZpbGUoInRlc3QiKTsKLSAgICAgICAgZXhwZWN0ID0gbmV3IGJ5dGVbXSB7MHg3NSwgKGJ5dGUpMHg4RSwgMHg0MSwgKGJ5dGUpMHhGRCwgLy8gQ1JDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxMjMsIChieXRlKTB4QTAsICAgICAgICAgICAgICAgICAgIC8vIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgNiwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWlkLCBnaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpJ3QnLCAoYnl0ZSknZScsIChieXRlKSdzJywgKGJ5dGUpJ3QnfTsKLSAgICAgICAgYiA9IGEuZ2V0TG9jYWxGaWxlRGF0YURhdGEoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBsaW5rIiwgZXhwZWN0Lmxlbmd0aCwgYi5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXhwZWN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGxpbmssIGJ5dGUgIitpLCBleHBlY3RbaV0sIGJbaV0pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHJlcGFyc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwYXJzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBDUkMgbWFudWFsbHkgY2FsY3VsYXRlZCwgc29ycnkKLSAgICAgICAgYnl0ZVtdIGRhdGEgPSB7KGJ5dGUpMHhDNiwgMHgwMiwgMHg3OCwgKGJ5dGUpMHhCNiwgLy8gQ1JDCi0gICAgICAgICAgICAgICAgICAgICAgIDAxMjMsIChieXRlKTB4ODAsICAgICAgICAgICAgICAgICAgIC8vIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgNiwgMH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWlkLCBnaWQKLSAgICAgICAgQXNpRXh0cmFGaWVsZCBhID0gbmV3IEFzaUV4dHJhRmllbGQoKTsKLSAgICAgICAgYS5wYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZW5ndGggcGxhaW4gZmlsZSIsIGRhdGEubGVuZ3RoLCAKLSAgICAgICAgICAgICAgICAgICAgIGEuZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnQoInBsYWluIGZpbGUsIG5vIGxpbmsiLCAhYS5pc0xpbmsoKSk7Ci0gICAgICAgIGFzc2VydCgicGxhaW4gZmlsZSwgbm8gZGlyIiwgIWEuaXNEaXJlY3RvcnkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibW9kZSBwbGFpbiBmaWxlIiwgRklMRV9GTEFHIHwgMDEyMywgYS5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVpZCBwbGFpbiBmaWxlIiwgNSwgYS5nZXRVc2VySWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZ2lkIHBsYWluIGZpbGUiLCA2LCBhLmdldEdyb3VwSWQoKSk7Ci0KLSAgICAgICAgZGF0YSA9IG5ldyBieXRlW10gezB4NzUsIChieXRlKTB4OEUsIDB4NDEsIChieXRlKTB4RkQsIC8vIENSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEyMywgKGJ5dGUpMHhBMCwgICAgICAgICAgICAgICAgICAgLy8gbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsIDYsIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkndCcsIChieXRlKSdlJywgKGJ5dGUpJ3MnLCAoYnl0ZSkndCd9OwotICAgICAgICBhID0gbmV3IEFzaUV4dHJhRmllbGQoKTsKLSAgICAgICAgYS5wYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZW5ndGggbGluayIsIGRhdGEubGVuZ3RoLCAKLSAgICAgICAgICAgICAgICAgICAgIGEuZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnQoImxpbmssIGlzIGxpbmsiLCBhLmlzTGluaygpKTsKLSAgICAgICAgYXNzZXJ0KCJsaW5rLCBubyBkaXIiLCAhYS5pc0RpcmVjdG9yeSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RlIGxpbmsiLCBMSU5LX0ZMQUcgfCAwMTIzLCBhLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidWlkIGxpbmsiLCA1LCBhLmdldFVzZXJJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJnaWQgbGluayIsIDYsIGEuZ2V0R3JvdXBJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgYS5nZXRMaW5rZWRGaWxlKCkpOwotCi0gICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtdIHsoYnl0ZSkweDhFLCAweDAxLCAoYnl0ZSkweEJGLCAoYnl0ZSkweDBFLCAvLyBDUkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxMjMsIChieXRlKTB4NDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsIDYsIDB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWlkLCBnaWQKLSAgICAgICAgYSA9IG5ldyBBc2lFeHRyYUZpZWxkKCk7Ci0gICAgICAgIGEucGFyc2VGcm9tTG9jYWxGaWxlRGF0YShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIGRpciIsIGRhdGEubGVuZ3RoLCAKLSAgICAgICAgICAgICAgICAgICAgIGEuZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnQoImRpciwgbm8gbGluayIsICFhLmlzTGluaygpKTsKLSAgICAgICAgYXNzZXJ0KCJkaXIsIGlzIGRpciIsIGEuaXNEaXJlY3RvcnkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibW9kZSBkaXIiLCBESVJfRkxBRyB8IDAxMjMsIGEuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1aWQgZGlyIiwgNSwgYS5nZXRVc2VySWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZ2lkIGRpciIsIDYsIGEuZ2V0R3JvdXBJZCgpKTsKLQotICAgICAgICBkYXRhID0gbmV3IGJ5dGVbXSB7MCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWQgQ1JDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwMTIzLCAoYnl0ZSkweDQwLCAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluawotICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgNiwgMH07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aWQsIGdpZAotICAgICAgICBhID0gbmV3IEFzaUV4dHJhRmllbGQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGEucGFyc2VGcm9tTG9jYWxGaWxlRGF0YShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgcmFpc2UgYmFkIENSQyBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiYmFkIENSQyBjaGVja3N1bSAwIGluc3RlYWQgb2YgZWJmMDE4ZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy96aXAvRXh0cmFGaWVsZFV0aWxzVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9FeHRyYUZpZWxkVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTlhOTIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9FeHRyYUZpZWxkVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy56aXAuRXh0cmFGaWVsZFV0aWxzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRyYUZpZWxkVXRpbHNUZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBVbml4U3RhdCB7Ci0gICAgcHVibGljIEV4dHJhRmllbGRVdGlsc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBc2lFeHRyYUZpZWxkIGE7Ci0gICAgcHJpdmF0ZSBVbnJlY29nbml6ZWRFeHRyYUZpZWxkIGR1bW15OwotICAgIHByaXZhdGUgYnl0ZVtdIGRhdGE7Ci0gICAgcHJpdmF0ZSBieXRlW10gYUxvY2FsOwotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOwotICAgICAgICBhLnNldE1vZGUoMDc1NSk7Ci0gICAgICAgIGEuc2V0RGlyZWN0b3J5KHRydWUpOwotICAgICAgICBkdW1teSA9IG5ldyBVbnJlY29nbml6ZWRFeHRyYUZpZWxkKCk7Ci0gICAgICAgIGR1bW15LnNldEhlYWRlcklkKG5ldyBaaXBTaG9ydCgxKSk7Ci0gICAgICAgIGR1bW15LnNldExvY2FsRmlsZURhdGFEYXRhKG5ldyBieXRlWzBdKTsKLSAgICAgICAgZHVtbXkuc2V0Q2VudHJhbERpcmVjdG9yeURhdGEobmV3IGJ5dGVbXSB7MH0pOwotCi0gICAgICAgIGFMb2NhbCA9IGEuZ2V0TG9jYWxGaWxlRGF0YURhdGEoKTsKLSAgICAgICAgYnl0ZVtdIGR1bW15TG9jYWwgPSBkdW1teS5nZXRMb2NhbEZpbGVEYXRhRGF0YSgpOwotICAgICAgICBkYXRhID0gbmV3IGJ5dGVbNCArIGFMb2NhbC5sZW5ndGggKyA0ICsgZHVtbXlMb2NhbC5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGEuZ2V0SGVhZGVySWQoKS5nZXRCeXRlcygpLCAwLCBkYXRhLCAwLCAyKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhLmdldExvY2FsRmlsZURhdGFMZW5ndGgoKS5nZXRCeXRlcygpLCAwLCBkYXRhLCAyLCAyKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhTG9jYWwsIDAsIGRhdGEsIDQsIGFMb2NhbC5sZW5ndGgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGR1bW15LmdldEhlYWRlcklkKCkuZ2V0Qnl0ZXMoKSwgMCwgZGF0YSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgNCthTG9jYWwubGVuZ3RoLCAyKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShkdW1teS5nZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkuZ2V0Qnl0ZXMoKSwgMCwgZGF0YSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgNCthTG9jYWwubGVuZ3RoKzIsIDIpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGR1bW15TG9jYWwsIDAsIGRhdGEsIAotICAgICAgICAgICAgICAgICAgICAgICAgIDQrYUxvY2FsLmxlbmd0aCs0LCBkdW1teUxvY2FsLmxlbmd0aCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0ZXN0IHBhcnNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWmlwRXh0cmFGaWVsZFtdIHplID0gRXh0cmFGaWVsZFV0aWxzLnBhcnNlKGRhdGEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm51bWJlciBvZiBmaWVsZHMiLCAyLCB6ZS5sZW5ndGgpOwotICAgICAgICBhc3NlcnQoInR5cGUgZmllbGQgMSIsIHplWzBdIGluc3RhbmNlb2YgQXNpRXh0cmFGaWVsZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibW9kZSBmaWVsZCAxIiwgMDQwNzU1LAotICAgICAgICAgICAgICAgICAgICAgKChBc2lFeHRyYUZpZWxkKSB6ZVswXSkuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0KCJ0eXBlIGZpZWxkIDIiLCB6ZVsxXSBpbnN0YW5jZW9mIFVucmVjb2duaXplZEV4dHJhRmllbGQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRhdGEgbGVuZ3RoIGZpZWxkIDIiLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgIHplWzFdLmdldExvY2FsRmlsZURhdGFMZW5ndGgoKS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICBieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aC0xXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBkYXRhMiwgMCwgZGF0YTIubGVuZ3RoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEV4dHJhRmllbGRVdGlscy5wYXJzZShkYXRhMik7Ci0gICAgICAgICAgICBmYWlsKCJkYXRhIHNob3VsZCBiZSBpbnZhbGlkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSBzdGFydGluZyBhdCAiKyg0K2FMb2NhbC5sZW5ndGgpKyIgaXMgaW4gdW5rbm93biBmb3JtYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgbWVyZ2UgbWV0aG9kcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHsKLSAgICAgICAgYnl0ZVtdIGxvY2FsID0gCi0gICAgICAgICAgICBFeHRyYUZpZWxkVXRpbHMubWVyZ2VMb2NhbEZpbGVEYXRhRGF0YShuZXcgWmlwRXh0cmFGaWVsZFtdIHthLCBkdW1teX0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxvY2FsIGxlbmd0aCIsIGRhdGEubGVuZ3RoLCBsb2NhbC5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bG9jYWwubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygibG9jYWwgYnl0ZSAiK2ksIGRhdGFbaV0sIGxvY2FsW2ldKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYnl0ZVtdIGR1bW15Q2VudHJhbCA9IGR1bW15LmdldENlbnRyYWxEaXJlY3RvcnlEYXRhKCk7Ci0gICAgICAgIGJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlWzQgKyBhTG9jYWwubGVuZ3RoICsgNCArIGR1bW15Q2VudHJhbC5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGRhdGEyLCAwLCA0ICsgYUxvY2FsLmxlbmd0aCArIDIpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGR1bW15LmdldENlbnRyYWxEaXJlY3RvcnlMZW5ndGgoKS5nZXRCeXRlcygpLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiwgNCthTG9jYWwubGVuZ3RoKzIsIDIpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGR1bW15Q2VudHJhbCwgMCwgZGF0YTIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIDQrYUxvY2FsLmxlbmd0aCs0LCBkdW1teUNlbnRyYWwubGVuZ3RoKTsKLQotCi0gICAgICAgIGJ5dGVbXSBjZW50cmFsID0gCi0gICAgICAgICAgICBFeHRyYUZpZWxkVXRpbHMubWVyZ2VDZW50cmFsRGlyZWN0b3J5RGF0YShuZXcgWmlwRXh0cmFGaWVsZFtdIHthLCBkdW1teX0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNlbnRyYWwgbGVuZ3RoIiwgZGF0YTIubGVuZ3RoLCBjZW50cmFsLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxjZW50cmFsLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNlbnRyYWwgYnl0ZSAiK2ksIGRhdGEyW2ldLCBjZW50cmFsW2ldKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVudHJ5VGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbnRyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlMzA0Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVudHJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5LgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBFbnRyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgWmlwRW50cnlUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRlc3QgaGFuZGxpbmcgb2YgZXh0cmEgZmllbGRzCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhRmllbGRzKCkgewotICAgICAgICBBc2lFeHRyYUZpZWxkIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOwotICAgICAgICBhLnNldERpcmVjdG9yeSh0cnVlKTsKLSAgICAgICAgYS5zZXRNb2RlKDA3NTUpOwotICAgICAgICBVbnJlY29nbml6ZWRFeHRyYUZpZWxkIHUgPSBuZXcgVW5yZWNvZ25pemVkRXh0cmFGaWVsZCgpOwotICAgICAgICB1LnNldEhlYWRlcklkKG5ldyBaaXBTaG9ydCgxKSk7Ci0gICAgICAgIHUuc2V0TG9jYWxGaWxlRGF0YURhdGEobmV3IGJ5dGVbMF0pOwotCi0gICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KCJ0ZXN0LyIpOwotICAgICAgICB6ZS5zZXRFeHRyYUZpZWxkcyhuZXcgWmlwRXh0cmFGaWVsZFtdIHthLCB1fSk7Ci0gICAgICAgIGJ5dGVbXSBkYXRhMSA9IHplLmdldEV4dHJhKCk7Ci0gICAgICAgIFppcEV4dHJhRmllbGRbXSByZXN1bHQgPSB6ZS5nZXRFeHRyYUZpZWxkcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZpcnN0IHBhc3MiLCAyLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0U2FtZShhLCByZXN1bHRbMF0pOwotICAgICAgICBhc3NlcnRTYW1lKHUsIHJlc3VsdFsxXSk7Ci0KLSAgICAgICAgVW5yZWNvZ25pemVkRXh0cmFGaWVsZCB1MiA9IG5ldyBVbnJlY29nbml6ZWRFeHRyYUZpZWxkKCk7Ci0gICAgICAgIHUyLnNldEhlYWRlcklkKG5ldyBaaXBTaG9ydCgxKSk7Ci0gICAgICAgIHUyLnNldExvY2FsRmlsZURhdGFEYXRhKG5ldyBieXRlW10gezF9KTsKLQotICAgICAgICB6ZS5hZGRFeHRyYUZpZWxkKHUyKTsKLSAgICAgICAgYnl0ZVtdIGRhdGEyID0gemUuZ2V0RXh0cmEoKTsKLSAgICAgICAgcmVzdWx0ID0gemUuZ2V0RXh0cmFGaWVsZHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZWNvbmQgcGFzcyIsIDIsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICBhc3NlcnRTYW1lKGEsIHJlc3VsdFswXSk7Ci0gICAgICAgIGFzc2VydFNhbWUodTIsIHJlc3VsdFsxXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIHNlY29uZCBwYXNzIiwgZGF0YTEubGVuZ3RoKzEsIGRhdGEyLmxlbmd0aCk7Ci0KLSAgICAgICAgVW5yZWNvZ25pemVkRXh0cmFGaWVsZCB1MyA9IG5ldyBVbnJlY29nbml6ZWRFeHRyYUZpZWxkKCk7Ci0gICAgICAgIHUzLnNldEhlYWRlcklkKG5ldyBaaXBTaG9ydCgyKSk7Ci0gICAgICAgIHUzLnNldExvY2FsRmlsZURhdGFEYXRhKG5ldyBieXRlW10gezF9KTsKLSAgICAgICAgemUuYWRkRXh0cmFGaWVsZCh1Myk7Ci0gICAgICAgIHJlc3VsdCA9IHplLmdldEV4dHJhRmllbGRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGhpcmQgcGFzcyIsIDMsIHJlc3VsdC5sZW5ndGgpOwotCi0gICAgICAgIHplLnJlbW92ZUV4dHJhRmllbGQobmV3IFppcFNob3J0KDEpKTsKLSAgICAgICAgYnl0ZVtdIGRhdGEzID0gemUuZ2V0RXh0cmEoKTsKLSAgICAgICAgcmVzdWx0ID0gemUuZ2V0RXh0cmFGaWVsZHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb3VydGggcGFzcyIsIDIsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICBhc3NlcnRTYW1lKGEsIHJlc3VsdFswXSk7Ci0gICAgICAgIGFzc2VydFNhbWUodTMsIHJlc3VsdFsxXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIGZvdXJ0aCBwYXNzIiwgZGF0YTIubGVuZ3RoLCBkYXRhMy5sZW5ndGgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB6ZS5yZW1vdmVFeHRyYUZpZWxkKG5ldyBaaXBTaG9ydCgxKSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgYmUgbm8gc3VjaCBlbGVtZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZSkgewotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nVGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzcyZGI4Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy96aXAvWmlwTG9uZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBMb25nLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBMb25nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBaaXBMb25nVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGNvbnZlcnNpb24gdG8gYnl0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRvQnl0ZXMoKSB7Ci0gICAgICAgIFppcExvbmcgemwgPSBuZXcgWmlwTG9uZygweDEyMzQ1Njc4KTsKLSAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHpsLmdldEJ5dGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIGdldEJ5dGVzIiwgNCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmlyc3QgYnl0ZSBnZXRCeXRlcyIsIDB4NzgsIHJlc3VsdFswXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2Vjb25kIGJ5dGUgZ2V0Qnl0ZXMiLCAweDU2LCByZXN1bHRbMV0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRoaXJkIGJ5dGUgZ2V0Qnl0ZXMiLCAweDM0LCByZXN1bHRbMl0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZvdXJ0aCBieXRlIGdldEJ5dGVzIiwgMHgxMiwgcmVzdWx0WzNdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGNvbnZlcnNpb24gZnJvbSBieXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbUJ5dGVzKCkgewotICAgICAgICBieXRlW10gdmFsID0gbmV3IGJ5dGVbXSB7MHg3OCwgMHg1NiwgMHgzNCwgMHgxMn07Ci0gICAgICAgIFppcExvbmcgemwgPSBuZXcgWmlwTG9uZyh2YWwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIGZyb20gYnl0ZXMiLCAweDEyMzQ1Njc4LCB6bC5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBjb250cmFjdCBvZiB0aGUgZXF1YWxzIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotICAgICAgICBaaXBMb25nIHpsID0gbmV3IFppcExvbmcoMHgxMjM0NTY3OCk7Ci0gICAgICAgIFppcExvbmcgemwyID0gbmV3IFppcExvbmcoMHgxMjM0NTY3OCk7Ci0gICAgICAgIFppcExvbmcgemwzID0gbmV3IFppcExvbmcoMHg4NzY1NDMyMSk7Ci0KLSAgICAgICAgYXNzZXJ0KCJyZWZsZXhpdmUiLCB6bC5lcXVhbHMoemwpKTsKLQotICAgICAgICBhc3NlcnQoIndvcmtzIiwgemwuZXF1YWxzKHpsMikpOwotICAgICAgICBhc3NlcnQoIndvcmtzLCBwYXJ0IHR3byIsICF6bC5lcXVhbHMoemwzKSk7Ci0KLSAgICAgICAgYXNzZXJ0KCJzeW1tZXRyaWMiLCB6bDIuZXF1YWxzKHpsKSk7Ci0KLSAgICAgICAgYXNzZXJ0KCJudWxsIGhhbmRsaW5nIiwgIXpsLmVxdWFscyhudWxsKSk7Ci0gICAgICAgIGFzc2VydCgibm9uIFppcExvbmcgaGFuZGxpbmciLCAhemwuZXF1YWxzKG5ldyBJbnRlZ2VyKDB4MTIzNCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHNpZ24gaGFuZGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNpZ24oKSB7Ci0gICAgICAgIFppcExvbmcgemwgPSBuZXcgWmlwTG9uZyhuZXcgYnl0ZVtdIHsoYnl0ZSkweEZGLCAoYnl0ZSkweEZGLCAoYnl0ZSkweEZGLCAoYnl0ZSkweEZGfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwRkZGRkZGRkZsLCB6bC5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnRUZXN0LmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcFNob3J0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzNmM2Y4Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCi0gKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy56aXAuWmlwU2hvcnQuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFuLmJvZGV3aWdAZXBvc3QuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hPiAKLSAqLwotcHVibGljIGNsYXNzIFppcFNob3J0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBaaXBTaG9ydFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBjb252ZXJzaW9uIHRvIGJ5dGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0J5dGVzKCkgewotICAgICAgICBaaXBTaG9ydCB6cyA9IG5ldyBaaXBTaG9ydCgweDEyMzQpOwotICAgICAgICBieXRlW10gcmVzdWx0ID0genMuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZW5ndGggZ2V0Qnl0ZXMiLCAyLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXJzdCBieXRlIGdldEJ5dGVzIiwgMHgzNCwgcmVzdWx0WzBdKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZWNvbmQgYnl0ZSBnZXRCeXRlcyIsIDB4MTIsIHJlc3VsdFsxXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBjb252ZXJzaW9uIGZyb20gYnl0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZyb21CeXRlcygpIHsKLSAgICAgICAgYnl0ZVtdIHZhbCA9IG5ldyBieXRlW10gezB4MzQsIDB4MTJ9OwotICAgICAgICBaaXBTaG9ydCB6cyA9IG5ldyBaaXBTaG9ydCh2YWwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIGZyb20gYnl0ZXMiLCAweDEyMzQsIHpzLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGNvbnRyYWN0IG9mIHRoZSBlcXVhbHMgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0gICAgICAgIFppcFNob3J0IHpzID0gbmV3IFppcFNob3J0KDB4MTIzNCk7Ci0gICAgICAgIFppcFNob3J0IHpzMiA9IG5ldyBaaXBTaG9ydCgweDEyMzQpOwotICAgICAgICBaaXBTaG9ydCB6czMgPSBuZXcgWmlwU2hvcnQoMHg1Njc4KTsKLQotICAgICAgICBhc3NlcnQoInJlZmxleGl2ZSIsIHpzLmVxdWFscyh6cykpOwotCi0gICAgICAgIGFzc2VydCgid29ya3MiLCB6cy5lcXVhbHMoenMyKSk7Ci0gICAgICAgIGFzc2VydCgid29ya3MsIHBhcnQgdHdvIiwgIXpzLmVxdWFscyh6czMpKTsKLQotICAgICAgICBhc3NlcnQoInN5bW1ldHJpYyIsIHpzMi5lcXVhbHMoenMpKTsKLQotICAgICAgICBhc3NlcnQoIm51bGwgaGFuZGxpbmciLCAhenMuZXF1YWxzKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0KCJub24gWmlwU2hvcnQgaGFuZGxpbmciLCAhenMuZXF1YWxzKG5ldyBJbnRlZ2VyKDB4MTIzNCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHNpZ24gaGFuZGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNpZ24oKSB7Ci0gICAgICAgIFppcFNob3J0IHpzID0gbmV3IFppcFNob3J0KG5ldyBieXRlW10geyhieXRlKTB4RkYsIChieXRlKTB4RkZ9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MDAwMEZGRkYsIHpzLmdldFZhbHVlKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEveGRvY3MvYW50bmV3cy54bWwgYi94ZG9jcy9hbnRuZXdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiMGEwNS4uMDAwMDAwMAotLS0gYS94ZG9jcy9hbnRuZXdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2N1bWVudD4KLQotICA8cHJvcGVydGllcz4KLSAgICA8YXV0aG9yIGVtYWlsPSJjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1Ij5Db25vciBNYWNOZWlsbDwvYXV0aG9yPgotICAgIDxhdXRob3IgZW1haWw9InN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYXV0aG9yPgotICAgIDx0aXRsZT5BbnQgTmV3czwvdGl0bGU+Ci0gIDwvcHJvcGVydGllcz4KLQotPGJvZHk+Ci0KLSAgPHNlY3Rpb24gbmFtZT0iQW50IDEuNCBCZXRhIj4KLSAgPGgzPkFudCAxLjQgQmV0YSBBdmFpbGFibGUgITwvaDM+Ci0gIDxwPlRoZSBiZXRhIHZlcnNpb24gb2YgQW50IDEuNCBpcyBub3cgYXZhaWxhYmxlIGZvciAKLSAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1hbnQvcmVsZWFzZS92MS40QmV0YTIvIj4KLSAgICAgZG93bmxvYWQ8L2E+LiBJZiB5b3UgaGF2ZSBhbnkgZmVlZGJhY2sgb24gdGhlIGJldGEgZmVlbCBmcmVlIHRvIGpvaW4gdGhlIAotICAgICBkaXNjdXNzaW9uIG9uIHRoZSBhbnQtZGV2IGFuZCBhbnQtdXNlciBtYWlsaW5nIGxpc3RzLgotICAgICA8L3A+Ci0gIDwvc2VjdGlvbj4KLQotICA8c2VjdGlvbiBuYW1lPSJBbnQgTmVlZHMgYSBMb2dvIj4KLSAgICA8cD5BbnQgc3RpbGwgZG9lc24ndCBoYXZlIGEgTG9nbywgYnV0IGl0IHN1cmUgZGVzZXJ2ZXMgb25lLiBXZSd2ZQotICAgIHB1dCB0b2dldGhlciBhIDxhIGhyZWY9ImxvZ29zLmh0bWwiPnBhZ2Ugd2l0aCBwcm9wb3NlZAotICAgIGxvZ29zPC9hPiwgcGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZW0gYW5kIHRlbGwgdXMgd2hhdCB5b3UKLSAgICB0aGluay4gSWYgeW91IGhhdmUgYSBuaWNlIGxvZ28gaWRlYSB5b3Vyc2VsZiwganVzdCBzdWJtaXQgaXQgdG8KLSAgICB0aGUgbWFpbGluZyBsaXN0cy48L3A+Ci0gIDwvc2VjdGlvbj4KLQotICA8c2VjdGlvbiBuYW1lPSJBbnQgMi4wIFJlcXVpcmVtZW50cyBDb2xsZWN0ZWQgLSBOZXh0IGlzIERlc2lnbiI+Ci0gICAgICA8cD5BIGNvbW1lbnRlZCB2ZXJzaW9uIG9mIHRoZSBjb2xsZWN0ZWQgdXNlciByZXF1aXJlbWVudHMgaXMgbm93Ci0gICAgICBhdmFpbGFibGUgPGEgaHJlZj0iL2FudC9hbnQyL2ZlYXR1cmVzLmh0bWwiPmhlcmU8L2E+IC0gaXQgaXMgbm90Ci0gICAgICBjb21wbGV0ZSBhcyBzb21lIGRldGFpbHMgc3RpbGwgaGF2ZSB0byBiZSBkZWZpbmVkLCBidXQgaXQgc2hvdWxkCi0gICAgICBnaXZlIHlvdSBhbiBpZGVhIG9mIHdoYXQgQW50MiBpcyBnb2luZyB0byBsb29rIGxpa2UuPC9wPgotCi0gICAgICA8cD5TZXZlcmFsIGRldGFpbHMgY2FuIG9ubHkgYmUgZGVjaWRlZCBpbiB0aGUgbGlnaHQgb2YgcmVhbCBjb2RlCi0gICAgICBhbmQgcHJvdG90eXBlcy4gIFNldmVyYWwgcGVvcGxlIGFyZSB3b3JraW5nIG9uIHByb3RvdHlwZXMgKHRoYXQKLSAgICAgIGNhbiBiZSBmb3VuZCBpbiBBbnQncyBDVlMgbW9kdWxlIGluIHRoZSBwcm9wb3NhbHMgZGlyZWN0b3J5KSBhbmQKLSAgICAgIGRpc2N1c3Npb24gaXMgZ29pbmcgb24gb24gdGhlIEFudC1EZXYgbWFpbGluZyBsaXN0LjwvcD4KLSAgPC9zZWN0aW9uPgotCi0gIDxzZWN0aW9uIG5hbWU9IkJlc3QtUHJhY3RpY2VzIFByb2ZpbGUgb2YgQW50IGF0IFN1biZhcG9zO3MgRG90LUNvbSBCdWlsZGVyIj4KLSAgICAgIDxwPlN1biBoYXMgcmVsZWFzZWQgYW4gaW50cm9kdWN0b3J5IGFydGljbGUgb24gQW50IG9uIHRoZWlyCi0gICAgICBEb3QtQ29tIEJ1aWxkZXIgc2l0ZSBvbiBNYXkmIzE2MDszMCYjMTYwOzIwMDEuIFNlZSA8YQotICAgICAgaHJlZj0iaHR0cDovL2RjYi5zdW4uY29tL3ByYWN0aWNlcy9wcm9maWxlcy9hbnQuanNwIj5odHRwOi8vZGNiLnN1bi5jb20vcHJhY3RpY2VzL3Byb2ZpbGVzL2FudC5qc3A8L2E+PC9wPgotICA8L3NlY3Rpb24+Ci0KLSAgPHNlY3Rpb24gbmFtZT0iQW50IDIuMCBSZXF1aXJlbWVudHMiPgotICAgIDxwPkFudCBoYXMgYmVlbiBpbiB1c2UgZm9yIHF1aXRlIHNvbWUgdGltZSBhbmQgaGFzIGJlZW4gdXNlZCBpbiB3YXlzIG5ldmVyIGNvbmNlaXZlZCB3aGVuIGl0Ci0gICAgICAgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbi4gV2hpbGUgQW50IDEueCBoYXMgY29udGludWVkIHRvIHN1Y2Vzc2Z1bGx5IGV2b2x2ZSBhbmQgZ3JvdywgdGhlcmUgCi0gICAgICAgYXJlIGEgbnVtYmVyIG9mIGxpbWl0YXRpb25zIGFuZCBpbmNvbnNpc3RlbmNpZXMgdGhhdCBhcmUgbm93IGFwcGFyZW50IGFuZCB3aGljaCBuZWVkIHRvIAotICAgICAgIGJlIGFkZHJlc3NlZC4gCi0gICAgPC9wPgotICAgIAotICAgIDxwPgotICAgICAgIEFzIHdlIGNvbnRpbnVlIHRvIGV2b2x2ZSBhbmQgZW5oYW5jZSBBbnQgMS54LCBpdCBpcyBub3cgdGltZSB0byBkZWZpbmUgd2hhdCBBbnQgMi4wIHdpbGwKLSAgICAgICBlbmNvbXBhc3MuIEFudCAyLjAgd2lsbCBiZSBhIG1ham9yIHJlYXJjaGl0ZWN0aW5nIG9mIEFudC4gSXQgaGFzIGEgbnVtYmVyIG9mIGdvYWxzIGluY2x1ZGluZzoKLSAgICAgICA8dWw+Ci0gICAgICAgICA8bGk+RGVmaW5lIHRoZSAiY29udHJhY3QiIHdpdGggYnVpbGQgZmlsZSB3cml0ZXJzIHRvIHdoaWNoIEFudCB3aWxsIGJlIGJvdW5kLjwvbGk+Ci0gICAgICAgICA8bGk+RGVmaW5lIHRoZSAiY29udHJhY3QiIGJldHdlZW4gdGhlIEFudCBjb3JlIGFuZCBUYXNrIHdyaXRlcnMuPC9saT4KLSAgICAgICAgIDxsaT5NYWtlIEFudCBtb3JlIGVhc2lseSBleHRlbmRhYmxlIGJ5IGFsbG93aW5nIGFkZGl0aW9uYWwgdGFza3MgdG8gYmUgImRyb3BwZWQiIGluLjwvbGk+Ci0gICAgICAgICA8bGk+QWxsb3cgQW50IHRvIGZ1bmN0aW9uIGFzIGEgY29tcG9uZW50IHRvIHNpbXBsaWZ5IGludGVncmF0aW9uIHdpdGggR1VJcyBhbmQgSURFcy48L2xpPgotICAgICAgICAgPGxpPk1ha2UgQW50IG1vcmUgcmVndWxhciBhbmQgbG9naWNhbC48L2xpPgotICAgICAgIDwvdWw+Ci0gICAgICAgCi0gICAgICAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBBbnQgMi4wIHdpbGwgYnJlYWsgQW50IDEueCBiYXNlZCBidWlsZCBmaWxlcy4gVGhlIGludGVudGlvbiBpcyB0bwotICAgICAgIG1ha2UgdGhpcyB0aGUgbGFzdCB0aW1lIHRoYXQgd2lsbCBoYXBwZW4uCi0gICAgIDwvcD4KLSAgICAgCi0gICAgIDxwPgotICAgICAgICBUbyBhZHZhbmNlIHRoZSBkZWZpbml0aW9uIG9mIEFudCwgdXNlciByZXF1aXJlbWVudHMgYXJlIG5vdyBiZWluZyBhY2NlcHRlZCBvbiB0aGUgCi0gICAgICAgIEFudC1EZXYgbWFpbGluZyBsaXN0LiBBbnkgcmVxdWlyZW1lbnQgd2lsbCBiZSBhY2NlcHRlZCBmb3IgY29uc2lkZXJhdGlvbi4gVGhlIAotICAgICAgICByZXF1aXJlbWVudHMgYXJlIGJlaW5nIGNvbGxlY3RlZCBpbnRvIGEgZG9jdW1lbnQgd2hpY2ggaXMgYXZhaWxhYmxlIAotICAgICAgICA8YSBocmVmPSIvYW50L2FudDIvcmVxdWVzdGVkLWZlYXR1cmVzLnR4dCI+b24tbGluZTwvYT4uIE5ldyBmZWF0dXJlcyB3aWxsIGJlIGV4Y2VwdGVkIAotICAgICAgICB1bnRpbCBNYXJjaCAyMXN0LCAyMDAxLiBBdCB0aGF0IHRpbWUsIGVhY2ggcmVxdWlyZW1lbnQgd2lsbCBiZSBkaXNjdXNzZWQgCi0gICAgICAgIGZvciBpbmNsdXNpb24gaW4gYW4gQW50IDIuMCByZXF1aXJlbWVudCBkb2N1bWVudC4KLSAgICAgIDwvcD4KLSAgICAgIAotICAgICAgPHA+Ci0gICAgICAgIEZvciB5b3VyIHJlZmVyZW5jZSBzb21lIG9mIHRoZSBnb2FscyB3aGljaCBoYXZlIHNoYXBlZCB0aGUgZGV2ZWxvcG1lbnQgb2YgQW50IDEueCBhcmUKLSAgICAgICAgYXZhaWxhYmxlIDxhIGhyZWY9Ii9hbnQvYW50Mi9vcmlnaW5hbC1zcGVjaWZpY2F0aW9uLmh0bWwiPmhlcmU8L2E+LiBUaGVzZSBjb250aW51ZSB0byBiZQotICAgICAgICByZWxldmFudCB0byBBbnQgMi4wLgotICAgICAgPC9wPgotICAgICAgCi0gICAgICA8cD4KLSAgICAgICAgSWYgeW91IHdhbnQgdG8gc2hhcGUgdGhlIGZ1dHVyZSBvZiBBbnQsIGpvaW4gdGhlIAotICAgICAgICA8YSBocmVmPSIvc2l0ZS9tYWlsLmh0bWwiPkFudC1EZXYgbWFpbGluZyBsaXN0PC9hPiBhbmQgY29udHJpYnV0ZQotICAgICAgICB5b3VyIGlkZWFzLgotICAgICAgPC9wPgotICA8L3NlY3Rpb24+Ci0KLSAgPHNlY3Rpb24gbmFtZT0iQW50IDEuMyBSZWxlYXNlZCI+Ci0KLSAgICA8cD4KLSAgICBBbnQgMS4zIGhhcyBiZWVuIHJlbGVhc2VkIGFmdGVyIGdvaW5nIHRocm91Z2ggdGhyZWUgYmV0YXMuIFRoYW5rcyB0byBldmVyeW9uZSB3aG8KLSAgICB0b29rIHRoZSB0aW1lIHRvIHRlc3QgdGhlIGJldGEgYW5kIHJlcG9ydCBidWdzIGFuZCBlbmhhbmNlbWVudHMuCi0gICAgPC9wPgotICAgIAotICAgIDxwPllvdSBjYW4gZG93bmxvYWQgdGhlIHJlbGVhc2UgZnJvbSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1hbnQvcmVsZWFzZS92MS4zLyI+aGVyZTwvYT4uIAotICAgICAgIEJvdGggc291cmNlIGFuZCBiaW5hcnkgcmVsZWFzZXMgYXJlIGF2YWlsYWJsZSBpbiB6aXAsIHRhcmJhbGwgYW5kIFJQTSBmb3JtYXRzLgotICAgIDwvcD4KLSAgICA8cD5QbGVhc2UgcmVwb3J0IGFsbCBidWdzIHVzaW5nIHRoZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1BbnQiPkFwYWNoZSBCdWd6aWxsYTwvYT4KLSAgICA8L3A+Ci0KLSAgPC9zZWN0aW9uPgotCi08L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS94ZG9jcy9leHRlcm5hbC54bWwgYi94ZG9jcy9leHRlcm5hbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmUzODMuLjAwMDAwMDAKLS0tIGEveGRvY3MvZXh0ZXJuYWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvY3VtZW50PgotCi0gIDxwcm9wZXJ0aWVzPgotICAgIDxhdXRob3IgZW1haWw9ImJvZGV3aWdAYXBhY2hlLm9yZyI+U3RlZmFuIEJvZGV3aWc8L2F1dGhvcj4KLSAgICA8dGl0bGU+RXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzPC90aXRsZT4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrcyI+Ci0KLSAgICAgIDxwPlRoaXMgcGFnZSBsaXN0cyBleHRlcm5hbCByZXNvdXJjZXMgZm9yIEFudDogdGFza3MsIElERQotICAgICAgaW50ZWdyYXRpb24gdG9vbHMsIGxvZ2dlcnMsIHlvdSBuYW1lIGl0LiBJZiB5b3UndmUgd3JpdHRlbgotICAgICAgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkLCBwbGVhc2UgcG9zdCBhbGwgcmVsZXZhbnQKLSAgICAgIGluZm9ybWF0aW9uIHRvIG9uZSBvZiB0aGUgbWFpbGluZyBsaXN0cy48L3A+Ci0KLSAgICAgIDxwPk5vdGhpbmcgbGlzdGVkIGhlcmUgaXMgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IHRoZSBBbnQKLSAgICAgIGRldmVsb3BlcnMsIGlmIHlvdSBlbmNvdW50ZXIgYW55IHByb2JsZW1zIHdpdGggdGhlbSwgcGxlYXNlIHVzZQotICAgICAgdGhlIGNvbnRhY3QgaW5mb3JtYXRpb24uPC9wPgotCi0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iVGFza3MiPgotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQUpDIj4KLQotICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vYXNwZWN0ai5vcmciPkFzcGVjdEo8L2E+IGlzIGFuCi0gICAgICAgICAgYXNwZWN0LW9yaWVudGVkIGV4dGVuc2lvbiB0byBKYXZhLiAgVGhpcyB0YXNrIGNvbXBpbGVzIGEKLSAgICAgICAgICBzb3VyY2UgdHJlZSB1c2luZyB0aGUgQXNwZWN0SiBjb21waWxlciAtLSBBSkMuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgotICAgICAgICAgICAgPHRkPkFudCAxLjM8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hc3BlY3RqLm9yZy9kbCI+aHR0cDovL2FzcGVjdGoub3JnL2RsPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QGFzcGVjdGoub3JnIj5zdXBwb3J0QGFzcGVjdGoub3JnPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgotICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbmFraWEiPgotCi0gICAgICAgIDxwPkFjdHVhbGx5LCBBbmFraWEgaXMgbW9yZSB0aGFuIGp1c3QgYW4gQW50IHRhc2ssIGl0IGlzIGEgYW4KLSAgICAgICAgWE1MIHRyYW5zZm9ybWF0aW9uIHRvb2wgYmFzZWQgb24gSkRPTSwgVmVsb2NpdHkgYW5kIEFudC48L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+QW50IDEuMiBhbmQgMS4zPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5L2FuYWtpYS5odG1sIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5L2FuYWtpYS5odG1sPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9tYWlsMi5odG1sIj5WZWxvY2l0eSBtYWlsaW5nIGxpc3RzPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgotICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDaGVja3N0eWxlIj4KLQotICAgICAgICA8cD5DaGVja3N0eWxlIGlzIGEgZGV2ZWxvcG1lbnQgdG9vbCB0byBoZWxwIHByb2dyYW1tZXJzIHdyaXRlCi0gICAgICAgIEphdmEgY29kZSB0aGF0IGFkaGVyZXMgdG8gYSBjb2Rpbmcgc3RhbmRhcmQuIEl0cyBwdXJwb3NlIGlzIHRvCi0gICAgICAgIGF1dG9tYXRlIHRoZSBwcm9jZXNzIG9mIGNoZWNraW5nIEphdmEgY29kZSwgYW5kIHRvIHNwYXJlCi0gICAgICAgIGh1bWFucyBvZiB0aGlzIGJvcmluZyAoYnV0IGltcG9ydGFudCkgdGFzay48L3A+Ci0KLSAgICAgICAgPHA+Q2hlY2tzdHlsZSBjYW4gYmUgcnVuIHZpYSBhbiBBTlQgdGFzayBvciBhIGNvbW1hbmQgbGluZQotICAgICAgICB1dGlsaXR5LjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KLSAgICAgICAgICAgIDx0ZD5BbnQgMS4yIGFuZCAxLjM8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vY2hlY2tzdHlsZSI+aHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9jaGVja3N0eWxlPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpjaGVja3N0eWxlQHB1cHB5Y3Jhd2wuY29tIj5PbGl2ZXIgQnVybjwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KLSAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ29uZmlndXJlIj4KLQotICAgICAgICA8cD5SZWN1cnNpdmUgYnVpbGQgc3VwcG9ydCAoY2FsbCBhbnQgb24gZXZlcnkgcGFja2FnZSBsZXZlbCwKLSAgICAgICAgYW5kIG9ubHkgYnVpbGQgZmlsZXMgaW4gdGhhdCBwYWNrYWdlIG9yIGluIHRoYXQgcGFja2FnZSBhbmQKLSAgICAgICAgZXZlcnl0aGluZyBiZWxvdykgd2l0aCBzZXBlcmF0aW9uIG9mIHNvdXJjZSBhbmQgb3V0cHV0LjwvcD4KLSAgICAgICAgCi0gICAgICAgIDxwPlRoZSB0YXNrIGdlbmVyYXRlcyBidWlsZCBmaWxlcyBpbiBhbnkgc3ViZGlyZWN0b3J5IChleGNlcHQKLSAgICAgICAgZm9yIENWUy1kaXJlY3RvcmllcykgZm9yIHlvdS4gT25seSBwbGFjZSBvbmUgYnVpbGQueG1sIGZpbGUgaW4KLSAgICAgICAgdGhlIHRvcCBhbmQgY2FsbCB0YXJnZXQgJmFwb3M7c2V0dXAmYXBvczsgb3IKLSAgICAgICAgJmFwb3M7cmVzY2FuJmFwb3M7LjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KLSAgICAgICAgICAgIDx0ZD5BbnQgMS4yIGFuZCAxLjM8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZHNkZWxmdC5ubC9+bGVtdmFsL2FudC8iPmh0dHA6Ly93d3cuZHNkZWxmdC5ubC9+bGVtdmFsL2FudC88L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmxlbXZhbEBkc2RlbGZ0Lm5sIj5NLkouUC4gdmFuIExlZXV3ZW48L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+TGljZW5zZSBkZXJpdmVkIGZyb20gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2U8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkoyTUUgQW50IFRhc2tzIj4KLQotICAgICAgICA8cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBzZXRzIG9mIHRhc2tzIHRvIGhlbHAgYnVpbGQgPGEKLSAgICAgICAgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMm1lLyI+SmF2YSAyIFBsYXRmb3JtLCBNaWNybwotICAgICAgICBFZGl0aW9uPC9hPiAoSjJNRSkgYXBwbGljYXRpb25zLjwvcD4KLSAgICAgICAgCi0gICAgICAgIDxwPlRoaXMgc2V0IHN1cHBvcnRzIENMREMgYW5kIHRoZSBLIFZpcnR1YWwgTWFjaGluZSAoS1ZNKTo8L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+QW50IDEuMzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+VVJMOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5kcmliaW4ub3JnL2RhdmUvajJtZV9hbnQvIj5odHRwOi8vd3d3LmRyaWJpbi5vcmcvZGF2ZS9qMm1lX2FudC88L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmRyaWJAZW50ZXJhY3QuY29tIj5EYXZlIERyaWJpbjwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KLSAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8cD5BbmQgdGhpcyBzZXQgd29ya3Mgd2l0aCB0aGUgSjJNRSBXaXJlbGVzcyBUb29sa2l0IGFuZCBNSURQCi0gICAgICAgIGZvciBQYWxtT1M6PC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgotICAgICAgICAgICAgPHRkPkFudCAxLjM8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuc3RhbXB5c29mdC5jb20vYW50LyI+aHR0cDovL3d3dy5zdGFtcHlzb2Z0LmNvbS9hbnQvPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpqZWNrZWxzQHN0YW1weXNvZnQuY29tIj5Kb3NoIEVja2VsczwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KLSAgICAgICAgICAgIDx0ZD5NSVQgTGljZW5zZTwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJUaW5pQW50Ij4KLQotICAgICAgICA8cD5UaW5pQW50IGlzIGFuIEFudCB0YXNrIHRvIHN1cHBvcnQgYnVpbGRpbmcgYXBwbGljYXRpb25zIGZvcgotICAgICAgICB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5pYnV0dG9uLmNvbS9USU5JLyI+VElOSTwvYT4uPC9wPgotICAgICAgICAKLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+QW50IDEuMiBhbmQgMS4zPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vdGluaWFudC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vdGluaWFudC5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzprZWxseUBhZDE0NDAubmV0Ij5TZWFuIEtlbGx5PC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgotICAgICAgICAgICAgPHRkPkJTRC1saWtlIGxpY2Vuc2U8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlZlbnVzIEFwcGxpY2F0aW9uIFB1Ymxpc2hlcidzIChWYW1wKSBBbnQgVGFzayBTdWl0ZSI+Ci0KLSAgICAgICAgPHA+VmVudXMgQXBwbGljYXRpb24gUHVibGlzaGVyJ3MgKFZhbXApIEFudCBUYXNrIFN1aXRlIGFsbG93cwotICAgICAgICB5b3UgdG8gc2lnbiBhbmQgcGFja2FnZSB5b3VyIGFwcGxpY2F0aW9ucyBpbnRvIHJlbG9jYXRhYmxlIFdlYgotICAgICAgICBBcmNoaXZlcyB0aGF0IHlvdSBjYW4gZHJvcCBpbnRvIHlvdXIgd2ViIHNlcnZlciBmb3IKLSAgICAgICAgc2luZ2xlLWNsaWNrIGxhdW5jaGluZyB1c2luZyBKYXZhIFdlYiBTdGFydCBvciBpbnRvIHNpbmdsZQotICAgICAgICBKYXZhIEFyY2hpdmUgaW5zdGFsbGVycyB0aGF0IHNlcnZlIHVwIHRoZWlyIGNvbnRlbnQgdGhyb3VnaCBhCi0gICAgICAgIGJ1aWx0LWluLCBtdWx0aS10aHJlYWRlZCwgdWx0cmEgbGlnaHQtd2VpZ2h0IHdlYiBzZXJ2ZXIuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgotICAgICAgICAgICAgPHRkPkFudCAxLjIgYW5kIDEuMzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+VVJMOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5nZW9jaXRpZXMuY29tL3ZhbXAyMDEvYW50Lmh0bWwiPmh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS92YW1wMjAxL2FudC5odG1sPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzp2YW1wMjAxQHlhaG9vLmNvbSI+R2VyYWxkIEJhdWVyPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgotICAgICAgICAgICAgPHRkPkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iSURFL0VkaXRvciBJbnRlZ3JhdGlvbiI+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudEZhcm0iPgotCi0gICAgICAgIDxwPkEgcGx1Z2luIHRoYXQgaW50ZWdyYXRlcyBBbnQgaW50byB0aGUgakVkaXQgZWRpdG9yLjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KLSAgICAgICAgICAgIDx0ZD5idW5kbGVzIEFudCAxLjM8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9wbHVnaW5zLmplZGl0Lm9yZy9wbHVnaW5zL0FudEZhcm0iPmh0dHA6Ly9wbHVnaW5zLmplZGl0Lm9yZy9wbHVnaW5zL0FudEZhcm08L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmplZGl0LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCI+akVkaXQgZGV2ZWxvcGVycyBtYWlsaW5nbGlzdDwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KLSAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50UnVubmVyIj4KLQotICAgICAgICA8cD5BbiBPcGVuVG9vbCB0aGF0IGludGVncmF0ZXMgQW50IGludG8gdGhlIEpCdWlsZGVyIElERS48L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+QW50IDEuMiBhbmQgMS4zPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmRpZXRlci1ib2dkb2xsLmRlL2phdmEvQW50UnVubmVyLyI+aHR0cDovL3d3dy5kaWV0ZXItYm9nZG9sbC5kZS9qYXZhL0FudFJ1bm5lci88L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmJvZ2RvbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5EaWV0ZXIgQm9nZG9sbDwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KLSAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50V29yayI+Ci0KLSAgICAgICAgPHA+QSBwbHVnaW4gdGhhdCBpbnRlZ3JhdGVzIEFudCBpbnRvIHRoZSBKZXh0IGVkaXRvci48L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+QW50IDEuMiBhbmQgMS4zPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJmdHA6Ly9qZXh0LnNvdXJjZWZvcmdlLm5ldC9wdWIvamV4dC9wbHVnaW5zL0FudFdvcmsuemlwIj5mdHA6Ly9qZXh0LnNvdXJjZWZvcmdlLm5ldC9wdWIvamV4dC9wbHVnaW5zL0FudFdvcmsuemlwPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpLSGFydGxhZ2VAdC1vbmxpbmUuZGUiPktsYXVzIEhhcnRsYWdlPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgotICAgICAgICAgICAgPHRkPkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRlbGxpSiBJREVBIDIuMCI+Ci0KLSAgICAgICAgPHA+SmF2YSBJREUgd2l0aCByZWZhY3RvcmluZyBzdXBwb3J0IGFuZCBBbnQgaW50ZWdyYXRpb24uPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgotICAgICAgICAgICAgPHRkPmJ1bmRsZXMgQW50IDEuMzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+VVJMOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5pbnRlbGxpai5jb20vaWRlYS8iPmh0dHA6Ly93d3cuaW50ZWxsaWouY29tL2lkZWEvPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QGludGVsbGlqLmNvbSI+c3VwcG9ydEBpbnRlbGxpai5jb208L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+Q29tbWVyY2lhbDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTmV0QmVhbnMgLyBGb3J0ZSBmb3IgSmF2YSI+Ci0KLSAgICAgICAgPHA+QSBtb2R1bGUgdGhhdCBpbnRlZ3JhdGVzIEFudCBpbnRvIHRoZSBOZXRCZWFucyBvciBGb3J0ZSBmb3IgSmF2YSBJREVzLjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KLSAgICAgICAgICAgIDx0ZD5idW5kbGVzIEFudCAxLjM8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnQubmV0YmVhbnMub3JnLyI+aHR0cDovL2FudC5uZXRiZWFucy5vcmcvPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpuYmRldkBuZXRiZWFucy5vcmciPm5iZGV2QG5ldGJlYW5zLm9yZzwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KLSAgICAgICAgICAgIDx0ZD5TdW4gUHVibGljIExpY2Vuc2U8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24gbmFtZT0iT3RoZXIiPgotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ3J1aXNlQ29udHJvbCI+Ci0gICAgICAgIDxwPkNydWlzZUNvbnRyb2wgaXMgYSB0b29sIGZvciBzZXR0aW5nIHVwIGEgY29udGludW91cyBidWlsZAotICAgICAgICBwcm9jZXNzLiAgQ3J1aXNlQ29udHJvbCBwcm92aWRlcyBhbiBBbnQgd3JhcHBlciBhbmQgYSBzZXQgb2YKLSAgICAgICAgdGFza3MgdG8gYXV0b21hdGUgdGhlIGNoZWNrb3V0L2J1aWxkL3Rlc3QgY3ljbGUuIENydWlzZUNvbnRyb2wKLSAgICAgICAgYWxzbyBjb21lcyBidW5kbGVkIHdpdGggYSBzZXJ2bGV0IGZvciB2aWV3aW5nIHRoZSBzdGF0dXMgb2YKLSAgICAgICAgdGhlIGN1cnJlbnQgYnVpbGQsIGFzIHdlbGwgYXMgcHJldmlvdXMgYnVpbGQgcmVzdWx0cy48L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+Ci0gICAgICAgICAgICA8dGQ+QW50IDEuMiBhbmQgMS4zPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vY3J1aXNlY29udHJvbC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vY3J1aXNlY29udHJvbC5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWYgPSdodHRwOi8vY3J1aXNlY29udHJvbC5zb3VyY2Vmb3JnZS5uZXQvY29udGFjdC5odG1sJz5Qcm9qZWN0IE1haWxpbmcgTGlzdHMgYW5kIEFkbWluaXN0cmF0b3JzPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgotICAgICAgICAgICAgPHRkPlJlbGVhc2UgMS4wIGhhcyBiZWVuIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgICAgICAgICAgIExpY2Vuc2UuICBTdGFydGluZyB3aXRoIHJlbGVhc2UgMS4xIHRoZSBsaWNlbnNlIGhhcyBiZWVuCi0gICAgICAgICAgICBjaGFuZ2VkIHRvIGEgQlNELWxpa2UgbGljZW5zZS48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0gICAgPC9zZWN0aW9uPgotCi0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3MvZmFxLnhtbCBiL3hkb2NzL2ZhcS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMmIzMGEuLjAwMDAwMDAKLS0tIGEveGRvY3MvZmFxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2N1bWVudD4KLQotICA8cHJvcGVydGllcz4KLSAgICA8YXV0aG9yIGVtYWlsPSJib2Rld2lnQGFwYWNoZS5vcmciPlN0ZWZhbiBCb2Rld2lnPC9hdXRob3I+Ci0gICAgPHRpdGxlPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC90aXRsZT4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxmYXFzZWN0aW9uIHRpdGxlPSJHZW5lcmFsIj4KLSAgICA8ZmFxIGlkPSJ3aGF0LWlzLWFudCI+Ci0gICAgICA8cXVlc3Rpb24+V2hhdCBpcyBBbnQ/PC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0gICAgICAgIDxwPiBBbnQgaXMgYSBKYXZhIGJhc2VkIGJ1aWxkIHRvb2wuIEluIHRoZW9yeSBpdCBpcyBraW5kIG9mCi0gICAgICAgIGxpa2UgJnF1b3Q7bWFrZSZxdW90OyB3aXRob3V0IG1ha2VzIHdyaW5rbGVzIGFuZCB3aXRoIHRoZSBmdWxsCi0gICAgICAgIHBvcnRhYmlsaXR5IG9mIHB1cmUgSmF2YSBjb2RlLjwvcD4KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotCi0gICAgPGZhcSBpZD0iYW50LW5hbWUiPgotICAgICAgPHF1ZXN0aW9uPldoeSBkbyB5b3UgY2FsbCBpdCBBbnQ/PC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0KLSAgICAgICAgPHA+QWNjb3JkaW5nIHRvIEFudCZhcG9zO3Mgb3JpZ2luYWwgYXV0aG9yIEphbWVzIER1bmNhbgotICAgICAgICBEYXZpZHNvbiwgdGhlIG5hbWUgaXMgYW4gYWNyb255bSBmb3IgJnF1b3Q7QW5vdGhlciBOZWF0Ci0gICAgICAgIFRvb2wmcXVvdDsuPC9wPgotICAgICAgICAKLSAgICAgICAgPHA+TGF0ZXIgZXhwbGFuYXRpb25zIGdvIGFsb25nIHRoZSBsaW5lcyBvZiAmcXVvdDtBbnRzIGFyZQotICAgICAgICBkb2luZyBhbiBleHRyZW1lbHkgZ29vZCBqb2IgYXQgYnVpbGRpbmcgdGhpbmdzJnF1b3Q7IG9yCi0gICAgICAgICZxdW90O0FudHMgYXJlIHZlcnkgc21hbGwgYW5kIGNhbiBjYXJyeSBhIHdlaWdodCBhIGRvemVuIHRpbWVzCi0gICAgICAgIG9mIHRoZWlyIG93biZxdW90OyAtIGRlc2NyaWJpbmcgd2hhdCBBbnQgaXMgaW50ZW5kZWQgdG8KLSAgICAgICAgYmUuPC9wPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0KLSAgICA8ZmFxIGlkPSJoaXN0b3J5Ij4KLSAgICAgIDxxdWVzdGlvbj5UZWxsIHVzIGEgbGl0dGxlIGJpdCBhYm91dCBBbnQmYXBvcztzIGhpc3RvcnkuPC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0KLSAgICAgICAgPHA+SW5pdGlhbGx5IEFudCB3YXMgcGFydCBvZiB0aGUgVG9tY2F0IGNvZGUgYmFzZSB3aGVuIGl0IHdhcwotICAgICAgICBkb25hdGVkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAtIGl0IGhhcyBiZWVuCi0gICAgICAgIGNyZWF0ZWQgYnkgSmFtZXMgRHVuY2FuIERhdmlkc29uLCB3aG8gYWxzbyBpcyB0aGUgb3JpZ2luYWwKLSAgICAgICAgYXV0aG9yIG9mIFRvbWNhdC4gQW50IHdhcyB0aGVyZSB0byBidWlsZCBUb21jYXQsIG5vdGhpbmcKLSAgICAgICAgZWxzZS48L3A+Ci0KLSAgICAgICAgPHA+U29vbiB0aGVyZWFmdGVyIHNldmVyYWwgb3BlbiBzb3VyY2UgSmF2YSBwcm9qZWN0cyByZWFsaXplZAotICAgICAgICB0aGF0IEFudCBjb3VsZCBzb2x2ZSB0aGUgcHJvYmxlbXMgdGhleSBoYWQgd2l0aCBtYWtlZmlsZXMuCi0gICAgICAgIFN0YXJ0aW5nIHdpdGggdGhlIHByb2plY3RzIGhvc3RlZCBhdCBKYWthcnRhIGFuZCB0aGUgb2xkIEphdmEKLSAgICAgICAgQXBhY2hlIHByb2plY3QsIEFudCBzcHJlYWQgbGlrZSBhIHZpcnVzIGFuZCBub3cgaXMgdGhlIGJ1aWxkCi0gICAgICAgIHRvb2wgb2YgY2hvaWNlIGZvciBhIGxvdCBvZiBwcm9qZWN0cy48L3A+Ci0KLSAgICAgICAgPHA+SW4gSmFudWFyeSAyMDAwIEFudCB3YXMgbW92ZWQgdG8gYSBzZXBhcmF0ZSBDVlMgbW9kdWxlIGFuZAotICAgICAgICB3YXMgcHJvbW90ZWQgdG8gYSBwcm9qZWN0IG9mIGl0cyBvd24sIGluZGVwZW5kZW50IG9mCi0gICAgICAgIFRvbWNhdC48L3A+Ci0KLSAgICAgICAgPHA+VGhlIGZpcnN0IHZlcnNpb24gb2YgQW50IHRoYXQgd2FzIGV4cG9zZWQgYSBsYWdlciBhdWRpZW5jZQotICAgICAgICB3YXMgdGhlIG9uZSB0aGF0IHNoaXBwZWQgd2l0aCBUb21jYXQmYXBvcztzIDMuMSByZWxlYXNlIG9uIDE5IEFwcmlsCi0gICAgICAgIDIwMDAuICBUaGlzIHZlcnNpb24gaGFzIGxhdGVyIGJlZW4gcmVmZXJlbmNlZCB0byBhcyBBbnQKLSAgICAgICAgMC4zLjEuPC9wPgotCi0gICAgICAgIDxwPlRoZSBmaXJzdCBvZmZpY2lhbCByZWxlYXNlIG9mIEFudCBhcyBhIHN0YW5kIGFsb25lIHByb2R1Y3Qgd2FzCi0gICAgICAgIEFudCAxLjEgcmVsZWFzZWQgb24gMTkgSnVseSAyMDAwLiAgVGhlIGNvbXBsZXRlIHJlbGVhc2UKLSAgICAgICAgaGlzdG9yeTo8L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5BbnQgVmVyc2lvbjwvdGg+Ci0gICAgICAgICAgICA8dGg+UmVsZWFzZSBEYXRlPC90aD4KLSAgICAgICAgICA8L3RyPgotCi0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjEuMTwvdGQ+Ci0gICAgICAgICAgICA8dGQ+MTkgSnVseSAyMDAwPC90ZD4KLSAgICAgICAgICA8L3RyPgotCi0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjEuMjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+MjQgT2N0b2JlciAyMDAwPC90ZD4KLSAgICAgICAgICA8L3RyPgotCi0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjEuMzwvdGQ+Ci0gICAgICAgICAgICA8dGQ+MyBNYXJjaCAyMDAxPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0KLSAgPC9mYXFzZWN0aW9uPgotCi0gIDxmYXFzZWN0aW9uIHRpdGxlPSJJbnN0YWxsYXRpb24iPgotICAgIDxmYXEgaWQ9Im5vLWdudS10YXIiPgotICAgICAgPHF1ZXN0aW9uPkkgZ2V0IGNoZWNrc3VtIGVycm9ycyB3aGVuIEkgdHJ5IHRvIGV4dHJhY3QgdGhlCi0gICAgICA8Y29kZT50YXIuZ3o8L2NvZGU+IGRpc3RyaWJ1dGlvbiBmaWxlLiBXaHk/PC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0gICAgICAgIDxwPkFudCZhcG9zO3MgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIGZpbGUgbmFtZXMgdGhhdCBhcmUgbG9uZ2VyCi0gICAgICAgIHRoYW4gMTAwIGNoYXJhY3RlcnMsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YW5kYXJkCi0gICAgICAgIHRhciBmaWxlIGZvcm1hdC4gU2V2ZXJhbCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRhciB1c2UKLSAgICAgICAgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2F5cyB0byB3b3JrIGFyb3VuZCB0aGlzCi0gICAgICAgIHJlc3RyaWN0aW9uLjwvcD4KLQotICAgICAgICA8cD5BbnQmYXBvcztzICZsdDt0YXImZ3Q7IHRhc2sgY2FuIGNyZWF0ZSB0YXIgYXJjaGl2ZXMgdGhhdCB1c2UKLSAgICAgICAgdGhlIEdOVSB0YXIgZXh0ZW5zaW9uLCBhbmQgdGhpcyBoYXMgYmVlbiB1c2VkIHdoZW4gcHV0dGluZwotICAgICAgICB0b2dldGhlciB0aGUgZGlzdHJpYnV0aW9uLiBJZiB5b3UgYXJlIHVzaW5nIGEgZGlmZmVyZW50Ci0gICAgICAgIHZlcnNpb24gb2YgdGFyIChmb3IgZXhhbXBsZSwgdGhlIG9uZSBzaGlwcGluZyB3aXRoIFNvbGFyaXMpLAotICAgICAgICB5b3UgY2Fubm90IHVzZSBpdCB0byBleHRyYWN0IHRoZSBhcmNoaXZlLjwvcD4KLQotICAgICAgICA8cD5UaGUgc29sdXRpb24gaXMgdG8gZWl0aGVyIGluc3RhbGwgR05VIHRhciwgd2hpY2ggY2FuIGJlCi0gICAgICAgIGZvdW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90YXIvdGFyLmh0bWwiPmhlcmU8L2E+IAotICAgICAgICBvciB1c2UgdGhlIHppcCBhcmNoaXZlIGluc3RlYWQgKHlvdSBjYW4gZXh0cmFjdCBpdCB1c2luZwotICAgICAgICA8Y29kZT5qYXIgeGY8L2NvZGU+KS48L3A+Ci0gICAgICA8L2Fuc3dlcj4KLSAgICA8L2ZhcT4KLSAgPC9mYXFzZWN0aW9uPgotCi0gIDxmYXFzZWN0aW9uIHRpdGxlPSJVc2luZyBBbnQiPgotICAgIDxmYXEgaWQ9ImFsd2F5cy1yZWNvbXBpbGVzIj4KLSAgICAgIDxxdWVzdGlvbj5XaHkgZG9lcyBBbnQgYWx3YXlzIHJlY29tcGlsZSBhbGwgbXkgSmF2YSBmaWxlcz88L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLQotICAgICAgICA8cD5JbiBvcmRlciB0byBmaW5kIG91dCB3aGljaCBmaWxlcyBzaG91bGQgYmUgY29tcGlsZWQsIEFudAotICAgICAgICBjb21wYXJlcyB0aGUgdGltZXN0YW1wcyBvZiB0aGUgc291cmNlIGZpbGVzIHRvIHRob3NlIG9mIHRoZQotICAgICAgICByZXN1bHRpbmcgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcy4gIE9wZW5pbmcgYWxsIHNvdXJjZSBmaWxlcwotICAgICAgICB0byBmaW5kIG91dCB3aGljaCBwYWNrYWdlIHRoZXkgYmVsb25nIHRvIHdvdWxkIGJlIHZlcnkKLSAgICAgICAgaW5lZmZpY2llbnQgLSBpbnN0ZWFkIG9mIHRoaXMsIEFudCBleHBlY3RzIHlvdSB0byBwbGFjZSB5b3VyCi0gICAgICAgIHNvdXJjZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSBoaWVyYXJjaHkgdGhhdCBtaXJyb3JzIHlvdXIKLSAgICAgICAgcGFja2FnZSBoaWVyYXJjaHkgYW5kIHRvIHBvaW50IEFudCB0byB0aGUgcm9vdCBvZiB0aGlzCi0gICAgICAgIGRpcmVjdG9yeSB0cmVlIHdpdGggdGhlIDxjb2RlPnNyY2RpcjwvY29kZT4gYXR0cmlidXRlLjwvcD4KLQotICAgICAgICA8cD5TYXkgeW91IGhhdmUgPGNvZGU+Jmx0O2phdmFjIHNyY2Rpcj0mcXVvdDtzcmMmcXVvdDsKLSAgICAgICAgZGVzdGRpcj0mcXVvdDtkZXN0JnF1b3Q7IC8mZ3Q7PC9jb2RlPi4gIElmIEFudCBmaW5kcyBhIGZpbGUKLSAgICAgICAgPGNvZGU+c3JjL2EvYi9DLmphdmE8L2NvZGU+IGl0IGV4cGVjdHMgaXQgdG8gYmUgaW4gcGFja2FnZQotICAgICAgICA8Y29kZT5hLmI8L2NvZGU+IHNvIHRoYXQgdGhlIHJlc3VsdGluZyA8Y29kZT4uY2xhc3M8L2NvZGU+Ci0gICAgICAgIGZpbGUgaXMgZ29pbmcgdG8gYmUgPGNvZGU+ZGVzdC9hL2IvQy5jbGFzczwvY29kZT4uPC9wPgotCi0gICAgICAgIDxwPklmIHlvdXIgc2V0dXAgaXMgZGlmZmVyZW50LCBBbnQmYXBvcztzIGhldXJpc3RpYyB3b24mYXBvczt0IHdvcmsgYW5kCi0gICAgICAgIGl0IHdpbGwgcmVjb21waWxlIGNsYXNzZXMgdGhhdCBhcmUgdXAgdG8gZGF0ZS4gIEFudCBpcyBub3QgdGhlCi0gICAgICAgIG9ubHkgdG9vbCwgdGhhdCBleHBlY3RzIGEgc291cmNlIHRyZWUgbGF5b3V0IGxpa2UgdGhpcy48L3A+Ci0KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotCi0gICAgPGZhcSBpZD0icGFzc2luZy1jbGktYXJncyI+Ci0gICAgICA8cXVlc3Rpb24+SG93IGRvIEkgcGFzcyBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0byBteQotICAgICAgICBidWlsZCBmaWxlPzwvcXVlc3Rpb24+Ci0gICAgICA8YW5zd2VyPgotCi0gICAgICAgIDxwPlVzZSBwcm9wZXJ0aWVzOiA8Y29kZT5hbnQKLSAgICAgICAgLUQmbHQ7bmFtZSZndDs9Jmx0O3ZhbHVlJmd0OzwvY29kZT4gbGV0cyB5b3UgZGVmaW5lIHZhbHVlcyBmb3IKLSAgICAgICAgcHJvcGVydGllcy4gIFRoZXNlIGNhbiB0aGVuIGJlIHVzZWQgd2l0aGluIHlvdXIgYnVpbGQgZmlsZSBhcwotICAgICAgICBhbnkgbm9ybWFsIHByb3BlcnR5OiA8Y29kZT4keyZsdDtuYW1lJmd0O308L2NvZGU+IHdpbGwgcHV0IGluCi0gICAgICAgIDxjb2RlPiZsdDt2YWx1ZSZndDs8L2NvZGU+LjwvcD4KLQotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0KLSAgICA8ZmFxIGlkPSJqaWtlcy1zd2l0Y2hlcyI+Ci0gICAgICA8cXVlc3Rpb24+SG93IGNhbiBJIHVzZSBKaWtlcyBzcGVjaWZpYyBjb21tYW5kIGxpbmUKLSAgICAgICAgc3dpdGNoZXM/PC9xdWVzdGlvbj4KLQotICAgICAgPGFuc3dlcj4KLQotICAgICAgICA8cD5BIGNvdXBsZSBvZiBzd2l0Y2hlcyBhcmUgc3VwcG9ydGVkIHZpYSBtYWdpYwotICAgICAgICAgIHByb3BlcnRpZXM6PC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+c3dpdGNoPC90aD4KLSAgICAgICAgICAgIDx0aD5wcm9wZXJ0eTwvdGg+Ci0gICAgICAgICAgICA8dGg+ZGVmYXVsdDwvdGg+Ci0gICAgICAgICAgPC90cj4KLQotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4rRTwvdGQ+Ci0gICAgICAgICAgICA8dGQ+YnVpbGQuY29tcGlsZXIuZW1hY3M8L3RkPgotICAgICAgICAgICAgPHRkPmZhbHNlID09IG5vdCBzZXQ8L3RkPgotICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+LW5vd2FybjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+YnVpbGQuY29tcGlsZXIud2FybmluZ3M8L3RkPgotICAgICAgICAgICAgPHRkPnRydWUgPT0gbm90IHNldDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLQotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4rUDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+YnVpbGQuY29tcGlsZXIucGVkYW50aWM8L3RkPgotICAgICAgICAgICAgPHRkPmZhbHNlID09IG5vdCBzZXQ8L3RkPgotICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+K0Y8L3RkPgotICAgICAgICAgICAgPHRkPmJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQ8L3RkPgotICAgICAgICAgICAgPHRkPmZhbHNlID09IG5vdCBzZXQ8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotCi0gICAgPGZhcSBpZD0ic2hlbGwtcmVkaXJlY3QtMSI+Ci0gICAgICA8cXVlc3Rpb24+SG93IGRvIEkgaW5jbHVkZSBhICZsdDsgY2hhcmFjdGVyIGluIG15IGNvbW1hbmQgbGluZSBhcmd1bWVudHM/PC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0gICAgICAgIDxwPlRoZSBzaG9ydCBhbnN3ZXIgaXMgIlVzZSA8Y29kZT4mYW1wO2x0OzwvY29kZT4iLjwvcD4KLQotICAgICAgICA8cD5UaGUgbG9uZyBhbnN3ZXIgaXMsIHRoYXQgdGhpcyBwcm9iYWJseSB3b24ndCBkbyB3aGF0IHlvdQotICAgICAgICB3YW50IGFueXdheSwgc2VlIDxhIGhyZWY9IiNzaGVsbC1yZWRpcmVjdC0yIj50aGUgbmV4dAotICAgICAgICBzZWN0aW9uPC9hPi48L3A+Ci0gICAgICA8L2Fuc3dlcj4KLSAgICA8L2ZhcT4KLQotICAgIDxmYXEgaWQ9InNoZWxsLXJlZGlyZWN0LTIiPgotICAgICAgPHF1ZXN0aW9uPkhvdyBkbyBJIHJlZGlyZWN0IHN0YW5kYXJkIGlucHV0IG9yIHN0YW5kYXJkIG91dHB1dAotICAgICAgICBpbiB0aGUgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrPzwvcXVlc3Rpb24+Ci0gICAgICA8YW5zd2VyPgotICAgICAgICA8cD5TYXkgeW91IHdhbnQgdG8gcmVkaXJlY3QgdGhlIHN0YW5kYXJkIGlucHV0IHN0cmVhbSBvZiB0aGUKLSAgICAgICAgPGNvZGU+Y2F0PC9jb2RlPiBjb21tYW5kIHRvIHJlYWQgZnJvbSBhIGZpbGUsIHNvbWV0aGluZwotICAgICAgICBsaWtlPC9wPgotCi0gICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCi1zaGVsbC1wcm9tcHQ+IGNhdCA8IGZvbwotXV0+PC9zb3VyY2U+Ci0gICAgICAgIAotICAgICAgICA8cD5hbmQgdHJ5IHRvIHRyYW5zbGF0ZSBpdCBpbnRvPC9wPgotCi0gICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCi08ZXhlYyBleGVjdXRhYmxlPSJjYXQiPgotICA8YXJnIHZhbHVlPSImbHQ7IiAvPgotICA8YXJnIHZhbHVlPSJmb28iIC8+Ci08L2V4ZWM+Ci1dXT48L3NvdXJjZT4KLQotICAgICAgICA8cD5UaGlzIHdpbGwgbm90IGRvIHdoYXQgeW91IGV4cGVjdC4gIFRoZSBpbnB1dC1yZWRpcmVjdGlvbiBpcwotICAgICAgICBwZXJmb3JtZWQgYnkgeW91ciBzaGVsbCwgbm90IHRoZSBjb21tYW5kIGl0c2VsZiwgc28gdGhpcwotICAgICAgICBzaG91bGQgcmVhZDo8L3A+Ci0gICAgICAgIAotICAgICAgICA8c291cmNlPjwhW0NEQVRBWwotPGV4ZWMgZXhlY3V0YWJsZT0iL2Jpbi9zaCI+Ci0gIDxhcmcgdmFsdWU9Ii1jIiAvPgotICA8YXJnIHZhbHVlPSJjYXQgJmx0OyBmb28iIC8+Ci08L2V4ZWM+Ci1dXT48L3NvdXJjZT4KLQotICAgICAgICA8cD5Ob3RlLCB0aGF0IHlvdSBtdXN0IHVzZSB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGF0dHJpYnV0ZSBvZgotICAgICAgICA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gaW4gdGhlIGxhc3QgZWxlbWVudC48L3A+Ci0KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotCi0gIDwvZmFxc2VjdGlvbj4KLQotICA8ZmFxc2VjdGlvbiB0aXRsZT0iQW50IGFuZCBJREVzL0VkaXRvcnMiPgotICAgIDxmYXEgaWQ9ImludGVncmF0aW9uIj4KLSAgICAgIDxxdWVzdGlvbj5JcyBBbnQgc3VwcG9ydGVkIGJ5IG15IElERS9FZGl0b3I/PC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0gICAgICAgIDxwPlNlZSB0aGUgPGEgaHJlZj0iZXh0ZXJuYWwuaHRtbCNJREUlNDdFZGl0b3IrSW50ZWdyYXRpb24iPnNlY3Rpb24gCi0gICAgICAgIG9uIElERSBpbnRlZ3JhdGlvbjwvYT4gb24gb3VyIGV4dGVybmFsIHRvb2xzIHBhZ2UuPC9wPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0KLSAgICA8ZmFxIGlkPSJlbWFjcy1tb2RlIj4KLSAgICAgIDxxdWVzdGlvbj5XaHkgZG9lc24mYXBvczt0IChYKUVtYWNzL3ZpL01hY09TIFgncyBwcm9qZWN0IGJ1aWxkZXIKLSAgICAgIHBhcnNlIHRoZSBlcnJvciBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgQW50IGNvcnJlY3RseT88L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLQotICAgICAgICA8cD5BbnQgYWRkcyBhICZxdW90O2Jhbm5lciZxdW90OyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50Ci0gICAgICAgIHRhc2sgaW4gZnJvbnQgb2YgYWxsIG1lc3NhZ2VzIC0gYW5kIHRoZXJlIGFyZSBubyBidWlsdC1pbgotICAgICAgICByZWd1bGFyIGV4cHJlc3Npb25zIGluIHlvdXIgRWRpdG9yIHRoYXQgd291bGQgYWNjb3VudCBmb3IKLSAgICAgICAgdGhpcy48L3A+Ci0KLSAgICAgICAgPHA+WW91IGNhbiBkaXNhYmxlIHRoaXMgYmFubmVyIGJ5IGludm9raW5nIEFudCB3aXRoIHRoZQotICAgICAgICA8Y29kZT4tZW1hY3M8L2NvZGU+IHN3aXRjaC4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGFkZCB0aGUKLSAgICAgICAgZm9sbG93aW5nIHNuaXBwZXQgdG8geW91ciA8Y29kZT4uZW1hY3M8L2NvZGU+IHRvIG1ha2UgRW1hY3MKLSAgICAgICAgdW5kZXJzdGFuZCBBbnQmYXBvcztzIG91dHB1dC48L3A+Ci0KLSAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKLShyZXF1aXJlICdjb21waWxlKQotKHNldHEgY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwLWFsaXN0Ci0gIChhcHBlbmQgKGxpc3QgCi0gICAgIDs7IHdvcmtzIGZvciBqaWtlcwotICAgICAnKCJeXFxzLSpcXFtbXl1dKlxcXVxccy0qXFwoLitcXCk6XFwoWzAtOV0rXFwpOlxcKFswLTldK1xcKTpbMC05XSs6WzAtOV0rOiIgMSAyIDMpCi0gICAgIDs7IHdvcmtzIGZvciBqYXZhYyAKLSAgICAgJygiXlxccy0qXFxbW15dXSpcXF1cXHMtKlxcKC4rXFwpOlxcKFswLTldK1xcKToiIDEgMikpCi0gIGNvbXBpbGF0aW9uLWVycm9yLXJlZ2V4cC1hbGlzdCkpCi1dXT48L3NvdXJjZT4KLQotICAgICAgICA8cD5ZZXQgYW5vdGhlciBhbHRlcm5hdGl2ZSB0aGF0IHByZXNlcnZlcyBtb3N0IG9mIEFudCdzCi0gICAgICAgIGZvcm1hdHRpbmcgaXMgdG8gcGlwZSBBbnQncyBvdXRwdXQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIFBlcmwKLSAgICAgICAgc2NyaXB0IGJ5IERpcmstV2lsbGVtIHZhbiBHdWxpazo8L3A+Ci0KLSAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKLSMhL3Vzci9iaW4vcGVybAotIwotIyBNYXkgMjAwMSBkaXJreEBhcGFjaGUub3JnIC0gcmVtb3ZlIGFueQotIyBbZm9vXSBsaW5lcyBmcm9tIHRoZSBvdXRwdXQ7IGtlZXBpbmcKLSMgc3BhY2luZyBtb3JlIG9yIGxlc3MgdGhlcmUuCi0jCi0kfD0xOwotd2hpbGUoPFNURElOPikgewotCWlmIChzL14oXHMrKVxbKFx3KylcXS8vKSB7Ci0JCWlmICgkMiBuZSAkbGFzdCkgewotCQkJcHJpbnQgIiQxXFskMlxdIjsKLQkJCSRzID0gJyAnIHggbGVuZ3RoKCQyKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ICIkMSAkcyAiOwotCQl9OwotCQkkbGFzdCA9ICQyOwotCX07Ci0JcHJpbnQ7Ci19OwotXV0+PC9zb3VyY2U+Ci0KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotICA8L2ZhcXNlY3Rpb24+Ci0KLSAgPGZhcXNlY3Rpb24gdGl0bGU9IkFkdmFuY2VkIGlzc3VlcyI+Ci0gICAgPGZhcSBpZD0iZHRkIj4KLSAgICAgIDxxdWVzdGlvbj5JcyB0aGVyZSBhIERURCB0aGF0IEkgY2FuIHVzZSB0byB2YWxpZGF0ZSBteSBidWlsZAotICAgICAgZmlsZXM/PC9xdWVzdGlvbj4KLQotICAgICAgPGFuc3dlcj4KLQotICAgICAgICA8cD5BbiBpbmNvbXBsZXRlIERURCBjYW4gYmUgY3JlYXRlZCBieSB0aGUKLSAgICAgICAgICA8Y29kZT4mbHQ7YW50c3RydWN0dXJlJmd0OzwvY29kZT4gdGFzayAtIGJ1dCB0aGlzIG9uZQotICAgICAgICAgIGhhcyBhIGZldyBwcm9ibGVtczo8L3A+Ci0KLSAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICA8bGk+SXQgZG9lc24mYXBvczt0IGtub3cgYWJvdXQgcmVxdWlyZWQgYXR0cmlidXRlcy4gIE9ubHkKLSAgICAgICAgICAgIG1hbnVhbCB0d2Vha2luZyBvZiB0aGlzIGZpbGUgY2FuIGhlbHAgaGVyZS48L2xpPgotICAgICAgICAgIAotICAgICAgICAgICAgPGxpPkl0IGlzIG5vdCBjb21wbGV0ZSAtIGlmIHlvdSBhZGQgbmV3IHRhc2tzIHZpYQotICAgICAgICAgICAgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiBpdCB3b24mYXBvczt0IGtub3cgYWJvdXQgaXQuICBTZWUKLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2R2LmZyL3BhZ2VzL2Nhc2EvaHRtbC9hbnQtZHRkLmVuLmh0bWwiPnRoaXMKLSAgICAgICAgICAgIHBhZ2U8L2E+IGJ5IE1pY2hlbCBDYXNhYmlhbmNhIGZvciBhIHNvbHV0aW9uIHRvIHRoaXMKLSAgICAgICAgICAgIHByb2JsZW0uICBOb3RlIHRoYXQgdGhlIERURCB5b3UgY2FuIGRvd25sb2FkIGF0IHRoaXMgcGFnZQotICAgICAgICAgICAgaXMgYmFzZWQgb24gQW50IDAuMy4xLjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT5JdCBtYXkgZXZlbiBiZSBhbiBpbnZhbGlkIERURC4gIEFzIEFudCBhbGxvd3MgdGFza3MKLSAgICAgICAgICAgIHdyaXRlcnMgdG8gZGVmaW5lIGFyYml0cmFyeSBlbGVtZW50cywgbmFtZSBjb2xsaXNpb25zIHdpbGwKLSAgICAgICAgICAgIGhhcHBlbiBxdWl0ZSBmcmVxdWVudGx5IC0gaWYgeW91ciB2ZXJzaW9uIG9mIEFudCBjb250YWlucwotICAgICAgICAgICAgdGhlIG9wdGlvbmFsIDxjb2RlPiZsdDt0ZXN0Jmd0OzwvY29kZT4gYW5kCi0gICAgICAgICAgICA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB0YXNrcywgdGhlcmUgYXJlIHR3byBYTUwKLSAgICAgICAgICAgIGVsZW1lbnRzIG5hbWVkIHRlc3QgKHRoZSB0YXNrIGFuZCB0aGUgbmVzdGVkIGNoaWxkIGVsZW1lbnQKLSAgICAgICAgICAgIG9mIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+KSB3aXRoIGRpZmZlcmVudCBhdHRyaWJ1dGUKLSAgICAgICAgICAgIGxpc3RzLiAgVGhpcyBwcm9ibGVtIGNhbm5vdCBiZSBzb2x2ZWQsIERURHMgZG9uJmFwb3M7dCBnaXZlIGEKLSAgICAgICAgICAgIHN5bnRheCByaWNoIGVub3VnaCB0byBzdXBwb3J0IHRoaXMuPC9saT4KLSAgICAgICAgICA8L3VsPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0KLSAgICA8ZmFxIGlkPSJ4bWwtZW50aXR5LWluY2x1ZGUiPgotICAgICAgPHF1ZXN0aW9uPkhvdyBkbyBJIGluY2x1ZGUgYW4gWE1MIHNuaXBwZXQgaW4gbXkgYnVpbGQgZmlsZT88L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLSAgICAgICAgPHA+WW91IGNhbiB1c2UgWE1MJmFwb3M7cyB3YXkgb2YgaW5jbHVkaW5nIGV4dGVybmFsIGZpbGVzIGFuZCBsZXQKLSAgICAgICAgdGhlIHBhcnNlciBkbyB0aGUgam9iIGZvciBBbnQ6PC9wPgotCi0gICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCFET0NUWVBFIHByb2plY3QgWwotICAgIDwhRU5USVRZIGNvbW1vbiBTWVNURU0gImZpbGU6Li9jb21tb24ueG1sIj4KLV0+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iPgotCi0gIDx0YXJnZXQgbmFtZT0ic2V0dXAiPgotICAgIC4uLgotICA8L3RhcmdldD4KLQotICAmY29tbW9uOwotCi0gIC4uLgotCi08L3Byb2plY3Q+Ci1dXT48L3NvdXJjZT4KLQotICAgICAgICA8cD53aWxsIGxpdGVyYWxseSBpbmNsdWRlIHRoZSBjb250ZW50cyBvZiA8Y29kZT5jb21tb24ueG1sPC9jb2RlPiB3aGVyZQotICAgICAgICB5b3UmYXBvczt2ZSBwbGFjZWQgdGhlIDxjb2RlPiZhbXA7Y29tbW9uOzwvY29kZT4gZW50aXR5LjwvcD4KLQotICAgICAgICA8cD5JbiBjb21iaW5hdGlvbiB3aXRoIGEgRFRELCB0aGlzIHdvdWxkIGxvb2sgbGlrZSB0aGlzOjwvcD4KLQotICAgICAgICA8c291cmNlPjwhW0NEQVRBWwotPCFET0NUWVBFIHByb2plY3QgUFVCTElDICItLy9BTlQvL0RURCBwcm9qZWN0Ly9FTiIgImZpbGU6Li9hbnQuZHRkIiBbCi0gICA8IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAiZmlsZTouL2hlYWRlci54bWwiPgotXT4KLV1dPjwvc291cmNlPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0KLSAgICA8ZmFxIGlkPSJtYWlsLWxvZ2dlciI+Ci0gICAgICA8cXVlc3Rpb24+SG93IGRvIEkgc2VuZCBhbiBlbWFpbCB3aXRoIHRoZSByZXN1bHQgb2YgbXkgYnVpbGQKLSAgICAgICAgcHJvY2Vzcz88L3F1ZXN0aW9uPgotCi0gICAgICA8YW5zd2VyPgotCi0gICAgICAgIDxwPllvdSBjYW4gdXNlIGEgY3VzdG9tIEJ1aWxkTGlzdGVuZXIsIHRoYXQgc2VuZHMgb3V0IGFuIGVtYWlsCi0gICAgICAgIGluIHRoZSBidWlsZEZpbmlzaGVkKCkgbWV0aG9kLiAgV2lsbCBHbG96ZXIKLSAgICAgICAgJmx0O3dpbGwuZ2xvemVyQGpkYS5jb20mZ3Q7IGhhcyB3cml0dGVuIHN1Y2ggYSBsaXN0ZW5lciBiYXNlZAotICAgICAgICBvbiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFtYWlsLyI+SmF2YU1haWw8L2E+LCAKLSAgICAgICAgdGhlIHNvdXJjZSBpczwvcD4KLQotICAgICAgICA8c291cmNlPjwhW0NEQVRBWwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC5tYWlsLio7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC4qOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci0KLS8qKgotICogQSBzaW1wbGUgbGlzdGVuZXIgdGhhdCB3YWl0cyBmb3IgYSBidWlsZCB0byBmaW5pc2ggYW5kIHNlbmRzIGFuIGVtYWlsCi0gKiBvZiB0aGUgcmVzdWx0cy4gIFRoZSBzZXR0aW5ncyBhcmUgc3RvcmVkIGluICJtb25pdG9yLnByb3BlcnRpZXMiIGFuZAotICogYXJlIGZhaXJseSBzZWxmIGV4cGxhbmF0b3J5LgotICoKLSAqIEBhdXRob3IgICAgICBXaWxsIEdsb3plcgotICogQHZlcnNpb24gICAgIDEuMDVhIDA5LzA2LzIwMDAKLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkTW9uaXRvciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgewotICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIHByb3BzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEJ1aWxkTW9uaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRNb25pdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIm1vbml0b3IucHJvcGVydGllcyIpOwotICAgICAgICBwcm9wcy5sb2FkKGlzKTsKLSAgICAgICAgaXMuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHRoZSBzdGF0dXMgb2YgdGhlIGJ1aWxkIGFuZCB0aGUgYWN0aW9ucyB0byBmb2xsb3csIG5vdyB0aGF0Ci0gICAgICogdGhlIGJ1aWxkIGhhcyBjb21wbGV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gICAgICAgZSAgICAgICBFdmVudCBkZXNjcmliaW5nIHRoZSBidWlsZCB0YXR1cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZSkgewotICAgICAgICBUaHJvd2FibGUgdGggPSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICBTdHJpbmcgc3RhdHVzID0gKHRoICE9IG51bGwpID8gImZhaWxlZCIgOiAic3VjY2VlZGVkIjsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gImJ1aWxkLiIgKyBzdGF0dXM7Ci0gICAgICAgICAgICBpZiAocHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgIi5ub3RpZnkiKS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gU2Vzc2lvbi5nZXREZWZhdWx0SW5zdGFuY2UocHJvcHMsIG51bGwpOwotCi0gICAgICAgICAgICBNaW1lTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1pbWVNZXNzYWdlKHNlc3Npb24pOwotICAgICAgICAgICAgbWVzc2FnZS5hZGRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5UTywgcGFyc2VBZGRyZXNzZXMoCi0gICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgIi5lbWFpbC50byIpKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNldFN1YmplY3QocHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgIi5lbWFpbC5zdWJqZWN0IikpOwotCi0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcigKLSAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgiYnVpbGQubG9nIikpKTsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOwotICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3LndyaXRlKGxpbmUpOwotICAgICAgICAgICAgICAgIHN3LndyaXRlKCJcbiIpOwotICAgICAgICAgICAgICAgIGxpbmUgPSBici5yZWFkTGluZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbWVzc2FnZS5zZXRUZXh0KHN3LnRvU3RyaW5nKCksICJVVEYtOCIpOwotICAgICAgICAgICAgc3cuY2xvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVHJhbnNwb3J0IHRyYW5zcG9ydCA9IHNlc3Npb24uZ2V0VHJhbnNwb3J0KCk7Ci0gICAgICAgICAgICB0cmFuc3BvcnQuY29ubmVjdCgpOwotICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQobWVzc2FnZSk7Ci0gICAgICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkTW9uaXRvciBmYWlsZWQgdG8gc2VuZCBlbWFpbCEiKTsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpbnRlcm5ldCBlbWFpbCBhZGRyZXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gICAgICAgcyAgICAgICBUaGUgbGlzdCBvZiBhZGRyZXNzZXMuCi0gICAgICogQHJldHVybiAgICAgIEFycmF5IG9mIEFkZHJlc3Nlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWRkcmVzc1tdIHBhcnNlQWRkcmVzc2VzKFN0cmluZyBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiLCIpOwotICAgICAgICBBZGRyZXNzW10gYWRkcnMgPSBuZXcgQWRkcmVzc1tzdC5jb3VudFRva2VucygpXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZHJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRyc1tpXSA9IG5ldyBJbnRlcm5ldEFkZHJlc3Moc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhZGRyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBlKSB7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBlKSB7Ci0gICAgfQotfQotXV0+PC9zb3VyY2U+Ci0gICAgICAgICAgCi0gICAgICA8cD5XaXRoIGEgPGNvZGU+bW9uaXRvci5wcm9wZXJ0aWVzPC9jb2RlPiBsaWtlIHRoaXM8L3A+Ci0KLSAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKLSMgY29uZmlndXJhdGlvbiBmb3IgYnVpbGQgbW9uaXRvcgotCi1tYWlsLnRyYW5zcG9ydC5wcm90b2NvbD1zbXRwCi1tYWlsLnNtdHAuaG9zdD08aG9zdD4KLW1haWwuZnJvbT1XaWxsIEdsb3plciA8d2lsbC5nbG96ZXJAamRhLmNvbT4KLQotYnVpbGQubG9nPWJ1aWxkLmxvZwotCi1idWlsZC5mYWlsZWQubm90aWZ5PXRydWUKLWJ1aWxkLmZhaWxlZC5lbWFpbC50bz13aWxsLmdsb3plckBqZGEuY29tCi1idWlsZC5mYWlsZWQuZW1haWwuc3ViamVjdD1OaWdodGx5IGJ1aWxkIGZhaWxlZCEKLQotYnVpbGQuc3VjY2VlZGVkLm5vdGlmeT10cnVlCi1idWlsZC5zdWNjZWVkZWQuZW1haWwudG89d2lsbC5nbG96ZXJAamRhLmNvbQotYnVpbGQuc3VjY2VlZGVkLmVtYWlsLnN1YmplY3Q9TmlnaHRseSBidWlsZCBzdWNjZWVkZWQhCi1dXT48L3NvdXJjZT4KLQotICAgICAgICA8cD48Y29kZT5tb25pdG9yLnByb3BlcnRpZXM8L2NvZGU+IHNob3VsZCBiZSBwbGFjZWQgcmlnaHQgbmV4dAotICAgICAgICB0byB5b3VyIGNvbXBpbGVkIDxjb2RlPkJ1aWxkTW9uaXRvci5jbGFzczwvY29kZT4uICBUbyB1c2UgaXQsCi0gICAgICAgIGludm9rZSBBbnQgbGlrZTwvcD4KLSAgICAgICAgCi0gICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCi1hbnQgLWxpc3RlbmVyIEJ1aWxkTW9uaXRvcgotXV0+PC9zb3VyY2U+Ci0KLSAgICAgICAgPHA+TWFrZSBzdXJlIHRoYXQgPGNvZGU+bWFpbC5qYXI8L2NvZGU+IGZyb20gSmF2YU1haWwgYW5kCi0gICAgICAgIDxjb2RlPmFjdGl2YXRpb24uamFyPC9jb2RlPiBmcm9tIHRoZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhYmVhbnMvZ2xhc2dvdy9qYWYuaHRtbCI+SmF2YQotICAgICAgICBCZWFucyBBY3RpdmF0aW9uIEZyYW1ld29yazwvYT4gaW4geW91ciA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LjwvcD4KLQotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0KLSAgPC9mYXFzZWN0aW9uPgotCi0gIDxmYXFzZWN0aW9uIHRpdGxlPSJLbm93biBwcm9ibGVtcyI+Ci0gICAgPGZhcSBpZD0icmVtb3ZlLWNyIj4KLSAgICAgIDxxdWVzdGlvbj4mbHQ7Y2htb2QmZ3Q7IG9yICZsdDtleGVjJmd0OyBkb24mYXBvczt0IHdvcmsgaW4gQW50Ci0gICAgICAgIDEuMyBvbiBVbml4PC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0KLSAgICAgICAgPHA+VGhlIDxjb2RlPmFudFJ1bjwvY29kZT4gc2NyaXB0IGluIDxjb2RlPkFOVF9IT01FL2JpbjwvY29kZT4KLSAgICAgICAgaGFzIERPUyBpbnN0ZWFkIG9mIFVuaXggbGluZSBlbmRpbmdzLCB5b3UgbXVzdCByZW1vdmUgdGhlCi0gICAgICAgIGNhcnJpYWdlIHJldHVybiBjaGFyYWN0ZXJzIGZyb20gdGhpcyBmaWxlLiAgVGhpcyBjYW4gYmUgZG9uZSBieQotICAgICAgICB1c2luZyBBbnQmYXBvcztzICZsdDtmaXhjcmxmJmd0OyB0YXNrIG9yIHNvbWV0aGluZyBsaWtlOjwvcD4KLQotICAgICAgICA8c291cmNlPjwhW0NEQVRBWwotdHIgLWQgJ1xyJyA8ICRBTlRfSE9NRS9iaW4vYW50UnVuID4gL3RtcC9mb28KLW12IC90bXAvZm9vICRBTlRfSE9NRS9iaW4vYW50UnVuCi1dXT48L3NvdXJjZT4KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotCi0gICAgPGZhcSBpZD0iamF2YWRvYy1jYW5ub3QtZXhlY3V0ZSI+Ci0gICAgICA8cXVlc3Rpb24+SmF2YURvYyBmYWlsZWQ6IGphdmEuaW8uSU9FeGNlcHRpb246IGphdmFkb2M6IGNhbm5vdCBleGVjdXRlPC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0gICAgICAgIDxwPlRoZXJlIGlzIGEgYnVnIGluIHRoZSBTb2xhcmlzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAgICB0aGUgSkRLLCBzZWUgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQyMzAzOTkuaHRtbCI+aHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQyMzAzOTkuaHRtbDwvYT4uCi0gICAgICAgIFRoaXMgYWxzbyBhcHBlYXJzIHRvIGJlIHRydWUgdW5kZXIgTGludXgsIG1vdmluZyB0aGUgSkRLIHRvCi0gICAgICAgIHRoZSBmcm9udCBvZiB0aGUgUEFUSCBmaXhlcyB0aGUgcHJvYmxlbS48L3A+Ci0gICAgICA8L2Fuc3dlcj4KLSAgICA8L2ZhcT4KLSAgPC9mYXFzZWN0aW9uPgotCi08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEveGRvY3MvaW5kZXgueG1sIGIveGRvY3MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWVmMDBjLi4wMDAwMDAwCi0tLSBhL3hkb2NzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2N1bWVudD4KLQotICA8cHJvcGVydGllcz4KLSAgICA8YXV0aG9yIGVtYWlsPSJjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1Ij5Db25vciBNYWNOZWlsbDwvYXV0aG9yPgotICAgIDxhdXRob3IgZW1haWw9InN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYXV0aG9yPgotICAgIDx0aXRsZT5BbnQ8L3RpdGxlPgotICA8L3Byb3BlcnRpZXM+Ci0KLTxib2R5PgotCi0gIDxzZWN0aW9uIG5hbWU9IkFudCAxLjQgQmV0YSI+Ci0gIDxoMz5BbnQgMS40IEJldGEgQXZhaWxhYmxlICE8L2gzPgotICA8cD5UaGUgYmV0YSB2ZXJzaW9uIG9mIEFudCAxLjQgaXMgbm93IGF2YWlsYWJsZSBmb3IgCi0gICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnVpbGRzL2pha2FydGEtYW50L3JlbGVhc2UvdjEuNEJldGEyLyI+Ci0gICAgIGRvd25sb2FkPC9hPi4gSWYgeW91IGhhdmUgYW55IGZlZWRiYWNrIG9uIHRoZSBiZXRhIGZlZWwgZnJlZSB0byBqb2luIHRoZSAKLSAgICAgZGlzY3Vzc2lvbiBvbiB0aGUgYW50LWRldiBhbmQgYW50LXVzZXIgbWFpbGluZyBsaXN0cy4KLSAgICAgPC9wPgotICA8L3NlY3Rpb24+Ci0KLSAgPHNlY3Rpb24gbmFtZT0iQW50Ij4KLQotPHA+Ci1BbnQgaXMgYSBKYXZhIGJhc2VkIGJ1aWxkIHRvb2wuIEluIHRoZW9yeSBpdCBpcyBraW5kIG9mIGxpa2UgbWFrZSB3aXRob3V0Ci1tYWtlJ3Mgd3JpbmtsZXMuCi08L3A+Ci0KLTxwPgotV2h5IGFub3RoZXIgYnVpbGQgdG9vbCB3aGVuIHRoZXJlIGlzIGFscmVhZHkgbWFrZSwgZ251bWFrZSwgbm1ha2UsIGphbSwgYW5kCi1vdGhlcnM/IEJlY2F1c2UgYWxsIG9mIHRob3NlIHRvb2xzIGhhdmUgbGltaXRhdGlvbnMgdGhhdCBBbnQncyBvcmlnaW5hbCBhdXRob3IKLWNvdWxkbid0IGxpdmUgd2l0aCB3aGVuIGRldmVsb3Bpbmcgc29mdHdhcmUgYWNyb3NzIG11bHRpcGxlIHBsYXRmb3Jtcy4gTWFrZS1saWtlCi10b29scyBhcmUgaW5oZXJlbnRseSBzaGVsbCBiYXNlZC4gVGhleSBldmFsdWF0ZSBhIHNldCBvZiBkZXBlbmRlbmNpZXMgYW5kIHRoZW4KLWV4ZWN1dGUgY29tbWFuZHMgbm90IHVubGlrZSB3aGF0IHlvdSB3b3VsZCBpc3N1ZSBvbiBhIHNoZWxsLiBUaGlzIG1lYW5zIHRoYXQgeW91Ci1jYW4gZWFzaWx5IGV4dGVuZCB0aGVzZSB0b29scyBieSB1c2luZyBvciB3cml0aW5nIGFueSBwcm9ncmFtIGZvciB0aGUgT1MgdGhhdAoteW91IGFyZSB3b3JraW5nIG9uLiBIb3dldmVyLCB0aGlzIGFsc28gbWVhbnMgdGhhdCB5b3UgbGltaXQgeW91cnNlbGYgdG8gdGhlIE9TLAotb3IgYXQgbGVhc3QgdGhlIE9TIHR5cGUgc3VjaCBhcyBVbml4LCB0aGF0IHlvdSBhcmUgd29ya2luZyBvbi4KLTwvcD4KLQotPHA+Ci1NYWtlZmlsZXMgYXJlIGluaGVyZW50bHkgZXZpbCBhcyB3ZWxsLiBBbnlib2R5IHdobyBoYXMgd29ya2VkIG9uIHRoZW0gZm9yIGFueQotdGltZSBoYXMgcnVuIGludG8gdGhlIGRyZWFkZWQgdGFiIHByb2JsZW0uICZxdW90O0lzIG15IGNvbW1hbmQgbm90IGV4ZWN1dGluZwotYmVjYXVzZSBJIGhhdmUgYSBzcGFjZSBpbiBmcm9udCBvZiBteSB0YWIhISEmcXVvdDsgc2FpZCB0aGUgb3JpZ2luYWwgYXV0aG9yIG9mCi1BbnQgd2F5IHRvbyBtYW55IHRpbWVzLiBUb29scyBsaWtlIEphbSB0b29rIGNhcmUgb2YgdGhpcyB0byBhIGdyZWF0IGRlZ3JlZSwgYnV0Ci1zdGlsbCB1c2UgeWV0IGFub3RoZXIgZm9ybWF0IHRvIHVzZSBhbmQgcmVtZW1iZXIuCi08L3A+Ci0KLTxwPgotQW50IGlzIGRpZmZlcmVudC4gSW5zdGVhZCBvZiBhIG1vZGVsIHdoZXJlIGl0IGlzIGV4dGVuZGVkIHdpdGggc2hlbGwgYmFzZWQKLWNvbW1hbmRzLCBpdCBpcyBleHRlbmRlZCB1c2luZyBKYXZhIGNsYXNzZXMuIEluc3RlYWQgb2Ygd3JpdGluZyBzaGVsbCBjb21tYW5kcywKLXRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBYTUwgYmFzZWQgY2FsbGluZyBvdXQgYSB0YXJnZXQgdHJlZSB3aGVyZSB2YXJpb3VzCi10YXNrcyBnZXQgZXhlY3V0ZWQuIEVhY2ggdGFzayBpcyBydW4gYnkgYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyCi1UYXNrIGludGVyZmFjZS4KLTwvcD4KLQotPHA+Ci1HcmFudGVkLCB0aGlzIHJlbW92ZXMgc29tZSBvZiB0aGUgZXhwcmVzc2l2ZSBwb3dlciB0aGF0IGlzIGluaGVyZW50IGJ5IGJlaW5nCi1hYmxlIHRvIGNvbnN0cnVjdCBhIHNoZWxsIGNvbW1hbmQgc3VjaCBhcyBgZmluZCAuIC1uYW1lIGZvbyAtZXhlYyBybSB7fWAgYnV0IGl0Ci1naXZlcyB5b3UgdGhlIGFiaWxpdHkgdG8gYmUgY3Jvc3MgcGxhdGZvcm0uIFRvIHdvcmsgYW55d2hlcmUgYW5kIGV2ZXJ5d2hlcmUuIEFuZAotaGV5LCBpZiB5b3UgcmVhbGx5IG5lZWQgdG8gZXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQsIEFudCBoYXMgYW4gZXhlYyBydWxlIHRoYXQKLWFsbG93cyBkaWZmZXJlbnQgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgYmFzZWQgb24gdGhlIE9TIHRoYXQgaXQgaXMgZXhlY3V0aW5nCi1vbi4KLTwvcD4KLQotICA8L3NlY3Rpb24+Ci0gIAotICA8c2VjdGlvbiBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgCi08cD4KLVlvdSBjYW4gdmlldyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG1vc3QgcmVjZW50IHJlbGVhc2UgCi08YSBocmVmPSJtYW51YWwvaW5kZXguaHRtbCI+b25saW5lPC9hPgotPC9wPgotCi08cD4KLUNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvbiBpcyBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGFuZCBiaW5hcnkgZGlzdHJpYnRpb25zLiAKLTwvcD4KLQotICA8L3NlY3Rpb24+Ci0KLSAgPHNlY3Rpb24gbmFtZT0iTGF0ZXN0IFJlbGVhc2UiPgotICAgIDxwPgotICAgIFlvdSBjYW4gZG93bmxvYWQgdGhlIGxhdGVzdCByZWxlYXNlOgotICAgIDwvcD4KLSAgICA8dWw+Ci0gICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLWFudC9yZWxlYXNlL3YxLjMvYmluLyI+Ci0gICAgICAgICAgICAgICAgRG93bmxvYWQgdGhlIGJpbmFyeSByZWxlYXNlPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLWFudC9yZWxlYXNlL3YxLjMvc3JjLyI+Ci0gICAgICAgICAgICAgICAgRG93bmxvYWQgdGhlIHNvdXJjZSByZWxlYXNlPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLWFudC9yZWxlYXNlL3YxLjMvcnBtcy8iPgotICAgICAgICAgICAgICAgIERvd25sb2FkIHNvdXJjZSBhbmQgYmluYXJ5IFJQTXM8L2E+PC9saT4KLSAgICA8L3VsPiAgCi0gIDwvc2VjdGlvbj4KLSAgCi0gIDxzZWN0aW9uIG5hbWU9Ik5pZ2h0bHkgQnVpbGRzIj4KLSAgICA8cD4KLSAgICBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIGxhdGVzdCBBbnQgZmVhdHVyZXMsIHlvdSBjYW4gdHJ5IGRvd25sb2FkaW5nIGEgbmlnaHRseSAKLSAgICBidWlsZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnVpbGRzL2pha2FydGEtYW50L25pZ2h0bHkvIj5oZXJlPC9hPgotICAgIDwvcD4KLSAgICAKLSAgPC9zZWN0aW9uPgotICAKLSAgPHNlY3Rpb24gbmFtZT0iVG93YXJkcyBBbnQyIj4KLSAgICA8cD4KLSAgICBXZSBhcmUgY3VycmVudGx5IGhhc2hpbmcgb3V0IGRlc2lnbiBkZXRhaWxzIGZvciBBbnQyLiBQbGVhc2UKLSAgICByZWFkIHRoZSBsYXRlc3QgPGEgaHJlZj0iYW50bmV3cy5odG1sIj5BbnQgbmV3czwvYT4gZm9yIG1vcmUgZGV0YWlscy4KLSAgICA8L3A+Ci0gIDwvc2VjdGlvbj4KLSAgCi0gIDxzZWN0aW9uIG5hbWU9IkdldCBJbnZvbHZlZCI+Ci08dWw+Ci08bGk+PGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9nZXRpbnZvbHZlZC9nZXRpbnZvbHZlZGluZGV4Lmh0bWwiPkdldCBJbnZvbHZlZDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvZ2V0aW52b2x2ZWQvbWFpbC5odG1sIj5Kb2luIE1haWxpbmcgTGlzdHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFudC1kZXYmYW1wO3I9MSZhbXA7dz0yIj5TZWFyY2ggdGhlIERldiBNYWlsaW5nIExpc3Q8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YW50LXVzZXImYW1wO3I9MSZhbXA7dz0yIj5TZWFyY2ggdGhlIFVzZXIgTWFpbGluZyBMaXN0PC9hPgotPC9saT4KLTwvdWw+Ci0KLQotCi0gIDwvc2VjdGlvbj4KLQotPC9ib2R5PgotPC9kb2N1bWVudD4KLQpkaWZmIC0tZ2l0IGEveGRvY3MvbG9nb3MueG1sIGIveGRvY3MvbG9nb3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWVhNDMyLi4wMDAwMDAwCi0tLSBhL3hkb2NzL2xvZ29zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPGRvY3VtZW50PgotCi0gIDxwcm9wZXJ0aWVzPgotICAgIDxhdXRob3IgZW1haWw9InN0ZWZhbi5ib2Rld2lnQGVwb3N0LmRlIj5TdGVmYW4gQm9kZXdpZzwvYXV0aG9yPgotICAgIDx0aXRsZT5BbnQgTG9nbyBQcm9wb3NhbHM8L3RpdGxlPgotICA8L3Byb3BlcnRpZXM+Ci0KLTxib2R5PgotCi0gIDxzZWN0aW9uIG5hbWU9IkFudCBuZWVkcyBhIExvZ28iPgotICAgIDxwPk9uZSBvZiB0aGUgcmVxdWlyZW1lbnRzIGZvciBBbnQyIGlzLCB0aGF0IEFudCBzaG91bGQgaGF2ZSBhCi0gICAgbG9nby4gIFlvdSBjYW4gZmluZCB0aGUgbG9nb3MgdGhhdCBoYXZlIGJlZW4gcHJvcG9zZWQgdG8gdGhlIEFudAotICAgIG1haWxpbmcgbGlzdHMgb24gdGhpcyBwYWdlLjwvcD4KLQotICAgIDxwPlRlbGwgdXMgd2hhdCB5b3UgdGhpbmsgb2YgdGhlbSAoeWVzLCA8ZW0+UG93ZXJlZCBieTwvZW0+IHNob3VsZAotICAgIGJldHRlciBiZSA8ZW0+QnVpbHQgYnk8L2VtPikuPC9wPgotCi0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGg+RW50cnk8L3RoPjx0aD5Hcm91cDwvdGg+PHRoPkF1dGhvcjwvdGg+PHRoPjwvdGg+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+MTwvdGQ+Ci0gICAgICAgIDx0ZD4xPC90ZD4KLSAgICAgICAgPHRkPkJpbGwgSi4gRmVsbG93cyAoQmlsbC5KLkZlbGxvd3MgYXQgbWFpbC5zcHJpbnQuY29tKTwvdGQ+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0iaW1hZ2VzL2FudExvZ28xLnBuZyIgLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjI8L3RkPgotICAgICAgICA8dGQ+MTwvdGQ+Ci0gICAgICAgIDx0ZD5CaWxsIEouIEZlbGxvd3MgKEJpbGwuSi5GZWxsb3dzIGF0IG1haWwuc3ByaW50LmNvbSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9hbnRMb2dvMi5wbmciIC8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4zPC90ZD4KLSAgICAgICAgPHRkPjI8L3RkPgotICAgICAgICA8dGQ+Q2hyaXN0b3BoIFdpbGhlbG1zIChDaHJpc3RvcGguV2lsaGVsbXMgYXQgdC1vbmxpbmUuZGUpPC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvYW50X2xvZ28uZ2lmIiAvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+NDwvdGQ+Ci0gICAgICAgIDx0ZD4yPC90ZD4KLSAgICAgICAgPHRkPkNocmlzdG9waCBXaWxoZWxtcyAoQ2hyaXN0b3BoLldpbGhlbG1zIGF0IHQtb25saW5lLmRlKTwvdGQ+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0iaW1hZ2VzL2FudDJfbG9nby5naWYiIC8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD41PC90ZD4KLSAgICAgICAgPHRkPjM8L3RkPgotICAgICAgICA8dGQ+V2FybmVyIE9uc3RpbmUgKHdhcm5lciBhdCB3YXJuZXJvbnN0aW5lLmNvbSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9hbnQtbG9nbzIuZ2lmIiAvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+NjwvdGQ+Ci0gICAgICAgIDx0ZD40PC90ZD4KLSAgICAgICAgPHRkPkNocmlzIENvbGVtYW4gKGNocmlzLmNvbGVtYW4gYXQgY3NmYi5jb20pPC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvY29sZW1hbi5naWYiIC8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD43PC90ZD4KLSAgICAgICAgPHRkPjU8L3RkPgotICAgICAgICA8dGQ+U3RlZmFuIExlY2hvIChTdGVmYW4uTGVjaG8gYXQgaWNvbm1lZGlhbGFiLmNvbSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9sZWNoby5qcGciIC8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD44PC90ZD4KLSAgICAgICAgPHRkPjY8L3RkPgotICAgICAgICA8dGQ+RGF2aWQgVHJvZ2RvbiAoRFRyb2dkb24gYXQgb3JndGVrLmNvbSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy90cm9nZG9uLmdpZiIgLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjk8L3RkPgotICAgICAgICA8dGQ+NzwvdGQ+Ci0gICAgICAgIDx0ZD5NaXJrbyBLbGVtbSAoTWlya28uS2xlbW0gYXQgdC1vbmxpbmUuZGUpPC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJodHRwOi8vd3d3Lm11dGFudGVuem9vLmRlL2FudGxvZ28tNDAwLnBuZyIgLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjEwPC90ZD4KLSAgICAgICAgPHRkPjg8L3RkPgotICAgICAgICA8dGQ+UnlhbiBQIFJpcGxleSAocnlhbi5yaXBsZXkgYXQgYm1zLmNvbSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9yaXBsZXkuanBnIiAvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+MTE8L3RkPgotICAgICAgICA8dGQ+OTwvdGQ+Ci0gICAgICAgIDx0ZD5DaHJpc3RvcGggV2lsaGVsbXMgKENocmlzdG9waC5XaWxoZWxtcyBhdCB0LW9ubGluZS5kZSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy93aWxoZWxtczMuZ2lmIiAvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+MTI8L3RkPgotICAgICAgICA8dGQ+MTA8L3RkPgotICAgICAgICA8dGQ+U2hhbmUgUGV0cm9mZiAoc2hhbmUgYXQgaGF5d2FyZC5jYSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9wZXRyb2ZmLmpwZyIgLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjEzPC90ZD4KLSAgICAgICAgPHRkPjEwPC90ZD4KLSAgICAgICAgPHRkPkppbSBDaGVlc21hbiAoamNoZWVzIGF0IG1zbC5lcyk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9jaGVlc21hbi5qcGciIC8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4xNDwvdGQ+Ci0gICAgICAgIDx0ZD4xMTwvdGQ+Ci0gICAgICAgIDx0ZD5LZXZpbiBEdWdnaW5zIChLZXZpbi5EdWdnaW5zIGF0IGRlZmluaXR5aGVhbHRoLmNvbSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9kdWdnaW5zLmdpZiIgLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjE1PC90ZD4KLSAgICAgICAgPHRkPjEyPC90ZD4KLSAgICAgICAgPHRkPktldmluIER1Z2dpbnMgKEtldmluLkR1Z2dpbnMgYXQgZGVmaW5pdHloZWFsdGguY29tKTwvdGQ+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0iaW1hZ2VzL2R1Z2dpbnMyLmdpZiIgLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjE2PC90ZD4KLSAgICAgICAgPHRkPjEzPC90ZD4KLSAgICAgICAgPHRkPkp1c3RpbiBSYW5zb20gKEp1c3Rpbi5SYW5zb20gYXQgcnVidXMuY29tKTwvdGQ+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0iaW1hZ2VzL2h1Z2hlczEuZ2lmIiAvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+MTc8L3RkPgotICAgICAgICA8dGQ+MTQ8L3RkPgotICAgICAgICA8dGQ+SnVzdGluIFJhbnNvbSAoSnVzdGluLlJhbnNvbSBhdCBydWJ1cy5jb20pPC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvaHVnaGVzMi5naWYiIC8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4xODwvdGQ+Ci0gICAgICAgIDx0ZD4xNTwvdGQ+Ci0gICAgICAgIDx0ZD5NYXJ0aW4gU2NobPZtZXIgKG1hcnRpbi5zY2hsb2VtZXIgYXQgcGhhc2UyNi5kZSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9zY2hsb2VtZXIuZ2lmIiAvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+MTk8L3RkPgotICAgICAgICA8dGQ+MTU8L3RkPgotICAgICAgICA8dGQ+TWFydGluIFNjaGz2bWVyIChtYXJ0aW4uc2NobG9lbWVyIGF0IHBoYXNlMjYuZGUpPC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvc2NobG9lbWVyMi5naWYiIC8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4yMDwvdGQ+Ci0gICAgICAgIDx0ZD4xNjwvdGQ+Ci0gICAgICAgIDx0ZD5EZXNpZ24gU2VydmljZXMgVGVhbSBhdCBIZXdsZXR0IFBhY2thcmQgKGJsYWlyX2h1Z2hlcyBhdCBocC5jb20+PC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvYmxhaXJodWdoZXNfYW50LmpwZyIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+MjE8L3RkPgotICAgICAgICA8dGQ+MTc8L3RkPgotICAgICAgICA8dGQ+RGVzaWduIFNlcnZpY2VzIFRlYW0gYXQgSGV3bGV0dCBQYWNrYXJkIChibGFpcl9odWdoZXMgYXQgaHAuY29tPjwvdGQ+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0iaW1hZ2VzL2JsYWlyaHVnaGVzX2FudDIuanBnIi8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4yMjwvdGQ+Ci0gICAgICAgIDx0ZD4xODwvdGQ+Ci0gICAgICAgIDx0ZD5EZXNpZ24gU2VydmljZXMgVGVhbSBhdCBIZXdsZXR0IFBhY2thcmQgKGJsYWlyX2h1Z2hlcyBhdCBocC5jb20+PC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvYmxhaXJodWdoZXNfYW50My5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjIzPC90ZD4KLSAgICAgICAgPHRkPjE5PC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19hbnQ0LmpwZyIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+MjQ8L3RkPgotICAgICAgICA8dGQ+MjA8L3RkPgotICAgICAgICA8dGQ+RGVzaWduIFNlcnZpY2VzIFRlYW0gYXQgSGV3bGV0dCBQYWNrYXJkIChibGFpcl9odWdoZXMgYXQgaHAuY29tPjwvdGQ+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0iaW1hZ2VzL2JsYWlyaHVnaGVzX2FudDUuanBnIi8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4yNTwvdGQ+Ci0gICAgICAgIDx0ZD4yMTwvdGQ+Ci0gICAgICAgIDx0ZD5EZXNpZ24gU2VydmljZXMgVGVhbSBhdCBIZXdsZXR0IFBhY2thcmQgKGJsYWlyX2h1Z2hlcyBhdCBocC5jb20+PC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvYmxhaXJodWdoZXNfYW50Ni5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjI2PC90ZD4KLSAgICAgICAgPHRkPjIyPC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19nZXJtMS5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjI3PC90ZD4KLSAgICAgICAgPHRkPjIyPC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19nZXJtMi5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjI4PC90ZD4KLSAgICAgICAgPHRkPjIzPC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19nZXJtMy5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjI5PC90ZD4KLSAgICAgICAgPHRkPjIzPC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19nZXJtNC5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjMwPC90ZD4KLSAgICAgICAgPHRkPjI0PC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19nZXJtNS5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjMxPC90ZD4KLSAgICAgICAgPHRkPjI0PC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19nZXJtNi5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjMyPC90ZD4KLSAgICAgICAgPHRkPjI1PC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19rZWlzMS5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjMzPC90ZD4KLSAgICAgICAgPHRkPjI1PC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19rZWlzMy5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjM0PC90ZD4KLSAgICAgICAgPHRkPjI2PC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19rZWlzMi5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjM1PC90ZD4KLSAgICAgICAgPHRkPjI3PC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19rZWlzNC5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjM2PC90ZD4KLSAgICAgICAgPHRkPjI4PC90ZD4KLSAgICAgICAgPHRkPkRlc2lnbiBTZXJ2aWNlcyBUZWFtIGF0IEhld2xldHQgUGFja2FyZCAoYmxhaXJfaHVnaGVzIGF0IGhwLmNvbT48L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9ibGFpcmh1Z2hlc19rZWlzNS5qcGciLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjM3PC90ZD4KLSAgICAgICAgPHRkPjI5PC90ZD4KLSAgICAgICAgPHRkPkFsaWNpYSBLb2xlc25pa292YTwvdGQ+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0iaW1hZ2VzL2tvbGVzbmlrb3ZhLmdpZiIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Mzg8L3RkPgotICAgICAgICA8dGQ+MzA8L3RkPgotICAgICAgICA8dGQ+TWF0dGhpYXMgQmVja2VyIChtYXR0aGlhcy5iZWNrZXIgYXQgbWVkaWE0Y29udGVudC5kZSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9iZWNrZXIxLmdpZiIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Mzk8L3RkPgotICAgICAgICA8dGQ+MzA8L3RkPgotICAgICAgICA8dGQ+TWF0dGhpYXMgQmVja2VyIChtYXR0aGlhcy5iZWNrZXIgYXQgbWVkaWE0Y29udGVudC5kZSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9iZWNrZXIyLmdpZiIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+NDA8L3RkPgotICAgICAgICA8dGQ+MzA8L3RkPgotICAgICAgICA8dGQ+TWF0dGhpYXMgQmVja2VyIChtYXR0aGlhcy5iZWNrZXIgYXQgbWVkaWE0Y29udGVudC5kZSk8L3RkPgotICAgICAgICA8dGQ+PGltZyBzcmM9ImltYWdlcy9iZWNrZXIzLmdpZiIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+NDE8L3RkPgotICAgICAgICA8dGQ+MzE8L3RkPgotICAgICAgICA8dGQ+QWxpY2lhIEtvbGVzbmlrb3ZhPC90ZD4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvYm9nYWVydC5naWYiLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgPC90YWJsZT4KLSAgPC9zZWN0aW9uPgotPC9ib2R5PgotPC9kb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9wcm9ibGVtcy54bWwgYi94ZG9jcy9wcm9ibGVtcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTEyYWUuLjAwMDAwMDAKLS0tIGEveGRvY3MvcHJvYmxlbXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvY3VtZW50PgotCi0gIDxwcm9wZXJ0aWVzPgotICAgIDxhdXRob3IgZW1haWw9ImNvbm9yQGFwYWNoZS5vcmciPkNvbm9yIE1hY05laWxsPC9hdXRob3I+Ci0gICAgPHRpdGxlPkhhdmluZyBQcm9ibGVtcz88L3RpdGxlPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iSGF2aW5nIFByb2JsZW1zPyI+Ci0gICAgICA8cD5JZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3aXRoIEFudCwgdGhpcyBwYWdlIGRldGFpbHMgc29tZSBzdGVwcyB5b3UgY2FuIHRha2UKLSAgICAgICAgIHRvIHRyeSBhbmQgcmVzb2x2ZSB0aGUgcHJvYmxlbS4gSWYgeW91IGNhbid0IHJlc29sdmUgdGhlIHByb2JsZW0gdGhlbiB0aGlzIHBhZ2Ugd2lsbCBoZWxwCi0gICAgICAgICB5b3UgY29sbGVjdCBzb21lIG9mIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiB0byBwcm92aWRlIGEgYnVnIHJlcG9ydC4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGhlbHAgCi0gICAgICAgICB0aGUgQW50IGRldmVsb3BlcnMgdW5kZXJzdGFuZCBhbmQgcmVzb2x2ZSB0aGUgcHJvYmxlbS4gT2YgY291cnNlLCBub3QgYWxsIG9mIHRoZSBzdGVwcyBoZXJlIHdpbGwgCi0gICAgICAgICBtYWtlIHNlbnNlIGZvciBldmVyeSBwcm9ibGVtIHlvdSBlbmNvdW50ZXIuIFRoZXNlIGFyZSBqdXN0IHNvbWUgc3VnZ2VzdGlvbnMgdG8gCi0gICAgICAgICBwb2ludCB5b3UgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4KLSAgICAgIDwvcD4KLSAgICAgICAgIAotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUmVhZCB0aGUgTWFudWFsIj4KLSAgICAgICAgPHA+VGhlIGZpcnN0IHN0ZXAgdG8gdGFrZSB3aGVuIHlvdSBoYXZlIGEgcHJvYmxlbSBpcyB0byByZWFkIHRoZSA8YSBocmVmPSJtYW51YWwvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgIG1hbnVhbDwvYT4gZW50cnkgZm9yIHRoZSB0YXNrIG9yIGNvbmNlcHQgdGhhdCBpcyBnaXZpbmcgeW91IHRyb3VibGUuIENoZWNrIHBhcnRpY3VsYXJseSB0aGUgbWVhbmluZyBvZgotICAgICAgICAgICBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMuIFBlcmhhcHMgYW4gYXR0cmlidXRlIHdvdWxkIHByb3ZpZGUgdGhlIGJlaGF2aW9yIHlvdSByZXF1aXJlLiBJZiB5b3UKLSAgICAgICAgICAgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSBtYW51YWwsIHRoZW4geW91IGNhbiBzdWJtaXQgYSBkb2N1bWVudGF0aW9uIGJ1ZyByZXBvcnQgKHNlZSBiZWxvdykgdG8gaGVscCB1cwotICAgICAgICAgICBpbXByb3ZlIHRoZSBBbnQgZG9jdW1lbnRhdGlvbi4KLSAgICAgICAgPC9wPiAgICAgICAgCi0gICAgICA8L3N1YnNlY3Rpb24+Ci0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJFeGFtaW5lIERlYnVnIE91dHB1dCI+Ci0gICAgICAgIDxwPlRoZSBmaXJzdCBzdGVwIHdoZW4geW91IGhhdmUgYSBwcm9ibGVtIGlzIHRvIHNlZSB3aGF0IEFudCBpcyBkb2luZy4gVHJ5IHJ1bm5pbmcgQW50IHdpdGgKLSAgICAgICAgICAgVGhlIHZlcmJvc2UgZmxhZzxici8+PGJyLz4KLSAgICAgICAgICAgPGNvZGU+YW50IC12ZXJib3NlPC9jb2RlPjxici8+PGJyLz4KLSAgICAgICAgICAgb3I8YnIvPjxici8+Ci0gICAgICAgICAgIDxjb2RlPmFudCAtdjwvY29kZT48YnIvPjxici8+Ci0gICAgICAgICAgIAotICAgICAgICAgICBUaGlzIHdpbGwgcHJvZHVjZSBzb21ldGhpbmcgd2hpY2ggc3RhcnRzIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgICAgICAgIDxzb3VyY2U+Ci1BbnQgdmVyc2lvbiAxLjRhbHBoYSBjb21waWxlZCBvbiBBdWd1c3QgNiAyMDAxCi1CdWlsZGZpbGU6IGJ1aWxkLnhtbAotRGV0ZWN0ZWQgSmF2YSB2ZXJzaW9uOiAxLjMgaW46IGY6XGpkazEuM1xqcmUKLURldGVjdGVkIE9TOiBXaW5kb3dzIE5UCi1wYXJzaW5nIGJ1aWxkZmlsZSBcamFrYXJ0YS1hbnRcYnVpbGQueG1sIHdpdGggCi1VUkkgPSBmaWxlOi9qYWthcnRhLWFudC9idWlsZC54bWwKLVByb2plY3QgYmFzZSBkaXIgc2V0IHRvOiBcamFrYXJ0YS1hbnQKLSBbcHJvcGVydHldIExvYWRpbmcgXGpha2FydGEtYW50XC5hbnQucHJvcGVydGllcwotIFtwcm9wZXJ0eV0gVW5hYmxlIHRvIGZpbmQgcHJvcGVydHkgZmlsZTogXGpha2FydGEtYW50XC5hbnQucHJvcGVydGllcwotIFtwcm9wZXJ0eV0gTG9hZGluZyBcY29ub3JcLmFudC5wcm9wZXJ0aWVzCi0gW3Byb3BlcnR5XSBPdmVycmlkZSBpZ25vcmVkIGZvciBkZWJ1ZwotCi1wcmVwYXJlOgotCi1jaGVja19mb3Jfb3B0aW9uYWxfcGFja2FnZXM6Ci0uLi4KLSAgICAgICAgICAgPC9zb3VyY2U+Ci0gICAgICAgICAgIDxwPgotICAgICAgICAgICAgIFlvdSBtYXkgYmUgYWJsZSB0byBzZWUgaW4gdGhpcyB0cmFjZSB3aGF0IGFudCBpcyBkb2luZyBhbmQgd2h5IGl0IHRha2VzIGEgcGFydGljdWxhciAKLSAgICAgICAgICAgICBjb3Vyc2Ugb2YgYWN0aW9uLiBJZiB5b3UgbmVlZCBldmVuIG1vcmUgaW5mb3JtYXRpb24geW91IGNhbiB1c2UgdGhlIDxjb2RlPi1kZWJ1ZzwvY29kZT4gCi0gICAgICAgICAgICAgZmxhZyByYXRoZXIgdGhhbiA8Y29kZT4tdmVyYm9zZTwvY29kZT4uIFRoaXMgd2lsbCBnZW5lcmFsbHkgcHJvZHVjZSBzbyBtdWNoIG91dHB1dCB0aGF0IAotICAgICAgICAgICAgIHlvdSBtYXkgd2FudCB0byBzYXZlIHRoZSBvdXRwdXQgYW5kIGFuYWx5emUgaXQgaW4gYW4gZWRpdG9yLgotICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgIAotICAgICAgICAgICA8cD5Tbywgb25jZSB5b3UgaGF2ZSBhbGwgdGhpcyBkZWJ1ZyBpbmZvcm1hdGlvbiwgaG93IGNhbiB5b3UgdXNlIGl0IHRvIHNvbHZlIHlvdXIgcHJvYmxlbT8gCi0gICAgICAgICAgICAgIFRoYXQgd2lsbCBkZXBlbmQgb24gdGhlIHRhc2sgaW4gcXVlc3Rpb24gYW5kIHRoZSBuYXR1cmUgb2YgeW91ciBwcm9ibGVtLiBFYWNoIHRhc2sgbG9ncwotICAgICAgICAgICAgICBkaWZmZXJlbnQgYXNwZWN0cyBvZiBpdHMgb3BlcmF0aW9uLCBidXQgaXQgd2lsbCBnaXZlIHlvdSBhbiBpZGVhIG9mIHdoYXQgaXMgZ29pbmcgb24uIEZvcgotICAgICAgICAgICAgICBleGFtcGxlLCB0aGUgJmx0O2phdmFjJmd0OyB0YXNrIGxvZ3MgdGhlIHJlYXNvbnMgd2h5IGl0IGNob29zZXMgdG8gY29tcGlsZSBwYXJ0aWN1bGFyIAotICAgICAgICAgICAgICBjbGFzc2VzIGFuZCB0aGUgZXF1aXZhbGVudCBjb21tYW5kIGl0IGlzIHVzaW5nLiBUaGUgZm9sbG93aW5nIHRyYWNlICh3aGljaCBoYXMgYmVlbiBlZGl0ZWQKLSAgICAgICAgICAgICAgYW5kIHJlZm9ybWF0dGVkIGZvciBjbGFyaXR5KSBzaG93cyBqYXZhYyBhZGRpbmcgb25lIGNsYXNzIGJ1dCBza2lwcGluZyBhbm90aGVyLiBUaGlzIGlzIGZvbGxvd2VkIAotICAgICAgICAgICAgICBieSB0aGUgY29tcGlsZXIgYXJndW1lbnRzIGFuZCBhIHN1bW1hcnkgb2YgYWxsIHRoZSBjbGFzc2VzIHRvIGJlIGNvbXBpbGVkLiAKLSAgICAgICAgICAgPC9wPgotPHNvdXJjZT4KLSBbamF2YWNdIG9yZ1xhcGFjaGVcdG9vbHNcYW50XGxpc3RlbmVyXExvZzRqTGlzdGVuZXIuamF2YSBhZGRlZCBhcyAKLSAgICAgICAgIFxidWlsZFxjbGFzc2VzXG9yZ1xhcGFjaGVcdG9vbHNcYW50XGxpc3RlbmVyXExvZzRqTGlzdGVuZXIuY2xhc3MgCi0gICAgICAgICAgICAgaXMgb3V0ZGF0ZWQuCi0gW2phdmFjXSBvcmdcYXBhY2hlXHRvb2xzXGFudFxMb2NhdGlvbi5qYXZhIG9taXR0ZWQgYXMgCi0gICAgICAgICBcYnVpbGRcY2xhc3Nlc1xvcmdcYXBhY2hlXHRvb2xzXGFudFxMb2NhdGlvbi5jbGFzcyBpcyB1cCB0byBkYXRlLgotICAuLi4KLSBbamF2YWNdIENvbXBpbGluZyAxIHNvdXJjZSBmaWxlIHRvIFxqYWthcnRhLWFudFxidWlsZFxjbGFzc2VzCi0gW2phdmFjXSBVc2luZyBtb2Rlcm4gY29tcGlsZXIKLSBbamF2YWNdIENvbXBpbGF0aW9uIGFyZ3M6IC1kIFxqYWthcnRhLWFudFxidWlsZFxjbGFzc2VzIC1jbGFzc3BhdGggCi0gICAgICAgICBcamFrYXJ0YS1hbnRcYnVpbGRcY2xhc3NlcztGOlxqZGsxLjNcbGliXHRvb2xzLmphcjsKLSAgICAgICAgIFxBbnRcbGliXG9wdGlvbmFsLmphcjtcQW50XGxpYlxsb2c0ai5qYXI7Ci0gICAgICAgICBcQW50XGxpYlxqdW5pdC5qYXI7XEFudFxsaWJcamF4cC5qYXI7Ci0gICAgICAgICBcQW50XGxpYlxjcmltc29uLmphcjtcQW50XGxpYlxhbnQuamFyIAotICAgICAgICAgLXNvdXJjZXBhdGggXGpha2FydGEtYW50XHNyY1xtYWluIC1nOm5vbmUgLU8KLSAgICBbamF2YWNdIEZpbGUgdG8gYmUgY29tcGlsZWQ6Ci0gICAgXHNyY1xtYWluXG9yZ1xhcGFjaGVcdG9vbHNcYW50XGxpc3RlbmVyXExvZzRqTGlzdGVuZXIuamF2YSAgCi08L3NvdXJjZT4KLQotICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgIEluIG1hbnkgY2FzZXMgQW50IHRhc2tzIGFyZSB3cmFwcGVycyBhcm91bmQgT1MgY29tbWFuZHMgb3Igb3RoZXIgamF2YSBjbGFzc2VzLiBJbiBkZWJ1ZyBtb2RlLCBtYW55Ci0gICAgICAgICAgICAgIG9mIHRoZXNlIHRhc2tzIHdpbGwgcHJpbnQgb3V0IHRoZSBlcXVpdmFsZW50IGNvbW1hbmQgbGluZSwgYXMgdGhlICZsdDtqYXZhYyZndDsgdGFzayBhYm92ZSBkb2VzLiBJZiAKLSAgICAgICAgICAgICAgeW91IGFyZSBoYXZpbmcgYSBwcm9ibGVtLCBpdCBpcyBvZnRlbiB1c2VmdWwgdG8gcnVuIHRoZSBjb21tYW5kIGRpcmVjdGx5IGluIHRoZSBzYW1lIHdheSBBbnQgaXMgZG9pbmcgCi0gICAgICAgICAgICAgIGFuZCBzZWUgaWYgdGhlIHByb2JsZW0gcGVyc2lzdHMuIFRoZSBwcm9ibGVtIG1heSBsaWUgaW4gdGhlIGNvbW1hbmQgYmVpbmcgcnVuIGJ5IEFudCwgb3IgaW4gdGhlIHdheSAKLSAgICAgICAgICAgICAgdGhlIEFudCB0YXNrIGlzIHJ1bm5pbmcgdGhlIGNvbW1hbmQuIFlvdSBjYW4gYWxzbyBzZWUgdGhlIGVmZmVjdCBvZiBjaGFuZ2luZyBhdHRyaWJ1dGUgdmFsdWVzIG9uIHRoZQotICAgICAgICAgICAgICBnZW5lcmF0ZWQgY29tbWFuZCBsaW5lLiBUaGlzIGNhbiBoZWxwIHlvdSB0byB1bmRlcnN0YW5kIHdoZXRoZXIgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIGFuZCB2YWx1ZXMuCi0gICAgICAgICAgICA8L3A+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkhhcyBpdCBiZWVuIGZpeGVkPyI+Ci0gICAgICAgIDxwPgotICAgICAgICAgIEFmdGVyIGV4YW1pbmluZyB0aGUgZGVidWcgb3V0cHV0LCB5b3Ugc3RpbGwgYmVsaWV2ZSB0aGF0IHRoZSBwcm9ibGVtIHlvdSBhcmUgaGF2aW5nIG1heSBiZSBjYXVzZWQgYnkgQW50LiAKLSAgICAgICAgICBDaGFuY2VzIGFyZSB0aGF0IHNvbWVvbmUgZWxzZSBtYXkgaGF2ZSBhbHJlYWR5IGVuY291bnRlcmVkIHRoaXMgcHJvYmxlbSBhbmQgcGVyaGFwcyBpdCBoYXMgYmVlbgotICAgICAgICAgIGZpeGVkLiBUaGUgbmV4dCBzdGVwLCB0aGVyZWZvcmUsIG1heSBiZSB0byB0cnkgYSBuaWdodGx5IGJ1aWxkIG9mIEFudCB0byBzZWUgaWYgdGhlIAotICAgICAgICAgIHByb2JsZW0gaGFzIGJlZW4gZml4ZWQuIE5pZ2h0bHkgYnVpbGRzIGZvciBBbnQgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSAKLSAgICAgICAgICA8YSBocmVmPSIvYnVpbGRzL2pha2FydGEtYW50L25pZ2h0bHkvIj5KYWthcnRhIHdlYiBzaXRlPC9hPi4gV2hpbGUgQW50IG5pZ2h0bHkKLSAgICAgICAgICBidWlsZHMgYXJlIHR5cGljYWxseSBxdWl0ZSBzdGFibGUgYW5kIGFyZSB1c2VkIGJ5IDxhIGhyZWY9Ii9idWlsZHMvZ3VtcC9sYXRlc3QvIj4KLSAgICAgICAgICBHdW1wPC9hPiB0byBidWlsZCBtYW55IG90aGVyIEpha2FydGEgcHJvamVjdHMsIHRoZXNlIGJ1aWxkcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBleHBlcmltZW50YWwuIFlvdSBjYW4gCi0gICAgICAgICAgaW5zdGFsbCBhbmQgdmVyaWZ5IHdoZXRoZXIgeW91ciBwcm9ibGVtIGhhcyBiZWVuIGZpeGVkLiBOb3RlIHRoYXQgbmlnaHRseSBidWlsZHMgZG8gbm90IGJ1aWxkIG1hbnkgb2YgdGhlCi0gICAgICAgICAgb3B0aW9uYWwgdGFza3MgdGhlIGNvbWUgd2l0aCBBbnQuIEEgc25hcHNob3Qgb2YgdGhlc2Ugb3B0aW9uYWwgdGFza3MgaXMgb2NjYXNpb25hbGx5IHVwbG9hZGVkIHRvIHRoZSBuaWdodGx5IAotICAgICAgICAgIGRvd25sb2FkIDxhIGhyZWY9Ii9idWlsZHMvamFrYXJ0YS1hbnQvbmlnaHRseS9vcHRpb25hbC8iPmFyZWE8L2E+LiBOb3RlIHRoYXQgZXZlbiAKLSAgICAgICAgICB0aGlzIHNuYXBzaG90IGRvZXMgbm90IGNvbnRhaW4gZXZlcnkgb3B0aW9uYWwgdGFzay4KLSAgICAgICAgPC9wPgotICAgICAgPC9zdWJzZWN0aW9uPgotICAgICAgCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJIYXMgaXQgYmVlbiByZXBvcnRlZD8iPgotICAgICAgICA8cD4KLSAgICAgICAgICBJZiB0aGUgY3VycmVudCBuaWdodGx5IGJ1aWxkIGRvZXNuJ3QgcmVzb2x2ZSB5b3VyIHByb2JsZW0sIGl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZW9uZSBlbHNlIGhhcyByZXBvcnRlZAotICAgICAgICAgIHRoZSBpc3N1ZS4gSXQgaXMgdGltZSB0byBsb29rIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvIj5BcGFjaGUgQnVnIERhdGFiYXNlPC9hPi4KLSAgICAgICAgICBUaGlzIHN5c3RlbSBpcyBlYXN5IHRvIHVzZSBhbmQgaXQgd2lsbCBsZXQgeW91IHNlYXJjaCB0aGUgCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9VU5DT05GSVJNRUQmYW1wO2J1Z19zdGF0dXM9TkVXJmFtcDtidWdfc3RhdHVzPUFTU0lHTkVEJmFtcDtidWdfc3RhdHVzPVJFT1BFTkVEJmFtcDtlbWFpbDE9JmFtcDtlbWFpbHR5cGUxPXN1YnN0cmluZyZhbXA7ZW1haWxhc3NpZ25lZF90bzE9MSZhbXA7ZW1haWwyPSZhbXA7ZW1haWx0eXBlMj1zdWJzdHJpbmcmYW1wO2VtYWlscmVwb3J0ZXIyPTEmYW1wO2J1Z2lkdHlwZT1pbmNsdWRlJmFtcDtidWdfaWQ9JmFtcDtjaGFuZ2VkaW49JmFtcDt2b3Rlcz0mYW1wO2NoZmllbGRmcm9tPSZhbXA7Y2hmaWVsZHRvPU5vdyZhbXA7Y2hmaWVsZHZhbHVlPSZhbXA7cHJvZHVjdD1BbnQmYW1wO3Nob3J0X2Rlc2M9JmFtcDtzaG9ydF9kZXNjX3R5cGU9c3Vic3RyaW5nJmFtcDtsb25nX2Rlc2M9JmFtcDtsb25nX2Rlc2NfdHlwZT1zdWJzdHJpbmcmYW1wO2J1Z19maWxlX2xvYz0mYW1wO2J1Z19maWxlX2xvY190eXBlPXN1YnN0cmluZyZhbXA7a2V5d29yZHM9JmFtcDtrZXl3b3Jkc190eXBlPWFueXdvcmRzJmFtcDtmaWVsZDAtMC0wPW5vb3AmYW1wO3R5cGUwLTAtMD1ub29wJmFtcDt2YWx1ZTAtMC0wPSZhbXA7b3JkZXI9YnVncy5idWdfaWQiPgotICAgICAgICAgIGN1cnJlbnRseSBvcGVuIAotICAgICAgICAgIDwvYT4uCi0gICAgICAgICAgYW5kIHJlc29sdmVkIGJ1Z3MgdG8gc2VlIGlmIHlvdXIgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgotICAgICAgICAgIElmIHlvdXIgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCwgeW91IGNhbiBzZWUgd2hldGhlciBhbnkgb2YgdGhlIGRldmVsb3BlcnMgaGF2ZSBjb21tZW50ZWQsIAotICAgICAgICAgIHN1Z2dlc3Rpbmcgd29ya2Fyb3VuZHMgb3IgdGhlIHJlYXNvbiBmb3IgdGhlIGJ1ZywgZXRjLiBZb3UgbWF5IGhhdmUgbW9yZSBpbmZvcm1hdGlvbiB0byBhZGQgKHNlZSBhYm91dCAKLSAgICAgICAgICBjcmVhdGluZyBidWcgcmVwb3J0cyBiZWxvdyksIGluIHdoaWNoIGNhc2UsIGdvIHJpZ2h0IGFoZWFkIGFuZCBhZGQgaXQuIElmIHlvdSBjYW4ndCBhZGQgbW9yZSBpbmZvcm1hdGlvbgotICAgICAgICAgIHlvdSBtYXkganVzdCB3YW50IHRvIHZvdGUgZm9yIHRoaXMgYnVnLCBhbmQgcGVyaGFwcyBhZGQgeW91cnNlbGYgdG8gdGhlIENDIGxpc3QgdG8gZm9sbG93IHRoZSBwcm9ncmVzcyBvZgotICAgICAgICAgIHRoaXMgYnVnLgotICAgICAgICA8L3A+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0gICAgICAKLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkZpbGluZyBhIEJ1ZyByZXBvcnQiPgotICAgICAgICA8cD5CeSB0aGlzIHRpbWUgeW91IG1heSBoYXZlIGRlY2lkZWQgdGhhdCB0aGVyZSBpcyBhIGJ1ZyBpbiBBbnQuIFlvdSBoYXZlIGEgZmV3IGNob2ljZXMgYXQgdGhpcyAKLSAgICAgICAgICAgcG9pbnQuIFlvdSBjYW4gc2VuZCBhbiBlbWFpbCB0byB0aGUgYW50LXVzZXIgbWFpbGluZyBsaXN0IHRvIHNlZSBpZiBvdGhlcnMgaGF2ZSBlbmNvdW50ZXJlZCB5b3VyIGlzc3VlCi0gICAgICAgICAgIGFuZCBob3cgdGhleSBtYXkgaGF2ZSB3b3JrZWQgYXJvdW5kIGl0LiBJZiBhZnRlciBzb21lIGRpc2N1c3Npb24sIHlvdSBzdGlsbCBmZWVsIHlvdSBoYXZlIGEgYnVnLCBpdCAKLSAgICAgICAgICAgaXMgdGltZSB0byBjcmVhdGUgYSBidWcgcmVwb3J0LiBUaGlzIGlzIGEgc2ltcGxlIG9wZXJhdGlvbiBpbiB0aGUgQnVnIERhdGFiYXNlLiBQbGVhc2UgdHJ5IHRvIHByb3ZpZGUgCi0gICAgICAgICAgIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgcG9zc2libGUgdG8gYXNzaXN0IHRoZSBkZXZlbG9wZXJzIGluIHJlc29sdmluZyB0aGUgYnVnLiBQbGVhc2UgdHJ5IHRvIGVudGVyIGNvcnJlY3QgCi0gICAgICAgICAgIHZhbHVlcyBmb3IgdGhlIHZhcmlvdXMgaW5wdXRzIHdoZW4gY3JlYXRpbmcgdGhlIGJ1Zy4gT25jZSB0aGUgYnVnIGlzIGNyZWF0ZWQgeW91IGNhbiBhZGQgYXR0YWNobWVudHMgdG8KLSAgICAgICAgICAgdGhlIGJ1ZyByZXBvcnQuIAotICAgICAgICA8L3A+Ci0gICAgICAgIAotICAgICAgICA8cD5XaGF0IGluZm9ybWF0aW9uIHNob3VsZCB5b3UgaW5jbHVkZSBpbiB5b3VyIGJ1ZyByZXBvcnQ/IFRoZSBlYXNpZXN0IGJ1Z3MgdG8gZml4IGFyZSB0aG9zZSB3aGljaCBhcmUgbW9zdCAKLSAgICAgICAgICAgZWFzaWx5IHJlcHJvZHVjaWJsZSwgc28gaWYgeW91IGNhbiwgaXQgaXMgcmVhbGx5IGhlbHBmdWwgdG8gcHJvZHVjZSBhIHNtYWxsIHRlc3QgY2FzZSB0aGF0IGV4aGliaXRzIHRoZQotICAgICAgICAgICBwcm9ibGVtLiBJbiB0aGlzIGNhc2UsIHlvdSB3b3VsZCBhdHRhY2ggdGhlIGJ1aWxkIGZpbGUgYW5kIG90aGVyIGZpbGVzIG5lY2Vzc2FyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0KLSAgICAgICAgICAgcHJvYmFibHkgcGFja2VkIHRvZ2V0aGVyIGluIGFuIGFyY2hpdmUuIElmIHlvdSBjYW4ndCBwcm9kdWNlIGEgdGVzdCBjYXNlLCB5b3Ugc2hvdWxkIHRyeSB0byBpbmNsdWRlIGEgCi0gICAgICAgICAgIHNuaXBwZXQgZnJvbSB5b3VyIGJ1aWxkIGZpbGUgYW5kIHRoZSByZWxldmFudCBzZWN0aW9ucyBmcm9tIHRoZSBkZWJ1ZyBvdXQgZnJvbSBBbnQuIFRyeSB0byBpbmNsdWRlIHRoZSAKLSAgICAgICAgICAgaGVhZGVyIGluZm9ybWF0aW9uIHdoZXJlIEFudCBzdGF0ZXMgdGhlIHZlcnNpb24sIHRoZSBPUyBhbmQgVk0gaW5mb3JtYXRpb24gZXRjLiBBcyB0aGUgZGVidWcgb3V0cHV0IGlzIAotICAgICAgICAgICBsaWtlbHkgdG8gYmUgdmVyeSBsYXJnZSwgeW91IHNob3VsZCB0cnkgdG8gcmVtb3ZlIHRoZSBvdXRwdXQgd2hpY2ggaXMgbm90IHJlbGV2YW50LiBPbmNlIHRoZSBidWcgaXMgCi0gICAgICAgICAgIGVudGVyZWQgaW50byB0aGUgQnVnIERhdGFiYXNlLCB5b3Ugd2lsbCBiZSBrZXB0IGluZm9ybWVkIGFib3V0IHByb2dyZXNzIG9uIHRoZSBidWcuIElmIHlvdSByZWNlaXZlIGVtYWlsCi0gICAgICAgICAgIGFza2luZyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgcGxlYXNlIHRyeSB0byByZXNwb25kIGFzIGl0IHdpbGwgYWlkIGluIHRoZSByZXNvbHV0aW9uIG9mIHlvdXIgYnVnLgotICAgICAgICA8L3A+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFza2luZyBmb3IgYW4gZW5oYW5jZW1lbnQiPgotICAgICAgICAgPHA+U29tZXRpbWVzLCB5b3UgbWF5IGZpbmQgdGhhdCBBbnQganVzdCBkb2Vzbid0IGRvIHdoYXQgeW91IHdhbnQuIEl0IGlzbid0IGEgYnVnLCBhcyBzdWNoLCBzaW5jZSBBbnQgCi0gICAgICAgICAgICBpcyB3b3JraW5nIHRoZSB3YXkgaXQgaXMgc3VwcG9zZWQgdG8uIFBlcmhhcHMgaXQgaXMgc29tZXRoaW5nIHRoYXQgaGFzbid0IGJlZW4gdGhvdWdodCBvZiB5ZXQsIG9yIAotICAgICAgICAgICAgYSBjb21wbGV0ZWx5IG5ldyB0YXNrLiBGb3IgdGhlc2Ugc2l0dWF0aW9ucyB5b3Ugd2lsbCB3YW50IHRvIHJhaXNlIGFuIGVuaGFuY2VtZW50IHJlcXVlc3QuIAotICAgICAgICAgICAgRW5oYW5jZW1lbnQgcmVxdWVzdHMgYXJlIG1hbmFnZWQgdXNpbmcgdGhlIHNhbWUgQXBhY2hlIEJ1ZyBEYXRhYmFzZSBkZXNjcmliZWQgYWJvdmUuIAotICAgICAgICAgICAgVGhlc2UgYXJlIGp1c3QgYSBkaWZmZXJlbnQgdHlwZSBvZiByZXBvcnQuIElmIHlvdSBsb29rIGluIHRoZSBkYXRhYmFzZSwgeW91IHdpbGwgc2VlIHRoYXQgb25lIG9mIAotICAgICAgICAgICAgdGhlIHNldmVyaXR5IHNldHRpbmdzIGZvciBhIGJ1ZyBpcyAmcXVvdDtFbmhhbmNlbWVudCZxdW90Oy4gU28sIGp1c3QgZmlsbCB0aGUgYnVnIHJlcG9ydCBpbiwgYW5kIAotICAgICAgICAgICAgaW4gdGhlIGRlc2NyaXB0aW9uLCBzdGF0ZSBob3cgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBBbnQgZW5oYW5jZWQuIEFnYWluIHlvdSBzaG91bGQgY2hlY2sgd2hldGhlcgotICAgICAgICAgICAgdGhlcmUgYXJlIGFueSBleGlzdGluZyBlbmhhbmNtZW50IHJlcXVlc3RzIHRoYXQgY292ZXIgeW91ciBuZWVkcy4gSWYgc28sIGp1c3QgYWRkIHlvdXIgdm90ZSB0byB0aGVzZS4KLSAgICAgICAgIDwvcD4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLSAgICAgIAotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iRml4aW5nIHRoZSBCdWciPgotICAgICAgICA8cD5JZiB5b3UgYXJlbid0IHNhdGlzZmllZCBqdXN0IGZpbGluZyBhIGJ1ZyByZXBvcnQsIHlvdSBjYW4gdHJ5IHRvIGZpbmQgYW5kIGZpeCB0aGUgcHJvYmxlbSB5b3Vyc2VsZi4gVGhlIAotICAgICAgICAgICBiZXN0IHdheSB0byBkbyB0aGF0IGlzIGJ5IHdvcmtpbmcgYWdhaW5zdCB0aGUgbGF0ZXN0IGNvZGUgZnJvbSBDVlMuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gd29yayB3aXRoIHRoZQotICAgICAgICAgICBzb3VyY2UgY29kZSBmcm9tIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgb24gdGhlIEpha2FydGEgd2Vic2l0ZS4gSWYgeW91IGFyZSBnb2luZyB0byB0YWNrbGUgdGhlCi0gICAgICAgICAgIGlzc3VlcyBhdCB0aGlzIGxldmVsLCB5b3UgbWF5IHdhbnQgdG8gZGlzY3VzcyBkZXRhaWxzIG9uIHRoZSBhbnQtZGV2IG1haWxpbmcgbGlzdC4gT25jZSB5b3UgaGF2ZSBhIGZpeCAKLSAgICAgICAgICAgZm9yIHRoZSBwcm9ibGVtLCB5b3UgbWF5IGVpdGhlciBzdWJtaXQgdGhlIHBhdGNoIHRvIHRoZSBhbnQtZGV2IG1haWxpbmcgbGlzdCBvciBlbnRlciBpbnRvIHRoZSBCdWcKLSAgICAgICAgICAgRGF0YWJhc2UgYXMgZGVzY3JpYmVkIGFib3ZlLCBhdHRhY2hpbmcgdGhlIHBhdGNoLiBVc2luZyB0aGUgQnVnIGRhdGFiYXNlIGhhcyB0aGUgYWR2YW50YWdlIG9mIHRyYWNraW5nCi0gICAgICAgICAgIHRoZSBwcm9ncmVzcyBvZiB5b3VyIGJ1Zy4KLSAgICAgICAgPC9wPgotICAgICAgPC9zdWJzZWN0aW9uPgotICAgICAgCi0gICAgICAgICAKLSAgICA8L3NlY3Rpb24+Ci0gICAgCi0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS94ZG9jcy9yZXNvdXJjZXMueG1sIGIveGRvY3MvcmVzb3VyY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhNGIxZi4uMDAwMDAwMAotLS0gYS94ZG9jcy9yZXNvdXJjZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvY3VtZW50PgotCi0gIDxwcm9wZXJ0aWVzPgotICAgIDxhdXRob3IgZW1haWw9ImJvZGV3aWdAYXBhY2hlLm9yZyI+U3RlZmFuIEJvZGV3aWc8L2F1dGhvcj4KLSAgICA8dGl0bGU+UmVzb3VyY2VzPC90aXRsZT4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxib2R5PgotCi0gICAgPHNlY3Rpb24gbmFtZT0iRkFRcyI+Ci0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBdCBBbnQncyB3ZWJzaXRlIj4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5GQVE8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9ImZhcS5odG1sIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2FudC9mYXEuaHRtbDwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9ImpHdXJ1Ij4KLSAgICAgICAgPHA+akd1cnUgaG9zdHMgYW4gaW50ZXJhY3RpdmUgQW50IGRpc2N1c3Npb24gZm9ydW0gYW5kIEZBUSBzeXN0ZW08L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Gb3J1bTwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qZ3VydS5jb20vZm9ydW1zL2hvbWUuanNwP3RvcGljPUFudCI+aHR0cDovL3d3dy5qZ3VydS5jb20vZm9ydW1zL2hvbWUuanNwP3RvcGljPUFudDwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkZBUTwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qZ3VydS5jb20vZmFxL2hvbWUuanNwP3RvcGljPUFudCI+aHR0cDovL3d3dy5qZ3VydS5jb20vZmFxL2hvbWUuanNwP3RvcGljPUFudDwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0gICAgPC9zZWN0aW9uPgotICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IkFydGljbGVzIGFuZCBQcmVzZW50YXRpb25zIj4KLQotICAgICAgPHA+VGhlIGZvbGxvd2luZyBzZWN0aW9ucyBsaXN0IGFydGljbGVzIGFuZCBwcmVzZW50YXRpb25zIHdyaXR0ZW4gYWJvdXQgQW50LiAgSWYKLSAgICAgIHlvdSd2ZSB3cml0dGVuIHNvbWV0aGluZyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCwgcGxlYXNlIHBvc3QgaXQgdG8gb25lCi0gICAgICBvZiB0aGUgbWFpbGluZyBsaXN0cy48L3A+Ci0KLSAgICA8L3NlY3Rpb24+Ci0KLSAgICA8c2VjdGlvbiBuYW1lPSJBcnRpY2xlcyI+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudCBpbiBBbmdlcjogVXNpbmcgQW50IGluIGEgUHJvZHVjdGlvbiBEZXZlbG9wbWVudAotICAgICAgU3lzdGVtIj4KLSAgICAgICAgPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgc3RyYXRlZ2llcyBhbmQgc29tZSBiYXNpYyBleGFtcGxlcyBvZiBob3cgdG8gCi0gICAgICAgIHVzZSBBbnQgaW4gbGFyZ2VyIHRlYW0gZGV2ZWxvcG1lbnQgcHJvamVjdHMuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnN0ZXZlX2xAaXNlcmFuLmNvbSI+U3RldmUgTG91Z2hyYW48L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJhbnRfaW5fYW5nZXIuaHRtbCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQvYW50X2luX2FuZ2VyLmh0bWw8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnQgVGFzayBHdWlkZWxpbmVzIj4KLSAgICAgICAgPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHdyaXRlIGN1c3RvbSBBbnQgdGFza3MsIGFuZCBob3cgdG8gc3VibWl0Ci0gICAgICAgIHRoZW0gdG8gcG90ZW50aWFsbHkgYmUgaW5jbHVkZWQgaW4gQW50LjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpzdGV2ZV9sQGlzZXJhbi5jb20iPlN0ZXZlIExvdWdocmFuPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+VVJMOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2FudC9hbnRfdGFza19ndWlkZWxpbmVzLmh0bWw8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBdXRvbWF0aW5nIHRoZSBidWlsZCBhbmQgdGVzdCBwcm9jZXNzIj4KLSAgICAgICAgPHA+VGhpcyBhcnRpY2xlIGRlbW9uc3RyYXRlcyBhbiBhcHByb2FjaCB0byB0aGUgYXV0b21hdGVkIGJ1aWxkIGFuZCB0ZXN0IHByb2Nlc3MuIFdvcmtpbmcgd2l0aCBBbnQgMS4zIGFuZCB0aGUgSlVuaXQgdGVzdCBmcmFtZXdvcmssIGl0IHNob3dzIGhvdyB0byBhdXRvbWF0ZSBhIHByb2Nlc3MgdGhhdCBjYXB0dXJlcyBwZXJ0aW5lbnQgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCB0ZXN0IHN1aXRlIHJ1biwgZ2VuZXJhdGVzIGFuIGF0dHJhY3RpdmUgcmVwb3J0LCBhbmQgZS1tYWlscyB0aGUgcmVwb3J0LjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzplcmlrQGhhdGNoZXIubmV0Ij5FcmlrIEhhdGNoZXI8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvamF2YS9saWJyYXJ5L2otanVuaXRtYWlsLyI+aHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2phdmEvbGlicmFyeS9qLWp1bml0bWFpbC88L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbmNyZW1lbnRhbCBkZXZlbG9wbWVudCB3aXRoIEFudCBhbmQgSlVuaXQiPgotICAgICAgICA8cD5UaGlzIGFydGljbGUgZXhwbG9yZXMgdGhlIGJlbmVmaXRzIG9mIHVuaXQgdGVzdGluZyB3aXRoIEFudCBhbmQKLSAgICAgICAgSlVuaXQsIGRldGFpbGluZyBob3cgdG8gZGV2ZWxvcCBhdXRvbWF0ZWQgdW5pdCB0ZXN0cyBhbmQgaW50ZWdyYXRlIHRoZW0KLSAgICAgICAgaW50byB5b3VyIGJ1aWxkIHByb2Nlc3MuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOm1hbGNvbG1AbnVlYXJ0aC5jb20iPk1hbGNvbG0gRGF2aXM8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LTEwNi5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpYnJhcnkvai1hbnQvP2R3em9uZT1qYXZhIj5odHRwOi8vd3d3LTEwNi5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpYnJhcnkvai1hbnQvP2R3em9uZT1qYXZhPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQXV0b21hdGUgeW91ciBidWlsZCBwcm9jZXNzIHVzaW5nIEphdmEgYW5kIEFudCI+Ci0gICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBpbnRyb2R1Y3Rpb24gdG8gdXNpbmcgQW50IHdpdGggc29tZSBiYXNpYwotICAgICAgICBleGFtcGxlcyBhbmQgYnkgaGlnaGxpZ2h0aW5nIHNvbWUgb2YgdGhlIGltcG9ydGFudCB0YXNrcy48L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86bWljaGFlbC5jeW1lcm1hbkBqYXZhd29ybGQuY29tIj5NaWNoYWVsIEN5bWVybWFuPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+VVJMOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhd29ybGQuY29tL2phdmF3b3JsZC9qdy0xMC0yMDAwL2p3LTEwMjAtYW50Lmh0bWwiPmh0dHA6Ly93d3cuamF2YXdvcmxkLmNvbS9qYXZhd29ybGQvanctMTAtMjAwMC9qdy0xMDIwLWFudC5odG1sPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iU2hvcnQgdHV0b3JpYWwgaW4gQ2FjdHVzJmFwb3M7IChmb3JtZXJseSBKMkVFVW5pdCkKLSAgICAgIGRvY3VtZW50YXRpb24iPgotICAgICAgICA8cD5UaGVyZSBpcyBhIHNob3J0IHR1dG9yaWFsIG9uIGhvdyB0byB1c2UgQW50IGluIENhY3R1cyZhcG9zOwotICAgICAgICBkb2N1bWVudGF0aW9uLiAgSXQgaGFzIGEgc2xhbnQgdG93YXJkcyBidWlsZCBmaWxlcyB0aGF0IHdpbGwgYmUgdXNlZAotICAgICAgICB3aXRoIENhY3R1cy48L3A+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KLSAgICAgICAgICAgIDx0ZD5DYWN0dXMgZGV2ZWxvcG1lbnQgdGVhbTwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+VVJMOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2NhY3R1cy9hbnQuaHRtbCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2NhY3R1cy9hbnQuaHRtbDwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkRldmVsb3BpbmcgY3VzdG9tIEFudCB0YXNrcyB3aXRoIFZpc3VhbEFnZSBmb3IgSmF2YSI+Ci0gICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBvdXRsaW5lcyBob3cgdG8gaW50ZWdyYXRlIEFudCBpbnRvIFZpc3VhbEFnZSBmb3IgSmF2YSwKLSAgICAgICAgYW5kIGhvdyB0byB3cml0ZSBhbmQgZGVidWcgY3VzdG9tIHRhc2tzIHVzaW5nIHRoZSBJREUgYW5kIHRoZQotICAgICAgICBpbnRlZ3JhdGVkIGRlYnVnZ2VyLjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpnbGVubkBzb21hbmV0d29ya3MuY29tIj5HbGVubiBNY0FsbGlzdGVyPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+VVJMOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dzcuc29mdHdhcmUuaWJtLmNvbS92YWQubnNmL2RhdGEvZG9jdW1lbnQyMzY2P09wZW5Eb2N1bWVudCZhbXA7cD0xJmFtcDtCQ1Q9MSZhbXA7Rm9vdGVyPTEiPmh0dHA6Ly93d3c3LnNvZnR3YXJlLmlibS5jb20vdmFkLm5zZi9kYXRhL2RvY3VtZW50MjM2Nj9PcGVuRG9jdW1lbnQmYW1wO3A9MSZhbXA7QkNUPTEmYW1wO0Zvb3Rlcj0xPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQXV0b21hdGVkIGJ1aWxkcyB3aXRoIFZpc3VhbEFnZSBmb3IgSmF2YSBhbmQgQW50Ij4KLSAgICAgICAgPHA+VGhpcyBhcnRpY2xlIHNob3dzIGhvdyB5b3UgY2FuIHBlcmZvcm0gY29tbWFuZCBsaW5lIGJ1aWxkcyB3aXRoIGEKLSAgICAgICAgVmlzdWFsQWdlIGZvciBKYXZhIHJlcG9zaXRvcnkuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmdsZW5uQHNvbWFuZXR3b3Jrcy5jb20iPkdsZW5uIE1jQWxsaXN0ZXI8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Ny5zb2Z0d2FyZS5pYm0uY29tL3ZhZC5uc2YvRGF0YS9Eb2N1bWVudDQzNjY/T3BlbkRvY3VtZW50JmFtcDtwPTEmYW1wO0JDVD0zJmFtcDtGb290ZXI9MSI+aHR0cDovL3d3dzcuc29mdHdhcmUuaWJtLmNvbS92YWQubnNmL0RhdGEvRG9jdW1lbnQ0MzY2P09wZW5Eb2N1bWVudCZhbXA7cD0xJmFtcDtCQ1Q9MyZhbXA7Rm9vdGVyPTE8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnQ6IEEgQnVpbGQgVG9vbCBmcm9tIHRoZSBKYWthcnRhIFByb2plY3QiPgotICAgICAgICA8cD5UaGlzIGFydGljbGUgaXMgZnJvbSB0aGUgJnF1b3Q7QmVzdCBQcmFjdGljZXMmcXVvdDsgc2VjdGlvbiBvZgotICAgICAgICBTdW4mYXBvcztzIERvdC1Db20gQnVpbGRlciBTaXRlLjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgotICAgICAgICAgICAgPHRkPkxhdXJhIEdlZWxlIFdhbmc8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9kY2Iuc3VuLmNvbS9wcmFjdGljZXMvcHJvZmlsZXMvYW50LmpzcCI+aHR0cDovL2RjYi5zdW4uY29tL3ByYWN0aWNlcy9wcm9maWxlcy9hbnQuanNwPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTWFraW5nIGEgTW91bnRhaW4gT3V0IG9mIGFuIEFudGhpbGwiPgotICAgICAgICA8cD5UaGlzIGFydGljbGUgaXMgZnJvbSB0aGUgSnVuZSAyMDAxIGlzc3VlIG9mIHRoZSBKYXZhIERldmVsb3BlciZhcG9zOwotICAgICAgICBKb3VybmFsLiAgWW91IG5lZWQgdG8gYmUgYSByZWdpc3RlcmVkIEpESiBzdWJzY3JpYmVyIHRvIHZpZXcgdGhpcwotICAgICAgICBhcnRpY2xlLjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgotICAgICAgICAgICAgPHRkPk5lYWwgRm9yZDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+VVJMOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5zeXMtY29uLmNvbS9qYXZhL2FyY2hpdmVzYS5jZm0/dm9sdW1lPTA2JmFtcDtpc3N1ZT0wNiI+aHR0cDovL3d3dy5zeXMtY29uLmNvbS9qYXZhL2FyY2hpdmVzYS5jZm0/dm9sdW1lPTA2JmFtcDtpc3N1ZT0wNjwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlVzaW5nIEFudCBhbmQgV2VibG9naWMgRUpCcyI+Ci0gICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgaG93IHRvIHVzZSBBbnQgdG8gY3JlYXRlIFdlYmxvZ2ljIEVKQnMsIGFuZAotICAgICAgICBzb21lIHdvcmthcm91bmRzIGZvciBpc3N1ZXMgeW91IG1heSBlbmNvdW50ZXIuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+SmVzc2UgRS4gVGlsbHk8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub25qYXZhLmNvbS9wdWIvYS9vbmphdmEvMjAwMS8wNi8yNS9hbnRlamIuaHRtbCI+aHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDAxLzA2LzI1L2FudGVqYi5odG1sPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW4gSW50cm9kdWN0aW9uIHRvIEFudCI+Ci0gICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBpcyBhIHNob3J0IGludHJvZHVjdGlvbiBpbnRvIHRoZSBiYXNpYwotICAgICAgICBjb25jZXB0cyBvZiBBbnQuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+SmF5YWtyaXNobmFuIE5haXI8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly92YXJuYW0ub3JnL2FydGljbGVzL2FudC5odG1sIj5odHRwOi8vdmFybmFtLm9yZy9hcnRpY2xlcy9hbnQuaHRtbDwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICA8L3NlY3Rpb24+Ci0KLSAgICA8c2VjdGlvbiBuYW1lPSJQcmVzZW50YXRpb25zIj4KLQotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50IC0gcHJlc2VudGVkIHRvIHRoZSBUdWNzb24gSmF2YSBVc2VycyBHcm91cCI+Ci0gICAgICAgIDxwPkEgUG93ZXJQb2ludCB0ZWNobmljYWwgb3ZlcnZpZXcgcHJlc2VudGF0aW9uIG9uIEFudC4gIENvbWVzIGNvbXBsZXRlIHdpdGggYSBzdHJhaWdodGZvcndhcmQgZXhhbXBsZSBkZW1vbnN0cmF0aW5nIGNvZGUgY29tcGlsYXRpb24sIEpBUidpbmcsIEpVbml0IHRlc3RpbmcsIEpVbml0IHJlcG9ydGluZywgYW5kIFppcHBpbmcgYSBkaXN0cmlidXRpb24uICBBIGZldyBhZHZhbmNlZCB0b3BpY3MgYXJlIHRvdWNoZWQgdXBvbiBsaWtlIHByb3BlcnR5IGltbXV0YWJhbGl0eSBhbmQgdXNpbmcgJmx0O2FudGNhbGwmZ3Q7IHRvIGdldCBhcm91bmQgaXQsIGJ1aWxkIGxpc3RlbmVycywgYW5kIHdyaXRpbmcgY3VzdG9tIHRhc2tzLjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzplcmlrQGhhdGNoZXIubmV0Ij5FcmlrIEhhdGNoZXI8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vZXJpay5oYXRjaGVyLm5ldC9hbnQtanVnLnppcCI+aHR0cDovL2VyaWsuaGF0Y2hlci5uZXQvYW50LWp1Zy56aXA8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnQgQnVpbGQgVG9vbCI+Ci0gICAgICAgIDxwPkEgUG93ZXJQb2ludCBwcmVzZW50YXRpb24gb24gQW50IDEuMi4gIEl0IHByb3ZpZGVzIGEgYmFzaWMgb3ZlcnZpZXcKLSAgICAgICAgb2YgQW50JmFwb3M7cyBjYXBhYmlsaXRpZXMuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmNoYW5lem9uQG5ldHNjYXBlLmNvbSI+UGF0cmljayBDaGFuZXpvbjwvYT48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9wZW9wbGUubmV0c2NhcGUuY29tL2NoYW5lem9uL3RlY2gvYW50L2FudF9wcmVzby5wcHQiPmh0dHA6Ly9wZW9wbGUubmV0c2NhcGUuY29tL2NoYW5lem9uL3RlY2gvYW50L2FudF9wcmVzby5wcHQ8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnQiPgotICAgICAgICA8cD5BIGRldGFpbGVkIEFudCAxLjMgUG93ZXJQb2ludCBwcmVzZW50YXRpb24sIG1hZGUgYXQgdGhlIFN0LiBMb3VpcyBKYXZhIFVzZXJzIEdyb3VwCi0gICAgICAgIG1lZXRpbmcgaW4gTWFyY2ggMjAwMS4gIEluY2x1ZGVzIGEgZGV0YWlsZWQgYnVpbGQgZmlsZSBhbmQgYmFzaWMKLSAgICAgICAgZGVzY3JpcHRpb25zIG9mIGFsbCB0aGUgYnVpbHQgaW4gYW5kIG9wdGlvbmFsIHRhc2tzLjwvcD4KLQotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgotICAgICAgICAgICAgPHRkPk1hcmsgVm9sa21hbm48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub2Npd2ViLmNvbS9qYXZhc2lnL2tub3dsZWRnZWJhc2UvTWFyY2gyMDAxL2luZGV4Lmh0bWwiPmh0dHA6Ly93d3cub2Npd2ViLmNvbS9qYXZhc2lnL2tub3dsZWRnZWJhc2UvTWFyY2gyMDAxL2luZGV4Lmh0bWw8L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9zdWJzZWN0aW9uPgotCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSJNb2Rlcm4gRGV2ZWxvcG1lbnQgQ3Jpc2VzIj4KLSAgICAgICAgPHA+VGhpcyBwcmVzZW50YXRpb24gaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2Ygc29mdHdhcmUKLSAgICAgICAgZGV2ZWxvcG1lbnQgdG9kYXkuICBUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygc2xpZGVzIHRoYXQgYnJpZWZseSBjb3ZlcgotICAgICAgICBBbnQuPC9wPgotCi0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnN0ZXZlX2xAaXNlcmFuLmNvbSI+U3RldmUgTG91Z2hyYW48L2E+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KLSAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmlzZXJhbi5jb20vU3RldmUvbW9kZXJuX2RldmVsb3BtZW50X3Byb2Nlc3Nlcy5odG1sIj5odHRwOi8vd3d3LmlzZXJhbi5jb20vU3RldmUvbW9kZXJuX2RldmVsb3BtZW50X3Byb2Nlc3Nlcy5odG1sPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLSAgICA8L3NlY3Rpb24+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS94ZG9jcy9zdHlsZXNoZWV0cy9mYXEudnNsIGIveGRvY3Mvc3R5bGVzaGVldHMvZmFxLnZzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0YzhjZi4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZXNoZWV0cy9mYXEudnNsCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotCi08IS0tIENvbnRlbnQgU3R5bGVzaGVldCBmb3IgU2l0ZSAtLT4KLQotICAgICMjIERlZmluZWQgdmFyaWFibGVzCi0gICAgI3NldCAoJGJvZHliZyA9ICIjZmZmZmZmIikKLSAgICAjc2V0ICgkYm9keWZnID0gIiMwMDAwMDAiKQotICAgICNzZXQgKCRib2R5bGluayA9ICIjNTI1RDc2IikKLSAgICAjc2V0ICgkYmFubmVyYmcgPSAiIzUyNUQ3NiIpCi0gICAgI3NldCAoJGJhbm5lcmZnID0gIiNmZmZmZmYiKQotICAgICNzZXQgKCRzdWJiYW5uZXJiZyA9ICIjODI4REE2IikKLSAgICAjc2V0ICgkc3ViYmFubmVyZmcgPSAiI2ZmZmZmZiIpCi0gICAgI3NldCAoJHRhYmxldGhiZyA9ICIjMDM5YWNjIikKLSAgICAjc2V0ICgkdGFibGV0ZGJnID0gIiNhMGRkZjAiKQotICAgICNzZXQgKCRwb3VuZCA9ICIjIiApCi0gICAgCi08IS0tIHN0YXJ0IHRoZSBwcm9jZXNzaW5nIC0tPgotI2ZhcXMoKQotPCEtLSBlbmQgdGhlIHByb2Nlc3NpbmcgLS0+Ci0KLSMjIFRoaXMgaXMgd2hlcmUgdGhlIEZBUSBzcGVjaWZpYyBtYWNybydzIGxpdmUKLQotI21hY3JvICh0b2MgJHNlY3Rpb24pCi0gIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgIDx0cj48dGQgYmdjb2xvcj0iJHN1YmJhbm5lcmJnIj4KLSAgICAgIDxmb250IGNvbG9yPSIkc3ViYmFubmVyZmciIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci0gICAgICAgIDxzdHJvbmc+JHNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoInRpdGxlIik8L3N0cm9uZz4KLSAgICAgIDwvZm9udD4KLSAgICA8L3RkPjwvdHI+Ci0gICAgPHRyPjx0ZD4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8dWw+Ci0gICAgICAgICNmb3JlYWNoICgkZmFxIGluICRzZWN0aW9uLmdldENoaWxkcmVuKCJmYXEiKSApCi0gICAgICAgICAgI3N1YnRvYyAoJGZhcSkKLSAgICAgICAgI2VuZAotICAgICAgICA8L3VsPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvdGQ+PC90cj4KLSAgPC90YWJsZT4KLSNlbmQKLQotI21hY3JvIChzdWJ0b2MgJGZhcSkKLSAgI3NldCAoJGlkID0gJGZhcS5nZXRBdHRyaWJ1dGVWYWx1ZSgiaWQiKSkKLSAgPGxpPjxhIGhyZWY9IiRwb3VuZCRpZCI+Ci0gICR4bWxvdXQub3V0cHV0U3RyaW5nKCRmYXEuZ2V0Q2hpbGQoInF1ZXN0aW9uIiksIHRydWUpCi0gIDwvYT48L2xpPgotI2VuZAotCi0jbWFjcm8gKGFuc3dlcnMgJHNlY3Rpb24pCi0gICNmb3JlYWNoICgkZmFxIGluICRzZWN0aW9uLmdldENoaWxkcmVuKCJmYXEiKSApCi0gICAgI2ZhcSAoJGZhcSkKLSAgI2VuZAotI2VuZAotCi0jbWFjcm8gKGZhcSAkZmFxKQotICAjc2V0ICgkaWQgPSAkZmFxLmdldEF0dHJpYnV0ZVZhbHVlKCJpZCIpKQotICA8YSBuYW1lPSIkaWQiPgotICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICA8dHI+PHRkIGJnY29sb3I9IiRzdWJiYW5uZXJiZyI+Ci0gICAgICA8Zm9udCBjb2xvcj0iJHN1YmJhbm5lcmZnIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotICAgICAgICA8c3Ryb25nPgotICAgICAgICAgICR4bWxvdXQub3V0cHV0U3RyaW5nKCRmYXEuZ2V0Q2hpbGQoInF1ZXN0aW9uIiksIHRydWUpCi0gICAgICAgIDwvc3Ryb25nPgotICAgICAgPC9mb250PgotICAgIDwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPgotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgICNmb3JlYWNoICgkaXRlbSBpbiAkZmFxLmdldENoaWxkKCJhbnN3ZXIiKS5nZXRDaGlsZHJlbigpKQotICAgICAgICAgICNpZiAoJGl0ZW0uZ2V0TmFtZSgpLmVxdWFscygiaW1nIikpCi0gICAgICAgICAgICAjaW1hZ2UgKCRpdGVtKQotICAgICAgICAgICNlbHNlaWYgKCRpdGVtLmdldE5hbWUoKS5lcXVhbHMoInNvdXJjZSIpKQotICAgICAgICAgICAgI3NvdXJjZSAoJGl0ZW0pCi0gICAgICAgICAgI2Vsc2VpZiAoJGl0ZW0uZ2V0TmFtZSgpLmVxdWFscygidGFibGUiKSkKLSAgICAgICAgICAgICN0YWJsZSAoJGl0ZW0pCi0gICAgICAgICAgI2Vsc2UKLSAgICAgICAgICAgICR4bWxvdXQub3V0cHV0U3RyaW5nKCRpdGVtKQotICAgICAgICAgICNlbmQKLSAgICAgICAgI2VuZAotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvdGQ+PC90cj4KLSAgPC90YWJsZT4KLSAgPC9hPgotI2VuZAotCi0jbWFjcm8gKGZhcXMpCi0gICNoZWFkZXIoKQotICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICA8dHI+PHRkIGJnY29sb3I9IiRiYW5uZXJiZyI+Ci0gICAgICA8Zm9udCBjb2xvcj0iJGJhbm5lcmZnIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotICAgICAgICA8c3Ryb25nPlF1ZXN0aW9uczwvc3Ryb25nPgotICAgICAgPC9mb250PgotICAgIDwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPgotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAjc2V0ICgkYWxsRmFxU2VjdGlvbnMgPSAkcm9vdC5nZXRDaGlsZHJlbigiZmFxc2VjdGlvbiIpKQotICAgICAgI2ZvcmVhY2ggKCAkZmFxU2VjdGlvbiBpbiAkYWxsRmFxU2VjdGlvbnMgKQotICAgICAgICAjdG9jICgkZmFxU2VjdGlvbikKLSAgICAgICNlbmQKLSAgICAgIDwvYmxvY2txdW90ZT4KLSAgICA8L3RkPjwvdHI+Ci0gIDwvdGFibGU+Ci0KLSAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPjx0ZCBiZ2NvbG9yPSIkYmFubmVyYmciPgotICAgICAgPGZvbnQgY29sb3I9IiRiYW5uZXJmZyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLSAgICAgICAgPHN0cm9uZz5BbnN3ZXJzPC9zdHJvbmc+Ci0gICAgICA8L2ZvbnQ+Ci0gICAgPC90ZD48L3RyPgotICAgIDx0cj48dGQ+Ci0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICNmb3JlYWNoICggJGZhcVNlY3Rpb24gaW4gJGFsbEZhcVNlY3Rpb25zICkKLSAgICAgICAgI2Fuc3dlcnMgKCRmYXFTZWN0aW9uKQotICAgICAgI2VuZAotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvdGQ+PC90cj4KLSAgPC90YWJsZT4KLSAgI2Zvb3RlcigpCi0jZW5kCmRpZmYgLS1naXQgYS94ZG9jcy9zdHlsZXNoZWV0cy9wcm9qZWN0LnhtbCBiL3hkb2NzL3N0eWxlc2hlZXRzL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDlhMjMwLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3N0eWxlc2hlZXRzL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPHByb2plY3QgbmFtZT0iSmFrYXJ0YSBTaXRlIgotICAgICAgICBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLyI+Ci0KLSAgICA8dGl0bGU+VGhlIEpha2FydGEgU2l0ZTwvdGl0bGU+Ci0gICAgPCEtLSB1bmNvbW1lbnQgYW5kIHB1dCB5b3VyIHByb2plY3QgbG9nbyBoZXJlIQotICAgIDxsb2dvIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvaW1hZ2VzL2pha2FydGEtbG9nby5naWYiPlRoZSBKYWthcnRhIFByb2plY3Q8L2xvZ28+Ci0gICAgLS0+Ci0gICAgCi0gICAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iQW50Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRnJvbnQgUGFnZSIgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTmV3cyIgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBocmVmPSIvYW50bmV3cy5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkRvY3VtZW50YXRpb24iICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGhyZWY9Ii9tYW51YWwvaW5kZXguaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRlcm5hbCBUb29scyBhbmQgVGFza3MiCi0gICAgICAgICAgICAgIGhyZWY9Ii9leHRlcm5hbC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IlJlc291cmNlcyIKLSAgICAgICAgICAgICAgaHJlZj0iL3Jlc291cmNlcy5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkFudCBGQVEiCi0gICAgICAgICAgICAgIGhyZWY9Ii9mYXEuaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJIYXZpbmcgUHJvYmxlbXM/IgotICAgICAgICAgICAgICBocmVmPSIvcHJvYmxlbXMuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkRvd25sb2FkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iQmluYXJpZXMiICAgICAgICAgICAgICBocmVmPSIvc2l0ZS9iaW5pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IlNvdXJjZSBDb2RlIiAgICAgICAgICAgaHJlZj0iL3NpdGUvc291cmNlaW5kZXguaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9Ikpha2FydGEiPgotICAgICAgICA8aXRlbSBuYW1lPSJOZXdzICZhbXA7IFN0YXR1cyIgICAgIGhyZWY9Ii9zaXRlL25ld3MuaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJNaXNzaW9uIiAgICAgICAgICAgICAgIGhyZWY9Ii9zaXRlL21pc3Npb24uaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJHdWlkZWxpbmVzIE5vdGVzIiAgICAgIGhyZWY9Ii9zaXRlL2d1aWRlbGluZXMuaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJGQVFzIiAgICAgICAgICAgICAgICAgIGhyZWY9Ii9zaXRlL2ZhcXMuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkdldCBJbnZvbHZlZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgaHJlZj0iL3NpdGUvZ2V0aW52b2x2ZWQuaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJDVlMgUmVwb3NpdG9yaWVzIiAgICAgIGhyZWY9Ii9zaXRlL2N2c2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbGluZyBMaXN0cyIgICAgICAgICBocmVmPSIvc2l0ZS9tYWlsLmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iUmVmZXJlbmNlIExpYnJhcnkiICAgICBocmVmPSIvc2l0ZS9saWJyYXJ5Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iQnVnIERhdGFiYXNlIiAgICAgICAgICBocmVmPSJodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PUFudCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFbmhhbmNlbWVudCBSZXF1ZXN0cyIgIGhyZWY9Imh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9QW50JmFtcDtidWdfc2V2ZXJpdHk9RW5oYW5jZW1lbnQiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS94ZG9jcy9zdHlsZXNoZWV0cy9zaXRlLnZzbCBiL3hkb2NzL3N0eWxlc2hlZXRzL3NpdGUudnNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjVlOGM5Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3N0eWxlc2hlZXRzL3NpdGUudnNsCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci0KLTwhLS0gQ29udGVudCBTdHlsZXNoZWV0IGZvciBTaXRlIC0tPgotCi0gICAgIyMgRGVmaW5lZCB2YXJpYWJsZXMKLSAgICAjc2V0ICgkYm9keWJnID0gIiNmZmZmZmYiKQotICAgICNzZXQgKCRib2R5ZmcgPSAiIzAwMDAwMCIpCi0gICAgI3NldCAoJGJvZHlsaW5rID0gIiM1MjVENzYiKQotICAgICNzZXQgKCRiYW5uZXJiZyA9ICIjNTI1RDc2IikKLSAgICAjc2V0ICgkYmFubmVyZmcgPSAiI2ZmZmZmZiIpCi0gICAgI3NldCAoJHN1YmJhbm5lcmJnID0gIiM4MjhEQTYiKQotICAgICNzZXQgKCRzdWJiYW5uZXJmZyA9ICIjZmZmZmZmIikKLSAgICAjc2V0ICgkdGFibGV0aGJnID0gIiMwMzlhY2MiKQotICAgICNzZXQgKCR0YWJsZXRkYmcgPSAiI2EwZGRmMCIpCi0gICAgCi08IS0tIHN0YXJ0IHRoZSBwcm9jZXNzaW5nIC0tPgotI2RvY3VtZW50KCkKLTwhLS0gZW5kIHRoZSBwcm9jZXNzaW5nIC0tPgotCi0jIyBUaGlzIGlzIHdoZXJlIHRoZSBjb21tb24gcGFnZSBtYWNybydzIGxpdmUKLQotI21hY3JvICggc3Vic2VjdGlvbiAkc3Vic2VjdGlvbikKLSAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPjx0ZCBiZ2NvbG9yPSIkc3ViYmFubmVyYmciPgotICAgICAgPGZvbnQgY29sb3I9IiRzdWJiYW5uZXJmZyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLSAgICAgICAgPGEgbmFtZT0iJHN1YnNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKSI+PHN0cm9uZz4kc3Vic2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpPC9zdHJvbmc+PC9hPgotICAgICAgPC9mb250PgotICAgIDwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPgotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAjZm9yZWFjaCAoICRpdGVtcyBpbiAkc3Vic2VjdGlvbi5nZXRDaGlsZHJlbigpICkKLSAgICAgICAgI2lmICgkaXRlbXMuZ2V0TmFtZSgpLmVxdWFscygiaW1nIikpCi0gICAgICAgICAgI2ltYWdlICgkaXRlbXMpCi0gICAgICAgICNlbHNlaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJzb3VyY2UiKSkKLSAgICAgICAgICAjc291cmNlICgkaXRlbXMpCi0gICAgICAgICNlbHNlaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJ0YWJsZSIpKQotICAgICAgICAgICN0YWJsZSAoJGl0ZW1zKQotICAgICAgICAjZWxzZQotICAgICAgICAgICR4bWxvdXQub3V0cHV0U3RyaW5nKCRpdGVtcykKLSAgICAgICAgI2VuZAotICAgICAgI2VuZAotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvdGQ+PC90cj4KLSAgPC90YWJsZT4KLSNlbmQKLQotI21hY3JvICggc2VjdGlvbiAkc2VjdGlvbikKLSAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPjx0ZCBiZ2NvbG9yPSIkYmFubmVyYmciPgotICAgICAgPGZvbnQgY29sb3I9IiRiYW5uZXJmZyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLSAgICAgICAgPGEgbmFtZT0iJHNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKSI+PHN0cm9uZz4kc2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpPC9zdHJvbmc+PC9hPgotICAgICAgPC9mb250PgotICAgIDwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPgotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAjZm9yZWFjaCAoICRpdGVtcyBpbiAkc2VjdGlvbi5nZXRDaGlsZHJlbigpICkKLSAgICAgICAgI2lmICgkaXRlbXMuZ2V0TmFtZSgpLmVxdWFscygiaW1nIikpCi0gICAgICAgICAgI2ltYWdlICgkaXRlbXMpCi0gICAgICAgICNlbHNlaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJzb3VyY2UiKSkKLSAgICAgICAgICAjc291cmNlICgkaXRlbXMpCi0gICAgICAgICNlbHNlaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJ0YWJsZSIpKQotICAgICAgICAgICN0YWJsZSAoJGl0ZW1zKQotICAgICAgICAjZWxzZWlmICgkaXRlbXMuZ2V0TmFtZSgpLmVxdWFscygic3Vic2VjdGlvbiIpKQotICAgICAgICAgICNzdWJzZWN0aW9uICgkaXRlbXMpCi0gICAgICAgICNlbHNlCi0gICAgICAgICAgJHhtbG91dC5vdXRwdXRTdHJpbmcoJGl0ZW1zKQotICAgICAgICAjZW5kCi0gICAgICAjZW5kCi0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPC90ZD48L3RyPgotICA8L3RhYmxlPgotI2VuZAotCi0jbWFjcm8gKGRvY3VtZW50KQotICAjaGVhZGVyKCkKLSAgI3NldCAoJGFsbFNlY3Rpb25zID0gJHJvb3QuZ2V0Q2hpbGQoImJvZHkiKS5nZXRDaGlsZHJlbigic2VjdGlvbiIpKQotICAjZm9yZWFjaCAoICRzZWN0aW9uIGluICRhbGxTZWN0aW9ucyApCi0gICAgI3NlY3Rpb24gKCRzZWN0aW9uKQotICAjZW5kCi0gICNmb290ZXIoKQotI2VuZApkaWZmIC0tZ2l0IGEveGRvY3Mvc3R5bGVzaGVldHMvdGVtcGxhdGVzLnZtIGIveGRvY3Mvc3R5bGVzaGVldHMvdGVtcGxhdGVzLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGZiMTFiLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3N0eWxlc2hlZXRzL3RlbXBsYXRlcy52bQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0jIyBUaGlzIGlzIHdoZXJlIHRoZSBjb21tb24gbWFjcm8ncyBsaXZlCi0KLSNtYWNybyAoIHRhYmxlICR0YWJsZSkKLSAgPHRhYmxlPgotICAjZm9yZWFjaCAoICRpdGVtcyBpbiAkdGFibGUuZ2V0Q2hpbGRyZW4oKSApCi0gICAgI2lmICgkaXRlbXMuZ2V0TmFtZSgpLmVxdWFscygidHIiKSkKLSAgICAgICN0ciAoJGl0ZW1zKQotICAgICNlbmQKLSAgI2VuZAotICA8L3RhYmxlPgotI2VuZAotCi0jbWFjcm8gKCB0ciAkdHIpCi0gIDx0cj4KLSAgI2ZvcmVhY2ggKCAkaXRlbXMgaW4gJHRyLmdldENoaWxkcmVuKCkgKQotICAgICNpZiAoJGl0ZW1zLmdldE5hbWUoKS5lcXVhbHMoInRkIikpCi0gICAgICAjdGQgKCRpdGVtcykKLSAgICAjZWxzZWlmICgkaXRlbXMuZ2V0TmFtZSgpLmVxdWFscygidGgiKSkKLSAgICAgICN0aCAoJGl0ZW1zKQotICAgICNlbmQKLSAgI2VuZAotPC90cj4KLSNlbmQKLQotI21hY3JvICggdGQgJHZhbHVlKQotICAjaWYgKCR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgiY29sc3BhbiIpKQotICAgICNzZXQgKCRjb2xzcGFuID0gJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJjb2xzcGFuIikpCi0gICNlbmQKLSAgI2lmICgkdmFsdWUuZ2V0QXR0cmlidXRlVmFsdWUoInJvd3NwYW4iKSkKLSAgICAjc2V0ICgkcm93c3BhbiA9ICR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgicm93c3BhbiIpKQotICAjZW5kCi0gIDx0ZCBiZ2NvbG9yPSIkdGFibGV0ZGJnIiBjb2xzcGFuPSIkIWNvbHNwYW4iIHJvd3NwYW49IiQhcm93c3BhbiIgCi0gICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLSAgICAjaWYgKCR2YWx1ZS5nZXRUZXh0KCkubGVuZ3RoKCkgIT0gMCB8fCAkdmFsdWUuaGFzQ2hpbGRyZW4oKSkKLSAgICAgICR4bWxvdXQub3V0cHV0U3RyaW5nKCR2YWx1ZSwgdHJ1ZSkKLSAgICAjZWxzZQotICAgICAgJm5ic3A7Ci0gICAgI2VuZAotICAgIDwvZm9udD4KLSAgPC90ZD4KLSNlbmQKLQotI21hY3JvICggdGggJHZhbHVlKQotICAjaWYgKCR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgiY29sc3BhbiIpKQotICAgICNzZXQgKCRjb2xzcGFuID0gJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJjb2xzcGFuIikpCi0gICNlbmQKLSAgI2lmICgkdmFsdWUuZ2V0QXR0cmlidXRlVmFsdWUoInJvd3NwYW4iKSkKLSAgICAjc2V0ICgkcm93c3BhbiA9ICR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgicm93c3BhbiIpKQotICAjZW5kCi0gIDx0ZCBiZ2NvbG9yPSIkdGFibGV0aGJnIiBjb2xzcGFuPSIkIWNvbHNwYW4iIHJvd3NwYW49IiQhcm93c3BhbiIgCi0gICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLSAgICAjaWYgKCR2YWx1ZS5nZXRUZXh0KCkubGVuZ3RoKCkgIT0gMCB8fCAkdmFsdWUuaGFzQ2hpbGRyZW4oKSkKLSAgICAgICR4bWxvdXQub3V0cHV0U3RyaW5nKCR2YWx1ZSwgdHJ1ZSkKLSAgICAjZWxzZQotICAgICAgJm5ic3A7Ci0gICAgI2VuZAotICAgIDwvZm9udD4KLSAgPC90ZD4KLSNlbmQKLQotI21hY3JvICggcHJvamVjdGFuY2hvciAkbmFtZSAkdmFsdWUgKQotICAjaWYgKCR2YWx1ZS5zdGFydHNXaXRoKCJodHRwOi8vIikpCi0gICAgPGEgaHJlZj0iJHZhbHVlIj4kbmFtZTwvYT4KLSAgI2Vsc2VpZiAoJHZhbHVlLnN0YXJ0c1dpdGgoIi9zaXRlIikpCi0gICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyR2YWx1ZSI+JG5hbWU8L2E+Ci0gICNlbHNlCi0gICAgPGEgaHJlZj0iJHJlbGF0aXZlUGF0aCR2YWx1ZSI+JG5hbWU8L2E+Ci0gICNlbmQKLSNlbmQKLQotI21hY3JvICggbWV0YWF1dGhvciAkYXV0aG9yICRlbWFpbCApCi0gIDxtZXRhIG5hbWU9ImF1dGhvciIgdmFsdWU9IiRhdXRob3IiPgotICA8bWV0YSBuYW1lPSJlbWFpbCIgdmFsdWU9IiRlbWFpbCI+Ci0jZW5kCi0KLSNtYWNybyAoIGltYWdlICR2YWx1ZSApCi0gICNpZiAoJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJ3aWR0aCIpKQotICAgICNzZXQgKCR3aWR0aD0kdmFsdWUuZ2V0QXR0cmlidXRlVmFsdWUoIndpZHRoIikpCi0gICNlbmQKLSAgI2lmICgkdmFsdWUuZ2V0QXR0cmlidXRlVmFsdWUoImhlaWdodCIpKQotICAgICNzZXQgKCRoZWlnaHQ9JHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJoZWlnaHQiKSkKLSAgI2VuZAotICAjaWYgKCR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgiYWxpZ24iKSkKLSAgICAjc2V0ICgkYWxpZ249JHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJhbGlnbiIpKQotICAjZW5kCi0gIDxpbWcgc3JjPSIkcmVsYXRpdmVQYXRoJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJzcmMiKSIgCi0gICAgICAgd2lkdGg9IiQhd2lkdGgiIGhlaWdodD0iJCFoZWlnaHQiIGFsaWduPSIkIWFsaWduIj4KLSNlbmQKLQotI21hY3JvICggc291cmNlICR2YWx1ZSkKLSAgPGRpdiBhbGlnbj0ibGVmdCI+Ci0gICAgPHRhYmxlIGNlbGxzcGFjaW5nPSI0IiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiMwMjMyNjQiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPjxpbWcgc3JjPSIvaW1hZ2VzL3ZvaWQuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+PC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiMwMjMyNjQiIGhlaWdodD0iMSI+PGltZyBzcmM9Ii9pbWFnZXMvdm9pZC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz48L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iIzAyMzI2NCIgd2lkdGg9IjEiIGhlaWdodD0iMSI+PGltZyBzcmM9Ii9pbWFnZXMvdm9pZC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiMwMjMyNjQiIHdpZHRoPSIxIj48aW1nIHNyYz0iL2ltYWdlcy92b2lkLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPjwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIj48cHJlPiRlc2NhcGUuZ2V0VGV4dCgkdmFsdWUuZ2V0VGV4dCgpKTwvcHJlPjwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjMDIzMjY0IiB3aWR0aD0iMSI+PGltZyBzcmM9Ii9pbWFnZXMvdm9pZC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiMwMjMyNjQiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPjxpbWcgc3JjPSIvaW1hZ2VzL3ZvaWQuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+PC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiMwMjMyNjQiIGhlaWdodD0iMSI+PGltZyBzcmM9Ii9pbWFnZXMvdm9pZC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz48L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iIzAyMzI2NCIgd2lkdGg9IjEiIGhlaWdodD0iMSI+PGltZyBzcmM9Ii9pbWFnZXMvdm9pZC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLSNlbmQKLQotI21hY3JvICggbWFrZVByb2plY3QgKQotICAjc2V0ICgkbWVudXMgPSAkcHJvamVjdC5nZXRDaGlsZCgiYm9keSIpLmdldENoaWxkcmVuKCJtZW51IikpCi0gICNmb3JlYWNoICggJG1lbnUgaW4gJG1lbnVzICkKLSAgICA8cD48c3Ryb25nPiRtZW51LmdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik8L3N0cm9uZz48L3A+Ci0gICAgPHVsPgotICAgICNmb3JlYWNoICggJGl0ZW0gaW4gJG1lbnUuZ2V0Q2hpbGRyZW4oKSApCi0gICAgICAjc2V0ICgkbmFtZSA9ICRpdGVtLmdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIikpCi0gICAgICA8bGk+I3Byb2plY3RhbmNob3IoJG5hbWUgJGl0ZW0uZ2V0QXR0cmlidXRlVmFsdWUoImhyZWYiKSk8L2xpPgotICAgICNlbmQKLSAgICA8L3VsPgotICAjZW5kCi0jZW5kCi0KLSNtYWNybyAoZ2V0UHJvamVjdEltYWdlKQotICAjaWYgKCRwcm9qZWN0LmdldENoaWxkKCJsb2dvIikpCi0gICAgPHRkIGFsaWduPSJsZWZ0Ij4KLSAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIj48aW1nIHNyYz0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiIgYm9yZGVyPSIwIi8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJyaWdodCI+Ci0gICAgI3NldCAoICRsb2dvU3RyaW5nID0gJHByb2plY3QuZ2V0Q2hpbGQoImxvZ28iKS5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHJlZiIpICkKLSAgICAjaWYgKCAkbG9nb1N0cmluZy5zdGFydHNXaXRoKCIvIikgKQotICAgICAgPGEgaHJlZj0iJHByb2plY3QuZ2V0QXR0cmlidXRlVmFsdWUoImhyZWYiKSI+PGltZyBzcmM9IiRyZWxhdGl2ZVBhdGgkbG9nb1N0cmluZyIgYWx0PSIkcHJvamVjdC5nZXRDaGlsZCgibG9nbyIpLmdldFRleHQoKSIgYm9yZGVyPSIwIi8+PC9hPgotICAgICNlbHNlCi0gICAgICA8YSBocmVmPSIkcHJvamVjdC5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHJlZiIpIj48aW1nIHNyYz0iJHJlbGF0aXZlUGF0aC8kbG9nb1N0cmluZyIgYWx0PSIkcHJvamVjdC5nZXRDaGlsZCgibG9nbyIpLmdldFRleHQoKSIgYm9yZGVyPSIwIi8+PC9hPgotICAgICNlbmQKLSAgICA8L3RkPgotICAjZWxzZQotICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIj48aW1nIHNyYz0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiIgYWxpZ249ImxlZnQiIGJvcmRlcj0iMCIvPjwvYT4KLSAgICA8L3RkPgotICAjZW5kCi0jZW5kCi0KLSNtYWNybyAoaGVhZGVyKQotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLSAgCi0gICAgICAjc2V0ICgkYXV0aG9ycyA9ICRyb290LmdldENoaWxkKCJwcm9wZXJ0aWVzIikuZ2V0Q2hpbGRyZW4oImF1dGhvciIpKQotICAgICAgI2ZvcmVhY2ggKCAkYXUgaW4gJGF1dGhvcnMgKQotICAgICAgICAjbWV0YWF1dGhvciAoICRhdS5nZXRUZXh0KCkgJGF1LmdldEF0dHJpYnV0ZVZhbHVlKCJlbWFpbCIpICkKLSAgICAgICNlbmQKLSAgCi0gICAgICA8dGl0bGU+JHByb2plY3QuZ2V0Q2hpbGQoInRpdGxlIikuZ2V0VGV4dCgpIC0gJHJvb3QuZ2V0Q2hpbGQoInByb3BlcnRpZXMiKS5nZXRDaGlsZCgidGl0bGUiKS5nZXRUZXh0KCk8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgCi0gICAgPGJvZHkgYmdjb2xvcj0iJGJvZHliZyIgdGV4dD0iJGJvZHlmZyIgbGluaz0iJGJvZHlsaW5rIj4gICAgCi0gICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiPgotICAgICAgICA8IS0tIFRPUCBJTUFHRSAtLT4KLSAgICAgICAgPHRyPgotICAgICAgICAgICNnZXRQcm9qZWN0SW1hZ2UoKQotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+Ci0gICAgICAgIDx0cj48dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgPGhyIG5vc2hhZGU9IiIgc2l6ZT0iMSIvPgotICAgICAgICA8L3RkPjwvdHI+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPCEtLSBMRUZUIFNJREUgTkFWSUdBVElPTiAtLT4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIG5vd3JhcD0idHJ1ZSI+Ci0gICAgICAgICAgI21ha2VQcm9qZWN0KCkKLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotI2VuZAotCi0jbWFjcm8gKGZvb3RlcikKLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDwhLS0gRk9PVEVSIC0tPgotICAgICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgIDxociBub3NoYWRlPSIiIHNpemU9IjEiLz4KLSAgICAgICAgPC90ZD48L3RyPgotICAgICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGZvbnQgY29sb3I9IiRib2R5bGluayIgc2l6ZT0iLTEiPjxlbT4KLSAgICAgICAgICBDb3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwMSwgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgICAgICAgICA8L2VtPjwvZm9udD48L2Rpdj4KLSAgICAgICAgPC90ZD48L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLSNlbmQKZGlmZiAtLWdpdCBhL3hkb2NzL3ZlbG9jaXR5LnByb3BlcnRpZXMgYi94ZG9jcy92ZWxvY2l0eS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzI3ZDk2Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3ZlbG9jaXR5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZpbGUucmVzb3VyY2UubG9hZGVyLnBhdGg9eGRvY3Mvc3R5bGVzaGVldHMKLXZlbG9jaW1hY3JvLmxpYnJhcnk9dGVtcGxhdGVzLnZtCg==